You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
233 lines
4.7 KiB
233 lines
4.7 KiB
// © 2016 and later: Unicode, Inc. and others.
|
|
// License & terms of use: http://www.unicode.org/copyright.html
|
|
/*
|
|
**********************************************************************
|
|
* 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
|