2 **********************************************************************
3 * Copyright (C) 1998-2010, International Business Machines
4 * Corporation and others. All Rights Reserved.
5 **********************************************************************
8 #ifndef __LEGLYPHSTORAGE_H
9 #define __LEGLYPHSTORAGE_H
12 #include "LEInsertionList.h"
16 * \brief C++ API: This class encapsulates the per-glyph storage used by the ICU LayoutEngine.
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
27 * The storage is growable using the <code>LEInsertionList</code> class.
30 * @see LEInsertionList.h
34 class U_LAYOUT_API LEGlyphStorage
: public UObject
, protected LEInsertionCallback
38 * The number of entries in the per-glyph arrays.
52 * The char indices array.
56 le_int32
*fCharIndices
;
59 * The glyph positions array.
66 * The auxillary data array.
74 * The insertion list, used to grow the above arrays.
78 LEInsertionList
*fInsertionList
;
81 * The source index while growing the data arrays.
88 * The destination index used while growing the data arrays.
96 * This implements <code>LEInsertionCallback</code>. The <code>LEInsertionList</code>
97 * will call this method once for each insertion.
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
103 * @return <code>true</code> if <code>LEInsertionList</code> should stop
104 * processing the insertion list after this insertion.
106 * @see LEInsertionList.h
110 virtual le_bool
applyInsertion(le_int32 atPosition
, le_int32 count
, LEGlyphID newGlyphs
[]);
115 * Allocates an empty <code>LEGlyphStorage</code> object. You must call
116 * <code>allocateGlyphArray, allocatePositions and allocateAuxData</code>
117 * to allocate the data.
124 * The destructor. This will deallocate all of the arrays.
131 * This method returns the number of glyphs in the glyph array.
133 * @return the number of glyphs in the glyph array
137 inline le_int32
getGlyphCount() const;
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
144 * @param glyphs - the destiniation glyph array
145 * @param success - set to an error code if the operation fails
149 void getGlyphs(LEGlyphID glyphs
[], LEErrorCode
&success
) const;
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)
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
163 void getGlyphs(le_uint32 glyphs
[], le_uint32 extraBits
, LEErrorCode
&success
) const;
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.
170 * @param charIndices - the destiniation character index array
171 * @param success - set to an error code if the operation fails
175 void getCharIndices(le_int32 charIndices
[], LEErrorCode
&success
) const;
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.
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
188 void getCharIndices(le_int32 charIndices
[], le_int32 indexBase
, LEErrorCode
&success
) const;
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.
196 * @param positions - the destiniation position array
197 * @param success - set to an error code if the operation fails
201 void getGlyphPositions(float positions
[], LEErrorCode
&success
) const;
204 * This method returns the X and Y position of the glyph at
208 * @param glyphIndex - the index of the glyph
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
217 void getGlyphPosition(le_int32 glyphIndex
, float &x
, float &y
, LEErrorCode
&success
) const;
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
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.
231 void allocateGlyphArray(le_int32 initialGlyphCount
, le_bool rightToLeft
, LEErrorCode
&success
);
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.
237 * @param success set to an error code if the positions array cannot be allocated.
239 * @return the number of X, Y position pairs allocated.
243 le_int32
allocatePositions(LEErrorCode
&success
);
246 * This method allocates the storage for the auxillary glyph data.
248 * @param success set to an error code if the aulillary data array cannot be allocated.
250 * @return the size of the auxillary data array.
254 le_int32
allocateAuxData(LEErrorCode
&success
);
257 * Copy the entire auxillary data array.
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
264 void getAuxData(le_uint32 auxData
[], LEErrorCode
&success
) const;
267 * Get the glyph ID for a particular glyph.
269 * @param glyphIndex the index into the glyph array
270 * @param success set to an error code if the glyph ID cannot be retrieved.
272 * @return the glyph ID
276 LEGlyphID
getGlyphID(le_int32 glyphIndex
, LEErrorCode
&success
) const;
279 * Get the char index for a particular glyph.
281 * @param glyphIndex the index into the glyph array
282 * @param success set to an error code if the char index cannot be retrieved.
284 * @return the character index
288 le_int32
getCharIndex(le_int32 glyphIndex
, LEErrorCode
&success
) const;
292 * Get the auxillary data for a particular glyph.
294 * @param glyphIndex the index into the glyph array
295 * @param success set to an error code if the auxillary data cannot be retrieved.
297 * @return the auxillary data
301 le_uint32
getAuxData(le_int32 glyphIndex
, LEErrorCode
&success
) const;
304 * This operator allows direct access to the glyph array
305 * using the index operator.
307 * @param glyphIndex the index into the glyph array
309 * @return a reference to the given location in the glyph array
313 inline LEGlyphID
&operator[](le_int32 glyphIndex
) const;
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.
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.
326 * @return the address at which to store the replacement glyphs.
328 * @see LEInsertionList.h
332 LEGlyphID
*insertGlyphs(le_int32 atIndex
, le_int32 insertCount
, LEErrorCode
& success
);
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.
341 * Note: Don't use this version, use the other version of this function which has an error code.
343 * @param atIndex the index of the glyph to be replaced
344 * @param insertCount the number of glyphs to replace it with
346 * @return the address at which to store the replacement glyphs.
348 * @see LEInsertionList.h
352 LEGlyphID
*insertGlyphs(le_int32 atIndex
, le_int32 insertCount
);
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
361 * @param fromPosition - position of the glyph to be moved
362 * @param toPosition - target position of the glyph
363 * @param marker marker bit
367 void moveGlyph(le_int32 fromPosition
, le_int32 toPosition
, le_uint32 marker
);
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.
375 * @return the new size of the glyph array
377 * @see LEInsertionList.h
381 le_int32
applyInsertions();
384 * Set the glyph ID for a particular glyph.
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.
392 void setGlyphID(le_int32 glyphIndex
, LEGlyphID glyphID
, LEErrorCode
&success
);
395 * Set the char index for a particular glyph.
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.
403 void setCharIndex(le_int32 glyphIndex
, le_int32 charIndex
, LEErrorCode
&success
);
406 * Set the X, Y position for a particular glyph.
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.
415 void setPosition(le_int32 glyphIndex
, float x
, float y
, LEErrorCode
&success
);
418 * Adjust the X, Y position for a particular glyph.
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.
427 void adjustPosition(le_int32 glyphIndex
, float xAdjust
, float yAdjust
, LEErrorCode
&success
);
430 * Set the auxillary data for a particular glyph.
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.
438 void setAuxData(le_int32 glyphIndex
, le_uint32 auxData
, LEErrorCode
&success
);
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>.
445 * @param from the <code>LEGlyphStorage</code> object from which
446 * to get the new glyph array.
450 void adoptGlyphArray(LEGlyphStorage
&from
);
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>.
457 * @param from the <code>LEGlyphStorage</code> object from which
458 * to get the new char indices array.
462 void adoptCharIndicesArray(LEGlyphStorage
&from
);
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>.
469 * @param from the <code>LEGlyphStorage</code> object from which
470 * to get the new position array.
474 void adoptPositionArray(LEGlyphStorage
&from
);
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>.
481 * @param from the <code>LEGlyphStorage</code> object from which
482 * to get the new auxillary data array.
486 void adoptAuxDataArray(LEGlyphStorage
&from
);
489 * Change the glyph count of this object to be the same
490 * as the one in <code>from</code>.
492 * @param from the <code>LEGlyphStorage</code> object from which
493 * to get the new glyph count.
497 void adoptGlyphCount(LEGlyphStorage
&from
);
500 * Change the glyph count of this object to the given value.
502 * @param newGlyphCount the new glyph count.
506 void adoptGlyphCount(le_int32 newGlyphCount
);
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
519 * ICU "poor man's RTTI", returns a UClassID for the actual class.
523 virtual UClassID
getDynamicClassID() const;
526 * ICU "poor man's RTTI", returns a UClassID for this class.
530 static UClassID
getStaticClassID();
533 inline le_int32
LEGlyphStorage::getGlyphCount() const
538 inline LEGlyphID
&LEGlyphStorage::operator[](le_int32 glyphIndex
) const
540 return fGlyphs
[glyphIndex
];