]>
Commit | Line | Data |
---|---|---|
b75a7d8f A |
1 | |
2 | /* | |
b75a7d8f | 3 | * |
46f4442e | 4 | * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved |
b75a7d8f A |
5 | * |
6 | */ | |
7 | ||
8 | #ifndef __LEFONTINSTANCE_H | |
9 | #define __LEFONTINSTANCE_H | |
10 | ||
11 | #include "LETypes.h" | |
73c04bcf A |
12 | /** |
13 | * \file | |
14 | * \brief C++ API: Layout Engine Font Instance object | |
15 | */ | |
b75a7d8f A |
16 | |
17 | U_NAMESPACE_BEGIN | |
18 | ||
19 | /** | |
374ca955 A |
20 | * Instances of this class are used by <code>LEFontInstance::mapCharsToGlyphs</code> and |
21 | * <code>LEFontInstance::mapCharToGlyph</code> to adjust character codes before the character | |
b75a7d8f A |
22 | * to glyph mapping process. Examples of this are filtering out control characters |
23 | * and character mirroring - replacing a character which has both a left and a right | |
24 | * hand form with the opposite form. | |
25 | * | |
73c04bcf | 26 | * @stable ICU 3.2 |
b75a7d8f A |
27 | */ |
28 | class LECharMapper /* not : public UObject because this is an interface/mixin class */ | |
29 | { | |
30 | public: | |
31 | /** | |
32 | * Destructor. | |
73c04bcf | 33 | * @stable ICU 3.2 |
b75a7d8f | 34 | */ |
73c04bcf | 35 | virtual ~LECharMapper(); |
b75a7d8f A |
36 | |
37 | /** | |
38 | * This method does the adjustments. | |
39 | * | |
40 | * @param ch - the input character | |
41 | * | |
42 | * @return the adjusted character | |
43 | * | |
374ca955 | 44 | * @stable ICU 2.8 |
b75a7d8f A |
45 | */ |
46 | virtual LEUnicode32 mapChar(LEUnicode32 ch) const = 0; | |
47 | }; | |
48 | ||
374ca955 A |
49 | /** |
50 | * This is a forward reference to the class which holds the per-glyph | |
51 | * storage. | |
52 | * | |
73c04bcf | 53 | * @stable ICU 3.0 |
374ca955 A |
54 | */ |
55 | class LEGlyphStorage; | |
56 | ||
b75a7d8f A |
57 | /** |
58 | * This is a virtual base class that serves as the interface between a LayoutEngine | |
59 | * and the platform font environment. It allows a LayoutEngine to access font tables, do | |
60 | * character to glyph mapping, and obtain metrics information without knowing any platform | |
61 | * specific details. There are also a few utility methods for converting between points, | |
62 | * pixels and funits. (font design units) | |
63 | * | |
64 | * An instance of an <code>LEFontInstance</code> represents a font at a particular point | |
65 | * size. Each instance can represent either a single physical font, or a composite font. | |
66 | * A composite font is a collection of physical fonts, each of which contains a subset of | |
67 | * the characters contained in the composite font. | |
68 | * | |
69 | * Note: with the exception of <code>getSubFont</code>, the methods in this class only | |
70 | * make sense for a physical font. If you have an <code>LEFontInstance</code> which | |
71 | * represents a composite font you should only call the methods below which have | |
72 | * an <code>LEGlyphID</code>, an <code>LEUnicode</code> or an <code>LEUnicode32</code> | |
73 | * as one of the arguments because these can be used to select a particular subfont. | |
74 | * | |
75 | * Subclasses which implement composite fonts should supply an implementation of these | |
76 | * methods with some default behavior such as returning constant values, or using the | |
77 | * values from the first subfont. | |
78 | * | |
73c04bcf | 79 | * @stable ICU 3.0 |
b75a7d8f A |
80 | */ |
81 | class U_LAYOUT_API LEFontInstance : public UObject | |
82 | { | |
83 | public: | |
84 | ||
85 | /** | |
86 | * This virtual destructor is here so that the subclass | |
87 | * destructors can be invoked through the base class. | |
88 | * | |
374ca955 | 89 | * @stable ICU 2.8 |
b75a7d8f | 90 | */ |
73c04bcf | 91 | virtual ~LEFontInstance(); |
b75a7d8f A |
92 | |
93 | /** | |
94 | * Get a physical font which can render the given text. For composite fonts, | |
95 | * if there is no single physical font which can render all of the text, | |
96 | * return a physical font which can render an initial substring of the text, | |
97 | * and set the <code>offset</code> parameter to the end of that substring. | |
98 | * | |
99 | * Internally, the LayoutEngine works with runs of text all in the same | |
100 | * font and script, so it is best to call this method with text which is | |
101 | * in a single script, passing the script code in as a hint. If you don't | |
102 | * know the script of the text, you can use zero, which is the script code | |
103 | * for characters used in more than one script. | |
104 | * | |
105 | * The default implementation of this method is intended for instances of | |
106 | * <code>LEFontInstance</code> which represent a physical font. It returns | |
107 | * <code>this</code> and indicates that the entire string can be rendered. | |
108 | * | |
109 | * This method will return a valid <code>LEFontInstance</code> unless you | |
110 | * have passed illegal parameters, or an internal error has been encountered. | |
111 | * For composite fonts, it may return the warning <code>LE_NO_SUBFONT_WARNING</code> | |
112 | * to indicate that the returned font may not be able to render all of | |
113 | * the text. Whenever a valid font is returned, the <code>offset</code> parameter | |
114 | * will be advanced by at least one. | |
115 | * | |
116 | * Subclasses which implement composite fonts must override this method. | |
117 | * Where it makes sense, they should use the script code as a hint to render | |
118 | * characters from the COMMON script in the font which is used for the given | |
119 | * script. For example, if the input text is a series of Arabic words separated | |
120 | * by spaces, and the script code passed in is <code>arabScriptCode</code> you | |
121 | * should return the font used for Arabic characters for all of the input text, | |
122 | * including the spaces. If, on the other hand, the input text contains characters | |
123 | * which cannot be rendered by the font used for Arabic characters, but which can | |
124 | * be rendered by another font, you should return that font for those characters. | |
125 | * | |
126 | * @param chars - the array of Unicode characters. | |
127 | * @param offset - a pointer to the starting offset in the text. On exit this | |
128 | * will be set the the limit offset of the text which can be | |
129 | * rendered using the returned font. | |
130 | * @param limit - the limit offset for the input text. | |
131 | * @param script - the script hint. | |
132 | * @param success - set to an error code if the arguments are illegal, or no font | |
133 | * can be returned for some reason. May also be set to | |
134 | * <code>LE_NO_SUBFONT_WARNING</code> if the subfont which | |
135 | * was returned cannot render all of the text. | |
136 | * | |
137 | * @return an <code>LEFontInstance</code> for the sub font which can render the characters, or | |
138 | * <code>NULL</code> if there is an error. | |
139 | * | |
140 | * @see LEScripts.h | |
141 | * | |
73c04bcf | 142 | * @stable ICU 3.2 |
b75a7d8f A |
143 | */ |
144 | virtual const LEFontInstance *getSubFont(const LEUnicode chars[], le_int32 *offset, le_int32 limit, le_int32 script, LEErrorCode &success) const; | |
145 | ||
146 | // | |
147 | // Font file access | |
148 | // | |
149 | ||
150 | /** | |
151 | * This method reads a table from the font. Note that in general, | |
152 | * it only makes sense to call this method on an <code>LEFontInstance</code> | |
153 | * which represents a physical font - i.e. one which has been returned by | |
154 | * <code>getSubFont()</code>. This is because each subfont in a composite font | |
155 | * will have different tables, and there's no way to know which subfont to access. | |
156 | * | |
157 | * Subclasses which represent composite fonts should always return <code>NULL</code>. | |
158 | * | |
159 | * @param tableTag - the four byte table tag. (e.g. 'cmap') | |
160 | * | |
161 | * @return the address of the table in memory, or <code>NULL</code> | |
162 | * if the table doesn't exist. | |
163 | * | |
374ca955 | 164 | * @stable ICU 2.8 |
b75a7d8f A |
165 | */ |
166 | virtual const void *getFontTable(LETag tableTag) const = 0; | |
167 | ||
168 | /** | |
169 | * This method is used to determine if the font can | |
170 | * render the given character. This can usually be done | |
171 | * by looking the character up in the font's character | |
172 | * to glyph mapping. | |
173 | * | |
174 | * The default implementation of this method will return | |
374ca955 | 175 | * <code>TRUE</code> if <code>mapCharToGlyph(ch)</code> |
b75a7d8f A |
176 | * returns a non-zero value. |
177 | * | |
178 | * @param ch - the character to be tested | |
179 | * | |
374ca955 | 180 | * @return <code>TRUE</code> if the font can render ch. |
b75a7d8f | 181 | * |
73c04bcf | 182 | * @stable ICU 3.2 |
b75a7d8f A |
183 | */ |
184 | virtual le_bool canDisplay(LEUnicode32 ch) const; | |
185 | ||
186 | /** | |
187 | * This method returns the number of design units in | |
188 | * the font's EM square. | |
189 | * | |
190 | * @return the number of design units pre EM. | |
191 | * | |
374ca955 | 192 | * @stable ICU 2.8 |
b75a7d8f A |
193 | */ |
194 | virtual le_int32 getUnitsPerEM() const = 0; | |
195 | ||
196 | /** | |
197 | * This method maps an array of character codes to an array of glyph | |
198 | * indices, using the font's character to glyph map. | |
199 | * | |
374ca955 A |
200 | * The default implementation iterates over all of the characters and calls |
201 | * <code>mapCharToGlyph(ch, mapper)</code> on each one. It also handles surrogate | |
202 | * characters, storing the glyph ID for the high surrogate, and a deleted glyph (0xFFFF) | |
203 | * for the low surrogate. | |
204 | * | |
205 | * Most sublcasses will not need to implement this method. | |
206 | * | |
b75a7d8f A |
207 | * @param chars - the character array |
208 | * @param offset - the index of the first character | |
209 | * @param count - the number of characters | |
374ca955 | 210 | * @param reverse - if <code>TRUE</code>, store the glyph indices in reverse order. |
b75a7d8f | 211 | * @param mapper - the character mapper. |
73c04bcf | 212 | * @param filterZeroWidth - <code>TRUE</code> if ZWJ / ZWNJ characters should map to a glyph w/ no contours. |
374ca955 | 213 | * @param glyphStorage - the object which contains the output glyph array |
b75a7d8f A |
214 | * |
215 | * @see LECharMapper | |
216 | * | |
46f4442e | 217 | * @stable ICU 3.6 |
73c04bcf A |
218 | */ |
219 | virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, const LECharMapper *mapper, le_bool filterZeroWidth, LEGlyphStorage &glyphStorage) const; | |
220 | ||
221 | /** | |
222 | * This method maps a single character to a glyph index, using the | |
223 | * font's character to glyph map. The default implementation of this | |
224 | * method calls the mapper, and then calls <code>mapCharToGlyph(mappedCh)</code>. | |
225 | * | |
226 | * @param ch - the character | |
227 | * @param mapper - the character mapper | |
228 | * @param filterZeroWidth - <code>TRUE</code> if ZWJ / ZWNJ characters should map to a glyph w/ no contours. | |
229 | * | |
230 | * @return the glyph index | |
231 | * | |
232 | * @see LECharMapper | |
233 | * | |
46f4442e | 234 | * @stable ICU 3.6 |
b75a7d8f | 235 | */ |
73c04bcf A |
236 | virtual LEGlyphID mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper, le_bool filterZeroWidth) const; |
237 | ||
b75a7d8f A |
238 | /** |
239 | * This method maps a single character to a glyph index, using the | |
240 | * font's character to glyph map. The default implementation of this | |
241 | * method calls the mapper, and then calls <code>mapCharToGlyph(mappedCh)</code>. | |
242 | * | |
243 | * @param ch - the character | |
244 | * @param mapper - the character mapper | |
245 | * | |
246 | * @return the glyph index | |
247 | * | |
248 | * @see LECharMapper | |
249 | * | |
73c04bcf | 250 | * @stable ICU 3.2 |
b75a7d8f A |
251 | */ |
252 | virtual LEGlyphID mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const; | |
253 | ||
254 | /** | |
255 | * This method maps a single character to a glyph index, using the | |
256 | * font's character to glyph map. There is no default implementation | |
257 | * of this method because it requires information about the platform | |
258 | * font implementation. | |
259 | * | |
260 | * @param ch - the character | |
261 | * | |
262 | * @return the glyph index | |
263 | * | |
73c04bcf | 264 | * @stable ICU 3.2 |
b75a7d8f A |
265 | */ |
266 | virtual LEGlyphID mapCharToGlyph(LEUnicode32 ch) const = 0; | |
267 | ||
268 | // | |
269 | // Metrics | |
270 | // | |
271 | ||
272 | /** | |
273 | * This method gets the X and Y advance of a particular glyph, in pixels. | |
274 | * | |
275 | * @param glyph - the glyph index | |
276 | * @param advance - the X and Y pixel values will be stored here | |
277 | * | |
73c04bcf | 278 | * @stable ICU 3.2 |
b75a7d8f A |
279 | */ |
280 | virtual void getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const = 0; | |
281 | ||
282 | /** | |
283 | * This method gets the hinted X and Y pixel coordinates of a particular | |
284 | * point in the outline of the given glyph. | |
285 | * | |
286 | * @param glyph - the glyph index | |
287 | * @param pointNumber - the number of the point | |
288 | * @param point - the point's X and Y pixel values will be stored here | |
289 | * | |
374ca955 | 290 | * @return <code>TRUE</code> if the point coordinates could be stored. |
b75a7d8f | 291 | * |
374ca955 | 292 | * @stable ICU 2.8 |
b75a7d8f A |
293 | */ |
294 | virtual le_bool getGlyphPoint(LEGlyphID glyph, le_int32 pointNumber, LEPoint &point) const = 0; | |
295 | ||
296 | /** | |
297 | * This method returns the width of the font's EM square | |
298 | * in pixels. | |
299 | * | |
300 | * @return the pixel width of the EM square | |
301 | * | |
374ca955 | 302 | * @stable ICU 2.8 |
b75a7d8f A |
303 | */ |
304 | virtual float getXPixelsPerEm() const = 0; | |
305 | ||
306 | /** | |
307 | * This method returns the height of the font's EM square | |
308 | * in pixels. | |
309 | * | |
310 | * @return the pixel height of the EM square | |
311 | * | |
374ca955 | 312 | * @stable ICU 2.8 |
b75a7d8f A |
313 | */ |
314 | virtual float getYPixelsPerEm() const = 0; | |
315 | ||
316 | /** | |
317 | * This method converts font design units in the | |
318 | * X direction to points. | |
319 | * | |
320 | * @param xUnits - design units in the X direction | |
321 | * | |
322 | * @return points in the X direction | |
323 | * | |
73c04bcf | 324 | * @stable ICU 3.2 |
b75a7d8f A |
325 | */ |
326 | virtual float xUnitsToPoints(float xUnits) const; | |
327 | ||
328 | /** | |
329 | * This method converts font design units in the | |
330 | * Y direction to points. | |
331 | * | |
332 | * @param yUnits - design units in the Y direction | |
333 | * | |
334 | * @return points in the Y direction | |
335 | * | |
73c04bcf | 336 | * @stable ICU 3.2 |
b75a7d8f A |
337 | */ |
338 | virtual float yUnitsToPoints(float yUnits) const; | |
339 | ||
340 | /** | |
341 | * This method converts font design units to points. | |
342 | * | |
343 | * @param units - X and Y design units | |
344 | * @param points - set to X and Y points | |
345 | * | |
73c04bcf | 346 | * @stable ICU 3.2 |
b75a7d8f A |
347 | */ |
348 | virtual void unitsToPoints(LEPoint &units, LEPoint &points) const; | |
349 | ||
350 | /** | |
351 | * This method converts pixels in the | |
352 | * X direction to font design units. | |
353 | * | |
354 | * @param xPixels - pixels in the X direction | |
355 | * | |
356 | * @return font design units in the X direction | |
357 | * | |
73c04bcf | 358 | * @stable ICU 3.2 |
b75a7d8f A |
359 | */ |
360 | virtual float xPixelsToUnits(float xPixels) const; | |
361 | ||
362 | /** | |
363 | * This method converts pixels in the | |
364 | * Y direction to font design units. | |
365 | * | |
366 | * @param yPixels - pixels in the Y direction | |
367 | * | |
368 | * @return font design units in the Y direction | |
369 | * | |
73c04bcf | 370 | * @stable ICU 3.2 |
b75a7d8f A |
371 | */ |
372 | virtual float yPixelsToUnits(float yPixels) const; | |
373 | ||
374 | /** | |
375 | * This method converts pixels to font design units. | |
376 | * | |
377 | * @param pixels - X and Y pixel | |
378 | * @param units - set to X and Y font design units | |
379 | * | |
73c04bcf | 380 | * @stable ICU 3.2 |
b75a7d8f A |
381 | */ |
382 | virtual void pixelsToUnits(LEPoint &pixels, LEPoint &units) const; | |
383 | ||
384 | /** | |
385 | * Get the X scale factor from the font's transform. The default | |
386 | * implementation of <code>transformFunits()</code> will call this method. | |
387 | * | |
388 | * @return the X scale factor. | |
389 | * | |
390 | * | |
391 | * @see transformFunits | |
392 | * | |
73c04bcf | 393 | * @stable ICU 3.2 |
b75a7d8f A |
394 | */ |
395 | virtual float getScaleFactorX() const = 0; | |
396 | ||
397 | /** | |
398 | * Get the Y scale factor from the font's transform. The default | |
399 | * implementation of <code>transformFunits()</code> will call this method. | |
400 | * | |
401 | * @return the Yscale factor. | |
402 | * | |
403 | * @see transformFunits | |
404 | * | |
73c04bcf | 405 | * @stable ICU 3.2 |
b75a7d8f A |
406 | */ |
407 | virtual float getScaleFactorY() const = 0; | |
408 | ||
409 | /** | |
410 | * This method transforms an X, Y point in font design units to a | |
411 | * pixel coordinate, applying the font's transform. The default | |
412 | * implementation of this method calls <code>getScaleFactorX()</code> | |
413 | * and <code>getScaleFactorY()</code>. | |
414 | * | |
415 | * @param xFunits - the X coordinate in font design units | |
416 | * @param yFunits - the Y coordinate in font design units | |
417 | * @param pixels - the tranformed co-ordinate in pixels | |
418 | * | |
419 | * @see getScaleFactorX | |
420 | * @see getScaleFactorY | |
421 | * | |
73c04bcf | 422 | * @stable ICU 3.2 |
b75a7d8f A |
423 | */ |
424 | virtual void transformFunits(float xFunits, float yFunits, LEPoint &pixels) const; | |
425 | ||
426 | /** | |
427 | * This is a convenience method used to convert | |
428 | * values in a 16.16 fixed point format to floating point. | |
429 | * | |
430 | * @param fixed - the fixed point value | |
431 | * | |
432 | * @return the floating point value | |
433 | * | |
374ca955 | 434 | * @stable ICU 2.8 |
b75a7d8f | 435 | */ |
73c04bcf | 436 | static inline float fixedToFloat(le_int32 fixed); |
b75a7d8f A |
437 | |
438 | /** | |
439 | * This is a convenience method used to convert | |
440 | * floating point values to 16.16 fixed point format. | |
441 | * | |
442 | * @param theFloat - the floating point value | |
443 | * | |
444 | * @return the fixed point value | |
445 | * | |
374ca955 | 446 | * @stable ICU 2.8 |
b75a7d8f | 447 | */ |
73c04bcf | 448 | static inline le_int32 floatToFixed(float theFloat); |
b75a7d8f A |
449 | |
450 | // | |
451 | // These methods won't ever be called by the LayoutEngine, | |
452 | // but are useful for clients of <code>LEFontInstance</code> who | |
453 | // need to render text. | |
454 | // | |
455 | ||
456 | /** | |
457 | * Get the font's ascent. | |
458 | * | |
459 | * @return the font's ascent, in points. This value | |
460 | * will always be positive. | |
461 | * | |
73c04bcf | 462 | * @stable ICU 3.2 |
b75a7d8f A |
463 | */ |
464 | virtual le_int32 getAscent() const = 0; | |
465 | ||
466 | /** | |
467 | * Get the font's descent. | |
468 | * | |
469 | * @return the font's descent, in points. This value | |
470 | * will always be positive. | |
471 | * | |
73c04bcf | 472 | * @stable ICU 3.2 |
b75a7d8f A |
473 | */ |
474 | virtual le_int32 getDescent() const = 0; | |
475 | ||
476 | /** | |
477 | * Get the font's leading. | |
478 | * | |
479 | * @return the font's leading, in points. This value | |
480 | * will always be positive. | |
481 | * | |
73c04bcf | 482 | * @stable ICU 3.2 |
b75a7d8f A |
483 | */ |
484 | virtual le_int32 getLeading() const = 0; | |
485 | ||
486 | /** | |
487 | * Get the line height required to display text in | |
488 | * this font. The default implementation of this method | |
489 | * returns the sum of the ascent, descent, and leading. | |
490 | * | |
491 | * @return the line height, in points. This vaule will | |
492 | * always be positive. | |
493 | * | |
73c04bcf | 494 | * @stable ICU 3.2 |
b75a7d8f A |
495 | */ |
496 | virtual le_int32 getLineHeight() const; | |
497 | ||
498 | /** | |
499 | * ICU "poor man's RTTI", returns a UClassID for the actual class. | |
500 | * | |
73c04bcf | 501 | * @stable ICU 3.2 |
b75a7d8f | 502 | */ |
374ca955 | 503 | virtual UClassID getDynamicClassID() const; |
b75a7d8f A |
504 | |
505 | /** | |
506 | * ICU "poor man's RTTI", returns a UClassID for this class. | |
507 | * | |
73c04bcf | 508 | * @stable ICU 3.2 |
b75a7d8f | 509 | */ |
374ca955 | 510 | static UClassID getStaticClassID(); |
b75a7d8f | 511 | |
b75a7d8f A |
512 | }; |
513 | ||
b75a7d8f A |
514 | inline float LEFontInstance::fixedToFloat(le_int32 fixed) |
515 | { | |
516 | return (float) (fixed / 65536.0); | |
517 | } | |
518 | ||
519 | inline le_int32 LEFontInstance::floatToFixed(float theFloat) | |
520 | { | |
521 | return (le_int32) (theFloat * 65536.0); | |
522 | } | |
523 | ||
b75a7d8f A |
524 | U_NAMESPACE_END |
525 | #endif | |
526 | ||
527 |