2010年01月01日(金)
新年を迎えました。 [タイ生活]
あけましておめでとうございます。今年もよろしくお願いいたします。
#
スーザン ボイルの歌声がよかったです。
小林幸子の衣装はすごかったですね。3トンもあるなんてびっくりしました。
Posted by ぷーちゃん at 00時13分 パーマリンク
2009年11月29日(日)
TrueType Font のファイル形式 [タイの電脳事情 電脳街情報]
TrueType Fontのファイル形式を解析してみました。以下はTahoma.ttfを読み込んだ結果です。見た感じ、テーブル内のTAGは二分探索を行うときに必要な項目です。フォントサイズを計算するとき、最大のOffset値を持っているテーブルを求めて、その値にテーブルの長さ(Length)を足せばいいです。
ここまでなら、プログラミング自体は難しくなかったのですが、TTFのファイル構造を理解するのに少し時間がかかりました。残りはグリフと文字コードの関係を調べる作業がありますが、かなり大きな構造体を理解する必要があるので、それなりに時間がないと終わらないと思います。
The offset subtable =================== scaler type : 0x00010000 number of tables : 22 search range : 256 entry selector : 4 range shift : 96 The table directory ------------------------------------------------- table tag checksum offset length ------------------------------------------------- 1 DSIG FCFE875A A406C 2434 2 GDEF F02BF75F 95960 340 3 GPOS C6F70E96 9793C B83A 4 GSUB B2491028 95CA0 1C9C 5 LTSH C7CA55B2 35DC CE9 6 OS/2 D6425AC4 1E8 60 7 VDMX 76D97D56 42C8 5E0 8 cmap 31408F48 A3178 EF2 9 cvt 89B4966C 1E438 308 10 fpgm FE40EAFD 1D8C8 5BC 11 gasp 00170009 95950 10 12 glyf FEAFC82C 21AD8 6A3FC 13 hdmx BD46C5E9 48A8 19020 14 head D84F7FD5 16C 36 15 hhea 0F58121F 1A4 24 16 hmtx 9F0772BB 248 3394 17 kern ADC4AF0B 8BED4 FDE 18 loca 2C92213E 1E740 3398 19 maxp 11010415 1C8 20 20 name 3AC16DD0 8CEB4 816 21 post FE8B50AA 8D6CC 8281 22 prep E1E8DA4C 1DE84 5B1 ------------------------------------------------- The last table is: DSIG FCFE875A A406C 2434 Last byte = A64A0
// the font directory consists of two parts: // part 1. the offset subtable - 12 bytes // note: for the scaler type // - fonts produced specifically for Mac OS // should be 0x74727565 ('true') // - fonts for MS Windows must use 0x000100 // (version no). // -------------------------------------------- typedef struct { byte scaler[4]; // scaler type, see note word tables; // number of tables word range; // search range word select; // entry selector word shift; // range shift } offtab; // part 2. the table directory - 16 bytes // note: entries in the table directory must be sorted // inascending order by tag. // --------------------------------------------------- typedef struct { byte tag[4]; // 4-byte identifier dword chksum; // this table checksum dword offset; // offset from the beginning of sfnt dword length; // actual table length in bytes } tabdir; // (not including pads) // function prototypes // ------------------- void help ( char *pname ); void readOffset ( offtab *tab, FILE *fp ); void dispOffset ( const offtab *tab ); void readTabdir ( tabdir *tab, FILE *fp ); void dispTabdir ( tabdir *tab ); void dispHead ( void ); void line ( int n ); // -------------------------- // M A I N P R O G R A M // -------------------------- int main ( int argc, char *argv[] ) { FILE *ttf; // TrueType font file offtab otab; // offset subtable tabdir dtab; // table directory tabdir mtab; int k; dword max = 0; // maximum offset // ttf filename is supplied? // ------------------------- if ( argc < 2 ) help(argv[0]); ttf = jopen(argv[1], "rb"); // read and display offset subtable readOffset(&otab, ttf); dispOffset(&otab); // read data, store in the table directory, and display // one table at a time // ---------------------------------------------------- dispHead(); for ( k = 0; k < otab.tables; ++k ) { readTabdir(&dtab, ttf); printf("%2d ", k+1); dispTabdir(&dtab); if ( dtab.offset > max ) { max = dtab.offset; mtab = dtab; } } line(49); printf("The last table is:¥n"); dispTabdir(&mtab); printf("Last byte = %X¥n", mtab.offset + mtab.length); jclose(ttf); return 0; } // help - display application's usage information // ---------------------------------------------- void help ( char *pname ) { printf("usage : %s <TrueType-font-file.ttf>¥n", pname); exit(1); } // readOffset - read the offset subtable, one element at a time // to avoid alignment prooblem; fixed size = 12 bytes // ------------------------------------------------------------ void readOffset ( offtab *tab, FILE *fp ) { jread(&tab->scaler, sizeof(tab->scaler), fp); jread(&tab->tables, sizeof(tab->tables), fp); jread(&tab->range, sizeof(tab->range), fp); jread(&tab->select, sizeof(tab->select), fp); jread(&tab->shift, sizeof(tab->shift), fp); // flip 16-bit data from host to network byte order // ------------------------------------------------ tab->tables = flip16(tab->tables); tab->range = flip16(tab->range); tab->select = flip16(tab->select); tab->shift = flip16(tab->shift); } // dispOffset - display the offset subtable // ---------------------------------------- void dispOffset ( const offtab *tab ) { int i; printf("¥n"); printf("The offset subtable¥n"); printf("===================¥n"); printf(" scaler type : 0x"); for ( i = 0; i < 4; ++i ) printf("%02X", tab->scaler[i]); printf("¥n"); printf(" number of tables : %d¥n", tab->tables); printf(" search range : %d¥n", tab->range); printf(" entry selector : %d¥n", tab->select); printf(" range shift : %d¥n", tab->shift); printf("¥n"); } // readTabdir - read the table directory, one element at a time // to avoid alignment prooblem; fixed size = 16 bytes // ------------------------------------------------------------ void readTabdir ( tabdir *tab, FILE *fp ) { jread(&tab->tag, sizeof(tab->tag), fp); jread(&tab->chksum, sizeof(tab->chksum), fp); jread(&tab->offset, sizeof(tab->offset), fp); jread(&tab->length, sizeof(tab->length), fp); // flip 32-bit data from host to network byte order // ------------------------------------------------ tab->chksum = flip32(tab->chksum); tab->offset = flip32(tab->offset); tab->length = flip32(tab->length); } // dispTabdir - display the table directory // ---------------------------------------- void dispTabdir ( tabdir *tab ) { int i; int n = sizeof(tab->tag); for ( i = 0; i < n; ++i ) printf("%c", (char)tab->tag[i]); printf(" "); printf("%08X ", tab->chksum); printf("%8X ", tab->offset); printf("%6X¥n", tab->length); } // dispHead - head of the table directory display // ---------------------------------------------- void dispHead ( void ) { printf("¥n"); printf(" The table directory¥n"); line(49); printf("table tag checksum offset length¥n"); line(49); } // line - display a line of length 'n' // ----------------------------------- void line ( int n ) { int i; for ( i = 0; i < n; ++i ) putchar('-'); putchar('¥n'); }
Posted by ぷーちゃん at 17時26分 パーマリンク
iPod nano のタイ語表示 [タイの電脳事情 電脳街情報]

