jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic-win1256.hh
changeset 34414 e496a8d8fc8a
equal deleted inserted replaced
34413:bbed9966db6e 34414:e496a8d8fc8a
       
     1 /*
       
     2  * Copyright © 2014  Google, Inc.
       
     3  *
       
     4  *  This is part of HarfBuzz, a text shaping library.
       
     5  *
       
     6  * Permission is hereby granted, without written agreement and without
       
     7  * license or royalty fees, to use, copy, modify, and distribute this
       
     8  * software and its documentation for any purpose, provided that the
       
     9  * above copyright notice and the following two paragraphs appear in
       
    10  * all copies of this software.
       
    11  *
       
    12  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
       
    13  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
       
    14  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
       
    15  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
       
    16  * DAMAGE.
       
    17  *
       
    18  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
       
    19  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
       
    20  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
       
    21  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
       
    22  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
       
    23  *
       
    24  * Google Author(s): Behdad Esfahbod
       
    25  */
       
    26 
       
    27 #ifndef HB_OT_SHAPE_COMPLEX_ARABIC_WIN1256_HH
       
    28 
       
    29 
       
    30 /*
       
    31  * The macros in the first part of this file are generic macros that can
       
    32  * be used to define the bytes for OpenType table data in code in a
       
    33  * readable manner.  We can move the macros to reside with their respective
       
    34  * struct types, but since we only use these to define one data table, the
       
    35  * Windows-1256 Arabic shaping table in this file, we keep them here.
       
    36  */
       
    37 
       
    38 
       
    39 /* First we measure, then we cut. */
       
    40 #ifndef OT_MEASURE
       
    41 #define OT_MEASURE
       
    42 #define OT_TABLE_START                  static const struct TABLE_NAME {
       
    43 #define OT_TABLE_END                    }
       
    44 #define OT_LABEL_START(Name)            unsigned char Name[
       
    45 #define OT_LABEL_END                    ];
       
    46 #define OT_BYTE(u8)                     +1/*byte*/
       
    47 #define OT_USHORT(u16)                  +2/*bytes*/
       
    48 #else
       
    49 #undef  OT_MEASURE
       
    50 #define OT_TABLE_START                  TABLE_NAME = {
       
    51 #define OT_TABLE_END                    };
       
    52 #define OT_LABEL_START(Name)            {
       
    53 #define OT_LABEL_END                    },
       
    54 #define OT_BYTE(u8)                     (u8),
       
    55 #define OT_USHORT(u16)                  (unsigned char)((u16)>>8), (unsigned char)((u16)&0xFFu),
       
    56 #define OT_COUNT(Name, ItemSize)        ((unsigned int) sizeof(((struct TABLE_NAME*)0)->Name) \
       
    57                                          / (unsigned int)(ItemSize) \
       
    58                                          /* OT_ASSERT it's divisible (and positive). */)
       
    59 #define OT_DISTANCE(From,To)            ((unsigned int) \
       
    60                                          ((char*)(&((struct TABLE_NAME*)0)->To) - \
       
    61                                           (char*)(&((struct TABLE_NAME*)0)->From)) \
       
    62                                          /* OT_ASSERT it's positive. */)
       
    63 #endif
       
    64 
       
    65 
       
    66 #define OT_LABEL(Name) \
       
    67         OT_LABEL_END \
       
    68         OT_LABEL_START(Name)
       
    69 
       
    70 /* Whenever we receive an argument that is a list, it will expand to
       
    71  * contain commas.  That cannot be passed to another macro because the
       
    72  * commas will throw off the preprocessor.  The solution is to wrap
       
    73  * the passed-in argument in OT_LIST() before passing to the next macro.
       
    74  * Unfortunately this trick requires vararg macros. */
       
    75 #define OT_LIST(...) __VA_ARGS__
       
    76 
       
    77 
       
    78 /*
       
    79  * Basic Types
       
    80  */
       
    81 
       
    82 #define OT_TAG(a,b,c,d) \
       
    83         OT_BYTE(a) OT_BYTE(b) OT_BYTE(c) OT_BYTE(d)
       
    84 
       
    85 #define OT_OFFSET(From, To) /* Offset from From to To in bytes */ \
       
    86         OT_USHORT(OT_DISTANCE(From, To))
       
    87 
       
    88 #define OT_GLYPHID /* GlyphID */ \
       
    89         OT_USHORT
       
    90 
       
    91 #define OT_UARRAY(Name, Items) \
       
    92         OT_LABEL_START(Name) \
       
    93         OT_USHORT(OT_COUNT(Name##Data, 2)) \
       
    94         OT_LABEL(Name##Data) \
       
    95         Items \
       
    96         OT_LABEL_END
       
    97 
       
    98 #define OT_UHEADLESSARRAY(Name, Items) \
       
    99         OT_LABEL_START(Name) \
       
   100         OT_USHORT(OT_COUNT(Name##Data, 2) + 1) \
       
   101         OT_LABEL(Name##Data) \
       
   102         Items \
       
   103         OT_LABEL_END
       
   104 
       
   105 
       
   106 /*
       
   107  * Common Types
       
   108  */
       
   109 
       
   110 #define OT_LOOKUP_FLAG_IGNORE_MARKS     0x08u
       
   111 
       
   112 #define OT_LOOKUP(Name, LookupType, LookupFlag, SubLookupOffsets) \
       
   113         OT_LABEL_START(Name) \
       
   114         OT_USHORT(LookupType) \
       
   115         OT_USHORT(LookupFlag) \
       
   116         OT_LABEL_END \
       
   117         OT_UARRAY(Name##SubLookupOffsetsArray, OT_LIST(SubLookupOffsets))
       
   118 
       
   119 #define OT_SUBLOOKUP(Name, SubFormat, Items) \
       
   120         OT_LABEL_START(Name) \
       
   121         OT_USHORT(SubFormat) \
       
   122         Items
       
   123 
       
   124 #define OT_COVERAGE1(Name, Items) \
       
   125         OT_LABEL_START(Name) \
       
   126         OT_USHORT(1) \
       
   127         OT_LABEL_END \
       
   128         OT_UARRAY(Name##Glyphs, OT_LIST(Items))
       
   129 
       
   130 
       
   131 /*
       
   132  * GSUB
       
   133  */
       
   134 
       
   135 #define OT_LOOKUP_TYPE_SUBST_SINGLE     1u
       
   136 #define OT_LOOKUP_TYPE_SUBST_LIGATURE   4u
       
   137 
       
   138 #define OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(Name, FromGlyphs, ToGlyphs) \
       
   139         OT_SUBLOOKUP(Name, 2, \
       
   140                 OT_OFFSET(Name, Name##Coverage) \
       
   141                 OT_LABEL_END \
       
   142                 OT_UARRAY(Name##Substitute, OT_LIST(ToGlyphs)) \
       
   143         ) \
       
   144         OT_COVERAGE1(Name##Coverage, OT_LIST(FromGlyphs)) \
       
   145         /* ASSERT_STATIC_EXPR_ZERO (len(FromGlyphs) == len(ToGlyphs)) */
       
   146 
       
   147 #define OT_SUBLOOKUP_LIGATURE_SUBST_FORMAT1(Name, FirstGlyphs, LigatureSetOffsets) \
       
   148         OT_SUBLOOKUP(Name, 1, \
       
   149                 OT_OFFSET(Name, Name##Coverage) \
       
   150                 OT_LABEL_END \
       
   151                 OT_UARRAY(Name##LigatureSetOffsetsArray, OT_LIST(LigatureSetOffsets)) \
       
   152         ) \
       
   153         OT_COVERAGE1(Name##Coverage, OT_LIST(FirstGlyphs)) \
       
   154         /* ASSERT_STATIC_EXPR_ZERO (len(FirstGlyphs) == len(LigatureSetOffsets)) */
       
   155 
       
   156 #define OT_LIGATURE_SET(Name, LigatureSetOffsets) \
       
   157         OT_UARRAY(Name, OT_LIST(LigatureSetOffsets))
       
   158 
       
   159 #define OT_LIGATURE(Name, Components, LigGlyph) \
       
   160         OT_LABEL_START(Name) \
       
   161         LigGlyph \
       
   162         OT_LABEL_END \
       
   163         OT_UHEADLESSARRAY(Name##ComponentsArray, OT_LIST(Components))
       
   164 
       
   165 /*
       
   166  *
       
   167  * Start of Windows-1256 shaping table.
       
   168  *
       
   169  */
       
   170 
       
   171 /* Table name. */
       
   172 #define TABLE_NAME arabic_win1256_gsub_lookups
       
   173 
       
   174 /* Table manifest. */
       
   175 #define MANIFEST(Items) \
       
   176         OT_LABEL_START(manifest) \
       
   177         OT_USHORT(OT_COUNT(manifestData, 6)) \
       
   178         OT_LABEL(manifestData) \
       
   179         Items \
       
   180         OT_LABEL_END
       
   181 
       
   182 #define MANIFEST_LOOKUP(Tag, Name) \
       
   183         Tag \
       
   184         OT_OFFSET(manifest, Name)
       
   185 
       
   186 /* Shorthand. */
       
   187 #define G       OT_GLYPHID
       
   188 
       
   189 /*
       
   190  * Table Start
       
   191  */
       
   192 OT_TABLE_START
       
   193 
       
   194 
       
   195 /*
       
   196  * Manifest
       
   197  */
       
   198 MANIFEST(
       
   199         MANIFEST_LOOKUP(OT_TAG('r','l','i','g'), rligLookup)
       
   200         MANIFEST_LOOKUP(OT_TAG('i','n','i','t'), initLookup)
       
   201         MANIFEST_LOOKUP(OT_TAG('m','e','d','i'), mediLookup)
       
   202         MANIFEST_LOOKUP(OT_TAG('f','i','n','a'), finaLookup)
       
   203         MANIFEST_LOOKUP(OT_TAG('r','l','i','g'), rligMarksLookup)
       
   204 )
       
   205 
       
   206 /*
       
   207  * Lookups
       
   208  */
       
   209 OT_LOOKUP(initLookup, OT_LOOKUP_TYPE_SUBST_SINGLE, OT_LOOKUP_FLAG_IGNORE_MARKS,
       
   210         OT_OFFSET(initLookup, initmediSubLookup)
       
   211         OT_OFFSET(initLookup, initSubLookup)
       
   212 )
       
   213 OT_LOOKUP(mediLookup, OT_LOOKUP_TYPE_SUBST_SINGLE, OT_LOOKUP_FLAG_IGNORE_MARKS,
       
   214         OT_OFFSET(mediLookup, initmediSubLookup)
       
   215         OT_OFFSET(mediLookup, mediSubLookup)
       
   216         OT_OFFSET(mediLookup, medifinaLamAlefSubLookup)
       
   217 )
       
   218 OT_LOOKUP(finaLookup, OT_LOOKUP_TYPE_SUBST_SINGLE, OT_LOOKUP_FLAG_IGNORE_MARKS,
       
   219         OT_OFFSET(finaLookup, finaSubLookup)
       
   220         /* We don't need this one currently as the sequence inherits masks
       
   221          * from the first item.  Just in case we change that in the future
       
   222          * to be smart about Arabic masks when ligating... */
       
   223         OT_OFFSET(finaLookup, medifinaLamAlefSubLookup)
       
   224 )
       
   225 OT_LOOKUP(rligLookup, OT_LOOKUP_TYPE_SUBST_LIGATURE, OT_LOOKUP_FLAG_IGNORE_MARKS,
       
   226         OT_OFFSET(rligLookup, lamAlefLigaturesSubLookup)
       
   227 )
       
   228 OT_LOOKUP(rligMarksLookup, OT_LOOKUP_TYPE_SUBST_LIGATURE, 0,
       
   229         OT_OFFSET(rligMarksLookup, shaddaLigaturesSubLookup)
       
   230 )
       
   231 
       
   232 /*
       
   233  * init/medi/fina forms
       
   234  */
       
   235 OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(initmediSubLookup,
       
   236         G(198)  G(200)  G(201)  G(202)  G(203)  G(204)  G(205)  G(206)  G(211)
       
   237         G(212)  G(213)  G(214)  G(223)  G(225)  G(227)  G(228)  G(236)  G(237),
       
   238         G(162)  G(4)    G(5)    G(5)    G(6)    G(7)    G(9)    G(11)   G(13)
       
   239         G(14)   G(15)   G(26)   G(140)  G(141)  G(142)  G(143)  G(154)  G(154)
       
   240 )
       
   241 OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(initSubLookup,
       
   242         G(218)  G(219)  G(221)  G(222)  G(229),
       
   243         G(27)   G(30)   G(128)  G(131)  G(144)
       
   244 )
       
   245 OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(mediSubLookup,
       
   246         G(218)  G(219)  G(221)  G(222)  G(229),
       
   247         G(28)   G(31)   G(129)  G(138)  G(149)
       
   248 )
       
   249 OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(finaSubLookup,
       
   250         G(194)  G(195)  G(197)  G(198)  G(199)  G(201)  G(204)  G(205)  G(206)
       
   251         G(218)  G(219)  G(229)  G(236)  G(237),
       
   252         G(2)    G(1)    G(3)    G(181)  G(0)    G(159)  G(8)    G(10)   G(12)
       
   253         G(29)   G(127)  G(152) G(160)   G(156)
       
   254 )
       
   255 OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(medifinaLamAlefSubLookup,
       
   256         G(165)  G(178)  G(180)  G(252),
       
   257         G(170)  G(179)  G(185)  G(255)
       
   258 )
       
   259 
       
   260 /*
       
   261  * Lam+Alef ligatures
       
   262  */
       
   263 OT_SUBLOOKUP_LIGATURE_SUBST_FORMAT1(lamAlefLigaturesSubLookup,
       
   264         G(225),
       
   265         OT_OFFSET(lamAlefLigaturesSubLookup, lamLigatureSet)
       
   266 )
       
   267 OT_LIGATURE_SET(lamLigatureSet,
       
   268         OT_OFFSET(lamLigatureSet, lamInitLigature1)
       
   269         OT_OFFSET(lamLigatureSet, lamInitLigature2)
       
   270         OT_OFFSET(lamLigatureSet, lamInitLigature3)
       
   271         OT_OFFSET(lamLigatureSet, lamInitLigature4)
       
   272 )
       
   273 OT_LIGATURE(lamInitLigature1, G(199), G(165))
       
   274 OT_LIGATURE(lamInitLigature2, G(195), G(178))
       
   275 OT_LIGATURE(lamInitLigature3, G(194), G(180))
       
   276 OT_LIGATURE(lamInitLigature4, G(197), G(252))
       
   277 
       
   278 /*
       
   279  * Shadda ligatures
       
   280  */
       
   281 OT_SUBLOOKUP_LIGATURE_SUBST_FORMAT1(shaddaLigaturesSubLookup,
       
   282         G(248),
       
   283         OT_OFFSET(shaddaLigaturesSubLookup, shaddaLigatureSet)
       
   284 )
       
   285 OT_LIGATURE_SET(shaddaLigatureSet,
       
   286         OT_OFFSET(shaddaLigatureSet, shaddaLigature1)
       
   287         OT_OFFSET(shaddaLigatureSet, shaddaLigature2)
       
   288         OT_OFFSET(shaddaLigatureSet, shaddaLigature3)
       
   289 )
       
   290 OT_LIGATURE(shaddaLigature1, G(243), G(172))
       
   291 OT_LIGATURE(shaddaLigature2, G(245), G(173))
       
   292 OT_LIGATURE(shaddaLigature3, G(246), G(175))
       
   293 
       
   294 /*
       
   295  * Table end
       
   296  */
       
   297 OT_TABLE_END
       
   298 
       
   299 
       
   300 /*
       
   301  * Clean up
       
   302  */
       
   303 #undef OT_TABLE_START
       
   304 #undef OT_TABLE_END
       
   305 #undef OT_LABEL_START
       
   306 #undef OT_LABEL_END
       
   307 #undef OT_BYTE
       
   308 #undef OT_USHORT
       
   309 #undef OT_DISTANCE
       
   310 #undef OT_COUNT
       
   311 
       
   312 /*
       
   313  * Include a second time to get the table data...
       
   314  */
       
   315 #if 0
       
   316 #include "hb-private.hh" /* Make check-includes.sh happy. */
       
   317 #endif
       
   318 #ifdef OT_MEASURE
       
   319 #include "hb-ot-shape-complex-arabic-win1256.hh"
       
   320 #endif
       
   321 
       
   322 #define HB_OT_SHAPE_COMPLEX_ARABIC_WIN1256_HH
       
   323 #endif /* HB_OT_SHAPE_COMPLEX_ARABIC_WIN1256_HH */