PassRefPtr<SharedBuffer> FontPlatformData::openTypeTable(uint32_t table) const { RefPtr<SharedBuffer> buffer; SkFontTableTag tag = SkEndianSwap32(table); const size_t tableSize = m_typeface->getTableSize(tag); if (tableSize) { Vector<char> tableBuffer(tableSize); m_typeface->getTableData(tag, 0, tableSize, &tableBuffer[0]); buffer = SharedBuffer::adoptVector(tableBuffer); } return buffer.release(); }
uint32_t SkKTXFile::readInt(const uint8_t** buf, size_t* bytesLeft) const { SkASSERT(buf && bytesLeft); uint32_t result; if (*bytesLeft < 4) { SkASSERT(false); return 0; } memcpy(&result, *buf, 4); *buf += 4; if (fSwapBytes) { SkEndianSwap32(result); } *bytesLeft -= 4; return result; }
static bool has_bitmap_strike(DWriteFontTypeface* typeface, PPEMRange range) { SkAutoExclusive l(DWriteFactoryMutex); { AutoTDWriteTable<SkOTTableEmbeddedBitmapLocation> eblc(typeface->fDWriteFontFace.get()); if (!eblc.fExists) { return false; } if (eblc.fSize < sizeof(SkOTTableEmbeddedBitmapLocation)) { return false; } if (eblc->version != SkOTTableEmbeddedBitmapLocation::version_initial) { return false; } uint32_t numSizes = SkEndianSwap32(eblc->numSizes); if (numSizes > 1024 || eblc.fSize < sizeof(SkOTTableEmbeddedBitmapLocation) + sizeof(SkOTTableEmbeddedBitmapLocation::BitmapSizeTable) * numSizes) { return false; } const SkOTTableEmbeddedBitmapLocation::BitmapSizeTable* sizeTable = SkTAfter<const SkOTTableEmbeddedBitmapLocation::BitmapSizeTable>(eblc.get()); for (uint32_t i = 0; i < numSizes; ++i, ++sizeTable) { if (sizeTable->ppemX == sizeTable->ppemY && range.min <= sizeTable->ppemX && sizeTable->ppemX <= range.max) { // TODO: determine if we should dig through IndexSubTableArray/IndexSubTable // to determine the actual number of glyphs with bitmaps. // TODO: Ensure that the bitmaps actually cover a significant portion of the strike. // TODO: Ensure that the bitmaps are bi-level? if (sizeTable->endGlyphIndex >= sizeTable->startGlyphIndex + 3) { return true; } } } } { AutoTDWriteTable<SkOTTableEmbeddedBitmapScaling> ebsc(typeface->fDWriteFontFace.get()); if (!ebsc.fExists) { return false; } if (ebsc.fSize < sizeof(SkOTTableEmbeddedBitmapScaling)) { return false; } if (ebsc->version != SkOTTableEmbeddedBitmapScaling::version_initial) { return false; } uint32_t numSizes = SkEndianSwap32(ebsc->numSizes); if (numSizes > 1024 || ebsc.fSize < sizeof(SkOTTableEmbeddedBitmapScaling) + sizeof(SkOTTableEmbeddedBitmapScaling::BitmapScaleTable) * numSizes) { return false; } const SkOTTableEmbeddedBitmapScaling::BitmapScaleTable* scaleTable = SkTAfter<const SkOTTableEmbeddedBitmapScaling::BitmapScaleTable>(ebsc.get()); for (uint32_t i = 0; i < numSizes; ++i, ++scaleTable) { if (scaleTable->ppemX == scaleTable->ppemY && range.min <= scaleTable->ppemX && scaleTable->ppemX <= range.max) { // EBSC tables are normally only found in bitmap only fonts. return true; } } } return false; }