/// <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(); }
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; }
/// <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(); }
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; }
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; }
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; }
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; }
public static extern void FT_Vector_Transform(ref FT_Vector vec, ref FT_Matrix matrix);
public static extern void FT_Set_Transform(IntPtr /*FaceRec*/ face, ref FT_Matrix matrix, ref FT_Vector delta);
public static extern int FT_Get_Kerning(IntPtr /*FaceRec*/ face, uint left_glyph, uint right_glyph, uint kern_mode, out FT_Vector akerning);