Blame src/hb-ot-cbdt-table.hh

Packit Service 5bcba8
/*
Packit Service 5bcba8
 * Copyright © 2016  Google, Inc.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 *  This is part of HarfBuzz, a text shaping library.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Permission is hereby granted, without written agreement and without
Packit Service 5bcba8
 * license or royalty fees, to use, copy, modify, and distribute this
Packit Service 5bcba8
 * software and its documentation for any purpose, provided that the
Packit Service 5bcba8
 * above copyright notice and the following two paragraphs appear in
Packit Service 5bcba8
 * all copies of this software.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
Packit Service 5bcba8
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
Packit Service 5bcba8
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
Packit Service 5bcba8
 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
Packit Service 5bcba8
 * DAMAGE.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
Packit Service 5bcba8
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
Packit Service 5bcba8
 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
Packit Service 5bcba8
 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
Packit Service 5bcba8
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Google Author(s): Seigo Nonaka
Packit Service 5bcba8
 */
Packit Service 5bcba8
Packit Service 5bcba8
#ifndef HB_OT_CBDT_TABLE_HH
Packit Service 5bcba8
#define HB_OT_CBDT_TABLE_HH
Packit Service 5bcba8
Packit Service 5bcba8
#include "hb-open-type-private.hh"
Packit Service 5bcba8
Packit Service 5bcba8
namespace OT {
Packit Service 5bcba8
Packit Service 5bcba8
struct SmallGlyphMetrics
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  inline void get_extents (hb_glyph_extents_t *extents) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    extents->x_bearing = bearingX;
Packit Service 5bcba8
    extents->y_bearing = bearingY;
Packit Service 5bcba8
    extents->width = width;
Packit Service 5bcba8
    extents->height = -height;
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  BYTE height;
Packit Service 5bcba8
  BYTE width;
Packit Service 5bcba8
  CHAR bearingX;
Packit Service 5bcba8
  CHAR bearingY;
Packit Service 5bcba8
  BYTE advance;
Packit Service 5bcba8
Packit Service 5bcba8
  DEFINE_SIZE_STATIC(5);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct BigGlyphMetrics : SmallGlyphMetrics
Packit Service 5bcba8
{
Packit Service 5bcba8
  CHAR vertBearingX;
Packit Service 5bcba8
  CHAR vertBearingY;
Packit Service 5bcba8
  BYTE vertAdvance;
Packit Service 5bcba8
Packit Service 5bcba8
  DEFINE_SIZE_STATIC(8);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct SBitLineMetrics
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  CHAR ascender;
Packit Service 5bcba8
  CHAR decender;
Packit Service 5bcba8
  BYTE widthMax;
Packit Service 5bcba8
  CHAR caretSlopeNumerator;
Packit Service 5bcba8
  CHAR caretSlopeDenominator;
Packit Service 5bcba8
  CHAR caretOffset;
Packit Service 5bcba8
  CHAR minOriginSB;
Packit Service 5bcba8
  CHAR minAdvanceSB;
Packit Service 5bcba8
  CHAR maxBeforeBL;
Packit Service 5bcba8
  CHAR minAfterBL;
Packit Service 5bcba8
  CHAR padding1;
Packit Service 5bcba8
  CHAR padding2;
Packit Service 5bcba8
Packit Service 5bcba8
  DEFINE_SIZE_STATIC(12);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
/*
Packit Service 5bcba8
 * Index Subtables.
Packit Service 5bcba8
 */
Packit Service 5bcba8
Packit Service 5bcba8
struct IndexSubtableHeader
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  USHORT indexFormat;
Packit Service 5bcba8
  USHORT imageFormat;
Packit Service 5bcba8
  ULONG imageDataOffset;
Packit Service 5bcba8
Packit Service 5bcba8
  DEFINE_SIZE_STATIC(8);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
template <typename OffsetType>
Packit Service 5bcba8
struct IndexSubtableFormat1Or3
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this) &&
Packit Service 5bcba8
		  c->check_array (offsetArrayZ, offsetArrayZ[0].static_size, glyph_count + 1));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  bool get_image_data (unsigned int idx,
Packit Service 5bcba8
		       unsigned int *offset,
Packit Service 5bcba8
		       unsigned int *length) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    if (unlikely (offsetArrayZ[idx + 1] <= offsetArrayZ[idx]))
Packit Service 5bcba8
      return false;
Packit Service 5bcba8
Packit Service 5bcba8
    *offset = header.imageDataOffset + offsetArrayZ[idx];
Packit Service 5bcba8
    *length = offsetArrayZ[idx + 1] - offsetArrayZ[idx];
Packit Service 5bcba8
    return true;
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  IndexSubtableHeader header;
Packit Service 5bcba8
  Offset<OffsetType> offsetArrayZ[VAR];
Packit Service 5bcba8
Packit Service 5bcba8
  DEFINE_SIZE_ARRAY(8, offsetArrayZ);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct IndexSubtableFormat1 : IndexSubtableFormat1Or3<ULONG> {};
