/* * Copyright 2024 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkOTTable_sbix_DEFINED #define SkOTTable_sbix_DEFINED #include "include/private/base/SkTemplates.h" #include "src/base/SkUtils.h" #include "src/sfnt/SkOTTableTypes.h" #pragma pack(push, 1) struct SkOTTableGlyphData; struct SkOTTableStandardBitmapGraphics { static const SK_OT_CHAR TAG0 = 's'; static const SK_OT_CHAR TAG1 = 'b'; static const SK_OT_CHAR TAG2 = 'i'; static const SK_OT_CHAR TAG3 = 'x'; static const SK_OT_ULONG TAG = SkOTTableTAG::value; SK_OT_USHORT version; // 1 SK_OT_USHORT flags; // Bit 0: 1. Bit 1: Draw outlines. Bits 2 to 15: reserved (set to 0) SK_OT_ULONG numStrikes; //SK_OT_ULONG strikeOffsets[/*numStrikes*/]; // offset from sbix table to Strike SK_OT_ULONG strikeOffset(int strikeIndex) { return sk_unaligned_load( SkTAddOffset(&numStrikes, sizeof(numStrikes)+sizeof(SK_OT_ULONG)*strikeIndex)); } struct Strike { SK_OT_USHORT ppem; // pixels for em SK_OT_USHORT ppi; // design pixel density //SK_OT_ULONG glyphDataOffsets[/*numGlyphs+1*/]; // offset from Strike to GlyphData SK_OT_ULONG glyphDataOffset(int glyphId) { return sk_unaligned_load( SkTAddOffset(&ppi, sizeof(ppi)+sizeof(SK_OT_ULONG)*glyphId)); } }; struct GlyphData { SK_OT_SHORT originOffsetX; // x offset of bitmap in pixels SK_OT_SHORT originOffsetY; // y offset of bitmap in pixels (y-up) SK_OT_ULONG graphicType; // 'jpg ', 'png ', 'tiff', or 'dupe' //SK_OT_BYTE data[]; // length is to next glyphDataOffsets entry SK_OT_BYTE* data() { return SkTAfter(&graphicType); } const SK_OT_BYTE* data() const { return SkTAfter(&graphicType); } }; }; #pragma pack(pop) #endif