大変お待たせしました。最近タイとアメリカサイトのGPSフォーラムに出入りしているので、ついブログをサボってしまいました。ipod nanoのタイ語表示は写真の通りです。完全にタイ語をサポートしているようです。
Posted by ぷーちゃん at 13時01分 パーマリンク
2009年10月01日(木)
今日のバンコクは雨でした [タイ生活]
日本の高校時代の友達に会うために久しぶりバンコクに行ってきました。台風の影響で広域的に雨でした。気温も例年よりやや低くて日中25~26度くらいでした。
約18年も会っていなくてあまり共通な話題がないかと心配しましたが、実際に会ってみてまったくそう感じていませんでした。後でわかったことですが、実はその友達も僕が通っていた大学に在籍していたことがありました。住んでいたところも近かったようで、「帰国子女」や「平砂宿舎」や「宝島」や「国関」などのローカルな話がなんでも通じました。本当にびっくりしましたが、こういうことも稀に起きるものですね。
現在その友達は国際的な舞台で活躍しています。年に何回も飛行機に乗っていろいろな国に出張したりしてタイトなスケジュールをこなしているようですが、今後もさらなる活躍を期待しているので大いに頑張ってください。そして、また機会があったら是非会いましょう。
Posted by ぷーちゃん at 19時06分 パーマリンク
2009年09月27日(日)
本日のランチメニュー [タイ生活]
ソムタム・プーマーが美味しかったです。もちろん唐辛子が入っていないのを頼みました。パパヤサラダだと思ってもいいかもしれません。全部300バーツ(約1000円)でした。
Posted by ぷーちゃん at 21時15分 パーマリンク
【 過去の記事へ 】