Commit: 4dcdb4b15edfb728a09e0d4f0e5af917ff3e7f94
Author: Campbell Barton
Date:   Mon May 12 08:45:19 2014 +1000
https://developer.blender.org/rB4dcdb4b15edfb728a09e0d4f0e5af917ff3e7f94

VFont: avoid allocating an array for storing total contours.

===================================================================

M       source/blender/blenlib/intern/freetypefont.c

===================================================================

diff --git a/source/blender/blenlib/intern/freetypefont.c 
b/source/blender/blenlib/intern/freetypefont.c
index 79f009e..4e06273 100644
--- a/source/blender/blenlib/intern/freetypefont.c
+++ b/source/blender/blenlib/intern/freetypefont.c
@@ -84,7 +84,8 @@ static VChar *freetypechar_to_vchar(FT_Face face, FT_ULong 
charcode, VFontData *
 
        /* If loading succeeded, convert the FT glyph to the internal format */
        if (!err) {
-               int *npoints;
+               /* initialize as -1 to add 1 on first loop each time */
+               int contour_prev;
                int *onpoints;
 
                /* First we create entry for the new character to the character 
list */
@@ -101,26 +102,20 @@ static VChar *freetypechar_to_vchar(FT_Face face, 
FT_ULong charcode, VFontData *
                BLI_ghash_insert(vfd->characters, 
SET_UINT_IN_POINTER(che->index), che);
 
                /* Start converting the FT data */
-               npoints = (int *)MEM_mallocN((ftoutline.n_contours) * 
sizeof(int), "endpoints");
                onpoints = (int *)MEM_callocN((ftoutline.n_contours) * 
sizeof(int), "onpoints");
 
-               /* calculate total points of each contour */
-               for (j = 0; j < ftoutline.n_contours; j++) {
-                       if (j == 0)
-                               npoints[j] = ftoutline.contours[j] + 1;
-                       else
-                               npoints[j] = ftoutline.contours[j] - 
ftoutline.contours[j - 1];
-               }
-
                /* get number of on-curve points for beziertriples (including 
conic virtual on-points) */
-               for (j = 0; j < ftoutline.n_contours; j++) {
-                       for (k = 0; k < npoints[j]; k++) {
+               for (j = 0, contour_prev = -1; j < ftoutline.n_contours; j++) {
+                       const int n = ftoutline.contours[j] - contour_prev;
+                       contour_prev = ftoutline.contours[j];
+
+                       for (k = 0; k < n; k++) {
                                l = (j > 0) ? (k + ftoutline.contours[j - 1] + 
1) : k;
 
                                if (ftoutline.tags[l] == FT_Curve_Tag_On)
                                        onpoints[j]++;
 
-                               if (k < npoints[j] - 1) {
+                               if (k < n - 1) {
                                        if (ftoutline.tags[l] == 
FT_Curve_Tag_Conic &&
                                            ftoutline.tags[l + 1] == 
FT_Curve_Tag_Conic)
                                        {
@@ -131,7 +126,10 @@ static VChar *freetypechar_to_vchar(FT_Face face, FT_ULong 
charcode, VFontData *
                }
 
                /* contour loop, bezier & conic styles merged */
-               for (j = 0; j < ftoutline.n_contours; j++) {
+               for (j = 0, contour_prev = -1; j < ftoutline.n_contours; j++) {
+                       const int n = ftoutline.contours[j] - contour_prev;
+                       contour_prev = ftoutline.contours[j];
+
                        /* add new curve */
                        nu  =  (Nurb *)MEM_callocN(sizeof(struct Nurb), 
"objfnt_nurb");
                        bezt = (BezTriple *)MEM_callocN((onpoints[j]) * 
sizeof(BezTriple), "objfnt_bezt");
@@ -145,12 +143,12 @@ static VChar *freetypechar_to_vchar(FT_Face face, 
FT_ULong charcode, VFontData *
                        nu->bezt = bezt;
 
                        /* individual curve loop, start-end */
-                       for (k = 0; k < npoints[j]; k++) {
-                               if (j > 0) l = k + ftoutline.contours[j - 1] + 
1; else l = k;
+                       for (k = 0; k < n; k++) {
+                               l = (j > 0) ? (k + ftoutline.contours[j - 1] + 
1) : k;
                                if (k == 0) m = l;
 
                                /* virtual conic on-curve points */
-                               if (k < npoints[j] - 1) {
+                               if (k < n - 1) {
                                        if (ftoutline.tags[l] == 
FT_Curve_Tag_Conic && ftoutline.tags[l + 1] == FT_Curve_Tag_Conic) {
                                                dx = (ftoutline.points[l].x + 
ftoutline.points[l + 1].x) * scale / 2.0f;
                                                dy = (ftoutline.points[l].y + 
ftoutline.points[l + 1].y) * scale / 2.0f;
@@ -216,7 +214,7 @@ static VChar *freetypechar_to_vchar(FT_Face face, FT_ULong 
charcode, VFontData *
                                        bezt->vec[1][1] = ftoutline.points[l].y 
* scale;
 
                                        /* right handle */
-                                       if (k < (npoints[j] - 1)) {
+                                       if (k < n - 1) {
                                                if (ftoutline.tags[l + 1] == 
FT_Curve_Tag_Cubic) {
                                                        bezt->vec[2][0] = 
ftoutline.points[l + 1].x * scale;
                                                        bezt->vec[2][1] = 
ftoutline.points[l + 1].y * scale;
@@ -273,8 +271,8 @@ static VChar *freetypechar_to_vchar(FT_Face face, FT_ULong 
charcode, VFontData *
                                }
                        }
                }
-               if (npoints) MEM_freeN(npoints);
-               if (onpoints) MEM_freeN(onpoints);
+
+               MEM_freeN(onpoints);
 
                return che;
        }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to