| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 2 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
| 3 * | 3 * |
| 4 * This is part of HarfBuzz, an OpenType Layout engine library. | 4 * This is part of HarfBuzz, an OpenType Layout engine library. |
| 5 * | 5 * |
| 6 * Permission is hereby granted, without written agreement and without | 6 * Permission is hereby granted, without written agreement and without |
| 7 * license or royalty fees, to use, copy, modify, and distribute this | 7 * license or royalty fees, to use, copy, modify, and distribute this |
| 8 * software and its documentation for any purpose, provided that the | 8 * software and its documentation for any purpose, provided that the |
| 9 * above copyright notice and the following two paragraphs appear in | 9 * above copyright notice and the following two paragraphs appear in |
| 10 * all copies of this software. | 10 * all copies of this software. |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 lineBreakType = HB_ForcedBreak; | 176 lineBreakType = HB_ForcedBreak; |
| 177 } else if(cls == HB_LineBreak_CR) { | 177 } else if(cls == HB_LineBreak_CR) { |
| 178 lineBreakType = (ncls == HB_LineBreak_LF) ? HB_NoBreak : HB_ForcedBr
eak; | 178 lineBreakType = (ncls == HB_LineBreak_LF) ? HB_NoBreak : HB_ForcedBr
eak; |
| 179 } | 179 } |
| 180 | 180 |
| 181 if (ncls == HB_LineBreak_SP) | 181 if (ncls == HB_LineBreak_SP) |
| 182 goto next_no_cls_update; | 182 goto next_no_cls_update; |
| 183 if (ncls >= HB_LineBreak_CR) | 183 if (ncls >= HB_LineBreak_CR) |
| 184 goto next; | 184 goto next; |
| 185 | 185 |
| 186 // two complex chars (thai or lao), thai_attributes might override, but
here we do a best guess | |
| 187 if (cls == HB_LineBreak_SA && ncls == HB_LineBreak_SA) { | |
| 188 lineBreakType = HB_Break; | |
| 189 goto next; | |
| 190 } | |
| 191 | |
| 192 { | 186 { |
| 193 int tcls = ncls; | 187 int tcls = ncls; |
| 188 // for south east asian chars that require a complex (dictionary ana
lysis), the unicode |
| 189 // standard recommends to treat them as AL. thai_attributes and othe
r attribute methods that |
| 190 // do dictionary analysis can override |
| 194 if (tcls >= HB_LineBreak_SA) | 191 if (tcls >= HB_LineBreak_SA) |
| 195 tcls = HB_LineBreak_ID; | 192 tcls = HB_LineBreak_AL; |
| 196 if (cls >= HB_LineBreak_SA) | 193 if (cls >= HB_LineBreak_SA) |
| 197 cls = HB_LineBreak_ID; | 194 cls = HB_LineBreak_AL; |
| 198 | 195 |
| 199 int brk = breakTable[cls][tcls]; | 196 int brk = breakTable[cls][tcls]; |
| 200 switch (brk) { | 197 switch (brk) { |
| 201 case DirectBreak: | 198 case DirectBreak: |
| 202 lineBreakType = HB_Break; | 199 lineBreakType = HB_Break; |
| 203 if (uc[i-1] == 0xad) // soft hyphen | 200 if (uc[i-1] == 0xad) // soft hyphen |
| 204 lineBreakType = HB_SoftHyphen; | 201 lineBreakType = HB_SoftHyphen; |
| 205 break; | 202 break; |
| 206 case IndirectBreak: | 203 case IndirectBreak: |
| 207 lineBreakType = (lcls == HB_LineBreak_SP) ? HB_Break : HB_NoBrea
k; | 204 lineBreakType = (lcls == HB_LineBreak_SP) ? HB_Break : HB_NoBrea
k; |
| (...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 579 #endif | 576 #endif |
| 580 | 577 |
| 581 HB_HeuristicPosition(shaper_item); | 578 HB_HeuristicPosition(shaper_item); |
| 582 return true; | 579 return true; |
| 583 } | 580 } |
| 584 | 581 |
| 585 const HB_ScriptEngine HB_ScriptEngines[] = { | 582 const HB_ScriptEngine HB_ScriptEngines[] = { |
| 586 // Common | 583 // Common |
| 587 { HB_BasicShape, 0}, | 584 { HB_BasicShape, 0}, |
| 588 // Greek | 585 // Greek |
| 589 { HB_BasicShape, 0}, | 586 { HB_GreekShape, 0}, |
| 590 // Cyrillic | 587 // Cyrillic |
| 591 { HB_BasicShape, 0}, | 588 { HB_BasicShape, 0}, |
| 592 // Armenian | 589 // Armenian |
| 593 { HB_BasicShape, 0}, | 590 { HB_BasicShape, 0}, |
| 594 // Hebrew | 591 // Hebrew |
| 595 { HB_HebrewShape, 0 }, | 592 { HB_HebrewShape, 0 }, |
| 596 // Arabic | 593 // Arabic |
| 597 { HB_ArabicShape, 0}, | 594 { HB_ArabicShape, 0}, |
| 598 // Syriac | 595 // Syriac |
| 599 { HB_ArabicShape, 0}, | 596 { HB_ArabicShape, 0}, |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 967 face->gpos = 0; | 964 face->gpos = 0; |
| 968 face->gsub = 0; | 965 face->gsub = 0; |
| 969 face->current_script = HB_ScriptCount; | 966 face->current_script = HB_ScriptCount; |
| 970 face->current_flags = HB_ShaperFlag_Default; | 967 face->current_flags = HB_ShaperFlag_Default; |
| 971 face->has_opentype_kerning = false; | 968 face->has_opentype_kerning = false; |
| 972 face->tmpAttributes = 0; | 969 face->tmpAttributes = 0; |
| 973 face->tmpLogClusters = 0; | 970 face->tmpLogClusters = 0; |
| 974 face->glyphs_substituted = false; | 971 face->glyphs_substituted = false; |
| 975 face->buffer = 0; | 972 face->buffer = 0; |
| 976 | 973 |
| 977 HB_Error error; | 974 HB_Error error = HB_Err_Ok; |
| 978 HB_Stream stream; | 975 HB_Stream stream; |
| 979 HB_Stream gdefStream; | 976 HB_Stream gdefStream; |
| 980 | 977 |
| 981 gdefStream = getTableStream(font, tableFunc, TTAG_GDEF); | 978 gdefStream = getTableStream(font, tableFunc, TTAG_GDEF); |
| 979 error = HB_Err_Not_Covered; |
| 982 if (!gdefStream || (error = HB_Load_GDEF_Table(gdefStream, &face->gdef))) { | 980 if (!gdefStream || (error = HB_Load_GDEF_Table(gdefStream, &face->gdef))) { |
| 983 //DEBUG("error loading gdef table: %d", error); | 981 //DEBUG("error loading gdef table: %d", error); |
| 984 face->gdef = 0; | 982 face->gdef = 0; |
| 985 } | 983 } |
| 986 | 984 |
| 987 //DEBUG() << "trying to load gsub table"; | 985 //DEBUG() << "trying to load gsub table"; |
| 988 stream = getTableStream(font, tableFunc, TTAG_GSUB); | 986 stream = getTableStream(font, tableFunc, TTAG_GSUB); |
| 987 error = HB_Err_Not_Covered; |
| 989 if (!stream || (error = HB_Load_GSUB_Table(stream, &face->gsub, face->gdef,
gdefStream))) { | 988 if (!stream || (error = HB_Load_GSUB_Table(stream, &face->gsub, face->gdef,
gdefStream))) { |
| 990 face->gsub = 0; | 989 face->gsub = 0; |
| 991 if (error != HB_Err_Not_Covered) { | 990 if (error != HB_Err_Not_Covered) { |
| 992 //DEBUG("error loading gsub table: %d", error); | 991 //DEBUG("error loading gsub table: %d", error); |
| 993 } else { | 992 } else { |
| 994 //DEBUG("face doesn't have a gsub table"); | 993 //DEBUG("face doesn't have a gsub table"); |
| 995 } | 994 } |
| 996 } | 995 } |
| 997 _hb_close_stream(stream); | 996 _hb_close_stream(stream); |
| 998 | 997 |
| 999 stream = getTableStream(font, tableFunc, TTAG_GPOS); | 998 stream = getTableStream(font, tableFunc, TTAG_GPOS); |
| 999 error = HB_Err_Not_Covered; |
| 1000 if (!stream || (error = HB_Load_GPOS_Table(stream, &face->gpos, face->gdef,
gdefStream))) { | 1000 if (!stream || (error = HB_Load_GPOS_Table(stream, &face->gpos, face->gdef,
gdefStream))) { |
| 1001 face->gpos = 0; | 1001 face->gpos = 0; |
| 1002 DEBUG("error loading gpos table: %d", error); | 1002 DEBUG("error loading gpos table: %d", error); |
| 1003 } | 1003 } |
| 1004 _hb_close_stream(stream); | 1004 _hb_close_stream(stream); |
| 1005 | 1005 |
| 1006 _hb_close_stream(gdefStream); | 1006 _hb_close_stream(gdefStream); |
| 1007 | 1007 |
| 1008 for (unsigned int i = 0; i < HB_ScriptCount; ++i) | 1008 for (unsigned int i = 0; i < HB_ScriptCount; ++i) |
| 1009 face->supported_scripts[i] = checkScript(face, i); | 1009 face->supported_scripts[i] = checkScript(face, i); |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1350 if (shaper_item->num_glyphs < shaper_item->item.length) { | 1350 if (shaper_item->num_glyphs < shaper_item->item.length) { |
| 1351 shaper_item->num_glyphs = shaper_item->item.length; | 1351 shaper_item->num_glyphs = shaper_item->item.length; |
| 1352 return false; | 1352 return false; |
| 1353 } | 1353 } |
| 1354 assert(shaper_item->item.script < HB_ScriptCount); | 1354 assert(shaper_item->item.script < HB_ScriptCount); |
| 1355 result = HB_ScriptEngines[shaper_item->item.script].shape(shaper_item); | 1355 result = HB_ScriptEngines[shaper_item->item.script].shape(shaper_item); |
| 1356 shaper_item->glyphIndicesPresent = false; | 1356 shaper_item->glyphIndicesPresent = false; |
| 1357 return result; | 1357 return result; |
| 1358 } | 1358 } |
| 1359 | 1359 |
| OLD | NEW |