|  | /* | 
|  | ********************************************************************** | 
|  | *   Copyright (C) 2003, International Business Machines | 
|  | *   Corporation and others.  All Rights Reserved. | 
|  | ********************************************************************** | 
|  | */ | 
|  |  | 
|  | #include "layout/LETypes.h" | 
|  | #include "layout/LEFontInstance.h" | 
|  |  | 
|  | #include "unicode/locid.h" | 
|  |  | 
|  | #include "layout/RunArrays.h" | 
|  |  | 
|  | U_NAMESPACE_BEGIN | 
|  |  | 
|  | const char RunArray::fgClassID = 0; | 
|  |  | 
|  | RunArray::RunArray(le_int32 initialCapacity) | 
|  | : fClientArrays(FALSE), fLimits(NULL), fCount(0), fCapacity(initialCapacity) | 
|  | { | 
|  | if (initialCapacity > 0) { | 
|  | fLimits = LE_NEW_ARRAY(le_int32, fCapacity); | 
|  | } | 
|  | } | 
|  |  | 
|  | RunArray::~RunArray() | 
|  | { | 
|  | if (! fClientArrays) { | 
|  | LE_DELETE_ARRAY(fLimits); | 
|  | fLimits = NULL; | 
|  | } | 
|  | } | 
|  |  | 
|  | le_int32 RunArray::ensureCapacity() | 
|  | { | 
|  | if (fCount >= fCapacity) { | 
|  | if (fCapacity == 0) { | 
|  | fCapacity = INITIAL_CAPACITY; | 
|  | init(fCapacity); | 
|  | } else { | 
|  | fCapacity += (fCapacity < CAPACITY_GROW_LIMIT ? fCapacity : CAPACITY_GROW_LIMIT); | 
|  | grow(fCapacity); | 
|  | } | 
|  | } | 
|  |  | 
|  | return fCount++; | 
|  | } | 
|  |  | 
|  | void RunArray::init(le_int32 capacity) | 
|  | { | 
|  | fLimits = LE_NEW_ARRAY(le_int32, capacity); | 
|  | } | 
|  |  | 
|  | void RunArray::grow(le_int32 newCapacity) | 
|  | { | 
|  | fLimits = (le_int32 *) LE_GROW_ARRAY(fLimits, newCapacity); | 
|  | } | 
|  |  | 
|  | le_int32 RunArray::add(le_int32 limit) | 
|  | { | 
|  | if (fClientArrays) { | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | le_int32  index  = ensureCapacity(); | 
|  | le_int32 *limits = (le_int32 *) fLimits; | 
|  |  | 
|  | limits[index] = limit; | 
|  |  | 
|  | return index; | 
|  | } | 
|  |  | 
|  | const char FontRuns::fgClassID = 0; | 
|  |  | 
|  | FontRuns::FontRuns(le_int32 initialCapacity) | 
|  | : RunArray(initialCapacity), fFonts(NULL) | 
|  | { | 
|  | if (initialCapacity > 0) { | 
|  | fFonts = LE_NEW_ARRAY(const LEFontInstance *, initialCapacity); | 
|  | } | 
|  | } | 
|  |  | 
|  | FontRuns::~FontRuns() | 
|  | { | 
|  | if (! fClientArrays) { | 
|  | LE_DELETE_ARRAY(fFonts); | 
|  | fFonts = NULL; | 
|  | } | 
|  | } | 
|  |  | 
|  | void FontRuns::init(le_int32 capacity) | 
|  | { | 
|  | RunArray::init(capacity); | 
|  | fFonts = LE_NEW_ARRAY(const LEFontInstance *, capacity); | 
|  | } | 
|  |  | 
|  | void FontRuns::grow(le_int32 capacity) | 
|  | { | 
|  | RunArray::grow(capacity); | 
|  | fFonts = (const LEFontInstance **) LE_GROW_ARRAY(fFonts, capacity); | 
|  | } | 
|  |  | 
|  | le_int32 FontRuns::add(const LEFontInstance *font, le_int32 limit) | 
|  | { | 
|  | le_int32 index = RunArray::add(limit); | 
|  |  | 
|  | if (index >= 0) { | 
|  | LEFontInstance **fonts = (LEFontInstance **) fFonts; | 
|  |  | 
|  | fonts[index] = (LEFontInstance *) font; | 
|  | } | 
|  |  | 
|  | return index; | 
|  | } | 
|  |  | 
|  | const LEFontInstance *FontRuns::getFont(le_int32 run) const | 
|  | { | 
|  | if (run < 0 || run >= getCount()) { | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | return fFonts[run]; | 
|  | } | 
|  |  | 
|  | const char LocaleRuns::fgClassID = 0; | 
|  |  | 
|  | LocaleRuns::LocaleRuns(le_int32 initialCapacity) | 
|  | : RunArray(initialCapacity), fLocales(NULL) | 
|  | { | 
|  | if (initialCapacity > 0) { | 
|  | fLocales = LE_NEW_ARRAY(const Locale *, initialCapacity); | 
|  | } | 
|  | } | 
|  |  | 
|  | LocaleRuns::~LocaleRuns() | 
|  | { | 
|  | if (! fClientArrays) { | 
|  | LE_DELETE_ARRAY(fLocales); | 
|  | fLocales = NULL; | 
|  | } | 
|  | } | 
|  |  | 
|  | void LocaleRuns::init(le_int32 capacity) | 
|  | { | 
|  | RunArray::init(capacity); | 
|  | fLocales = LE_NEW_ARRAY(const Locale *, capacity); | 
|  | } | 
|  |  | 
|  | void LocaleRuns::grow(le_int32 capacity) | 
|  | { | 
|  | RunArray::grow(capacity); | 
|  | fLocales = (const Locale **) LE_GROW_ARRAY(fLocales, capacity); | 
|  | } | 
|  |  | 
|  | le_int32 LocaleRuns::add(const Locale *locale, le_int32 limit) | 
|  | { | 
|  | le_int32 index = RunArray::add(limit); | 
|  |  | 
|  | if (index >= 0) { | 
|  | Locale **locales = (Locale **) fLocales; | 
|  |  | 
|  | locales[index] = (Locale *) locale; | 
|  | } | 
|  |  | 
|  | return index; | 
|  | } | 
|  |  | 
|  | const Locale *LocaleRuns::getLocale(le_int32 run) const | 
|  | { | 
|  | if (run < 0 || run >= getCount()) { | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | return fLocales[run]; | 
|  | } | 
|  |  | 
|  | const char ValueRuns::fgClassID = 0; | 
|  |  | 
|  | ValueRuns::ValueRuns(le_int32 initialCapacity) | 
|  | : RunArray(initialCapacity), fValues(NULL) | 
|  | { | 
|  | if (initialCapacity > 0) { | 
|  | fValues = LE_NEW_ARRAY(le_int32, initialCapacity); | 
|  | } | 
|  | } | 
|  |  | 
|  | ValueRuns::~ValueRuns() | 
|  | { | 
|  | if (! fClientArrays) { | 
|  | LE_DELETE_ARRAY(fValues); | 
|  | fValues = NULL; | 
|  | } | 
|  | } | 
|  |  | 
|  | void ValueRuns::init(le_int32 capacity) | 
|  | { | 
|  | RunArray::init(capacity); | 
|  | fValues = LE_NEW_ARRAY(le_int32, capacity); | 
|  | } | 
|  |  | 
|  | void ValueRuns::grow(le_int32 capacity) | 
|  | { | 
|  | RunArray::grow(capacity); | 
|  | fValues = (const le_int32 *) LE_GROW_ARRAY(fValues, capacity); | 
|  | } | 
|  |  | 
|  | le_int32 ValueRuns::add(le_int32 value, le_int32 limit) | 
|  | { | 
|  | le_int32 index = RunArray::add(limit); | 
|  |  | 
|  | if (index >= 0) { | 
|  | le_int32 *values = (le_int32 *) fValues; | 
|  |  | 
|  | values[index] = value; | 
|  | } | 
|  |  | 
|  | return index; | 
|  | } | 
|  |  | 
|  | le_int32 ValueRuns::getValue(le_int32 run) const | 
|  | { | 
|  | if (run < 0 || run >= getCount()) { | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | return fValues[run]; | 
|  | } | 
|  |  | 
|  | U_NAMESPACE_END |