1 /* 2 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 3 * 4 * This is part of HarfBuzz, an OpenType Layout engine 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 25 #include "harfbuzz-shaper.h" 26 #include "harfbuzz-shaper-private.h" 27 #include "harfbuzz-external.h" 28 29 #include <assert.h> 30 31 static void thaiWordBreaks(const HB_UChar16 *string, hb_uint32 len, HB_CharAttributes *attributes) 32 { 33 typedef int (*th_brk_def)(const char*, int[], int); 34 static void *thaiCodec = 0; 35 static th_brk_def th_brk = 0; 36 char *cstr = 0; 37 int brp[128]; 38 int *break_positions = brp; 39 hb_uint32 numbreaks; 40 hb_uint32 i; 41 42 if (!thaiCodec) 43 thaiCodec = HB_TextCodecForMib(2259); 44 45 /* load libthai dynamically */ 46 if (!th_brk && thaiCodec) { 47 th_brk = (th_brk_def)HB_Library_Resolve("thai", "th_brk"); 48 if (!th_brk) 49 thaiCodec = 0; 50 } 51 52 if (!th_brk) 53 return; 54 55 cstr = HB_TextCodec_ConvertFromUnicode(thaiCodec, string, len, 0); 56 if (!cstr) 57 return; 58 59 break_positions = brp; 60 numbreaks = th_brk(cstr, break_positions, 128); 61 if (numbreaks > 128) { 62 break_positions = (int *)malloc(numbreaks * sizeof(int)); 63 numbreaks = th_brk(cstr, break_positions, numbreaks); 64 } 65 66 for (i = 0; i < len; ++i) 67 attributes[i].lineBreakType = HB_NoBreak; 68 69 for (i = 0; i < numbreaks; ++i) { 70 if (break_positions[i] > 0) 71 attributes[break_positions[i]-1].lineBreakType = HB_Break; 72 } 73 74 if (break_positions != brp) 75 free(break_positions); 76 77 HB_TextCodec_FreeResult(cstr); 78 } 79 80 81 void HB_ThaiAttributes(HB_Script script, const HB_UChar16 *text, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes) 82 { 83 assert(script == HB_Script_Thai); 84 attributes += from; 85 thaiWordBreaks(text + from, len, attributes); 86 } 87 88