64 |
64 |
65 xScalePixelsToUnits = upem / xppem; |
65 xScalePixelsToUnits = upem / xppem; |
66 yScalePixelsToUnits = upem / yppem; |
66 yScalePixelsToUnits = upem / yppem; |
67 }; |
67 }; |
68 |
68 |
|
69 |
69 const void *FontInstanceAdapter::getFontTable(LETag tableTag) const |
70 const void *FontInstanceAdapter::getFontTable(LETag tableTag) const |
70 { |
71 { |
|
72 size_t ignored = 0; |
|
73 return getFontTable(tableTag, ignored); |
|
74 } |
|
75 |
|
76 static const LETag cacheMap[LAYOUTCACHE_ENTRIES] = { |
|
77 GPOS_TAG, GDEF_TAG, GSUB_TAG, MORT_TAG, MORX_TAG, KERN_TAG |
|
78 }; |
|
79 |
|
80 const void *FontInstanceAdapter::getFontTable(LETag tableTag, size_t &length) const |
|
81 { |
|
82 length = 0; |
|
83 |
71 if (!layoutTables) { // t1 font |
84 if (!layoutTables) { // t1 font |
72 return 0; |
85 return 0; |
73 } |
86 } |
74 |
87 |
75 // cache in font's pscaler object |
88 // cache in font's pscaler object |
76 // font disposer will handle for us |
89 // font disposer will handle for us |
77 |
90 |
78 switch(tableTag) { |
91 int cacheIdx; |
79 case GSUB_TAG: if (layoutTables->gsub_len != -1) return (void*)layoutTables->gsub; break; |
92 for (cacheIdx=0;cacheIdx<LAYOUTCACHE_ENTRIES;cacheIdx++) { |
80 case GPOS_TAG: if (layoutTables->gpos_len != -1) return (void*)layoutTables->gpos; break; |
93 if (tableTag==cacheMap[cacheIdx]) break; |
81 case GDEF_TAG: if (layoutTables->gdef_len != -1) return (void*)layoutTables->gdef; break; |
94 } |
82 case MORT_TAG: if (layoutTables->mort_len != -1) return (void*)layoutTables->mort; break; |
95 |
83 case KERN_TAG: if (layoutTables->kern_len != -1) return (void*)layoutTables->kern; break; |
96 if (cacheIdx<LAYOUTCACHE_ENTRIES) { // if found |
84 default: |
97 if (layoutTables->entries[cacheIdx].len != -1) { |
85 //fprintf(stderr, "unexpected table request from font instance adapter: %x\n", tableTag); |
98 length = layoutTables->entries[cacheIdx].len; |
|
99 return layoutTables->entries[cacheIdx].ptr; |
|
100 } |
|
101 } else { |
|
102 //fprintf(stderr, "unexpected table request from font instance adapter: %x\n", tableTag); |
|
103 // (don't load any other tables) |
86 return 0; |
104 return 0; |
87 } |
105 } |
88 |
106 |
89 jbyte* result = 0; |
107 jbyte* result = 0; |
90 jsize len = 0; |
108 jsize len = 0; |
94 len = env->GetArrayLength(tableBytes); |
112 len = env->GetArrayLength(tableBytes); |
95 result = new jbyte[len]; |
113 result = new jbyte[len]; |
96 env->GetByteArrayRegion(tableBytes, 0, len, result); |
114 env->GetByteArrayRegion(tableBytes, 0, len, result); |
97 } |
115 } |
98 |
116 |
99 switch(tableTag) { |
117 if (cacheIdx<LAYOUTCACHE_ENTRIES) { // if cacheable table |
100 case GSUB_TAG: layoutTables->gsub = (void*)result; layoutTables->gsub_len = len; break; |
118 layoutTables->entries[cacheIdx].len = len; |
101 case GPOS_TAG: layoutTables->gpos = (void*)result; layoutTables->gpos_len = len; break; |
119 layoutTables->entries[cacheIdx].ptr = (const void*)result; |
102 case GDEF_TAG: layoutTables->gdef = (void*)result; layoutTables->gdef_len = len; break; |
120 } |
103 case MORT_TAG: layoutTables->mort = (void*)result; layoutTables->mort_len = len; break; |
121 |
104 case KERN_TAG: layoutTables->kern = (void*)result; layoutTables->kern_len = len; break; |
122 length = len; |
105 default: break; |
123 return (const void*)result; |
106 } |
|
107 |
|
108 return (void*)result; |
|
109 }; |
124 }; |
110 |
125 |
111 LEGlyphID FontInstanceAdapter::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const |
126 LEGlyphID FontInstanceAdapter::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const |
112 { |
127 { |
113 LEUnicode32 mappedChar = mapper->mapChar(ch); |
128 LEUnicode32 mappedChar = mapper->mapChar(ch); |