Пример #1
0
        /// <summary>
        ///     Custom GL "write" routine. Slow version
        /// </summary>
        /// <param name="text">
        ///     The text to print.
        /// </param>
        public void ftWrite(string text)
        {
            if ((text == "") || (text == null)) return;

            // Scale to fit on Projection rendering screen with default coordinates                        
            Gl.glPushMatrix();

            switch (FT_ALIGN)
            {
                case FTFontAlign.FT_ALIGN_CENTERED:
                    Gl.glTranslatef(-ftExtent(ref text) / 2, 0, 0);
                    break;

                case FTFontAlign.FT_ALIGN_RIGHT:
                    Gl.glTranslatef(-ftExtent(ref text), 0, 0);
                    break;

                //By default it is left-aligned, so there's no need to bother translating by 0.
            }


            //Check Glyphs
            for (int i = 0; i < text.Length; i++)            
                CheckGlyph((int)text[i]);

            //Render


            if (kerning)
            {
                FT_Vector kern = new FT_Vector();

                for (int i = 0; i < text.Length; i++)
                {
                    if (i > 0)
                    {
                        FT.FT_Get_Kerning(faceptr, GetChar(text[i - 1]), GetChar(text[i]), (uint)FT_Kerning_Mode.FT_KERNING_DEFAULT, out kern);
                        Gl.glTranslatef(kern.x >> 6, 0, 0);
                    }

                    Gl.glCallLists(1, Gl.GL_UNSIGNED_INT, (uint)text[i]);
                }
            }
            else
                Gl.glCallLists(text.Length, Gl.GL_UNSIGNED_SHORT, text);

            Gl.glPopMatrix();
        }
Пример #2
0
        public int FT_Outline_CubicToFunc(ref FT_Vector control1, ref FT_Vector control2, ref FT_Vector to, IntPtr user)
        {
  /* VertexInfo to_vertex( to );
 1722     VertexInfo control1_vertex( control1 );
 1723     VertexInfo control2_vertex( control2 );
 1724 
 1725     double a[2], b[2], c[2], d[2], f[2], df[2], d2f[2], d3f[2];
 1726 
 1727     a[X] = -filled->last_vertex_.v_[X] + 3 * control1_vertex.v_[X]
 1728       -3 * control2_vertex.v_[X] + to_vertex.v_[X];
 1729     a[Y] = -filled->last_vertex_.v_[Y] + 3 * control1_vertex.v_[Y]
 1730       -3 * control2_vertex.v_[Y] + to_vertex.v_[Y];
 1731 
 1732     b[X] = 3 * filled->last_vertex_.v_[X] - 6 * control1_vertex.v_[X] +
 1733       3 * control2_vertex.v_[X];
 1734     b[Y] = 3 * filled->last_vertex_.v_[Y] - 6 * control1_vertex.v_[Y] +
 1735       3 * control2_vertex.v_[Y];
 1736 
 1737     c[X] = -3 * filled->last_vertex_.v_[X] + 3 * control1_vertex.v_[X];
 1738     c[Y] = -3 * filled->last_vertex_.v_[Y] + 3 * control1_vertex.v_[Y];
 1739 
 1740     d[X] = filled->last_vertex_.v_[X];
 1741     d[Y] = filled->last_vertex_.v_[Y];
 1742 
 1743     f[X] = d[X];
 1744     f[Y] = d[Y];
 1745     df[X] = c[X] * filled->delta_ + b[X] * filled->delta2_
 1746       + a[X] * filled->delta3_;
 1747     df[Y] = c[Y] * filled->delta_ + b[Y] * filled->delta2_
 1748       + a[Y] * filled->delta3_;
 1749     d2f[X] = 2 * b[X] * filled->delta2_ + 6 * a[X] * filled->delta3_;
 1750     d2f[Y] = 2 * b[Y] * filled->delta2_ + 6 * a[Y] * filled->delta3_;
 1751     d3f[X] = 6 * a[X] * filled->delta3_;
 1752     d3f[Y] = 6 * a[Y] * filled->delta3_;
 1753 
 1754     for ( unsigned int i = 0; i < filled->tessellation_steps_-1; i++ ) {
 1755 
 1756       f[X] += df[X];
 1757       f[Y] += df[Y];
 1758 
 1759       VertexInfo* vertex = new VertexInfo( f );
 1760 
 1761       vertex->v_[X] *= filled->vector_scale_;
 1762       vertex->v_[Y] *= filled->vector_scale_;
 1763 
 1764       filled->vertices_.push_back( vertex );
 1765 
 1766       gluTessVertex( filled->tess_obj_, vertex->v_, vertex );
 1767 
 1768       df[X] += d2f[X];
 1769       df[Y] += d2f[Y];
 1770       d2f[X] += d3f[X];
 1771       d2f[Y] += d3f[Y];
 1772     }
 1773 
 1774     VertexInfo* vertex = new VertexInfo( to );
 1775 
 1776     vertex->v_[X] *= filled->vector_scale_;
 1777     vertex->v_[Y] *= filled->vector_scale_;
 1778 
 1779     filled->vertices_.push_back( vertex );
 1780 
 1781     gluTessVertex( filled->tess_obj_, vertex->v_, vertex );
 1782 
 1783     filled->last_vertex_ = to_vertex;*/


            return 0;
        }
