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