Changed the Font editing panel so it displays the Postscript name of the font.
authorRob Haarsma <phaseIV@zonnet.nl>
Thu, 15 Jan 2004 20:34:54 +0000 (20:34 +0000)
committerRob Haarsma <phaseIV@zonnet.nl>
Thu, 15 Jan 2004 20:34:54 +0000 (20:34 +0000)
Also supplied tooltip information for the buttons in the Font panel.

source/blender/blenlib/BLI_vfontdata.h
source/blender/blenlib/intern/freetypefont.c
source/blender/src/buttons_editing.c

index 6485a0aa48eaf3b6e6a2099e15551fed56916222..516bfb15f3f32f7fcabb08432506a0e03780f9b7 100644 (file)
@@ -49,6 +49,7 @@ typedef struct VFontData {
        float       resol[MAX_VF_CHARS];
        float       width[MAX_VF_CHARS];
        float       *points[MAX_VF_CHARS];
+       char            name[128];
 } VFontData;
 
 /**
index 340c68366e183232803493da9148907bbb667829..4acc623450013c99246ea891315db399ef9845e0 100644 (file)
  * The Original Code is written by Rob Haarsma (phase)
  * All rights reserved.
  *
- *
  * Contributor(s): none yet.
  *
  * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This code parses the Freetype font outline data to chains of Blender's beziertriples.
+ * Additional information can be found at the bottom of this file.
+ *
+ * Code that uses exotic character maps is present but commented out.
  */
 
 #ifdef WITH_FREETYPE2
 
 #include "BIF_toolbox.h"
 
+#include "BKE_utildefines.h"
+
 #include "DNA_packedFile_types.h"
 #include "DNA_curve_types.h"
 
-// increased max to 255, including extended charset (ton)
 #define myMIN_ASCII    32
 #define myMAX_ASCII    255
 
-// should come from arithb.c
-#define MIN2(x,y)               ( (x)<(y) ? (x) : (y) )
-#define MAX2(x,y)               ( (x)>(y) ? (x) : (y) )
-
 /* local variables */
 static FT_Library      library;
 static FT_Error                err;
 