Пример #3
0
        /// <summary>
        ///     Custom GL "write" routine.
        /// </summary>
        /// <param name="text">
        ///     The text to print.
        /// </param>
        public void ftWrite(string text, ref int gllist)
        {
            if ((text == "") || (text == null)) return;

            // Scale to fit on Projection rendering screen with default coordinates                        
            Gl.glPushMatrix();

            switch (FT_ALIGN)
            {
                case FTFontAlign.FT_ALIGN_CENTERED:
                    Gl.glTranslatef(-ftExtent(ref text) / 2, 0, 0);
                    break;

                case FTFontAlign.FT_ALIGN_RIGHT:
                    Gl.glTranslatef(-ftExtent(ref text), 0, 0);
                    break;

                //By default it is left-aligned, so there's no need to bother translating by 0.
            }


            //Render
            if ((gllist != 0))
            {
                Gl.glCallList(gllist);
            }
            else
            {
                for (int i = 0; i < text.Length; i++)
                    CheckGlyph((int)text[i]);

                gllist = Gl.glGenLists(1);   
                Gl.glNewList(gllist, Gl.GL_COMPILE);

                //byte[] textbytes = new byte[text.Length];

                if (kerning)
                {
                    FT_Vector kern = new FT_Vector();

                    for (int i = 0; i < text.Length; i++)
                    {                        
                        if (i>0)
                        {
                            FT.FT_Get_Kerning(faceptr, (uint)text[i - 1], (uint)text[i], (uint)FT_Kerning_Mode.FT_KERNING_DEFAULT, out kern);
                            Gl.glTranslatef(kern.x >> 6,0,0);
                        }

                        Gl.glCallLists(1, Gl.GL_UNSIGNED_INT, (uint)text[i]);
                    }
                }
                else
                    Gl.glCallLists(text.Length, Gl.GL_UNSIGNED_SHORT, text);                             

                Gl.glEndList();

                //textbytes = null;
            }
            //textbytes[i] = (byte)text[i];
            //Gl.glCallLists(text.Length, Gl.GL_UNSIGNED_BYTE, textbytes);            
            Gl.glPopMatrix();
        }
Пример #4
0
        public int FT_Outline_LineToFunc(ref FT_Vector to, IntPtr user) 
        {
            last_vector_ = to;            
             
//              vertex->v_[X] *= filled->vector_scale_;
//              vertex->v_[Y] *= filled->vector_scale_;
 
               
    //    Glu.gluTessVertex(tess_obj_, vertex->v_, vertex );
    
        //filled->vertices_.push_back( vertex );
  

            return 0; 
        }
