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 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