Start adding a unified shaper access infrastructure

Add global shape_plan.  Unused so far.
This commit is contained in:
Behdad Esfahbod 2012-07-26 17:34:25 -04:00
parent fa2dfcd560
commit 027857d041
17 changed files with 611 additions and 241 deletions

View File

@ -24,7 +24,6 @@ HBSOURCES = \
hb-buffer.cc \
hb-cache-private.hh \
hb-common.cc \
hb-fallback-shape-private.hh \
hb-fallback-shape.cc \
hb-font-private.hh \
hb-font.cc \
@ -42,6 +41,12 @@ HBSOURCES = \
hb-set-private.hh \
hb-set.cc \
hb-shape.cc \
hb-shape-plan-private.hh \
hb-shape-plan.cc \
hb-shape-plan.h \
hb-shaper-list.hh \
hb-shaper-impl-private.hh \
hb-shaper-private.hh \
hb-tt-font.cc \
hb-unicode-private.hh \
hb-unicode.cc \
@ -129,21 +134,21 @@ endif
if HAVE_GRAPHITE2
HBCFLAGS += $(GRAPHITE2_CFLAGS)
HBLIBS += $(GRAPHITE2_LIBS)
HBSOURCES += hb-graphite2.cc hb-graphite2-private.hh
HBSOURCES += hb-graphite2.cc
HBHEADERS += hb-graphite2.h
endif
if HAVE_UNISCRIBE
HBCFLAGS += $(UNISCRIBE_CFLAGS)
HBLIBS += $(UNISCRIBE_LIBS)
HBSOURCES += hb-uniscribe.cc hb-uniscribe-private.hh
HBSOURCES += hb-uniscribe.cc
HBHEADERS += hb-uniscribe.h
endif
if HAVE_CORETEXT
HBCFLAGS += $(CORETEXT_CFLAGS)
HBLIBS += $(CORETEXT_LIBS)
HBSOURCES += hb-coretext.cc hb-coretext-private.hh
HBSOURCES += hb-coretext.cc
HBHEADERS += hb-coretext.h
endif
@ -151,7 +156,7 @@ if HAVE_HB_OLD
SUBDIRS += hb-old
HBCFLAGS += -I$(srcdir)/hb-old
HBLIBS += hb-old/libhb-old.la
HBSOURCES += hb-old.cc hb-old-private.hh
HBSOURCES += hb-old.cc
endif
DIST_SUBDIRS += hb-old

View File

@ -1,42 +0,0 @@
/*
* Copyright © 2012 Mozilla Foundation.
*
* This is part of HarfBuzz, a text shaping library.
*
* Permission is hereby granted, without written agreement and without
* license or royalty fees, to use, copy, modify, and distribute this
* software and its documentation for any purpose, provided that the
* above copyright notice and the following two paragraphs appear in
* all copies of this software.
*
* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*
* Mozilla Author(s): Jonathan Kew
*/
#ifndef HB_CORETEXT_PRIVATE_HH
#define HB_CORETEXT_PRIVATE_HH
#include "hb-private.hh"
#include "hb-coretext.h"
HB_INTERNAL hb_bool_t
_hb_coretext_shape (hb_font_t *font,
hb_buffer_t *buffer,
const hb_feature_t *features,
unsigned int num_features);
#endif /* HB_CORETEXT_PRIVATE_HH */

View File

@ -24,7 +24,8 @@
* Mozilla Author(s): Jonathan Kew
*/
#include "hb-private.hh"
#define HB_SHAPER coretext
#include "hb-shaper-private.hh"
#define GlyphID GlyphID_mac
#include <ApplicationServices/ApplicationServices.h>
@ -32,9 +33,6 @@
#include "hb-coretext.h"
#include "hb-ot-name-table.hh"
#include "hb-ot-tag.h"
#include "hb-font-private.hh"
#include "hb-buffer-private.hh"

View File

