[API] Add hb_font_create_sub_font() and hb_font_get_parent()
[apps/home/video-player.git] / src / hb-ot-layout.cc
index f1287c5..7e1e966 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2006  Behdad Esfahbod
- * Copyright (C) 2007,2008,2009  Red Hat, Inc.
+ * Copyright © 1998-2004  David Turner and Werner Lemberg
+ * Copyright © 2006  Behdad Esfahbod
+ * Copyright © 2007,2008,2009  Red Hat, Inc.
  *
  *  This is part of HarfBuzz, a text shaping library.
  *
@@ -33,6 +33,7 @@
 #include "hb-ot-layout-gdef-private.hh"
 #include "hb-ot-layout-gsub-private.hh"
 #include "hb-ot-layout-gpos-private.hh"
+#include "hb-ot-head-private.hh"
 
 
 #include <stdlib.h>
@@ -42,33 +43,33 @@ HB_BEGIN_DECLS
 
 
 hb_ot_layout_t *
-_hb_ot_layout_new (hb_face_t *face)
+_hb_ot_layout_create (hb_face_t *face)
 {
-  /* Remove this object altogether */
+  /* TODO Remove this object altogether */
   hb_ot_layout_t *layout = (hb_ot_layout_t *) calloc (1, sizeof (hb_ot_layout_t));
 
-  layout->gdef_blob = Sanitizer<GDEF>::sanitize (hb_face_get_table (face, HB_OT_TAG_GDEF));
+  layout->gdef_blob = Sanitizer<GDEF>::sanitize (hb_face_reference_table (face, HB_OT_TAG_GDEF));
   layout->gdef = Sanitizer<GDEF>::lock_instance (layout->gdef_blob);
 
-  layout->gsub_blob = Sanitizer<GSUB>::sanitize (hb_face_get_table (face, HB_OT_TAG_GSUB));
+  layout->gsub_blob = Sanitizer<GSUB>::sanitize (hb_face_reference_table (face, HB_OT_TAG_GSUB));
   layout->gsub = Sanitizer<GSUB>::lock_instance (layout->gsub_blob);
 
-  layout->gpos_blob = Sanitizer<GPOS>::sanitize (hb_face_get_table (face, HB_OT_TAG_GPOS));
+  layout->gpos_blob = Sanitizer<GPOS>::sanitize (hb_face_reference_table (face, HB_OT_TAG_GPOS));
   layout->gpos = Sanitizer<GPOS>::lock_instance (layout->gpos_blob);
 
+  layout->head_blob = Sanitizer<head>::sanitize (hb_face_reference_table (face, HB_OT_TAG_head));
+  layout->head = Sanitizer<head>::lock_instance (layout->head_blob);
+
   return layout;
 }
 
 void
-_hb_ot_layout_free (hb_ot_layout_t *layout)
+_hb_ot_layout_destroy (hb_ot_layout_t *layout)
 {
-  hb_blob_unlock (layout->gdef_blob);
-  hb_blob_unlock (layout->gsub_blob);
-  hb_blob_unlock (layout->gpos_blob);
-
   hb_blob_destroy (layout->gdef_blob);
   hb_blob_destroy (layout->gsub_blob);
   hb_blob_destroy (layout->gpos_blob);
+  hb_blob_destroy (layout->head_blob);
 
   free (layout);
 }
@@ -78,18 +79,21 @@ _get_gdef (hb_face_t *face)
 {
   return likely (face->ot_layout && face->ot_layout->gdef) ? *face->ot_layout->gdef : Null(GDEF);
 }
-
 static inline const GSUB&
 _get_gsub (hb_face_t *face)
 {
   return likely (face->ot_layout && face->ot_layout->gsub) ? *face->ot_layout->gsub : Null(GSUB);
 }
-
 static inline const GPOS&
 _get_gpos (hb_face_t *face)
 {
   return likely (face->ot_layout && face->ot_layout->gpos) ? *face->ot_layout->gpos : Null(GPOS);
 }
+static inline const head&
+_get_head (hb_face_t *face)
+{
+  return likely (face->ot_layout && face->ot_layout->head) ? *face->ot_layout->head : Null(head);
+}
 
 
 /*
@@ -193,7 +197,6 @@ hb_ot_layout_get_attach_points (hb_face_t      *face,
 
 unsigned int
 hb_ot_layout_get_ligature_carets (hb_font_t      *font,
-                                 hb_face_t      *face,
                                  hb_direction_t  direction,
                                  hb_codepoint_t  glyph,
                                  unsigned int    start_offset,
@@ -202,8 +205,8 @@ hb_ot_layout_get_ligature_carets (hb_font_t      *font,
 {
   hb_ot_layout_context_t c;
   c.font = font;
-  c.face = face;
-  return _get_gdef (face).get_lig_carets (&c, direction, glyph, start_offset, caret_count, caret_array);
+  c.face = font->face;
+  return _get_gdef (c.face).get_lig_carets (&c, direction, glyph, start_offset, caret_count, caret_array);
 }
 
 /*
@@ -470,15 +473,14 @@ hb_ot_layout_position_start (hb_buffer_t  *buffer)
 
 hb_bool_t
 hb_ot_layout_position_lookup   (hb_font_t    *font,
-                               hb_face_t    *face,
                                hb_buffer_t  *buffer,
                                unsigned int  lookup_index,
                                hb_mask_t     mask)
 {
   hb_ot_layout_context_t c;
   c.font = font;
-  c.face = face;
-  return _get_gpos (face).position_lookup (&c, buffer, lookup_index, mask);
+  c.face = font->face;
+  return _get_gpos (c.face).position_lookup (&c, buffer, lookup_index, mask);
 }
 
 void
@@ -488,4 +490,15 @@ hb_ot_layout_position_finish (hb_buffer_t  *buffer)
 }
 
 
+/*
+ * head
+ */
+
+unsigned int
+_hb_ot_layout_get_upem (hb_face_t *face)
+{
+  return _get_head (face).get_upem ();
+}
+
+
 HB_END_DECLS