Packit Service 5bcba8
struct IndexSubtableFormat3 : IndexSubtableFormat1Or3<USHORT> {};
Packit Service 5bcba8
Packit Service 5bcba8
struct IndexSubtable
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    if (!u.header.sanitize (c)) return_trace (false);
Packit Service 5bcba8
    switch (u.header.indexFormat) {
Packit Service 5bcba8
    case 1: return_trace (u.format1.sanitize (c, glyph_count));
Packit Service 5bcba8
    case 3: return_trace (u.format3.sanitize (c, glyph_count));
Packit Service 5bcba8
    default:return_trace (true);
Packit Service 5bcba8
    }
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  inline bool get_extents (hb_glyph_extents_t *extents) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    switch (u.header.indexFormat) {
Packit Service 5bcba8
    case 2: case 5: /* TODO */
Packit Service 5bcba8
    case 1: case 3: case 4: /* Variable-metrics formats do not have metrics here. */
Packit Service 5bcba8
    default:return (false);
Packit Service 5bcba8
    }
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  bool get_image_data (unsigned int idx,
Packit Service 5bcba8
		       unsigned int *offset,
Packit Service 5bcba8
		       unsigned int *length,
Packit Service 5bcba8
		       unsigned int *format) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    *format = u.header.imageFormat;
Packit Service 5bcba8
    switch (u.header.indexFormat) {
Packit Service 5bcba8
    case 1: return u.format1.get_image_data (idx, offset, length);
Packit Service 5bcba8
    case 3: return u.format3.get_image_data (idx, offset, length);
Packit Service 5bcba8
    default: return false;
Packit Service 5bcba8
    }
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  union {
Packit Service 5bcba8
  IndexSubtableHeader	header;
Packit Service 5bcba8
  IndexSubtableFormat1	format1;
Packit Service 5bcba8
  IndexSubtableFormat3	format3;
Packit Service 5bcba8
  /* TODO: Format 2, 4, 5. */
Packit Service 5bcba8
  } u;
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_UNION (8, header);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct IndexSubtableRecord
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this) &&
Packit Service 5bcba8
		  firstGlyphIndex <= lastGlyphIndex &&
Packit Service 5bcba8
		  offsetToSubtable.sanitize (c, this, lastGlyphIndex - firstGlyphIndex + 1));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  inline bool get_extents (hb_glyph_extents_t *extents) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    return (this+offsetToSubtable).get_extents (extents);
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  bool get_image_data (unsigned int gid,
Packit Service 5bcba8
		       unsigned int *offset,
Packit Service 5bcba8
		       unsigned int *length,
Packit Service 5bcba8
		       unsigned int *format) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    if (gid < firstGlyphIndex || gid > lastGlyphIndex)
Packit Service 5bcba8
    {
Packit Service 5bcba8
      return false;
Packit Service 5bcba8
    }
Packit Service 5bcba8
    return (this+offsetToSubtable).get_image_data (gid - firstGlyphIndex,
Packit Service 5bcba8
						   offset, length, format);
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  USHORT firstGlyphIndex;
Packit Service 5bcba8
  USHORT lastGlyphIndex;
Packit Service 5bcba8
  LOffsetTo<IndexSubtable> offsetToSubtable;
Packit Service 5bcba8
Packit Service 5bcba8
  DEFINE_SIZE_STATIC(8);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct IndexSubtableArray
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    if (unlikely (!c->check_array (&indexSubtablesZ, indexSubtablesZ[0].static_size, count)))
Packit Service 5bcba8
      return_trace (false);
Packit Service 5bcba8
    for (unsigned int i = 0; i < count; i++)
Packit Service 5bcba8
      if (unlikely (!indexSubtablesZ[i].sanitize (c, this)))
Packit Service 5bcba8
	return_trace (false);
Packit Service 5bcba8
    return_trace (true);
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  const IndexSubtableRecord* find_table (hb_codepoint_t glyph, unsigned int numTables) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    for (unsigned int i = 0; i < numTables; ++i)
Packit Service 5bcba8
    {
Packit Service 5bcba8
      unsigned int firstGlyphIndex = indexSubtablesZ[i].firstGlyphIndex;
Packit Service 5bcba8
      unsigned int lastGlyphIndex = indexSubtablesZ[i].lastGlyphIndex;
Packit Service 5bcba8
      if (firstGlyphIndex <= glyph && glyph <= lastGlyphIndex) {
Packit Service 5bcba8
        return &indexSubtablesZ[i];
Packit Service 5bcba8
      }
Packit Service 5bcba8
    }
Packit Service 5bcba8
    return NULL;
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  IndexSubtableRecord indexSubtablesZ[VAR];
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_ARRAY(0, indexSubtablesZ);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct BitmapSizeTable
Packit Service 5bcba8
{
Packit Service 5bcba8
  friend struct CBLC;
Packit Service 5bcba8
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this) &&
Packit Service 5bcba8
		  indexSubtableArrayOffset.sanitize (c, base, numberOfIndexSubtables) &&
