Home | History | Annotate | Download | only in layoutex
      1 //  2016 and later: Unicode, Inc. and others.
      2 // License & terms of use: http://www.unicode.org/copyright.html
      3 /*
      4  **********************************************************************
      5  *   Copyright (C) 2003, International Business Machines
      6  *   Corporation and others.  All Rights Reserved.
      7  **********************************************************************
      8  */
      9 
     10 #include "layout/LETypes.h"
     11 #include "layout/LEFontInstance.h"
     12 
     13 #include "unicode/locid.h"
     14 
     15 #include "layout/RunArrays.h"
     16 
     17 U_NAMESPACE_BEGIN
     18 
     19 const char RunArray::fgClassID = 0;
     20 
     21 RunArray::RunArray(le_int32 initialCapacity)
     22     : fClientArrays(FALSE), fLimits(NULL), fCount(0), fCapacity(initialCapacity)
     23 {
     24     if (initialCapacity > 0) {
     25         fLimits = LE_NEW_ARRAY(le_int32, fCapacity);
     26     }
     27 }
     28 
     29 RunArray::~RunArray()
     30 {
     31     if (! fClientArrays) {
     32         LE_DELETE_ARRAY(fLimits);
     33         fLimits = NULL;
     34     }
     35 }
     36 
     37 le_int32 RunArray::ensureCapacity()
     38 {
     39     if (fCount >= fCapacity) {
     40         if (fCapacity == 0) {
     41             fCapacity = INITIAL_CAPACITY;
     42             init(fCapacity);
     43         } else {
     44             fCapacity += (fCapacity < CAPACITY_GROW_LIMIT ? fCapacity : CAPACITY_GROW_LIMIT);
     45             grow(fCapacity);
     46         }
     47     }
     48 
     49     return fCount++;
     50 }
     51 
     52 void RunArray::init(le_int32 capacity)
     53 {
     54     fLimits = LE_NEW_ARRAY(le_int32, capacity);
     55 }
     56 
     57 void RunArray::grow(le_int32 newCapacity)
     58 {
     59     fLimits = (le_int32 *) LE_GROW_ARRAY(fLimits, newCapacity);
     60 }
     61 
     62 le_int32 RunArray::add(le_int32 limit)
     63 {
     64     if (fClientArrays) {
     65         return -1;
     66     }
     67 
     68     le_int32  index  = ensureCapacity();
     69     le_int32 *limits = (le_int32 *) fLimits;
     70 
     71     limits[index] = limit;
     72 
     73     return index;
     74 }
     75 
     76 const char FontRuns::fgClassID = 0;
     77 
     78 FontRuns::FontRuns(le_int32 initialCapacity)
     79     : RunArray(initialCapacity), fFonts(NULL)
     80 {
     81     if (initialCapacity > 0) {
     82         fFonts = LE_NEW_ARRAY(const LEFontInstance *, initialCapacity);
     83     }
     84 }
     85 
     86 FontRuns::~FontRuns()
     87 {
     88     if (! fClientArrays) {
     89         LE_DELETE_ARRAY(fFonts);
     90         fFonts = NULL;
     91     }
     92 }
     93 
     94 void FontRuns::init(le_int32 capacity)
     95 {
     96     RunArray::init(capacity);
     97     fFonts = LE_NEW_ARRAY(const LEFontInstance *, capacity);
     98 }
     99 
    100 void FontRuns::grow(le_int32 capacity)
    101 {
    102     RunArray::grow(capacity);
    103     fFonts = (const LEFontInstance **) LE_GROW_ARRAY(fFonts, capacity);
    104 }
    105 
    106 le_int32 FontRuns::add(const LEFontInstance *font, le_int32 limit)
    107 {
    108     le_int32 index = RunArray::add(limit);
    109 
    110     if (index >= 0) {
    111         LEFontInstance **fonts = (LEFontInstance **) fFonts;
    112 
    113         fonts[index] = (LEFontInstance *) font;
    114     }
    115 
    116     return index;
    117 }
    118 
    119 const LEFontInstance *FontRuns::getFont(le_int32 run) const
    120 {
    121     if (run < 0 || run >= getCount()) {
    122         return NULL;
    123     }
    124 
    125     return fFonts[run];
    126 }
    127 
    128 const char LocaleRuns::fgClassID = 0;
    129 
    130 LocaleRuns::LocaleRuns(le_int32 initialCapacity)
    131     : RunArray(initialCapacity), fLocales(NULL)
    132 {
    133     if (initialCapacity > 0) {
    134         fLocales = LE_NEW_ARRAY(const Locale *, initialCapacity);
    135     }
    136 }
    137 
    138 LocaleRuns::~LocaleRuns()
    139 {
    140     if (! fClientArrays) {
    141         LE_DELETE_ARRAY(fLocales);
    142         fLocales = NULL;
    143     }
    144 }
    145 
    146 void LocaleRuns::init(le_int32 capacity)
    147 {
    148     RunArray::init(capacity);
    149     fLocales = LE_NEW_ARRAY(const Locale *, capacity);
    150 }
    151 
    152 void LocaleRuns::grow(le_int32 capacity)
    153 {
    154     RunArray::grow(capacity);
    155     fLocales = (const Locale **) LE_GROW_ARRAY(fLocales, capacity);
    156 }
    157 
    158 le_int32 LocaleRuns::add(const Locale *locale, le_int32 limit)
    159 {
    160     le_int32 index = RunArray::add(limit);
    161 
    162     if (index >= 0) {
    163         Locale **locales = (Locale **) fLocales;
    164 
    165         locales[index] = (Locale *) locale;
    166     }
    167 
    168     return index;
    169 }
    170 
    171 const Locale *LocaleRuns::getLocale(le_int32 run) const
    172 {
    173     if (run < 0 || run >= getCount()) {
    174         return NULL;
    175     }
    176 
    177     return fLocales[run];
    178 }
    179 
    180 const char ValueRuns::fgClassID = 0;
    181 
    182 ValueRuns::ValueRuns(le_int32 initialCapacity)
    183     : RunArray(initialCapacity), fValues(NULL)
    184 {
    185     if (initialCapacity > 0) {
    186         fValues = LE_NEW_ARRAY(le_int32, initialCapacity);
    187     }
    188 }
    189 
    190 ValueRuns::~ValueRuns()
    191 {
    192     if (! fClientArrays) {
    193         LE_DELETE_ARRAY(fValues);
    194         fValues = NULL;
    195     }
    196 }
    197 
    198 void ValueRuns::init(le_int32 capacity)
    199 {
    200     RunArray::init(capacity);
    201     fValues = LE_NEW_ARRAY(le_int32, capacity);
    202 }
    203 
    204 void ValueRuns::grow(le_int32 capacity)
    205 {
    206     RunArray::grow(capacity);
    207     fValues = (const le_int32 *) LE_GROW_ARRAY(fValues, capacity);
    208 }
    209 
    210 le_int32 ValueRuns::add(le_int32 value, le_int32 limit)
    211 {
    212     le_int32 index = RunArray::add(limit);
    213 
    214     if (index >= 0) {
    215         le_int32 *values = (le_int32 *) fValues;
    216 
    217         values[index] = value;
    218     }
    219 
    220     return index;
    221 }
    222 
    223 le_int32 ValueRuns::getValue(le_int32 run) const
    224 {
    225     if (run < 0 || run >= getCount()) {
    226         return -1;
    227     }
    228 
    229     return fValues[run];
    230 }
    231 
    232 U_NAMESPACE_END
    233