-#if 0
-// Freetype2 Outline struct
-
-typedef struct  FT_Outline_
-  {
-    short       n_contours;      /* number of contours in glyph        */
-    short       n_points;        /* number of points in the glyph      */
-
-    FT_Vector*  points;          /* the outline's points               */
-    char*       tags;            /* the points flags                   */
-    short*      contours;        /* the contour end points             */
-
-    int         flags;           /* outline masks                      */
-
-  } FT_Outline;
-#endif
-
-/***//*
-from: http://www.freetype.org/freetype2/docs/glyphs/glyphs-6.html#section-1
-
-Vectorial representation of Freetype glyphs
-
-The source format of outlines is a collection of closed paths called "contours". Each contour is
-made of a series of line segments and bezier arcs. Depending on the file format, these can be
-second-order or third-order polynomials. The former are also called quadratic or conic arcs, and
-they come from the TrueType format. The latter are called cubic arcs and mostly come from the
-Type1 format.
-
-Each arc is described through a series of start, end and control points. Each point of the outline
-has a specific tag which indicates wether it is used to describe a line segment or an arc.
-
-
-The following rules are applied to decompose the contour's points into segments and arcs :
-
-# two successive "on" points indicate a line segment joining them.
-
-# one conic "off" point amidst two "on" points indicates a conic bezier arc, the "off" point being
-  the control point, and the "on" ones the start and end points.
-
-# Two successive cubic "off" points amidst two "on" points indicate a cubic bezier arc. There must
-  be exactly two cubic control points and two on points for each cubic arc (using a single cubic 
-  "off" point between two "on" points is forbidden, for example).
-
-# finally, two successive conic "off" points forces the rasterizer to create (during the scan-line
-  conversion process exclusively) a virtual "on" point amidst them, at their exact middle. This
-  greatly facilitates the definition of successive conic bezier arcs. Moreover, it's the way
-  outlines are described in the TrueType specification.
-
-Note that it is possible to mix conic and cubic arcs in a single contour, even though no current
-font driver produces such outlines.
-
-                                  *            # on      
-                                               * off
-                               __---__
-  #-__                      _--       -_
-      --__                _-            -
-          --__           #               \
-              --__                        #
-                  -#
-                           Two "on" points
-   Two "on" points       and one "conic" point
-                            between them
-
-
-
-                *
-  #            __      Two "on" points with two "conic"
-   \          -  -     points between them. The point
-    \        /    \    marked '0' is the middle of the
-     -      0      \   "off" points, and is a 'virtual'
-      -_  _-       #   "on" point where the curve passes.
-        --             It does not appear in the point
-                       list.
-        *
-
-
-
-
-        *                # on
-                   *     * off
-         __---__
-      _--       -_
-    _-            -
-   #               \
-                    #
-
-     Two "on" points
-   and two "cubic" point
-      between them
-
-
-Each glyph's original outline points are located on a grid of indivisible units. The points are stored
-in the font file as 16-bit integer grid coordinates, with the grid origin's being at (0,0); they thus
-range from -16384 to 16383.
-
-
-Convert conic to bezier arcs:
-Conic P0 P1 P2
-Bezier B0 B1 B2 B3
-B0=P0
-B1=(P0+2*P1)/3
-B2=(P2+2*P1)/3
-B3=P2
-
-*//****/
 
 static VFontData *objfnt_to_ftvfontdata(PackedFile * pf)
 {
@@ -188,16 +84,12 @@ static VFontData *objfnt_to_ftvfontdata(PackedFile * pf)
        FT_UShort my_encoding_id = TT_MS_ID_UNICODE_CS;
        int         n;
 */
-
-       float scale= 1. / 1024.; //needs text_height from metrics to make a standard linedist
+       //scale needs text_height from freetype metrics to make a standard linedist,
+       //is currently set to generic value
+       float scale= 1. / 1024.;
        float dx, dy;
-       int i, j, k, l, m; /* uhoh, kiddie C loops */
-       /* i = characters, j = curves/contours, k = points, l = curvepoint, m = first point on curve */
-
-       // test is used for BIF_printf
-       char test[2];
+       int i, j, k, l, m;
 
-       
        // load the freetype font
        err = FT_New_Memory_Face( library,
                                                pf->data,
@@ -227,22 +119,20 @@ static VFontData *objfnt_to_ftvfontdata(PackedFile * pf)
 
        // allocate blender font
        vfd= MEM_callocN(sizeof(*vfd), "FTVFontData");
+       strcpy(vfd->name, FT_Get_Postscript_Name(face)); 
 
-       // extract generic ascii character range (needs international support, dynamic loading of chars, etcetc)
+       // extract generic ascii character range
        for(i = myMIN_ASCII; i <= myMAX_ASCII; i++) {
+
                int  *npoints;  //total points of each contour
                int  *onpoints; //num points on curve
 
-               test[0] = i;
-               test[1] = '\0'; //to print character
-
                glyph_index = FT_Get_Char_Index( face, i );
                err = FT_Load_Glyph(face, glyph_index, FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP);
                glyph = face->glyph;
                ftoutline = glyph->outline;
 
                vfd->width[i] = glyph->advance.x* scale;
-//             BIF_printf("sx %d sy %d", glyph->advance.x, face->glyph->metrics->text_height);
 
                npoints = (int *)MEM_callocN((ftoutline.n_contours)* sizeof(int),"endpoints") ;
                onpoints = (int *)MEM_callocN((ftoutline.n_contours)* sizeof(int),"onpoints") ;
@@ -261,8 +151,6 @@ static VFontData *objfnt_to_ftvfontdata(PackedFile * pf)
                        for(k = 0; k < npoints[j]; k++) {
                                if(j > 0) l = k + ftoutline.contours[j - 1] + 1; else l = k;
 
-//                             if(i == 67) BIF_printf("%d->%s : |k %2d|l %2d|t %2d|", i, test, k, l, ftoutline.n_points);
-
                                if(ftoutline.tags[l] == FT_Curve_Tag_On)
                                        onpoints[j]++;
 
@@ -273,12 +161,13 @@ static VFontData *objfnt_to_ftvfontdata(PackedFile * pf)
                        }
                }
 
-               //final contour loop, bezier & conic styles merged
+               //contour loop, bezier & conic styles merged
                for(j = 0; j < ftoutline.n_contours; j++) {
                        // add new curve
                        nu  =  (Nurb*)MEM_callocN(sizeof(struct Nurb),"objfnt_nurb");
                        bezt = (BezTriple*)MEM_callocN((onpoints[j])* sizeof(BezTriple),"objfnt_bezt") ;
                        BLI_addtail(&vfd->nurbsbase[i], nu);
+
                        nu->type= CU_BEZIER+CU_2D;
                        nu->pntsu = onpoints[j];
                        nu->resolu= 8;
@@ -301,8 +190,8 @@ static VFontData *objfnt_to_ftvfontdata(PackedFile * pf)
                                                bezt->vec[0][1] = (dy + (2 * ftoutline.points[l].y)* scale) / 3.0;
 
                                                //midpoint (virtual on-curve point)
-                                               bezt->vec[1][0] = (ftoutline.points[l].x + ftoutline.points[l+1].x)* scale / 2.0;
-                                               bezt->vec[1][1] = (ftoutline.points[l].y + ftoutline.points[l+1].y)* scale / 2.0;
+                                               bezt->vec[1][0] = dx;
+                                               bezt->vec[1][1] = dy;
 
                                                //right handle
                                                bezt->vec[2][0] = (dx + (2 * ftoutline.points[l+1].x)* scale) / 3.0;
@@ -366,7 +255,6 @@ static VFontData *objfnt_to_ftvfontdata(PackedFile * pf)
                                                }
                                        } else { //last point on curve
                                                if(ftoutline.tags[m] == FT_Curve_Tag_Cubic) {
-//                                                     okee("hhuh");
                                                        bezt->vec[2][0] = ftoutline.points[m].x* scale;
                                                        bezt->vec[2][1] = ftoutline.points[m].y* scale;
                                                        bezt->h2= HD_FREE;
@@ -475,7 +363,7 @@ VFontData *BLI_vfontdata_from_freetypefont(PackedFile *pf)
        //init Freetype 
        err = FT_Init_FreeType( &library);
        if(err) {
-           error("Failed loading Freetype font library");
+           error("Failed to load the Freetype font library");
                return 0;
        }
 
@@ -492,3 +380,112 @@ VFontData *BLI_vfontdata_from_freetypefont(PackedFile *pf)
 }
 
 #endif // WITH_FREETYPE2
+
+
+
+#if 0
+
+// Freetype2 Outline struct
+
+typedef struct  FT_Outline_
+  {
+    short       n_contours;      /* number of contours in glyph        */
+    short       n_points;        /* number of points in the glyph      */
+
+    FT_Vector*  points;          /* the outline's points               */
+    char*       tags;            /* the points flags                   */
+    short*      contours;        /* the contour end points             */
+
+    int         flags;           /* outline masks                      */
+
+  } FT_Outline;
+
+#endif
+
+/***//*
+from: http://www.freetype.org/freetype2/docs/glyphs/glyphs-6.html#section-1
+
+Vectorial representation of Freetype glyphs
+
+The source format of outlines is a collection of closed paths called "contours". Each contour is
+made of a series of line segments and bezier arcs. Depending on the file format, these can be
+second-order or third-order polynomials. The former are also called quadratic or conic arcs, and
+they come from the TrueType format. The latter are called cubic arcs and mostly come from the
+Type1 format.
+
+Each arc is described through a series of start, end and control points. Each point of the outline
+has a specific tag which indicates wether it is used to describe a line segment or an arc.
+
+
+The following rules are applied to decompose the contour's points into segments and arcs :
+
+# two successive "on" points indicate a line segment joining them.
+
+# one conic "off" point amidst two "on" points indicates a conic bezier arc, the "off" point being
+  the control point, and the "on" ones the start and end points.
+
+# Two successive cubic "off" points amidst two "on" points indicate a cubic bezier arc. There must
+  be exactly two cubic control points and two on points for each cubic arc (using a single cubic 
+  "off" point between two "on" points is forbidden, for example).
+
+# finally, two successive conic "off" points forces the rasterizer to create (during the scan-line
+  conversion process exclusively) a virtual "on" point amidst them, at their exact middle. This
+  greatly facilitates the definition of successive conic bezier arcs. Moreover, it's the way
+  outlines are described in the TrueType specification.
+
+Note that it is possible to mix conic and cubic arcs in a single contour, even though no current
+font driver produces such outlines.
+
+                                  *            # on      
+                                               * off
+                               __---__
+  #-__                      _--       -_
+      --__                _-            -
+          --__           #               \
+              --__                        #
+                  -#
+                           Two "on" points
+   Two "on" points       and one "conic" point
+                            between them
+
+
+
+                *
+  #            __      Two "on" points with two "conic"
+   \          -  -     points between them. The point
+    \        /    \    marked '0' is the middle of the
+     -      0      \   "off" points, and is a 'virtual'
+      -_  _-       #   "on" point where the curve passes.
+        --             It does not appear in the point
+                       list.
+        *
+
+
+
+
+        *                # on
+                   *     * off
+         __---__
+      _--       -_
+    _-            -
+   #               \
+                    #
+
+     Two "on" points
+   and two "cubic" point
+      between them
+
+
+Each glyph's original outline points are located on a grid of indivisible units. The points are stored
+in the font file as 16-bit integer grid coordinates, with the grid origin's being at (0,0); they thus
+range from -16384 to 16383.
+
+Convert conic to bezier arcs:
+Conic P0 P1 P2
+Bezier B0 B1 B2 B3
+B0=P0
+B1=(P0+2*P1)/3
+B2=(P2+2*P1)/3
+B3=P2
+
+*//****/
index e4ea882706978344fc2eeadc43ad940ea86f9799..b5637a1230980ae0889bbc8c0c7f93da64511170 100644 (file)
@@ -81,6 +81,7 @@
 
 #include "BLI_blenlib.h"
 #include "BLI_arithb.h"
+#include "BLI_vfontdata.h"
 
 #include "BSE_filesel.h"
 
@@ -642,57 +643,55 @@ void do_fontbuts(unsigned short event)
        }
 }
 
