Home | History | Annotate | Download | only in layout
      1 /*
      2  *
      3  * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved
      4  *
      5  * Developed at DIT - Government of Bhutan
      6  *
      7  * Contact person: Pema Geyleg - <pema_geyleg (at) druknet.bt>
      8  *
      9  * This file is a modification of the ICU file KhmerReordering.cpp
     10  * by Jens Herden and Javier Sola who have given all their possible rights to IBM and the Governement of Bhutan
     11  * A first module for Dzongkha was developed by Karunakar under Panlocalisation funding.
     12  * Assistance for this module has been received from Namgay Thinley, Christopher Fynn and Javier Sola
     13  *
     14  */
     15 
     16 
     17 #include "OpenTypeLayoutEngine.h"
     18 #include "TibetanLayoutEngine.h"
     19 #include "LEGlyphStorage.h"
     20 #include "TibetanReordering.h"
     21 
     22 U_NAMESPACE_BEGIN
     23 
     24 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TibetanOpenTypeLayoutEngine)
     25 
     26 TibetanOpenTypeLayoutEngine::TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
     27                     le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success)
     28     : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success)
     29 {
     30     fFeatureMap   = TibetanReordering::getFeatureMap(fFeatureMapCount);
     31     fFeatureOrder = TRUE;
     32 }
     33 
     34 TibetanOpenTypeLayoutEngine::TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
     35 						     le_int32 typoFlags, LEErrorCode &success)
     36     : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success)
     37 {
     38     fFeatureMap   = TibetanReordering::getFeatureMap(fFeatureMapCount);
     39     fFeatureOrder = TRUE;
     40 }
     41 
     42 TibetanOpenTypeLayoutEngine::~TibetanOpenTypeLayoutEngine()
     43 {
     44     // nothing to do
     45 }
     46 
     47 // Input: characters
     48 // Output: characters, char indices, tags
     49 // Returns: output character count
     50 le_int32 TibetanOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
     51         LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success)
     52 {
     53     if (LE_FAILURE(success)) {
     54         return 0;
     55     }
     56 
     57     if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) {
     58         success = LE_ILLEGAL_ARGUMENT_ERROR;
     59         return 0;
     60     }
     61 
     62     le_int32 worstCase = count * 3;  // worst case is 3 for Khmer  TODO check if 2 is enough
     63 
     64     outChars = LE_NEW_ARRAY(LEUnicode, worstCase);
     65 
     66     if (outChars == NULL) {
     67         success = LE_MEMORY_ALLOCATION_ERROR;
     68         return 0;
     69     }
     70 
     71     glyphStorage.allocateGlyphArray(worstCase, rightToLeft, success);
     72     glyphStorage.allocateAuxData(success);
     73 
     74     if (LE_FAILURE(success)) {
     75         LE_DELETE_ARRAY(outChars);
     76         return 0;
     77     }
     78 
     79     // NOTE: assumes this allocates featureTags...
     80     // (probably better than doing the worst case stuff here...)
     81     le_int32 outCharCount = TibetanReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage);
     82 
     83     glyphStorage.adoptGlyphCount(outCharCount);
     84     return outCharCount;
     85 }
     86 
     87 U_NAMESPACE_END
     88