• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  **********************************************************************
3  *   Copyright (C) 1998-2010, International Business Machines
4  *   Corporation and others.  All Rights Reserved.
5  **********************************************************************
6  */
7 
8 #ifndef __LEGLYPHSTORAGE_H
9 #define __LEGLYPHSTORAGE_H
10 
11 #include "LETypes.h"
12 #include "LEInsertionList.h"
13 
14 /**
15  * \file
16  * \brief C++ API: This class encapsulates the per-glyph storage used by the ICU LayoutEngine.
17  */
18 
19 U_NAMESPACE_BEGIN
20 
21 /**
22  * This class encapsulates the per-glyph storage used by the ICU LayoutEngine.
23  * For each glyph it holds the glyph ID, the index of the backing store character
24  * which produced the glyph, the X and Y position of the glyph and an auxillary data
25  * pointer.
26  *
27  * The storage is growable using the <code>LEInsertionList</code> class.
28  *
29  *
30  * @see LEInsertionList.h
31  *
32  * @stable ICU 3.6
33  */
34 class U_LAYOUT_API LEGlyphStorage : public UObject, protected LEInsertionCallback
35 {
36 private:
37     /**
38      * The number of entries in the per-glyph arrays.
39      *
40      * @internal
41      */
42     le_int32   fGlyphCount;
43 
44     /**
45      * The glyph ID array.
46      *
47      * @internal
48      */
49     LEGlyphID *fGlyphs;
50 
51     /**
52      * The char indices array.
53      *
54      * @internal
55      */
56     le_int32  *fCharIndices;
57 
58     /**
59      * The glyph positions array.
60      *
61      * @internal
62      */
63     float     *fPositions;
64 
65     /**
66      * The auxillary data array.
67      *
68      * @internal
69      */
70     le_uint32 *fAuxData;
71 
72 
73     /**
74      * The insertion list, used to grow the above arrays.
75      *
76      * @internal
77      */
78     LEInsertionList *fInsertionList;
79 
80     /**
81      * The source index while growing the data arrays.
82      *
83      * @internal
84      */
85     le_int32 fSrcIndex;
86 
87     /**
88      * The destination index used while growing the data arrays.
89      *
90      * @internal
91      */
92     le_int32 fDestIndex;
93 
94 protected:
95     /**
96      * This implements <code>LEInsertionCallback</code>. The <code>LEInsertionList</code>
97      * will call this method once for each insertion.
98      *
99      * @param atPosition the position of the insertion
100      * @param count the number of glyphs being inserted
101      * @param newGlyphs the address of the new glyph IDs
102      *
103      * @return <code>true</code> if <code>LEInsertionList</code> should stop
104      *         processing the insertion list after this insertion.
105      *
106      * @see LEInsertionList.h
107      *
108      * @stable ICU 3.0
109      */
110     virtual le_bool applyInsertion(le_int32 atPosition, le_int32 count, LEGlyphID newGlyphs[]);
111 
112 public:
113 
114     /**
115      * Allocates an empty <code>LEGlyphStorage</code> object. You must call
116      * <code>allocateGlyphArray, allocatePositions and allocateAuxData</code>
117      * to allocate the data.
118      *
119      * @stable ICU 3.0
120      */
121     LEGlyphStorage();
122 
123     /**
124      * The destructor. This will deallocate all of the arrays.
125      *
126      * @stable ICU 3.0
127      */
128     ~LEGlyphStorage();
129 
130     /**
131      * This method returns the number of glyphs in the glyph array.
132      *
133      * @return the number of glyphs in the glyph array
134      *
135      * @stable ICU 3.0
136      */
137     inline le_int32 getGlyphCount() const;
138 
139     /**
140      * This method copies the glyph array into a caller supplied array.
141      * The caller must ensure that the array is large enough to hold all
142      * the glyphs.
143      *
144      * @param glyphs - the destiniation glyph array
145      * @param success - set to an error code if the operation fails
146      *
147      * @stable ICU 3.0
148      */
149     void getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const;
150 
151     /**
152      * This method copies the glyph array into a caller supplied array,
153      * ORing in extra bits. (This functionality is needed by the JDK,
154      * which uses 32 bits pre glyph idex, with the high 16 bits encoding
155      * the composite font slot number)
156      *
157      * @param glyphs - the destination (32 bit) glyph array
158      * @param extraBits - this value will be ORed with each glyph index
159      * @param success - set to an error code if the operation fails
160      *
161      * @stable ICU 3.0
162      */
163     void getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const;
164 
165     /**
166      * This method copies the character index array into a caller supplied array.
167      * The caller must ensure that the array is large enough to hold a
168      * character index for each glyph.
169      *
170      * @param charIndices - the destiniation character index array
171      * @param success - set to an error code if the operation fails
172      *
173      * @stable ICU 3.0
174      */
175     void getCharIndices(le_int32 charIndices[], LEErrorCode &success) const;
176 
177     /**
178      * This method copies the character index array into a caller supplied array.
179      * The caller must ensure that the array is large enough to hold a
180      * character index for each glyph.
181      *
182      * @param charIndices - the destiniation character index array
183      * @param indexBase - an offset which will be added to each index
184      * @param success - set to an error code if the operation fails
185      *
186      * @stable ICU 3.0
187      */
188     void getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const;
189 
190     /**
191      * This method copies the position array into a caller supplied array.
192      * The caller must ensure that the array is large enough to hold an
193      * X and Y position for each glyph, plus an extra X and Y for the
194      * advance of the last glyph.
195      *
196      * @param positions - the destiniation position array
197      * @param success - set to an error code if the operation fails
198      *
199      * @stable ICU 3.0
200      */
201     void getGlyphPositions(float positions[], LEErrorCode &success) const;
202 
203     /**
204      * This method returns the X and Y position of the glyph at
205      * the given index.
206      *
207      * Input parameters:
208      * @param glyphIndex - the index of the glyph
209      *
210      * Output parameters:
211      * @param x - the glyph's X position
212      * @param y - the glyph's Y position
213      * @param success - set to an error code if the operation fails
214      *
215      * @stable ICU 3.0
216      */
217     void getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const;
218 
219     /**
220      * This method allocates the glyph array, the char indices array and the insertion list. You
221      * must call this method before using the object. This method also initializes the char indices
222      * array.
223      *
224      * @param initialGlyphCount the initial size of the glyph and char indices arrays.
225      * @param rightToLeft <code>true</code> if the original input text is right to left.
226      * @param success set to an error code if the storage cannot be allocated of if the initial
227      *        glyph count is not positive.
228      *
229      * @stable ICU 3.0
230      */
231     void allocateGlyphArray(le_int32 initialGlyphCount, le_bool rightToLeft, LEErrorCode &success);
232 
233     /**
234      * This method allocates the storage for the glyph positions. It allocates one extra X, Y
235      * position pair for the position just after the last glyph.
236      *
237      * @param success set to an error code if the positions array cannot be allocated.
238      *
239      * @return the number of X, Y position pairs allocated.
240      *
241      * @stable ICU 3.0
242      */
243     le_int32 allocatePositions(LEErrorCode &success);
244 
245     /**
246      * This method allocates the storage for the auxillary glyph data.
247      *
248      * @param success set to an error code if the aulillary data array cannot be allocated.
249      *
250      * @return the size of the auxillary data array.
251      *
252      * @stable ICU 3.6
253      */
254     le_int32 allocateAuxData(LEErrorCode &success);
255 
256     /**
257      * Copy the entire auxillary data array.
258      *
259      * @param auxData the auxillary data array will be copied to this address
260      * @param success set to an error code if the data cannot be copied
261      *
262      * @stable ICU 3.6
263      */
264     void getAuxData(le_uint32 auxData[], LEErrorCode &success) const;
265 
266     /**
267      * Get the glyph ID for a particular glyph.
268      *
269      * @param glyphIndex the index into the glyph array
270      * @param success set to an error code if the glyph ID cannot be retrieved.
271      *
272      * @return the glyph ID
273      *
274      * @stable ICU 3.0
275      */
276     LEGlyphID getGlyphID(le_int32 glyphIndex, LEErrorCode &success) const;
277 
278     /**
279      * Get the char index for a particular glyph.
280      *
281      * @param glyphIndex the index into the glyph array
282      * @param success set to an error code if the char index cannot be retrieved.
283      *
284      * @return the character index
285      *
286      * @stable ICU 3.0
287      */
288     le_int32  getCharIndex(le_int32 glyphIndex, LEErrorCode &success) const;
289 
290 
291     /**
292      * Get the auxillary data for a particular glyph.
293      *
294      * @param glyphIndex the index into the glyph array
295      * @param success set to an error code if the auxillary data cannot be retrieved.
296      *
297      * @return the auxillary data
298      *
299      * @stable ICU 3.6
300      */
301     le_uint32 getAuxData(le_int32 glyphIndex, LEErrorCode &success) const;
302 
303     /**
304      * This operator allows direct access to the glyph array
305      * using the index operator.
306      *
307      * @param glyphIndex the index into the glyph array
308      *
309      * @return a reference to the given location in the glyph array
310      *
311      * @stable ICU 3.0
312      */
313     inline LEGlyphID &operator[](le_int32 glyphIndex) const;
314 
315     /**
316      * Call this method to replace a single glyph in the glyph array
317      * with multiple glyphs. This method uses the <code>LEInsertionList</code>
318      * to do the insertion. It returns the address of storage where the new
319      * glyph IDs can be stored. They will not actually be inserted into the
320      * glyph array until <code>applyInsertions</code> is called.
321      *
322      * @param atIndex the index of the glyph to be replaced
323      * @param insertCount the number of glyphs to replace it with
324      * @param success set to an error code if the auxillary data cannot be retrieved.
325      *
326      * @return the address at which to store the replacement glyphs.
327      *
328      * @see LEInsertionList.h
329      *
330      * @stable ICU 4.2
331      */
332     LEGlyphID *insertGlyphs(le_int32 atIndex, le_int32 insertCount, LEErrorCode& success);
333 
334     /**
335      * Call this method to replace a single glyph in the glyph array
336      * with multiple glyphs. This method uses the <code>LEInsertionList</code>
337      * to do the insertion. It returns the address of storage where the new
338      * glyph IDs can be stored. They will not actually be inserted into the
339      * glyph array until <code>applyInsertions</code> is called.
340      *
341      * Note: Don't use this version, use the other version of this function which has an error code.
342      *
343      * @param atIndex the index of the glyph to be replaced
344      * @param insertCount the number of glyphs to replace it with
345      *
346      * @return the address at which to store the replacement glyphs.
347      *
348      * @see LEInsertionList.h
349      *
350      * @stable ICU 3.0
351      */
352     LEGlyphID *insertGlyphs(le_int32 atIndex, le_int32 insertCount);
353 
354     /**
355      * This method is used to reposition glyphs during Indic v2 processing.  It moves
356      * all of the relevant glyph information ( glyph, indices, positions, and auxData ),
357      * from the source position to the target position, and also allows for a marker bit
358      * to be set in the target glyph's auxData so that it won't be reprocessed later in the
359      * cycle.
360      *
361      * @param fromPosition - position of the glyph to be moved
362      * @param toPosition - target position of the glyph
363      * @param marker marker bit
364      *
365      * @stable ICU 4.2
366      */
367     void moveGlyph(le_int32 fromPosition, le_int32 toPosition, le_uint32 marker);
368 
369     /**
370      * This method causes all of the glyph insertions recorded by
371      * <code>insertGlyphs</code> to be applied to the glyph array. The
372      * new slots in the char indices and the auxillary data arrays
373      * will be filled in with the values for the glyph being replaced.
374      *
375      * @return the new size of the glyph array
376      *
377      * @see LEInsertionList.h
378      *
379      * @stable ICU 3.0
380      */
381     le_int32 applyInsertions();
382 
383     /**
384      * Set the glyph ID for a particular glyph.
385      *
386      * @param glyphIndex the index of the glyph
387      * @param glyphID the new glyph ID
388      * @param success will be set to an error code if the glyph ID cannot be set.
389      *
390      * @stable ICU 3.0
391      */
392     void setGlyphID(le_int32 glyphIndex, LEGlyphID glyphID, LEErrorCode &success);
393 
394     /**
395      * Set the char index for a particular glyph.
396      *
397      * @param glyphIndex the index of the glyph
398      * @param charIndex the new char index
399      * @param success will be set to an error code if the char index cannot be set.
400      *
401      * @stable ICU 3.0
402      */
403     void setCharIndex(le_int32 glyphIndex, le_int32 charIndex, LEErrorCode &success);
404 
405     /**
406      * Set the X, Y position for a particular glyph.
407      *
408      * @param glyphIndex the index of the glyph
409      * @param x the new X position
410      * @param y the new Y position
411      * @param success will be set to an error code if the position cannot be set.
412      *
413      * @stable ICU 3.0
414      */
415     void setPosition(le_int32 glyphIndex, float x, float y, LEErrorCode &success);
416 
417     /**
418      * Adjust the X, Y position for a particular glyph.
419      *
420      * @param glyphIndex the index of the glyph
421      * @param xAdjust the adjustment to the glyph's X position
422      * @param yAdjust the adjustment to the glyph's Y position
423      * @param success will be set to an error code if the glyph's position cannot be adjusted.
424      *
425      * @stable ICU 3.0
426      */
427     void adjustPosition(le_int32 glyphIndex, float xAdjust, float yAdjust, LEErrorCode &success);
428 
429     /**
430      * Set the auxillary data for a particular glyph.
431      *
432      * @param glyphIndex the index of the glyph
433      * @param auxData the new auxillary data
434      * @param success will be set to an error code if the auxillary data cannot be set.
435      *
436      * @stable ICU 3.6
437      */
438     void setAuxData(le_int32 glyphIndex, le_uint32 auxData, LEErrorCode &success);
439 
440     /**
441      * Delete the glyph array and replace it with the one
442      * in <code>from</code>. Set the glyph array pointer
443      * in <code>from</code> to <code>NULL</code>.
444      *
445      * @param from the <code>LEGlyphStorage</code> object from which
446      *             to get the new glyph array.
447      *
448      * @stable ICU 3.0
449      */
450     void adoptGlyphArray(LEGlyphStorage &from);
451 
452     /**
453      * Delete the char indices array and replace it with the one
454      * in <code>from</code>. Set the char indices array pointer
455      * in <code>from</code> to <code>NULL</code>.
456      *
457      * @param from the <code>LEGlyphStorage</code> object from which
458      *             to get the new char indices array.
459      *
460      * @stable ICU 3.0
461      */
462     void adoptCharIndicesArray(LEGlyphStorage &from);
463 
464     /**
465      * Delete the position array and replace it with the one
466      * in <code>from</code>. Set the position array pointer
467      * in <code>from</code> to <code>NULL</code>.
468      *
469      * @param from the <code>LEGlyphStorage</code> object from which
470      *             to get the new position array.
471      *
472      * @stable ICU 3.0
473      */
474     void adoptPositionArray(LEGlyphStorage &from);
475 
476     /**
477      * Delete the auxillary data array and replace it with the one
478      * in <code>from</code>. Set the auxillary data array pointer
479      * in <code>from</code> to <code>NULL</code>.
480      *
481      * @param from the <code>LEGlyphStorage</code> object from which
482      *             to get the new auxillary data array.
483      *
484      * @stable ICU 3.0
485      */
486     void adoptAuxDataArray(LEGlyphStorage &from);
487 
488     /**
489      * Change the glyph count of this object to be the same
490      * as the one in <code>from</code>.
491      *
492      * @param from the <code>LEGlyphStorage</code> object from which
493      *             to get the new glyph count.
494      *
495      * @stable ICU 3.0
496      */
497     void adoptGlyphCount(LEGlyphStorage &from);
498 
499     /**
500      * Change the glyph count of this object to the given value.
501      *
502      * @param newGlyphCount the new glyph count.
503      *
504      * @stable ICU 3.0
505      */
506     void adoptGlyphCount(le_int32 newGlyphCount);
507 
508     /**
509      * This method frees the glyph, character index, position  and
510      * auxillary data arrays so that the LayoutEngine can be reused
511      * to layout a different characer array. (This method is also called
512      * by the destructor)
513      *
514      * @stable ICU 3.0
515      */
516     void reset();
517 
518     /**
519      * ICU "poor man's RTTI", returns a UClassID for the actual class.
520      *
521      * @stable ICU 3.0
522      */
523     virtual UClassID getDynamicClassID() const;
524 
525     /**
526      * ICU "poor man's RTTI", returns a UClassID for this class.
527      *
528      * @stable ICU 3.0
529      */
530     static UClassID getStaticClassID();
531 };
532 
getGlyphCount()533 inline le_int32 LEGlyphStorage::getGlyphCount() const
534 {
535     return fGlyphCount;
536 }
537 
538 inline LEGlyphID &LEGlyphStorage::operator[](le_int32 glyphIndex) const
539 {
540     return fGlyphs[glyphIndex];
541 }
542 
543 
544 U_NAMESPACE_END
545 #endif
546 
547