-
-
 static void editing_panel_font_type(Object *ob, Curve *cu)
 {
        uiBlock *block;
        char *strp;
        static int packdummy = 0;
+       VFontData *vfd;
 
        block= uiNewBlock(&curarea->uiblocks, "editing_panel_font_type", UI_EMBOSS, UI_HELV, curarea->win);
        if(uiNewPanel(curarea, block, "Font", "Editing", 640, 0, 318, 204)==0) return;
-       uiBlockBeginAlign(block);
-       uiDefButS(block, ROW,B_MAKEFONT, "Left",                484,139,53,18, &cu->spacemode, 0.0,0.0, 0, 0, "");
-       uiDefButS(block, ROW,B_MAKEFONT, "Right",               540,139,62,18, &cu->spacemode, 0.0,2.0, 0, 0, "");
-       uiDefButS(block, ROW,B_MAKEFONT, "Middle",              604,139,61,18, &cu->spacemode, 0.0,1.0, 0, 0, "");
-       uiDefButS(block, ROW,B_MAKEFONT, "Flush",               665,139,61,18, &cu->spacemode, 0.0,3.0, 0, 0, "");
-       uiBlockEndAlign(block);
-       
-       uiDefIDPoinBut(block, test_obpoin_but, B_TEXTONCURVE, "TextOnCurve:",   484,115,243,19, &cu->textoncurve, "");
-       uiDefBut(block, TEX,REDRAWVIEW3D, "Ob Family:", 484,85,243,19, cu->family, 0.0, 20.0, 0, 0, "");
 
-       uiBlockBeginAlign(block);
-       uiDefButF(block, NUM,B_MAKEFONT, "Size:",               482,56,121,19, &cu->fsize, 0.1,10.0, 10, 0, "");
-       uiDefButF(block, NUM,B_MAKEFONT, "Linedist:",   605,56,121,19, &cu->linedist, 0.0,10.0, 10, 0, "");
-       uiDefButF(block, NUM,B_MAKEFONT, "Spacing:",    482,34,121,19, &cu->spacing, 0.0,10.0, 10, 0, "");
-       uiDefButF(block, NUM,B_MAKEFONT, "Y offset:",   605,34,121,19, &cu->yof, -50.0,50.0, 10, 0, "");
-       uiDefButF(block, NUM,B_MAKEFONT, "Shear:",      482,12,121,19, &cu->shear, -1.0,1.0, 10, 0, "");
-       uiDefButF(block, NUM,B_MAKEFONT, "X offset:",   605,12,121,19, &cu->xof, -50.0,50.0, 10, 0, "");
-       uiBlockEndAlign(block);
-       
-       uiDefBut(block, BUT, B_TOUPPER, "ToUpper",              623,163,103,23, 0, 0, 0, 0, 0, "");
-       
        G.buts->texnr= give_vfontnr(cu->vfont);
-       
        strp= give_vfontbutstr();
-       
-       uiDefButS(block, MENU, B_SETFONT, strp, 484,191,220,20, &G.buts->texnr, 0, 0, 0, 0, "");
-       
+       vfd= cu->vfont->data;
+
+       uiDefBut(block, BUT,B_LOADFONT, "Load", 480,188,68,20, 0, 0, 0, 0, 0, "Load a new font");
+       uiDefButS(block, MENU, B_SETFONT, strp, 550,188,220,20, &G.buts->texnr, 0, 0, 0, 0, "Change font for object");
+
        if (cu->vfont->packedfile) {
                packdummy = 1;
        } else {
                packdummy = 0;
        }
-       
-       uiDefIconButI(block, TOG|BIT|0, B_PACKFONT, ICON_PACKAGE,       706,191,20,20, &packdummy, 0, 0, 0, 0, "Pack/Unpack this Vectorfont");
+       uiDefIconButI(block, TOG|BIT|0, B_PACKFONT, ICON_PACKAGE,       772,188,20,20, &packdummy, 0, 0, 0, 0, "Pack/Unpack this font");
+       uiDefBut(block, LABEL, 0, vfd->name,  480, 165,314,20, 0, 0, 0, 0, 0, "Postscript name of the font");
        
        MEM_freeN(strp);
+
+       uiBlockBeginAlign(block);
+       uiDefButS(block, ROW,B_MAKEFONT, "Left",                480,135,53,20, &cu->spacemode, 0.0,0.0, 0, 0, "Align text from the left of the object centre");
+       uiDefButS(block, ROW,B_MAKEFONT, "Middle",              535,135,55,20, &cu->spacemode, 0.0,1.0, 0, 0, "Align text from the middle of the object centre");
+       uiDefButS(block, ROW,B_MAKEFONT, "Right",               592,135,53,20, &cu->spacemode, 0.0,2.0, 0, 0, "Align text from the right of the object centre");
+       uiDefButS(block, ROW,B_MAKEFONT, "Flush",               647,135,53,20, &cu->spacemode, 0.0,3.0, 0, 0, "Fill characters to maximum linewidth. (Multiple lines required)");
+       uiDefBut(block, BUT, B_TOUPPER, "ToUpper",              715,135,78,20, 0, 0, 0, 0, 0, "Toggle between upper and lower case in editmode");
+       uiBlockEndAlign(block);
        
-       uiDefBut(block, BUT,B_LOADFONT, "Load Font",    484,163,103,23, 0, 0, 0, 0, 0, "");
+       uiDefIDPoinBut(block, test_obpoin_but, B_TEXTONCURVE, "TextOnCurve:",   480,105,220,19, &cu->textoncurve, "Apply a deforming curve to the text");
+       uiDefBut(block, TEX,REDRAWVIEW3D, "Ob Family:", 480,84,220,19, cu->family, 0.0, 20.0, 0, 0, "Blender uses font from selfmade objects");
 
+       uiBlockBeginAlign(block);
+       uiDefButF(block, NUM,B_MAKEFONT, "Size:",               480,56,155,20, &cu->fsize, 0.1,10.0, 10, 0, "Size of the text");
+       uiDefButF(block, NUM,B_MAKEFONT, "Linedist:",   640,56,155,20, &cu->linedist, 0.0,10.0, 10, 0, "Distance between text lines");
+       uiDefButF(block, NUM,B_MAKEFONT, "Spacing:",    480,34,155,20, &cu->spacing, 0.0,10.0, 10, 0, "Spacing of individual characters");
+       uiDefButF(block, NUM,B_MAKEFONT, "X offset:",   640,34,155,20, &cu->xof, -50.0,50.0, 10, 0, "Horizontal position from object centre");
+       uiDefButF(block, NUM,B_MAKEFONT, "Shear:",              480,12,155,20, &cu->shear, -1.0,1.0, 10, 0, "Italic angle of the characters");
+       uiDefButF(block, NUM,B_MAKEFONT, "Y offset:",   640,12,155,20, &cu->yof, -50.0,50.0, 10, 0, "Vertical position from object centre");
+       uiBlockEndAlign(block);
 }
 
+
 /* *************************** CURVE ******************************** */