12e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod/*
22e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * Copyright © 2009  Red Hat, Inc.
32e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * Copyright © 2011  Google, Inc.
42e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod *
52e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod *  This is part of HarfBuzz, a text shaping library.
62e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod *
72e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * Permission is hereby granted, without written agreement and without
82e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this
92e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * software and its documentation for any purpose, provided that the
102e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * above copyright notice and the following two paragraphs appear in
112e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * all copies of this software.
122e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod *
132e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
142e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
152e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
162e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
172e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * DAMAGE.
182e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod *
192e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
202e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
212e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
222e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
232e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
242e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod *
252e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * Red Hat Author(s): Behdad Esfahbod
262e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * Google Author(s): Behdad Esfahbod
272e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod */
282e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
292e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod#ifndef HB_FACE_PRIVATE_HH
302e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod#define HB_FACE_PRIVATE_HH
312e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
322e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod#include "hb-private.hh"
332e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
342e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod#include "hb-object-private.hh"
352e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod#include "hb-shaper-private.hh"
362e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod#include "hb-shape-plan-private.hh"
372e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
382e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
392e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod/*
402e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod * hb_face_t
412e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod */
422e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
432e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbodstruct hb_face_t {
442e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  hb_object_header_t header;
452e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  ASSERT_POD ();
462e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
472e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  hb_bool_t immutable;
482e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
492e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  hb_reference_table_func_t  reference_table_func;
502e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  void                      *user_data;
512e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  hb_destroy_func_t          destroy;
522e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
532e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  unsigned int index;
542e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  mutable unsigned int upem;
552e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  mutable unsigned int num_glyphs;
562e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
572e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  struct hb_shaper_data_t shaper_data;
582e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
592e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  struct plan_node_t {
602e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod    hb_shape_plan_t *shape_plan;
612e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod    plan_node_t *next;
622e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  } *shape_plans;
632e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
642e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
652e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  inline hb_blob_t *reference_table (hb_tag_t tag) const
662e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  {
672e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod    hb_blob_t *blob;
682e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
692e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod    if (unlikely (!this || !reference_table_func))
702e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod      return hb_blob_get_empty ();
712e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
722e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod    blob = reference_table_func (/*XXX*/const_cast<hb_face_t *> (this), tag, user_data);
732e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod    if (unlikely (!blob))
742e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod      return hb_blob_get_empty ();
752e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
762e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod    return blob;
772e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  }
782e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
792e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  inline HB_PURE_FUNC unsigned int get_upem (void) const
802e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  {
812e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod    if (unlikely (!upem))
822e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod      load_upem ();
832e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod    return upem;
842e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  }
852e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
862e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  inline unsigned int get_num_glyphs (void) const
872e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  {
882e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod    if (unlikely (num_glyphs == (unsigned int) -1))
892e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod      load_num_glyphs ();
902e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod    return num_glyphs;
912e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  }
922e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
932e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  private:
942e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  HB_INTERNAL void load_upem (void) const;
952e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod  HB_INTERNAL void load_num_glyphs (void) const;
962e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod};
972e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
982e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbodextern HB_INTERNAL const hb_face_t _hb_face_nil;
992e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
1002e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod#define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
1012e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, face);
1022e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod#include "hb-shaper-list.hh"
1032e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod#undef HB_SHAPER_IMPLEMENT
1042e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod#undef HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
1052e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
1062e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod
1072e3a07abdf97b0ad2105c3a52f3ff0e0b60b29c4Behdad Esfahbod#endif /* HB_FACE_PRIVATE_HH */
108