jdk/src/share/native/sun/font/FontInstanceAdapter.cpp
changeset 16891 91e99bed64ae
parent 9035 1255eb81cc2f
child 23010 6dadb192ad81
equal deleted inserted replaced
16890:36b30720a997 16891:91e99bed64ae
    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);