src/share/native/sun/font/layout/KernTable.cpp
Print this page
*** 94,104 ****
*
* TODO: support multiple subtables
* TODO: respect header flags
*/
KernTable::KernTable(const LETableReference& base, LEErrorCode &success)
! : pairs(), pairsSwapped(NULL), fTable(base)
{
if(LE_FAILURE(success) || (fTable.isEmpty())) {
#if DEBUG
fprintf(stderr, "no kern data\n");
#endif
--- 94,104 ----
*
* TODO: support multiple subtables
* TODO: respect header flags
*/
KernTable::KernTable(const LETableReference& base, LEErrorCode &success)
! : pairsSwapped(NULL), fTable(base)
{
if(LE_FAILURE(success) || (fTable.isEmpty())) {
#if DEBUG
fprintf(stderr, "no kern data\n");
#endif
*** 141,176 ****
searchRange = (1 << entrySelector) * KERN_PAIRINFO_SIZE;
rangeShift = (nPairs * KERN_PAIRINFO_SIZE) - searchRange;
#endif
if(LE_SUCCESS(success) && nPairs>0) {
! // pairs is an instance member, and table is on the stack.
! // set 'pairs' based on table.getAlias(). This will range check it.
! pairs = LEReferenceToArrayOf<PairInfo>(fTable, // based on overall table
success,
(const PairInfo*)table.getAlias(), // subtable 0 + ..
KERN_SUBTABLE_0_HEADER_SIZE, // .. offset of header size
nPairs); // count
- }
if (LE_SUCCESS(success) && pairs.isValid()) {
pairsSwapped = (PairInfo*)(malloc(nPairs*sizeof(PairInfo)));
PairInfo *p = (PairInfo*)pairsSwapped;
for (int i = 0; LE_SUCCESS(success) && i < nPairs; i++, p++) {
memcpy(p, pairs.getAlias(i,success), KERN_PAIRINFO_SIZE);
p->key = SWAPL(p->key);
}
fTable.getFont()->setKernPairs((void*)pairsSwapped); // store it
}
#if 0
! fprintf(stderr, "coverage: %0.4x nPairs: %d pairs %p\n", coverage, nPairs, pairs.getAlias());
fprintf(stderr, " searchRange: %d entrySelector: %d rangeShift: %d\n", searchRange, entrySelector, rangeShift);
fprintf(stderr, "[[ ignored font table entries: range %d selector %d shift %d ]]\n", SWAPW(table->searchRange), SWAPW(table->entrySelector), SWAPW(table->rangeShift));
#endif
#if DEBUG
! fprintf(stderr, "coverage: %0.4x nPairs: %d pairs 0x%x\n", coverage, nPairs, pairs);
fprintf(stderr,
" searchRange(pairs): %d entrySelector: %d rangeShift(pairs): %d\n",
searchRange, entrySelector, rangeShift);
{
--- 141,180 ----
searchRange = (1 << entrySelector) * KERN_PAIRINFO_SIZE;
rangeShift = (nPairs * KERN_PAIRINFO_SIZE) - searchRange;
#endif
if(LE_SUCCESS(success) && nPairs>0) {
! // pairsSwapped is an instance member, and table is on the stack.
! // set 'pairsSwapped' based on table.getAlias(). This will range check it.
! pairsSwapped = (PairInfo*)(fTable.getFont()->getKernPairs());
! if (pairsSwapped == NULL) {
! LEReferenceToArrayOf<PairInfo>pairs =
! LEReferenceToArrayOf<PairInfo>(fTable, // based on overall table
success,
(const PairInfo*)table.getAlias(), // subtable 0 + ..
KERN_SUBTABLE_0_HEADER_SIZE, // .. offset of header size
nPairs); // count
if (LE_SUCCESS(success) && pairs.isValid()) {
pairsSwapped = (PairInfo*)(malloc(nPairs*sizeof(PairInfo)));
PairInfo *p = (PairInfo*)pairsSwapped;
for (int i = 0; LE_SUCCESS(success) && i < nPairs; i++, p++) {
memcpy(p, pairs.getAlias(i,success), KERN_PAIRINFO_SIZE);
p->key = SWAPL(p->key);
}
fTable.getFont()->setKernPairs((void*)pairsSwapped); // store it
}
+ }
+ }
#if 0
! fprintf(stderr, "coverage: %0.4x nPairs: %d pairs %p\n", coverage, nPairs, pairsSwapped);
fprintf(stderr, " searchRange: %d entrySelector: %d rangeShift: %d\n", searchRange, entrySelector, rangeShift);
fprintf(stderr, "[[ ignored font table entries: range %d selector %d shift %d ]]\n", SWAPW(table->searchRange), SWAPW(table->entrySelector), SWAPW(table->rangeShift));
#endif
#if DEBUG
! fprintf(stderr, "coverage: %0.4x nPairs: %d pairs 0x%x\n", coverage, nPairs, pairsSwapped);
fprintf(stderr,
" searchRange(pairs): %d entrySelector: %d rangeShift(pairs): %d\n",
searchRange, entrySelector, rangeShift);
{
*** 180,190 ****
LEGlyphID id = font->mapCharToGlyph(i);
if (id < 256) {
ids[id] = (char)i;
}
}
! PairInfo *p = pairs;
for (int i = 0; i < nPairs; ++i, p++) {
le_uint32 k = p->key;
le_uint16 left = (k >> 16) & 0xffff;
le_uint16 right = k & 0xffff;
if (left < 256 && right < 256) {
--- 184,194 ----
LEGlyphID id = font->mapCharToGlyph(i);
if (id < 256) {
ids[id] = (char)i;
}
}
! PairInfo *p = pairsSwapped;
for (int i = 0; i < nPairs; ++i, p++) {
le_uint32 k = p->key;
le_uint16 left = (k >> 16) & 0xffff;
le_uint16 right = k & 0xffff;
if (left < 256 && right < 256) {