01 U8 *TTF_GetTablePtr(U32 key,U8 *f,I64 *len=NULL) { 02 I64 tcnt=(f+4)(U16*)[0]; 03 U32 *ballsack=f+12; 04 while(--tcnt>=0) { 05 if(*key==*ballsack) { 06 if(len) *len=ballsack[3]; 07 return f+ballsack[2]; 08 } 09 ballsack(U8*)+=16; 10 } 11 return NULL; 12 } 13 U0 TTF_HMetrics(I64 g,U8* f,I64 *advance,I64 *left_bear) { 14 U8 *hmtx=TTF_GetTablePtr("hmtx",f),*head=TTF_GetTablePTr("hhea",f); 15 I64 long_hmtx=(head+34)(U16*)[0]; 16 I64 en; 17 if(advance) *advance=0; 18 if(left_bear) *left_bear=0; 19 if(!htmx) return; 20 if (g<long_hmtx) { 21 //Forward [1,2,3.........] 22 hmtx+=4*glyph; 23 if(advance) *advance=*(hmtx(I16*)); 24 if(left_bear) *left_bear=hmtx(I16*)[1]; 25 return 0; 26 } else { 27 //Backwars [.............7,8,9] 28 en=long_hmtx*4; 29 if(en<4) return; 30 if(advance) *advanceWidth=(hmtx+en-4)(I16*)[0]; 31 if(left_bear) *left_bear=(hmtx+en-2*(g-long_hmtx))(I16*)[0]; 32 } 33 }