@@ -90,16 +90,11 @@ namespace
9090 CAGE_THROW_ERROR (Exception, " unknown freetype error code" );
9191 }
9292
93- msdfgen::Shape cursorShape ( )
93+ void setSize (uint32 nominalSize )
9494 {
95- const msdfgen::Point2 points[4 ] = { { 0 , 0 }, { 0 , 10 }, { 1 , 10 }, { 1 , 0 } };
96- msdfgen::Shape shape;
97- msdfgen::Contour &c = shape.addContour ();
98- c.addEdge (msdfgen::EdgeHolder (points[0 ], points[1 ]));
99- c.addEdge (msdfgen::EdgeHolder (points[1 ], points[2 ]));
100- c.addEdge (msdfgen::EdgeHolder (points[2 ], points[3 ]));
101- c.addEdge (msdfgen::EdgeHolder (points[3 ], points[0 ]));
102- return shape;
95+ CALL (FT_Set_Pixel_Sizes, face, nominalSize, nominalSize);
96+ header.nominalSize = nominalSize;
97+ header.nominalScale = 1.0 / nominalSize / 64 ;
10398 }
10499
105100 void loadGlyphs ()
@@ -123,6 +118,45 @@ namespace
123118 CAGE_LOG (SeverityEnum::Info, " assetProcessor" , Stringizer () + " non-empty glyphs count: " + header.glyphsCount );
124119 }
125120
121+ void computeLineProperties ()
122+ {
123+ CAGE_LOG (SeverityEnum::Info, " assetProcessor" , " compute line properties" );
124+ Real maxAscender, minDescender;
125+ for (char c : " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" )
126+ {
127+ CALL (FT_Load_Char, face, c, FT_LOAD_DEFAULT);
128+ const FT_Glyph_Metrics &glm = face->glyph ->metrics ;
129+ maxAscender = max (maxAscender, float (glm.horiBearingY ) * header.nominalScale );
130+ minDescender = min (minDescender, (float (glm.horiBearingY ) - float (glm.height )) * header.nominalScale );
131+ }
132+ header.lineHeight = maxAscender - minDescender;
133+ header.lineOffset = minDescender * 0.5 - maxAscender;
134+ CAGE_LOG (SeverityEnum::Note, " assetProcessor" , Stringizer () + " line offset: " + header.lineOffset );
135+ CAGE_LOG (SeverityEnum::Note, " assetProcessor" , Stringizer () + " line height: " + header.lineHeight );
136+ }
137+
138+ msdfgen::Shape cursorShape ()
139+ {
140+ const msdfgen::Point2 points[4 ] = { { 0 , 0 }, { 0 , 10 }, { 1 , 10 }, { 1 , 0 } };
141+ msdfgen::Shape shape;
142+ msdfgen::Contour &c = shape.addContour ();
143+ c.addEdge (msdfgen::EdgeHolder (points[0 ], points[1 ]));
144+ c.addEdge (msdfgen::EdgeHolder (points[1 ], points[2 ]));
145+ c.addEdge (msdfgen::EdgeHolder (points[2 ], points[3 ]));
146+ c.addEdge (msdfgen::EdgeHolder (points[3 ], points[0 ]));
147+ return shape;
148+ }
149+
150+ void addCursorGlyph ()
151+ {
152+ CAGE_LOG (SeverityEnum::Info, " assetProcessor" , " adding cursor glyph" );
153+ Glyph g;
154+ g.data .glyphId = uint32 (-2 );
155+ g.shape = cursorShape ();
156+ glyphs.push_back (std::move (g));
157+ header.glyphsCount ++;
158+ }
159+
126160 void createGlyphsImages ()
127161 {
128162 CAGE_LOG (SeverityEnum::Info, " assetProcessor" , " create glyphs images" );
@@ -187,23 +221,6 @@ namespace
187221 images.push_back (std::move (image));
188222 }
189223
190- void computeLineProperties ()
191- {
192- CAGE_LOG (SeverityEnum::Info, " assetProcessor" , " compute line properties" );
193- Real maxAscender, minDescender;
194- for (char c : " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" )
195- {
196- CALL (FT_Load_Char, face, c, FT_LOAD_DEFAULT);
197- const FT_Glyph_Metrics &glm = face->glyph ->metrics ;
198- maxAscender = max (maxAscender, float (glm.horiBearingY ) * header.nominalScale );
199- minDescender = min (minDescender, (float (glm.horiBearingY ) - float (glm.height )) * header.nominalScale );
200- }
201- header.lineHeight = maxAscender - minDescender;
202- header.lineOffset = minDescender * 0.5 - maxAscender;
203- CAGE_LOG (SeverityEnum::Note, " assetProcessor" , Stringizer () + " line offset: " + header.lineOffset );
204- CAGE_LOG (SeverityEnum::Note, " assetProcessor" , Stringizer () + " line height: " + header.lineHeight );
205- }
206-
207224 void exportData ()
208225 {
209226 CAGE_LOG (SeverityEnum::Info, " assetProcessor" , " exporting data" );
@@ -265,13 +282,6 @@ namespace
265282 glyphs.clear ();
266283 images.clear ();
267284 }
268-
269- void setSize (uint32 nominalSize)
270- {
271- CALL (FT_Set_Pixel_Sizes, face, nominalSize, nominalSize);
272- header.nominalSize = nominalSize;
273- header.nominalScale = 1.0 / nominalSize / 64 ;
274- }
275285}
276286
277287void processFont ()
@@ -287,9 +297,10 @@ void processFont()
287297 CAGE_LOG (SeverityEnum::Info, " assetProcessor" , Stringizer () + " units per EM: " + face->units_per_EM );
288298 setSize (40 );
289299 loadGlyphs ();
300+ computeLineProperties ();
301+ addCursorGlyph ();
290302 createGlyphsImages ();
291303 createImage ();
292- computeLineProperties ();
293304 exportData ();
294305 printDebugData ();
295306 clearAll ();
0 commit comments