Packit Service 5bcba8
		  c->check_range (&(base+indexSubtableArrayOffset), indexTablesSize) &&
Packit Service 5bcba8
		  horizontal.sanitize (c) &&
Packit Service 5bcba8
		  vertical.sanitize (c));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  const IndexSubtableRecord *find_table (hb_codepoint_t glyph, const void *base) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    return (base+indexSubtableArrayOffset).find_table (glyph, numberOfIndexSubtables);
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  LOffsetTo<IndexSubtableArray> indexSubtableArrayOffset;
Packit Service 5bcba8
  ULONG indexTablesSize;
Packit Service 5bcba8
  ULONG numberOfIndexSubtables;
Packit Service 5bcba8
  ULONG colorRef;
Packit Service 5bcba8
  SBitLineMetrics horizontal;
Packit Service 5bcba8
  SBitLineMetrics vertical;
Packit Service 5bcba8
  USHORT startGlyphIndex;
Packit Service 5bcba8
  USHORT endGlyphIndex;
Packit Service 5bcba8
  BYTE ppemX;
Packit Service 5bcba8
  BYTE ppemY;
Packit Service 5bcba8
  BYTE bitDepth;
Packit Service 5bcba8
  CHAR flags;
Packit Service 5bcba8
Packit Service 5bcba8
public:
Packit Service 5bcba8
  DEFINE_SIZE_STATIC(48);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
/*
Packit Service 5bcba8
 * Glyph Bitmap Data Formats.
Packit Service 5bcba8
 */
Packit Service 5bcba8
Packit Service 5bcba8
struct GlyphBitmapDataFormat17
Packit Service 5bcba8
{
Packit Service 5bcba8
  SmallGlyphMetrics glyphMetrics;
Packit Service 5bcba8
  ULONG dataLen;
Packit Service 5bcba8
  BYTE dataZ[VAR];
Packit Service 5bcba8
Packit Service 5bcba8
  DEFINE_SIZE_ARRAY(9, dataZ);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
/*
Packit Service 5bcba8
 * CBLC -- Color Bitmap Location Table
Packit Service 5bcba8
 */
Packit Service 5bcba8
Packit Service 5bcba8
#define HB_OT_TAG_CBLC HB_TAG('C','B','L','C')
Packit Service 5bcba8
Packit Service 5bcba8
struct CBLC
Packit Service 5bcba8
{
Packit Service 5bcba8
  static const hb_tag_t tableTag = HB_OT_TAG_CBLC;
Packit Service 5bcba8
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this) &&
Packit Service 5bcba8
		  likely (version.major == 2 || version.major == 3) &&
Packit Service 5bcba8
		  sizeTables.sanitize (c, this));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  const IndexSubtableRecord *find_table (hb_codepoint_t glyph,
Packit Service 5bcba8
					 unsigned int *x_ppem, unsigned int *y_ppem) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    /* TODO: Make it possible to select strike. */
Packit Service 5bcba8
Packit Service 5bcba8
    unsigned int count = sizeTables.len;
Packit Service 5bcba8
    for (uint32_t i = 0; i < count; ++i)
Packit Service 5bcba8
    {
Packit Service 5bcba8
      unsigned int startGlyphIndex = sizeTables.array[i].startGlyphIndex;
Packit Service 5bcba8
      unsigned int endGlyphIndex = sizeTables.array[i].endGlyphIndex;
Packit Service 5bcba8
      if (startGlyphIndex <= glyph && glyph <= endGlyphIndex)
Packit Service 5bcba8
      {
Packit Service 5bcba8
	*x_ppem = sizeTables[i].ppemX;
Packit Service 5bcba8
	*y_ppem = sizeTables[i].ppemY;
Packit Service 5bcba8
	return sizeTables[i].find_table (glyph, this);
Packit Service 5bcba8
      }
Packit Service 5bcba8
    }
Packit Service 5bcba8
Packit Service 5bcba8
    return NULL;
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  FixedVersion<>		version;
Packit Service 5bcba8
  LArrayOf<BitmapSizeTable>	sizeTables;
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_ARRAY(8, sizeTables);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
/*
Packit Service 5bcba8
 * CBDT -- Color Bitmap Data Table
Packit Service 5bcba8
 */
Packit Service 5bcba8
#define HB_OT_TAG_CBDT HB_TAG('C','B','D','T')
Packit Service 5bcba8
Packit Service 5bcba8
struct CBDT
Packit Service 5bcba8
{
Packit Service 5bcba8
  static const hb_tag_t tableTag = HB_OT_TAG_CBDT;
Packit Service 5bcba8
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this) &&
Packit Service 5bcba8
		  likely (version.major == 2 || version.major == 3));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  FixedVersion<>version;
Packit Service 5bcba8
  BYTE dataZ[VAR];
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_ARRAY(4, dataZ);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
} /* namespace OT */
Packit Service 5bcba8
Packit Service 5bcba8
#endif /* HB_OT_CBDT_TABLE_HH */