jdk/src/share/native/sun/font/layout/KernTable.cpp
changeset 22597 7515a991bb37
parent 18118 aa253c91de2e
child 22607 ba232b417248
equal deleted inserted replaced
22596:62542b8be764 22597:7515a991bb37
    37 #include "LESwaps.h"
    37 #include "LESwaps.h"
    38 #include "OpenTypeUtilities.h"
    38 #include "OpenTypeUtilities.h"
    39 
    39 
    40 #include <stdio.h>
    40 #include <stdio.h>
    41 
    41 
    42 #define DEBUG 0
    42 #define DEBUG_KERN_TABLE 0
    43 
    43 
    44 U_NAMESPACE_BEGIN
    44 U_NAMESPACE_BEGIN
    45 
    45 
    46 struct PairInfo {
    46 struct PairInfo {
    47   le_uint32 key;   // sigh, MSVC compiler gags on union here
    47   le_uint32 key;   // sigh, MSVC compiler gags on union here
    97  */
    97  */
    98 KernTable::KernTable(const LETableReference& base, LEErrorCode &success)
    98 KernTable::KernTable(const LETableReference& base, LEErrorCode &success)
    99   : pairsSwapped(NULL), fTable(base)
    99   : pairsSwapped(NULL), fTable(base)
   100 {
   100 {
   101   if(LE_FAILURE(success) || (fTable.isEmpty())) {
   101   if(LE_FAILURE(success) || (fTable.isEmpty())) {
   102 #if DEBUG
   102 #if DEBUG_KERN_TABLE
   103     fprintf(stderr, "no kern data\n");
   103     fprintf(stderr, "no kern data\n");
   104 #endif
   104 #endif
   105     return;
   105     return;
   106   }
   106   }
   107   LEReferenceTo<KernTableHeader> header(fTable, success);
   107   LEReferenceTo<KernTableHeader> header(fTable, success);
   108 
   108 
   109 #if DEBUG
   109 #if DEBUG_KERN_TABLE
   110   // dump first 32 bytes of header
   110   // dump first 32 bytes of header
   111   for (int i = 0; i < 64; ++i) {
   111   for (int i = 0; i < 64; ++i) {
   112     fprintf(stderr, "%0.2x ", ((const char*)header.getAlias())[i]&0xff);
   112     fprintf(stderr, "%0.2x ", ((const char*)header.getAlias())[i]&0xff);
   113     if (((i+1)&0xf) == 0) {
   113     if (((i+1)&0xf) == 0) {
   114       fprintf(stderr, "\n");
   114       fprintf(stderr, "\n");
   169 #if 0
   169 #if 0
   170         fprintf(stderr, "coverage: %0.4x nPairs: %d pairs %p\n", coverage, nPairs, pairsSwapped);
   170         fprintf(stderr, "coverage: %0.4x nPairs: %d pairs %p\n", coverage, nPairs, pairsSwapped);
   171         fprintf(stderr, "  searchRange: %d entrySelector: %d rangeShift: %d\n", searchRange, entrySelector, rangeShift);
   171         fprintf(stderr, "  searchRange: %d entrySelector: %d rangeShift: %d\n", searchRange, entrySelector, rangeShift);
   172         fprintf(stderr, "[[ ignored font table entries: range %d selector %d shift %d ]]\n", SWAPW(table->searchRange), SWAPW(table->entrySelector), SWAPW(table->rangeShift));
   172         fprintf(stderr, "[[ ignored font table entries: range %d selector %d shift %d ]]\n", SWAPW(table->searchRange), SWAPW(table->entrySelector), SWAPW(table->rangeShift));
   173 #endif
   173 #endif
   174 #if DEBUG
   174 #if DEBUG_KERN_TABLE
   175         fprintf(stderr, "coverage: %0.4x nPairs: %d pairs 0x%x\n", coverage, nPairs, pairsSwapped);
   175         fprintf(stderr, "coverage: %0.4x nPairs: %d pairs 0x%x\n", coverage, nPairs, pairsSwapped);
   176         fprintf(stderr,
   176         fprintf(stderr,
   177           "  searchRange(pairs): %d entrySelector: %d rangeShift(pairs): %d\n",
   177           "  searchRange(pairs): %d entrySelector: %d rangeShift(pairs): %d\n",
   178           searchRange, entrySelector, rangeShift);
   178           searchRange, entrySelector, rangeShift);
   179 
   179 
   240       const PairInfo* tp = (const PairInfo*)(p + (rangeShift/KERN_PAIRINFO_SIZE)); /* rangeshift is in original table bytes */
   240       const PairInfo* tp = (const PairInfo*)(p + (rangeShift/KERN_PAIRINFO_SIZE)); /* rangeshift is in original table bytes */
   241       if (key > tp->key) {
   241       if (key > tp->key) {
   242         p = tp;
   242         p = tp;
   243       }
   243       }
   244 
   244 
   245 #if DEBUG
   245 #if DEBUG_KERN_TABLE
   246       fprintf(stderr, "binary search for %0.8x\n", key);
   246       fprintf(stderr, "binary search for %0.8x\n", key);
   247 #endif
   247 #endif
   248 
   248 
   249       le_uint32 probe = searchRange;
   249       le_uint32 probe = searchRange;
   250       while (probe > 1) {
   250       while (probe > 1) {
   251         probe >>= 1;
   251         probe >>= 1;
   252         tp = (const PairInfo*)(p + (probe/KERN_PAIRINFO_SIZE));
   252         tp = (const PairInfo*)(p + (probe/KERN_PAIRINFO_SIZE));
   253         le_uint32 tkey = tp->key;
   253         le_uint32 tkey = tp->key;
   254 #if DEBUG
   254 #if DEBUG_KERN_TABLE
   255         fprintf(stdout, "   %.3d (%0.8x)\n", (tp - pairsSwapped), tkey);
   255         fprintf(stdout, "   %.3d (%0.8x)\n", (tp - pairsSwapped), tkey);
   256 #endif
   256 #endif
   257         if (tkey <= key) {
   257         if (tkey <= key) {
   258           if (tkey == key) {
   258           if (tkey == key) {
   259             le_int16 value = SWAPW(tp->value);
   259             le_int16 value = SWAPW(tp->value);
   260 #if DEBUG
   260 #if DEBUG_KERN_TABLE
   261             fprintf(stdout, "binary found kerning pair %x:%x at %d, value: 0x%x (%g)\n",
   261             fprintf(stdout, "binary found kerning pair %x:%x at %d, value: 0x%x (%g)\n",
   262                     storage[i-1], storage[i], i, value & 0xffff, font->xUnitsToPoints(value));
   262                     storage[i-1], storage[i], i, value & 0xffff, font->xUnitsToPoints(value));
   263             fflush(stdout);
   263             fflush(stdout);
   264 #endif
   264 #endif
   265             // Have to undo the device transform.
   265             // Have to undo the device transform.