File 0008-use-design-metrics-in-eblc-instead-of-calculated-met.patch of Package fonttosfnt.20912

From 9dad916c49ba0959c039dd4071083d5b5226c582 Mon Sep 17 00:00:00 2001
From: Christopher Zimmermann <madroach@gmerlin.de>
Date: Sun, 12 Jul 2020 15:12:59 +0200
Subject: [PATCH 08/14] use design metrics in eblc instead of calculated
 metrics

This will probably not work for a font providing multiple strikes.
But .bdf fonts don't provide multiple strikes (or do they?!?)
I don't know about .pcf fonts, but I would recommend against running fonttosfnt
on .pcf fonts because bdf2pcf seems to loose some attributes during conversion.
---
 fonttosfnt.h |  2 +-
 struct.c     | 25 +++----------------------
 write.c      | 42 +++++++++++++++---------------------------
 3 files changed, 19 insertions(+), 50 deletions(-)

diff --git a/fonttosfnt.h b/fonttosfnt.h
index a05e036..9869129 100644
--- a/fonttosfnt.h
+++ b/fonttosfnt.h
@@ -167,7 +167,7 @@ CmapPtr makeCmap(FontPtr);
 int findIndex(CmapPtr, int);
 int findCode(CmapPtr, int);
 BitmapPtr strikeBitmapIndex(StrikePtr, CmapPtr, int);
-void strikeMetrics(StrikePtr, int*, int*, int*, int*, int*);
+int strikeMaxWidth(StrikePtr);
 int glyphMetrics(FontPtr, int, int*, int*, int*, int*, int*);
 void fontMetrics(FontPtr, MetricsPtr);
 int maxIndex(CmapPtr);
diff --git a/struct.c b/struct.c
index 1c14931..0317673 100644
--- a/struct.c
+++ b/struct.c
@@ -425,19 +425,12 @@ strikeBitmapIndex(StrikePtr strike, CmapPtr cmap, int index)
     return STRIKE_BITMAP(strike, code);
 }
 
-void
-strikeMetrics(StrikePtr strike,
-              int *width_max_return, 
-              int *x_min_return, int *y_min_return,
-              int *x_max_return, int *y_max_return)
+int
+strikeMaxWidth(StrikePtr strike)
 {
     BitmapPtr bitmap;
     int i;
     int width_max = 0;
-    int x_min = 10000;
-    int y_min = 10000;
-    int x_max = -10000;
-    int y_max = -10000;
 
     for(i = 0; i < FONT_CODES; i++) {
         bitmap = STRIKE_BITMAP(strike, i);
@@ -445,21 +438,9 @@ strikeMetrics(StrikePtr strike,
             continue;
         if(bitmap->advanceWidth > width_max)
             width_max = bitmap->advanceWidth;
-        if(bitmap->horiBearingX < x_min)
-            x_min = bitmap->horiBearingX;
-        if(bitmap->horiBearingY > y_max)
-            y_max = bitmap->horiBearingY;
-        if(bitmap->horiBearingX + bitmap->width > x_max)
-            x_max = bitmap->horiBearingX + bitmap->width;
-        if(bitmap->horiBearingY - bitmap->height < y_min)
-            y_min = bitmap->horiBearingY - bitmap->height;
     }
 
-    if(width_max_return) *width_max_return = width_max;
-    if(x_min_return) *x_min_return = x_min;
-    if(y_min_return) *y_min_return = y_min;
-    if(x_max_return) *x_max_return = x_max;
-    if(y_max_return) *y_max_return = y_max;
+    return width_max;
 }
 
 int
diff --git a/write.c b/write.c
index 8f54625..99d0aba 100644
--- a/write.c
+++ b/write.c
@@ -550,27 +550,6 @@ writeEBDT(FILE* out, FontPtr font)
     return 0;
 }
 
-static int
-writeSbitLineMetrics(FILE *out, StrikePtr strike, int num, int den)
-{
-    int width_max, x_min, y_min, x_max, y_max;
-    strikeMetrics(strike, &width_max, &x_min, &y_min, &x_max, &y_max);
-
-    writeCHAR(out, y_max);      /* ascender */
-    writeCHAR(out, y_min);      /* descender */
-    writeBYTE(out, width_max);  /* widthMax */
-    writeCHAR(out, num);          /* caretSlopeNumerator */
-    writeCHAR(out, den);          /* caretSlopeDenominator */
-    writeCHAR(out, 0);          /* caretOffset */
-    writeCHAR(out, 0);          /* minOriginSB */
-    writeCHAR(out, 0);          /* minAdvanceSB */
-    writeCHAR(out, 0);          /* maxBeforeBL */
-    writeCHAR(out, 0);          /* minAfterBL */
-    writeCHAR(out, 0);          /* pad1 */
-    writeCHAR(out, 0);          /* pad2 */
-    return 0;
-}
-
 static int 
 writeEBLC(FILE* out, FontPtr font)
 {
@@ -600,8 +579,20 @@ writeEBLC(FILE* out, FontPtr font)
         writeULONG(out, 0xDEADFACE); /* indexTablesSize */
         writeULONG(out, 0xDEADFACE); /* numberOfIndexSubTables */
         writeULONG(out, 0);     /* colorRef */
-        writeSbitLineMetrics(out, strike, num, den);
-        writeSbitLineMetrics(out, strike, num, den);
+	for (i = 0; i <= 1; i++) {
+	  writeCHAR(out, font->pxMetrics.ascent);	/* ascender */
+	  writeCHAR(out, -font->pxMetrics.descent);	/* descender */
+	  writeBYTE(out, strikeMaxWidth(strike));	/* widthMax */
+	  writeCHAR(out, num);				/* caretSlopeNumerator */
+	  writeCHAR(out, den);				/* caretSlopeDenominator */
+	  writeCHAR(out, 0);				/* caretOffset */
+	  writeCHAR(out, 0);				/* minOriginSB */
+	  writeCHAR(out, 0);				/* minAdvanceSB */
+	  writeCHAR(out, 0);				/* maxBeforeBL */
+	  writeCHAR(out, 0);				/* minAfterBL */
+	  writeCHAR(out, 0);				/* pad1 */
+	  writeCHAR(out, 0);				/* pad2 */
+	}
         writeUSHORT(out, 0);    /* startGlyphIndex */
         writeUSHORT(out, 0xFFFD); /* endGlyphIndex */
         writeBYTE(out, strike->sizeX); /* ppemX */
@@ -649,9 +640,6 @@ writeEBLC(FILE* out, FontPtr font)
     /* actual indexSubTables */
     strike = font->strikes;
     while(strike) {
-        int vertAdvance, y_min, y_max;
-        strikeMetrics(strike, NULL, NULL, &y_min, NULL, &y_max);
-        vertAdvance = y_max - y_min;
         table = strike->indexSubTables;
         while(table) {
             int location;
@@ -719,7 +707,7 @@ writeEBLC(FILE* out, FontPtr font)
                 writeBYTE(out, bitmap->advanceWidth);
                 writeCHAR(out, bitmap->horiBearingX); /* vertBearingX */
                 writeCHAR(out, bitmap->horiBearingY); /* vertBearingY */
-                writeBYTE(out, vertAdvance); /* vertAdvance */
+                writeBYTE(out, font->metrics.maxAwidth); /* vertAdvance */
             } else {
                 for(i = table->firstGlyphIndex; 
                     i <= table->lastGlyphIndex; i++) {
-- 
2.28.0

openSUSE Build Service is sponsored by