Imported Upstream version 1.7.6
[platform/upstream/harfbuzz.git] / src / hb-shape-plan.cc
index 6173766..6eeba2b 100644 (file)
  * Google Author(s): Behdad Esfahbod
  */
 
+#include "hb-private.hh"
+#include "hb-debug.hh"
 #include "hb-shape-plan-private.hh"
 #include "hb-shaper-private.hh"
 #include "hb-font-private.hh"
 #include "hb-buffer-private.hh"
 
 
-#ifndef HB_DEBUG_SHAPE_PLAN
-#define HB_DEBUG_SHAPE_PLAN (HB_DEBUG+0)
-#endif
-
-
 static void
 hb_shape_plan_plan (hb_shape_plan_t    *shape_plan,
                    const hb_feature_t *user_features,
@@ -115,7 +112,7 @@ hb_shape_plan_create (hb_face_t                     *face,
 {
   return hb_shape_plan_create2 (face, props,
                                user_features, num_user_features,
-                               NULL, 0,
+                               nullptr, 0,
                                shaper_list);
 }
 
@@ -128,7 +125,7 @@ hb_shape_plan_create2 (hb_face_t                     *face,
                       unsigned int                   num_coords,
                       const char * const            *shaper_list)
 {
-  DEBUG_MSG_FUNC (SHAPE_PLAN, NULL,
+  DEBUG_MSG_FUNC (SHAPE_PLAN, nullptr,
                  "face=%p num_features=%d num_coords=%d shaper_list=%p",
                  face,
                  num_user_features,
@@ -136,8 +133,8 @@ hb_shape_plan_create2 (hb_face_t                     *face,
                  shaper_list);
 
   hb_shape_plan_t *shape_plan;
-  hb_feature_t *features = NULL;
-  int *coords = NULL;
+  hb_feature_t *features = nullptr;
+  int *coords = nullptr;
 
   if (unlikely (!face))
     face = hb_face_get_empty ();
@@ -160,7 +157,7 @@ hb_shape_plan_create2 (hb_face_t                     *face,
   assert (props->direction != HB_DIRECTION_INVALID);
 
   hb_face_make_immutable (face);
-  shape_plan->default_shaper_list = shaper_list == NULL;
+  shape_plan->default_shaper_list = !shaper_list;
   shape_plan->face_unsafe = face;
   shape_plan->props = *props;
   shape_plan->num_user_features = num_user_features;
@@ -196,16 +193,16 @@ hb_shape_plan_get_empty (void)
     HB_OBJECT_HEADER_STATIC,
 
     true, /* default_shaper_list */
-    NULL, /* face */
+    nullptr, /* face */
     HB_SEGMENT_PROPERTIES_DEFAULT, /* props */
 
-    NULL, /* shaper_func */
-    NULL, /* shaper_name */
+    nullptr, /* shaper_func */
+    nullptr, /* shaper_name */
 
-    NULL, /* user_features */
+    nullptr, /* user_features */
     0,    /* num_user_featurs */
 
-    NULL, /* coords */
+    nullptr, /* coords */
     0,    /* num_coords */
 
     {
@@ -423,7 +420,7 @@ hb_shape_plan_matches (const hb_shape_plan_t          *shape_plan,
   return hb_segment_properties_equal (&shape_plan->props, &proposal->props) &&
         hb_shape_plan_user_features_match (shape_plan, proposal) &&
         hb_shape_plan_coords_match (shape_plan, proposal) &&
-        ((shape_plan->default_shaper_list && proposal->shaper_list == NULL) ||
+        ((shape_plan->default_shaper_list && !proposal->shaper_list) ||
          (shape_plan->shaper_func == proposal->shaper_func));
 }
 
@@ -470,7 +467,7 @@ hb_shape_plan_create_cached (hb_face_t                     *face,
 {
   return hb_shape_plan_create_cached2 (face, props,
                                       user_features, num_user_features,
-                                      NULL, 0,
+                                      nullptr, 0,
                                       shaper_list);
 }
 
@@ -483,7 +480,7 @@ hb_shape_plan_create_cached2 (hb_face_t                     *face,
                              unsigned int                   num_coords,
                              const char * const            *shaper_list)
 {
-  DEBUG_MSG_FUNC (SHAPE_PLAN, NULL,
+  DEBUG_MSG_FUNC (SHAPE_PLAN, nullptr,
                  "face=%p num_features=%d shaper_list=%p",
                  face,
                  num_user_features,
@@ -494,7 +491,7 @@ hb_shape_plan_create_cached2 (hb_face_t                     *face,
     shaper_list,
     user_features,
     num_user_features,
-    NULL
+    nullptr
   };
 
   if (shaper_list) {
@@ -520,15 +517,17 @@ hb_shape_plan_create_cached2 (hb_face_t                     *face,
 
 retry:
   hb_face_t::plan_node_t *cached_plan_nodes = (hb_face_t::plan_node_t *) hb_atomic_ptr_get (&face->shape_plans);
-  for (hb_face_t::plan_node_t *node = cached_plan_nodes; node; node = node->next)
-    if (hb_shape_plan_matches (node->shape_plan, &proposal))
-    {
-      DEBUG_MSG_FUNC (SHAPE_PLAN, node->shape_plan, "fulfilled from cache");
-      return hb_shape_plan_reference (node->shape_plan);
-    }
 
-  /* Not found. */
+  /* Don't look for plan in the cache if there were variation coordinates XXX Fix me. */
+  if (!hb_coords_present (coords, num_coords))
+    for (hb_face_t::plan_node_t *node = cached_plan_nodes; node; node = node->next)
+      if (hb_shape_plan_matches (node->shape_plan, &proposal))
+      {
+        DEBUG_MSG_FUNC (SHAPE_PLAN, node->shape_plan, "fulfilled from cache");
+        return hb_shape_plan_reference (node->shape_plan);
+      }
 
+  /* Not found. */
   hb_shape_plan_t *shape_plan = hb_shape_plan_create2 (face, props,
                                                       user_features, num_user_features,
                                                       coords, num_coords,