Switch old and uniscribe backends to shape_plan
diff --git a/src/hb-old.cc b/src/hb-old.cc
index 77761e8..f938a9b 100644
--- a/src/hb-old.cc
+++ b/src/hb-old.cc
@@ -248,61 +248,6 @@
* shaper
*/
-
-static hb_user_data_key_t hb_old_data_key;
-
-static HB_Face
-_hb_old_face_get (hb_face_t *face)
-{
- HB_Face data = (HB_Face) hb_face_get_user_data (face, &hb_old_data_key);
- if (likely (data)) return data;
-
- data = _hb_old_shaper_face_data_create (face);
-
- if (unlikely (!data)) {
- DEBUG_MSG (OLD, face, "HB_NewFace failed");
- return NULL;
- }
-
- if (unlikely (!hb_face_set_user_data (face, &hb_old_data_key, data,
- (hb_destroy_func_t) _hb_old_shaper_face_data_destroy,
- false)))
- {
- _hb_old_shaper_face_data_destroy (data);
- data = (HB_Face) hb_face_get_user_data (face, &hb_old_data_key);
- if (data)
- return data;
- else
- return NULL;
- }
-
- return data;
-}
-
-
-static HB_Font
-_hb_old_font_get (hb_font_t *font)
-{
- /* Ouch, check user_data! */
- HB_Font data = _hb_old_shaper_font_data_create (font);
- if (!data)
- return NULL;
-
- if (unlikely (!hb_font_set_user_data (font, &hb_old_data_key, data,
- (hb_destroy_func_t) _hb_old_shaper_font_data_destroy,
- false)))
- {
- _hb_old_shaper_font_data_destroy (data);
- data = (HB_Font) hb_font_get_user_data (font, &hb_old_data_key);
- if (data)
- return data;
- else
- return NULL;
- }
-
- return data;
-}
-
hb_bool_t
_hb_old_shape (hb_shape_plan_t *shape_plan,
hb_font_t *font,
@@ -310,27 +255,12 @@
const hb_feature_t *features,
unsigned int num_features)
{
- if (unlikely (!buffer->len))
- return true;
-
- buffer->guess_properties ();
+ hb_face_t *face = font->face;
+ HB_Face old_face = HB_SHAPER_DATA_GET (face);
+ HB_Font old_font = HB_SHAPER_DATA_GET (font);
bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
-#define FAIL(...) \
- HB_STMT_START { \
- DEBUG_MSG (OLD, NULL, __VA_ARGS__); \
- return false; \
- } HB_STMT_END;
-
- HB_Face old_face = _hb_old_face_get (font->face);
- if (unlikely (!old_face))
- FAIL ("Couldn't get old face");
-
- HB_Font old_font = _hb_old_font_get (font);
- if (unlikely (!old_font))
- FAIL ("Couldn't get old font");
-
retry:
unsigned int scratch_size;
@@ -398,7 +328,7 @@
{
buffer->ensure (buffer->allocated * 2);
if (buffer->in_error)
- FAIL ("Buffer resize failed");
+ return false;
goto retry;
}
return false;
@@ -429,7 +359,7 @@
buffer->ensure (num_glyphs);
if (buffer->in_error)
- FAIL ("Buffer in error");
+ return false;
buffer->len = num_glyphs;
diff --git a/src/hb-shape.cc b/src/hb-shape.cc
index 0087618..fde9cf2 100644
--- a/src/hb-shape.cc
+++ b/src/hb-shape.cc
@@ -82,6 +82,11 @@
unsigned int num_features,
const char * const *shaper_list)
{
+ if (unlikely (!buffer->len))
+ return true;
+
+ buffer->guess_properties ();
+
hb_shape_plan_t *shape_plan = hb_shape_plan_create (font->face, &buffer->props, features, num_features, shaper_list);
hb_bool_t res = hb_shape_plan_execute (shape_plan, font, buffer, features, num_features);
hb_shape_plan_destroy (shape_plan);
diff --git a/src/hb-shaper-impl-private.hh b/src/hb-shaper-impl-private.hh
index 91ee14f..7844081 100644
--- a/src/hb-shaper-impl-private.hh
+++ b/src/hb-shaper-impl-private.hh
@@ -36,8 +36,7 @@
#ifdef HB_SHAPER
-/* For use in things like font->shaper_data() in the shaper implementations. */
-#define shaper_data() shaper_data.HB_SHAPER
+#define HB_SHAPER_DATA_GET(object) HB_SHAPER_DATA (HB_SHAPER, object)
#endif
diff --git a/src/hb-shaper-private.hh b/src/hb-shaper-private.hh
index 9e35ef8..1cf7c5b 100644
--- a/src/hb-shaper-private.hh
+++ b/src/hb-shaper-private.hh
@@ -69,15 +69,11 @@
#define HB_SHAPER_DATA_TYPE(shaper, object) struct hb_##shaper##_shaper_##object##_data_t
#define HB_SHAPER_DATA(shaper, object) (* (HB_SHAPER_DATA_TYPE(shaper, object) **) &(object)->shaper_data.shaper)
-#define HB_SHAPER_DATA_GET_FUNC(shaper, object) _hb_##shaper##_shaper_get_##object##_data
#define HB_SHAPER_DATA_CREATE_FUNC(shaper, object) _hb_##shaper##_shaper_##object##_data_create
#define HB_SHAPER_DATA_DESTROY_FUNC(shaper, object) _hb_##shaper##_shaper_##object##_data_destroy
#define HB_SHAPER_DATA_PROTOTYPE(shaper, object) \
HB_SHAPER_DATA_TYPE (shaper, object); /* Type forward declaration. */ \
- static inline HB_SHAPER_DATA_TYPE (shaper, object) * \
- HB_SHAPER_DATA_GET_FUNC (shaper, object) (hb_##object##_t *object) \
- { return HB_SHAPER_DATA (shaper, object); } \
extern "C" HB_INTERNAL HB_SHAPER_DATA_TYPE (shaper, object) * \
HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (hb_##object##_t *object HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS); \
extern "C" HB_INTERNAL void \
diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc
index a7aa163..67e245c 100644
--- a/src/hb-uniscribe.cc
+++ b/src/hb-uniscribe.cc
@@ -55,38 +55,6 @@
);
*/
-static bool
-populate_log_font (LOGFONTW *lf,
- hb_font_t *font)
-{
- memset (lf, 0, sizeof (*lf));
- lf->lfHeight = -font->y_scale;
- lf->lfCharSet = DEFAULT_CHARSET;
-
- hb_blob_t *blob = Sanitizer<name>::sanitize (hb_face_reference_table (font->face, HB_TAG ('n','a','m','e')));
- const name *name_table = Sanitizer<name>::lock_instance (blob);
- unsigned int len = name_table->get_name (3, 1, 0x409, 4,
- lf->lfFaceName,
- sizeof (lf->lfFaceName[0]) * LF_FACESIZE)
- / sizeof (lf->lfFaceName[0]);
- hb_blob_destroy (blob);
-
- if (unlikely (!len)) {
- DEBUG_MSG (UNISCRIBE, NULL, "Didn't find English name table entry");
- return false;
- }
- if (unlikely (len >= LF_FACESIZE)) {
- DEBUG_MSG (UNISCRIBE, NULL, "Font name too long");
- return false;
- }
-
- for (unsigned int i = 0; i < len; i++)
- lf->lfFaceName[i] = hb_be_uint16 (lf->lfFaceName[i]);
- lf->lfFaceName[len] = 0;
-
- return true;
-}
-
/*
* shaper face data
@@ -141,6 +109,38 @@
SCRIPT_CACHE script_cache;
};
+static bool
+populate_log_font (LOGFONTW *lf,
+ hb_font_t *font)
+{
+ memset (lf, 0, sizeof (*lf));
+ lf->lfHeight = -font->y_scale;
+ lf->lfCharSet = DEFAULT_CHARSET;
+
+ hb_blob_t *blob = Sanitizer<name>::sanitize (hb_face_reference_table (font->face, HB_TAG ('n','a','m','e')));
+ const name *name_table = Sanitizer<name>::lock_instance (blob);
+ unsigned int len = name_table->get_name (3, 1, 0x409, 4,
+ lf->lfFaceName,
+ sizeof (lf->lfFaceName[0]) * LF_FACESIZE)
+ / sizeof (lf->lfFaceName[0]);
+ hb_blob_destroy (blob);
+
+ if (unlikely (!len)) {
+ DEBUG_MSG (UNISCRIBE, NULL, "Didn't find English name table entry");
+ return false;
+ }
+ if (unlikely (len >= LF_FACESIZE)) {
+ DEBUG_MSG (UNISCRIBE, NULL, "Font name too long");
+ return false;
+ }
+
+ for (unsigned int i = 0; i < len; i++)
+ lf->lfFaceName[i] = hb_be_uint16 (lf->lfFaceName[i]);
+ lf->lfFaceName[len] = 0;
+
+ return true;
+}
+
hb_uniscribe_shaper_font_data_t *
_hb_uniscribe_shaper_font_data_create (hb_font_t *font)
{
@@ -208,65 +208,18 @@
/*
* shaper
*/
-static hb_user_data_key_t hb_uniscribe_data_key;
-
-static hb_uniscribe_shaper_face_data_t *
-_hb_uniscribe_face_get_data (hb_face_t *face)
-{
- hb_uniscribe_shaper_face_data_t *data = (hb_uniscribe_shaper_face_data_t *) hb_face_get_user_data (face, &hb_uniscribe_data_key);
- if (likely (data)) return data;
-
- data = _hb_uniscribe_shaper_face_data_create (face);
- if (!data) return NULL;
-
- if (unlikely (!hb_face_set_user_data (face, &hb_uniscribe_data_key, data,
- (hb_destroy_func_t) _hb_uniscribe_shaper_face_data_destroy,
- false)))
- {
- _hb_uniscribe_shaper_face_data_destroy (data);
- data = (hb_uniscribe_shaper_face_data_t *) hb_face_get_user_data (face, &hb_uniscribe_data_key);
- }
-
- return data;
-}
-
-
-static hb_uniscribe_shaper_font_data_t *
-_hb_uniscribe_font_get_data (hb_font_t *font)
-{
- hb_uniscribe_shaper_font_data_t *data = (hb_uniscribe_shaper_font_data_t *) hb_font_get_user_data (font, &hb_uniscribe_data_key);
- if (likely (data)) return data;
-
- data = _hb_uniscribe_shaper_font_data_create (font);
- if (unlikely (!data))
- return NULL;
-
- if (unlikely (!hb_font_set_user_data (font, &hb_uniscribe_data_key, data,
- (hb_destroy_func_t) _hb_uniscribe_shaper_font_data_destroy,
- false)))
- {
- _hb_uniscribe_shaper_font_data_destroy (data);
- data = (hb_uniscribe_shaper_font_data_t *) hb_font_get_user_data (font, &hb_uniscribe_data_key);
- }
-
- return data;
-}
LOGFONTW *
hb_uniscribe_font_get_logfontw (hb_font_t *font)
{
- hb_uniscribe_shaper_font_data_t *font_data = _hb_uniscribe_font_get_data (font);
- if (unlikely (!font_data))
- return NULL;
+ hb_uniscribe_shaper_font_data_t *font_data = HB_SHAPER_DATA_GET (font);
return &font_data->log_font;
}
HFONT
hb_uniscribe_font_get_hfont (hb_font_t *font)
{
- hb_uniscribe_shaper_font_data_t *font_data = _hb_uniscribe_font_get_data (font);
- if (unlikely (!font_data))
- return 0;
+ hb_uniscribe_shaper_font_data_t *font_data = HB_SHAPER_DATA_GET (font);
return font_data->hfont;
}
@@ -278,7 +231,9 @@
const hb_feature_t *features,
unsigned int num_features)
{
- buffer->guess_properties ();
+ hb_face_t *face = font->face;
+ hb_uniscribe_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
+ hb_uniscribe_shaper_font_data_t *font_data = HB_SHAPER_DATA_GET (font);
#define FAIL(...) \
HB_STMT_START { \
@@ -286,17 +241,6 @@
return false; \
} HB_STMT_END;
- hb_uniscribe_shaper_face_data_t *face_data = _hb_uniscribe_face_get_data (font->face);
- if (unlikely (!face_data->fh))
- FAIL ("Couldn't get face data");
-
- hb_uniscribe_shaper_font_data_t *font_data = _hb_uniscribe_font_get_data (font);
- if (unlikely (!font_data->hfont))
- FAIL ("Couldn't get font font");
-
- if (unlikely (!buffer->len))
- return true;
-
HRESULT hr;
retry: