summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/harfbuzz-ng/src/OT/glyf/GlyphHeader.hh
blob: e4a9168b79f0c703c4ae45c3f2db0887ca8bbbc9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#ifndef OT_GLYF_GLYPHHEADER_HH
#define OT_GLYF_GLYPHHEADER_HH


#include "../../hb-open-type.hh"


namespace OT {
namespace glyf_impl {


struct GlyphHeader
{
  bool has_data () const { return numberOfContours; }

  template <typename accelerator_t>
  bool get_extents_without_var_scaled (hb_font_t *font, const accelerator_t &glyf_accelerator,
				       hb_codepoint_t gid, hb_glyph_extents_t *extents) const
  {
    /* Undocumented rasterizer behavior: shift glyph to the left by (lsb - xMin), i.e., xMin = lsb */
    /* extents->x_bearing = hb_min (glyph_header.xMin, glyph_header.xMax); */
    int lsb = hb_min (xMin, xMax);
    (void) glyf_accelerator.hmtx->get_leading_bearing_without_var_unscaled (gid, &lsb);
    extents->x_bearing = font->em_scale_x (lsb);
    extents->y_bearing = font->em_scale_y (hb_max (yMin, yMax));
    extents->width     = font->em_scale_x (hb_max (xMin, xMax) - hb_min (xMin, xMax));
    extents->height    = font->em_scale_y (hb_min (yMin, yMax) - hb_max (yMin, yMax));

    return true;
  }

  HBINT16	numberOfContours;
		    /* If the number of contours is
		     * greater than or equal to zero,
		     * this is a simple glyph; if negative,
		     * this is a composite glyph. */
  FWORD	xMin;	/* Minimum x for coordinate data. */
  FWORD	yMin;	/* Minimum y for coordinate data. */
  FWORD	xMax;	/* Maximum x for coordinate data. */
  FWORD	yMax;	/* Maximum y for coordinate data. */
  public:
  DEFINE_SIZE_STATIC (10);
};


} /* namespace glyf_impl */
} /* namespace OT */


#endif /* OT_GLYF_GLYPHHEADER_HH */