Пример #5
0
        public int FT_Outline_ConicToFunc(ref FT_Vector control, ref FT_Vector to, IntPtr user) 
        { 
             // This is crude: Step off conics with a fixed number of increments
            /*VertexInfo to_vertex( to );
            1662     VertexInfo control_vertex( control );
            1663 
            1664     double b[2], c[2], d[2], f[2], df[2], d2f[2];
            1665 
            1666     b[X] = filled->last_vertex_.v_[X] - 2 * control_vertex.v_[X] +
            1667       to_vertex.v_[X];
            1668     b[Y] = filled->last_vertex_.v_[Y] - 2 * control_vertex.v_[Y] +
            1669       to_vertex.v_[Y];
            1670 
            1671     c[X] = -2 * filled->last_vertex_.v_[X] + 2 * control_vertex.v_[X];
            1672     c[Y] = -2 * filled->last_vertex_.v_[Y] + 2 * control_vertex.v_[Y];
            1673 
            1674     d[X] = filled->last_vertex_.v_[X];
            1675     d[Y] = filled->last_vertex_.v_[Y];
            1676 
            1677     f[X] = d[X];
            1678     f[Y] = d[Y];
            1679     df[X] = c[X] * filled->delta_ + b[X] * filled->delta2_;
            1680     df[Y] = c[Y] * filled->delta_ + b[Y] * filled->delta2_;
            1681     d2f[X] = 2 * b[X] * filled->delta2_;
            1682     d2f[Y] = 2 * b[Y] * filled->delta2_;
            1683 
            1684     for ( unsigned int i = 0; i < filled->tessellation_steps_-1; i++ ) {
            1685 
            1686       f[X] += df[X];
            1687       f[Y] += df[Y];
            1688 
            1689       VertexInfo* vertex = new VertexInfo( f );
            1690 
            1691       vertex->v_[X] *= filled->vector_scale_;
            1692       vertex->v_[Y] *= filled->vector_scale_;
            1693 
            1694       filled->vertices_.push_back( vertex );
            1695 
            1696       gluTessVertex( filled->tess_obj_, vertex->v_, vertex );
            1697 
            1698       df[X] += d2f[X];
            1699       df[Y] += d2f[Y];
            1700     }
            1701 
            1702     VertexInfo* vertex = new VertexInfo( to );
            1703 
            1704     vertex->v_[X] *= filled->vector_scale_;
            1705     vertex->v_[Y] *= filled->vector_scale_;
            1706 
            1707     filled->vertices_.push_back( vertex );
            1708 
            1709     gluTessVertex( filled->tess_obj_, vertex->v_, vertex );
            1710 
            1711     filled->last_vertex_ = to_vertex;
           */

            return 0; 
        }
Пример #6
0
        public int FT_Outline_MoveToFunc(ref FT_Vector to, IntPtr user) 
        {
              if ( contour_open_ ) 
              {
                    Glu.gluTessEndContour( tess_obj_ );
              }
             
             last_vector_ = to;
             
             Glu.gluTessBeginContour(tess_obj_ );             
             contour_open_ = true;

            return 0;  
        }
Пример #7
0
        public static KerningInfo CreateKerningInfo(uint leftIndex, uint rightIndex)
        {
            KerningInfo info = new KerningInfo();
            FT_Vector vector = new FT_Vector();
            FT.FT_Get_Kerning(ftFace, leftIndex, rightIndex,
                              (uint)FT_Kerning_Mode.FT_KERNING_DEFAULT,
                              out vector);
            info.HorizontalAdjust = ((double)vector.x) / 64.0d;
            info.VerticalAdjust = ((double)vector.y) / 64.0d;

            return info;
        }
Пример #8
0
 public static extern void FT_Vector_Transform(ref FT_Vector vec, ref FT_Matrix matrix);
Пример #9
0
 public static extern void FT_Set_Transform(IntPtr /*FaceRec*/ face, ref FT_Matrix matrix, ref FT_Vector delta);
Пример #10
0
 public static extern int FT_Get_Kerning(IntPtr /*FaceRec*/ face, uint left_glyph, uint right_glyph, uint kern_mode, out FT_Vector akerning);