@ -24,9 +24,67 @@
* Google Author(s): Behdad Esfahbod
*/
#include "hb-fallback-shape-private.hh"
#define HB_SHAPER fallback
#include "hb-shaper-impl-private.hh"
#include "hb-buffer-private.hh"
/*
* shaper face data
*/
struct hb_fallback_shaper_face_data_t {};
hb_fallback_shaper_face_data_t *
_hb_fallback_shaper_face_data_create (hb_face_t *face)
{
return (hb_fallback_shaper_face_data_t *) HB_SHAPER_DATA_SUCCEEDED;
}
void
_hb_fallback_shaper_face_data_destroy (hb_fallback_shaper_face_data_t *data)
{
}
/*
* shaper font data
*/
struct hb_fallback_shaper_font_data_t {};
hb_fallback_shaper_font_data_t *
_hb_fallback_shaper_font_data_create (hb_font_t *font)
{
return (hb_fallback_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
}
void
_hb_fallback_shaper_font_data_destroy (hb_fallback_shaper_font_data_t *data)
{
}
/*
* shaper shape_plan data
*/
struct hb_fallback_shaper_shape_plan_data_t {};
hb_fallback_shaper_shape_plan_data_t *
_hb_fallback_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan)
{
return (hb_fallback_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED;
}
void
_hb_fallback_shaper_shape_plan_data_destroy (hb_fallback_shaper_shape_plan_data_t *data)
{
}
/*
* shaper
*/
hb_bool_t
_hb_fallback_shape (hb_font_t *font,

View File

@ -33,6 +33,7 @@
#include "hb-font.h"
#include "hb-object-private.hh"
#include "hb-shaper-private.hh"
@ -100,8 +101,14 @@ struct hb_face_t {
unsigned int index;
unsigned int upem;
struct hb_shaper_data_t shaper_data;
};
#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, face);
#include "hb-shaper-list.hh"
#undef HB_SHAPER_IMPLEMENT
/*
* hb_font_t
@ -126,6 +133,8 @@ struct hb_font_t {
void *user_data;
hb_destroy_func_t destroy;
struct hb_shaper_data_t shaper_data;
/* Convert from font-space to user-space */
inline hb_position_t em_scale_x (int16_t v) { return em_scale (v, this->x_scale); }
@ -163,6 +172,9 @@ struct hb_font_t {
inline hb_position_t em_scale (int16_t v, int scale) { return v * (int64_t) scale / hb_face_get_upem (this->face); }
};
#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, font);
#include "hb-shaper-list.hh"
#undef HB_SHAPER_IMPLEMENT
#endif /* HB_FONT_PRIVATE_HH */

View File

@ -1,5 +1,6 @@
/*
* Copyright © 2009 Red Hat, Inc.
* Copyright © 2012 Google, Inc.
*
* This is part of HarfBuzz, a text shaping library.
*
@ -22,6 +23,7 @@
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*
* Red Hat Author(s): Behdad Esfahbod
* Google Author(s): Behdad Esfahbod
*/
#include "hb-private.hh"
@ -707,6 +709,10 @@ hb_face_destroy (hb_face_t *face)
_hb_ot_layout_destroy (face->ot_layout);
#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_DESTROY(shaper, face);
#include "hb-shaper-list.hh"
#undef HB_SHAPER_IMPLEMENT
if (face->destroy)
face->destroy (face->user_data);
@ -888,11 +894,16 @@ hb_font_destroy (hb_font_t *font)
{
if (!hb_object_destroy (font)) return;
#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_DESTROY(shaper, font);
#include "hb-shaper-list.hh"
#undef HB_SHAPER_IMPLEMENT
if (font->destroy)
font->destroy (font->user_data);
hb_font_destroy (font->parent);
hb_face_destroy (font->face);
hb_font_funcs_destroy (font->klass);
if (font->destroy)
font->destroy (font->user_data);
free (font);
}

View File

@ -24,12 +24,10 @@
* Google Author(s): Behdad Esfahbod
*/
#include "hb-private.hh"
#include "hb-old-private.hh"
#include "hb-font-private.hh"
#include "hb-buffer-private.hh"
#define HB_SHAPER old
#define hb_old_shaper_face_data_t HB_FaceRec_
#define hb_old_shaper_font_data_t HB_Font_
#include "hb-shaper-impl-private.hh"
#include <harfbuzz.h>
@ -166,8 +164,6 @@ static const HB_FontClass hb_old_font_class = {
static hb_user_data_key_t hb_old_data_key;
static HB_Error
table_func (void *font, HB_Tag tag, HB_Byte *buffer, HB_UInt *length)
{
@ -180,13 +176,86 @@ table_func (void *font, HB_Tag tag, HB_Byte *buffer, HB_UInt *length)
return HB_Err_Ok;
}
/*
* shaper face data
*/
hb_old_shaper_face_data_t *
_hb_old_shaper_face_data_create (hb_face_t *face)
{
return HB_NewFace (face, table_func);
}
void
_hb_old_shaper_face_data_destroy (hb_old_shaper_face_data_t *data)
{
HB_FreeFace (data);
}
/*
* shaper font data
*/
hb_old_shaper_font_data_t *
_hb_old_shaper_font_data_create (hb_font_t *font)
{
HB_FontRec *data = (HB_FontRec *) calloc (1, sizeof (HB_FontRec));
if (unlikely (!data)) {
DEBUG_MSG (OLD, font, "malloc()ing HB_Font failed");
return NULL;
}
data->klass = &hb_old_font_class;
data->x_ppem = font->x_ppem;
data->y_ppem = font->y_ppem;
data->x_scale = font->x_scale; // XXX
data->y_scale = font->y_scale; // XXX
data->userData = font;
return data;
}
void
_hb_old_shaper_font_data_destroy (hb_old_shaper_font_data_t *data)
{
free (data);
}
/*
* shaper shape_plan data
*/
struct hb_old_shaper_shape_plan_data_t {};
hb_old_shaper_shape_plan_data_t *
_hb_old_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan)
{
return (hb_old_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED;
}
void
_hb_old_shaper_shape_plan_data_destroy (hb_old_shaper_shape_plan_data_t *data)
{
}
/*
* 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_NewFace (face, table_func);
data = _hb_old_shaper_face_data_create (face);
if (unlikely (!data)) {
DEBUG_MSG (OLD, face, "HB_NewFace failed");
@ -194,10 +263,10 @@ _hb_old_face_get (hb_face_t *face)
}
if (unlikely (!hb_face_set_user_data (face, &hb_old_data_key, data,
(hb_destroy_func_t) HB_FreeFace,
(hb_destroy_func_t) _hb_old_shaper_face_data_destroy,
false)))
{
HB_FreeFace (data);
_hb_old_shaper_face_data_destroy (data);
data = (HB_Face) hb_face_get_user_data (face, &hb_old_data_key);
if (data)
return data;
@ -212,24 +281,16 @@ _hb_old_face_get (hb_face_t *face)
static HB_Font
_hb_old_font_get (hb_font_t *font)
{
HB_Font data = (HB_Font) calloc (1, sizeof (HB_FontRec));
if (unlikely (!data)) {
DEBUG_MSG (OLD, font, "malloc()ing HB_Font failed");
/* Ouch, check user_data! */
HB_Font data = _hb_old_shaper_font_data_create (font);
if (!data)
return NULL;
}
data->klass = &hb_old_font_class;
data->x_ppem = font->x_ppem;
data->y_ppem = font->y_ppem;
data->x_scale = font->x_scale; // XXX
data->y_scale = font->y_scale; // XXX
data->userData = font;
if (unlikely (!hb_font_set_user_data (font, &hb_old_data_key, data,
(hb_destroy_func_t) free,
(hb_destroy_func_t) _hb_old_shaper_font_data_destroy,
false)))
{
free (data);
_hb_old_shaper_font_data_destroy (data);
data = (HB_Font) hb_font_get_user_data (font, &hb_old_data_key);
if (data)
return data;

View File

@ -46,14 +46,6 @@ struct hb_ot_shape_plan_t
};
HB_INTERNAL hb_bool_t
_hb_ot_shape (hb_font_t *font,
hb_buffer_t *buffer,
const hb_feature_t *features,
unsigned int num_features);
inline void
_hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_unicode_funcs_t *unicode)
{

View File

@ -26,14 +26,72 @@
* Google Author(s): Behdad Esfahbod
*/
#define HB_SHAPER ot
#define hb_ot_shaper_face_data_t hb_ot_layout_t
#include "hb-shaper-impl-private.hh"
#include "hb-ot-shape-private.hh"
#include "hb-ot-shape-normalize-private.hh"
#include "hb-ot-layout-private.hh"
#include "hb-font-private.hh"
#include "hb-set-private.hh"
/*
* shaper face data
*/
hb_ot_shaper_face_data_t *
_hb_ot_shaper_face_data_create (hb_face_t *face)
{
return (hb_ot_shaper_face_data_t *) HB_SHAPER_DATA_SUCCEEDED;
}
void
_hb_ot_shaper_face_data_destroy (hb_ot_shaper_face_data_t *data)
{
}
/*
* shaper font data
*/
struct hb_ot_shaper_font_data_t {};
hb_ot_shaper_font_data_t *
_hb_ot_shaper_font_data_create (hb_font_t *font)
{
return (hb_ot_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
}
void
_hb_ot_shaper_font_data_destroy (hb_ot_shaper_font_data_t *data)
{
}
/*
* shaper shape_plan data
*/
struct hb_ot_shaper_shape_plan_data_t {};
hb_ot_shaper_shape_plan_data_t *
_hb_ot_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan)
{
return (hb_ot_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED;
}
void
_hb_ot_shaper_shape_plan_data_destroy (hb_ot_shaper_shape_plan_data_t *data)
{
}
/*
* shaper
*/
hb_tag_t common_features[] = {
HB_TAG('c','c','m','p'),

View File

@ -24,19 +24,29 @@
* Google Author(s): Behdad Esfahbod
*/
#ifndef HB_GRAPHITE2_PRIVATE_HH
#define HB_GRAPHITE2_PRIVATE_HH
#ifndef HB_SHAPE_PLAN_PRIVATE_HH
#define HB_SHAPE_PLAN_PRIVATE_HH
#include "hb-private.hh"
#include "hb-graphite2.h"
#include "hb-shape-plan.h"
#include "hb-shaper-private.hh"
HB_INTERNAL hb_bool_t
_hb_graphite2_shape (hb_font_t *font,
hb_buffer_t *buffer,
const hb_feature_t *features,
unsigned int num_features);
struct hb_shape_plan_t
{
hb_object_header_t header;
ASSERT_POD ();
hb_shape_func_t *shapers[HB_NUM_SHAPERS];
struct hb_shaper_data_t shaper_data;
};
#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, shape_plan);
#include "hb-shaper-list.hh"
#undef HB_SHAPER_IMPLEMENT
#endif /* HB_GRAPHITE2_PRIVATE_HH */
#endif /* HB_SHAPE_PLAN_PRIVATE_HH */

85
src/hb-shape-plan.cc Normal file
View File

@ -0,0 +1,85 @@
/*
* Copyright © 2012 Google, Inc.
*
* This is part of HarfBuzz, a text shaping library.
*
* Permission is hereby granted, without written agreement and without
* license or royalty fees, to use, copy, modify, and distribute this
* software and its documentation for any purpose, provided that the
* above copyright notice and the following two paragraphs appear in
* all copies of this software.
*
* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*
* Google Author(s): Behdad Esfahbod
*/
#include "hb-private.hh"
#include "hb-shape-plan-private.hh"
#include "hb-font-private.hh"
/*
* hb_shape_plan_t
*/
hb_shape_plan_t *
hb_shape_plan_create (hb_face_t *face,
const hb_segment_properties_t *props,
const hb_feature_t *user_features,
unsigned int num_user_features,
const char * const *shaper_list)
{
hb_shape_plan_t *shape_plan;
if (unlikely (!face))
face = hb_face_get_empty ();
if (unlikely (!props || hb_object_is_inert (face)))
return hb_shape_plan_get_empty ();
if (!(shape_plan = hb_object_create<hb_shape_plan_t> ()))
return hb_shape_plan_get_empty ();
hb_face_make_immutable (face);
return shape_plan;
}
hb_shape_plan_t *
hb_shape_plan_get_empty (void)
{
static const hb_shape_plan_t _hb_shape_plan_nil = {
HB_OBJECT_HEADER_STATIC,
};
return const_cast<hb_shape_plan_t *> (&_hb_shape_plan_nil);
}
hb_shape_plan_t *
hb_shape_plan_reference (hb_shape_plan_t *shape_plan)
{
return hb_object_reference (shape_plan);
}
void
hb_shape_plan_destroy (hb_shape_plan_t *shape_plan)
{
if (!hb_object_destroy (shape_plan)) return;
#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_DESTROY(shaper, shape_plan);
#include "hb-shaper-list.hh"
#undef HB_SHAPER_IMPLEMENT
free (shape_plan);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright © 2011 Google, Inc.
* Copyright © 2012 Google, Inc.
*
* This is part of HarfBuzz, a text shaping library.
*
@ -24,18 +24,37 @@
* Google Author(s): Behdad Esfahbod
*/
#ifndef HB_FALLBACK_SHAPE_PRIVATE_HH
#define HB_FALLBACK_SHAPE_PRIVATE_HH
#ifndef HB_SHAPE_PLAN_H
#define HB_SHAPE_PLAN_H
/* TODO To become public one day */
#include "hb-private.hh"
#include "hb-shape.h"
#include "hb-buffer-private.hh"
HB_INTERNAL hb_bool_t
_hb_fallback_shape (hb_font_t *font,
hb_buffer_t *buffer,
const hb_feature_t *features,
unsigned int num_features);
typedef struct hb_shape_plan_t hb_shape_plan;
#endif /* HB_FALLBACK_SHAPE_PRIVATE_HH */
/*
* hb_shape_plan_t
*/
HB_INTERNAL hb_shape_plan_t *
hb_shape_plan_create (hb_face_t *face,
const hb_segment_properties_t *props,
const hb_feature_t *user_features,
unsigned int num_user_features,
const char * const *shaper_list);
HB_INTERNAL hb_shape_plan_t *
hb_shape_plan_get_empty (void);
HB_INTERNAL hb_shape_plan_t *
hb_shape_plan_reference (hb_shape_plan_t *shape_plan);
HB_INTERNAL void
hb_shape_plan_destroy (hb_shape_plan_t *shape_plan);
#endif /* HB_SHAPE_PLAN_H */

View File

@ -26,56 +26,18 @@
#include "hb-private.hh"
#include "hb-shape.h"
#include "hb-shaper-private.hh"
#include "hb-buffer-private.hh"
#ifdef HAVE_GRAPHITE
#include "hb-graphite2-private.hh"
#endif
#ifdef HAVE_UNISCRIBE
# include "hb-uniscribe-private.hh"
#endif
#ifdef HAVE_CORETEXT
# include "hb-coretext-private.hh"
#endif
#ifdef HAVE_HB_OLD
# include "hb-old-private.hh"
#endif
#ifdef HAVE_OT
# include "hb-ot-shape-private.hh"
#endif
#include "hb-fallback-shape-private.hh"
typedef hb_bool_t (*hb_shape_func_t) (hb_font_t *font,
hb_buffer_t *buffer,
const hb_feature_t *features,
unsigned int num_features);
#define HB_SHAPER_IMPLEMENT(name) {#name, _hb_##name##_shape}
static const struct hb_shaper_pair_t {
char name[16];
hb_shape_func_t func;
hb_shape_func_t *func;
} all_shapers[] = {
/* v--- Add new shapers in the right place here */
#ifdef HAVE_GRAPHITE
HB_SHAPER_IMPLEMENT (graphite2),
#endif
#ifdef HAVE_UNISCRIBE
HB_SHAPER_IMPLEMENT (uniscribe),
#endif
#ifdef HAVE_CORETEXT
HB_SHAPER_IMPLEMENT (coretext),
#endif
#ifdef HAVE_OT
HB_SHAPER_IMPLEMENT (ot),
#endif
#ifdef HAVE_HB_OLD
HB_SHAPER_IMPLEMENT (old),
#endif
HB_SHAPER_IMPLEMENT (fallback), /* This should be last. */
};
#define HB_SHAPER_IMPLEMENT(name) {#name, _hb_##name##_shape},
#include "hb-shaper-list.hh"
#undef HB_SHAPER_IMPLEMENT
};
/* Thread-safe, lock-free, shapers */

View File

@ -24,19 +24,21 @@
* Google Author(s): Behdad Esfahbod
*/
#ifndef HB_UNISCRIBE_PRIVATE_HH
#define HB_UNISCRIBE_PRIVATE_HH
#ifndef HB_SHAPER_IMPL_PRIVATE_HH
#define HB_SHAPER_IMPL_PRIVATE_HH
#include "hb-private.hh"
#include "hb-uniscribe.h"
#include "hb-shaper-private.hh"
#include "hb-shape-plan-private.hh"
#include "hb-font-private.hh"
#include "hb-buffer-private.hh"
HB_INTERNAL hb_bool_t
_hb_uniscribe_shape (hb_font_t *font,
hb_buffer_t *buffer,
const hb_feature_t *features,
unsigned int num_features);
#ifdef HB_SHAPER
/* For use in things like font->shaper_data() in the shaper implementations. */
#define shaper_data() shaper_data.HB_SHAPER
#endif
#endif /* HB_UNISCRIBE_PRIVATE_HH */
#endif /* HB_SHAPER_IMPL_PRIVATE_HH */

View File

@ -24,17 +24,27 @@
* Google Author(s): Behdad Esfahbod
*/
#ifndef HB_OLD_PRIVATE_HH
#define HB_OLD_PRIVATE_HH
#ifndef HB_SHAPER_LIST_HH
#define HB_SHAPER_LIST_HH
#endif /* HB_SHAPER_LIST_HH */ /* Dummy header guards */
#include "hb-private.hh"
/* v--- Add new shapers in the right place here. */
#ifdef HAVE_GRAPHITE
HB_SHAPER_IMPLEMENT (graphite2)
#endif
#ifdef HAVE_UNISCRIBE
HB_SHAPER_IMPLEMENT (uniscribe)
#endif
#ifdef HAVE_CORETEXT
HB_SHAPER_IMPLEMENT (coretext)
#endif
#ifdef HAVE_OT
HB_SHAPER_IMPLEMENT (ot) /* <--- This is our main OpenType shaper. */
#endif
HB_INTERNAL hb_bool_t
_hb_old_shape (hb_font_t *font,
hb_buffer_t *buffer,
const hb_feature_t *features,
unsigned int num_features);
#ifdef HAVE_HB_OLD
HB_SHAPER_IMPLEMENT (old)
#endif
#endif /* HB_OLD_PRIVATE_HH */
HB_SHAPER_IMPLEMENT (fallback) /* <--- This should be last. */

81
src/hb-shaper-private.hh Normal file
View File

@ -0,0 +1,81 @@
/*
* Copyright © 2012 Google, Inc.
*
* This is part of HarfBuzz, a text shaping library.
*
* Permission is hereby granted, without written agreement and without
* license or royalty fees, to use, copy, modify, and distribute this
* software and its documentation for any purpose, provided that the
* above copyright notice and the following two paragraphs appear in
* all copies of this software.
*
* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*
* Google Author(s): Behdad Esfahbod
*/
#ifndef HB_SHAPER_PRIVATE_HH
#define HB_SHAPER_PRIVATE_HH
#include "hb-private.hh"
typedef hb_bool_t hb_shape_func_t (hb_font_t *font,
hb_buffer_t *buffer,
const hb_feature_t *features,
unsigned int num_features);
#define HB_SHAPER_IMPLEMENT(name) \
extern "C" HB_INTERNAL hb_shape_func_t _hb_##name##_shape;
#include "hb-shaper-list.hh"
#undef HB_SHAPER_IMPLEMENT
/* For embedding in face / font / ... */
struct hb_shaper_data_t {
#define HB_SHAPER_IMPLEMENT(shaper) void *shaper;
#include "hb-shaper-list.hh"
#undef HB_SHAPER_IMPLEMENT
};
#define HB_NUM_SHAPERS (sizeof (hb_shaper_data_t) / sizeof (void *))
/* Means: succeeded, but don't need to keep any data. */
#define HB_SHAPER_DATA_SUCCEEDED ((void *) +1)
/* Means: tried but failed to create. */
#define HB_SHAPER_DATA_INVALID ((void *) -1)
#define HB_SHAPER_DATA_IS_INVALID(data) ((void *) (data) == HB_SHAPER_DATA_INVALID)
#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); \
extern "C" HB_INTERNAL void \
HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (HB_SHAPER_DATA_TYPE (shaper, object) *data)
#define HB_SHAPER_DATA_DESTROY(shaper, object) \
if (object->shaper_data.shaper && \
object->shaper_data.shaper != HB_SHAPER_DATA_INVALID && \
object->shaper_data.shaper != HB_SHAPER_DATA_SUCCEEDED) \
HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (HB_SHAPER_DATA (shaper, object));
#endif /* HB_SHAPER_PRIVATE_HH */

View File

@ -26,7 +26,8 @@
#define _WIN32_WINNT 0x0600
#include "hb-private.hh"
#define HB_SHAPER uniscribe
#include "hb-shaper-impl-private.hh"
#include <windows.h>
#include <usp10.h>
@ -38,10 +39,6 @@ typedef ULONG WIN_ULONG;
#include "hb-ot-name-table.hh"
#include "hb-ot-tag.h"
#include "hb-font-private.hh"
#include "hb-buffer-private.hh"
#ifndef HB_DEBUG_UNISCRIBE
#define HB_DEBUG_UNISCRIBE (HB_DEBUG+0)
@ -91,31 +88,20 @@ populate_log_font (LOGFONTW *lf,
}
static hb_user_data_key_t hb_uniscribe_data_key;
/*
* shaper face data
*/
static struct hb_uniscribe_face_data_t {
struct hb_uniscribe_shaper_face_data_t {
HANDLE fh;
} _hb_uniscribe_face_data_nil = {0};
};
static void
_hb_uniscribe_face_data_destroy (hb_uniscribe_face_data_t *data)
hb_uniscribe_shaper_face_data_t *
_hb_uniscribe_shaper_face_data_create (hb_face_t *face)
{
if (data->fh)
RemoveFontMemResourceEx (data->fh);
free (data);
}
static hb_uniscribe_face_data_t *
_hb_uniscribe_face_get_data (hb_face_t *face)
{
hb_uniscribe_face_data_t *data = (hb_uniscribe_face_data_t *) hb_face_get_user_data (face, &hb_uniscribe_data_key);
if (likely (data)) return data;
data = (hb_uniscribe_face_data_t *) calloc (1, sizeof (hb_uniscribe_face_data_t));
hb_uniscribe_shaper_face_data_t *data = (hb_uniscribe_shaper_face_data_t *) calloc (1, sizeof (hb_uniscribe_shaper_face_data_t));
if (unlikely (!data))
return &_hb_uniscribe_face_data_nil;
return NULL;
hb_blob_t *blob = hb_face_reference_blob (face);
unsigned int blob_length;
@ -126,35 +112,68 @@ _hb_uniscribe_face_get_data (hb_face_t *face)
DWORD num_fonts_installed;
data->fh = AddFontMemResourceEx ((void *) blob_data, blob_length, 0, &num_fonts_installed);
hb_blob_destroy (blob);
if (unlikely (!data->fh))
if (unlikely (!data->fh)) {
DEBUG_MSG (UNISCRIBE, face, "Face AddFontMemResourceEx() failed");
if (unlikely (!hb_face_set_user_data (face, &hb_uniscribe_data_key, data,
(hb_destroy_func_t) _hb_uniscribe_face_data_destroy,
false)))
{
_hb_uniscribe_face_data_destroy (data);
data = (hb_uniscribe_face_data_t *) hb_face_get_user_data (face, &hb_uniscribe_data_key);
if (data)
return data;
else
return &_hb_uniscribe_face_data_nil;
free (data);
return NULL;
}
return data;
}
void
_hb_uniscribe_shaper_face_data_destroy (hb_uniscribe_shaper_face_data_t *data)
{
if (data->fh)
RemoveFontMemResourceEx (data->fh);
free (data);
}
static struct hb_uniscribe_font_data_t {
/*
* shaper font data
*/
struct hb_uniscribe_shaper_font_data_t {
HDC hdc;
LOGFONTW log_font;
HFONT hfont;
SCRIPT_CACHE script_cache;
} _hb_uniscribe_font_data_nil = {NULL, NULL, NULL};
};
static void
_hb_uniscribe_font_data_destroy (hb_uniscribe_font_data_t *data)
hb_uniscribe_shaper_font_data_t *
_hb_uniscribe_shaper_font_data_create (hb_font_t *font)
{
hb_uniscribe_shaper_font_data_t * data = (hb_uniscribe_shaper_font_data_t *) calloc (1, sizeof (hb_uniscribe_shaper_font_data_t));
if (unlikely (!data))
return NULL;
data->hdc = GetDC (NULL);
if (unlikely (!populate_log_font (&data->log_font, font))) {
DEBUG_MSG (UNISCRIBE, font, "Font populate_log_font() failed");
_hb_uniscribe_shaper_font_data_destroy (data);
return NULL;
}
data->hfont = CreateFontIndirectW (&data->log_font);
if (unlikely (!data->hfont)) {
DEBUG_MSG (UNISCRIBE, font, "Font CreateFontIndirectW() failed");
_hb_uniscribe_shaper_font_data_destroy (data);
return NULL;
}
if (!SelectObject (data->hdc, data->hfont)) {
DEBUG_MSG (UNISCRIBE, font, "Font SelectObject() failed");
_hb_uniscribe_shaper_font_data_destroy (data);
return NULL;
}
return data;
}
void
_hb_uniscribe_shaper_font_data_destroy (hb_uniscribe_shaper_font_data_t *data)
{
if (data->hdc)
ReleaseDC (NULL, data->hdc);
@ -165,38 +184,67 @@ _hb_uniscribe_font_data_destroy (hb_uniscribe_font_data_t *data)
free (data);
}
static hb_uniscribe_font_data_t *
_hb_uniscribe_font_get_data (hb_font_t *font)
/*
* shaper shape_plan data
*/
struct hb_uniscribe_shaper_shape_plan_data_t {};
hb_uniscribe_shaper_shape_plan_data_t *
_hb_uniscribe_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan)
{
hb_uniscribe_font_data_t *data = (hb_uniscribe_font_data_t *) hb_font_get_user_data (font, &hb_uniscribe_data_key);
return (hb_uniscribe_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED;
}
void
_hb_uniscribe_shaper_shape_plan_data_destroy (hb_uniscribe_shaper_shape_plan_data_t *data)
{
}
/*
* 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_font_data_t *) calloc (1, sizeof (hb_uniscribe_font_data_t));
if (unlikely (!data))
return &_hb_uniscribe_font_data_nil;
data = _hb_uniscribe_shaper_face_data_create (face);
if (!data) return NULL;
data->hdc = GetDC (NULL);
if (unlikely (!populate_log_font (&data->log_font, font)))
DEBUG_MSG (UNISCRIBE, font, "Font populate_log_font() failed");
else {
data->hfont = CreateFontIndirectW (&data->log_font);
if (unlikely (!data->hfont))
DEBUG_MSG (UNISCRIBE, font, "Font CreateFontIndirectW() failed");
if (!SelectObject (data->hdc, data->hfont))
DEBUG_MSG (UNISCRIBE, font, "Font SelectObject() failed");
}
if (unlikely (!hb_font_set_user_data (font, &hb_uniscribe_data_key, data,
(hb_destroy_func_t) _hb_uniscribe_font_data_destroy,
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_font_data_destroy (data);
data = (hb_uniscribe_font_data_t *) hb_font_get_user_data (font, &hb_uniscribe_data_key);
if (data)
return data;
else
return &_hb_uniscribe_font_data_nil;
_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;
@ -205,7 +253,7 @@ _hb_uniscribe_font_get_data (hb_font_t *font)
LOGFONTW *
hb_uniscribe_font_get_logfontw (hb_font_t *font)
{
hb_uniscribe_font_data_t *font_data = _hb_uniscribe_font_get_data (font);
hb_uniscribe_shaper_font_data_t *font_data = _hb_uniscribe_font_get_data (font);
if (unlikely (!font_data))
return NULL;
return &font_data->log_font;
@ -214,7 +262,7 @@ hb_uniscribe_font_get_logfontw (hb_font_t *font)
HFONT
hb_uniscribe_font_get_hfont (hb_font_t *font)
{
hb_uniscribe_font_data_t *font_data = _hb_uniscribe_font_get_data (font);
hb_uniscribe_shaper_font_data_t *font_data = _hb_uniscribe_font_get_data (font);
if (unlikely (!font_data))
return 0;
return font_data->hfont;
@ -235,11 +283,11 @@ _hb_uniscribe_shape (hb_font_t *font,
return false; \
} HB_STMT_END;
hb_uniscribe_face_data_t *face_data = _hb_uniscribe_face_get_data (font->face);
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_font_data_t *font_data = _hb_uniscribe_font_get_data (font);
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");