[API] Sort out get_blob API
hb_face_get_blob() renamed to hb_face_reference_blob(), returns a reference now. hb_face_[sg]et_index() added. hb_face_set_upem() added.
This commit is contained in:
parent
e715784be3
commit
3897335c76
|
@ -94,6 +94,7 @@ struct _hb_face_t {
|
||||||
|
|
||||||
struct hb_ot_layout_t *ot_layout;
|
struct hb_ot_layout_t *ot_layout;
|
||||||
|
|
||||||
|
unsigned int index;
|
||||||
unsigned int upem;
|
unsigned int upem;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -154,7 +155,7 @@ struct _hb_font_t {
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
inline hb_position_t em_scale (int16_t v, int scale) { return v * (int64_t) scale / this->face->upem; }
|
inline hb_position_t em_scale (int16_t v, int scale) { return v * (int64_t) scale / hb_face_get_upem (this->face); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "hb-font-private.hh"
|
#include "hb-font-private.hh"
|
||||||
#include "hb-blob.h"
|
#include "hb-blob.h"
|
||||||
#include "hb-open-file-private.hh"
|
#include "hb-open-file-private.hh"
|
||||||
|
#include "hb-ot-head-private.hh"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
@ -538,7 +539,8 @@ static hb_face_t _hb_face_nil = {
|
||||||
|
|
||||||
NULL, /* ot_layout */
|
NULL, /* ot_layout */
|
||||||
|
|
||||||
1000
|
0, /* index */
|
||||||
|
1000 /* upem */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -561,7 +563,7 @@ hb_face_create_for_tables (hb_reference_table_func_t reference_table,
|
||||||
|
|
||||||
face->ot_layout = _hb_ot_layout_create (face);
|
face->ot_layout = _hb_ot_layout_create (face);
|
||||||
|
|
||||||
face->upem = _hb_ot_layout_get_upem (face);
|
face->upem = 0;
|
||||||
|
|
||||||
return face;
|
return face;
|
||||||
}
|
}
|
||||||
|
@ -599,6 +601,9 @@ _hb_face_for_data_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void
|
||||||
{
|
{
|
||||||
hb_face_for_data_closure_t *data = (hb_face_for_data_closure_t *) user_data;
|
hb_face_for_data_closure_t *data = (hb_face_for_data_closure_t *) user_data;
|
||||||
|
|
||||||
|
if (tag == HB_TAG_NONE)
|
||||||
|
return hb_blob_reference (data->blob);
|
||||||
|
|
||||||
const OpenTypeFontFile &ot_file = *Sanitizer<OpenTypeFontFile>::lock_instance (data->blob);
|
const OpenTypeFontFile &ot_file = *Sanitizer<OpenTypeFontFile>::lock_instance (data->blob);
|
||||||
const OpenTypeFontFace &ot_face = ot_file.get_face (data->index);
|
const OpenTypeFontFace &ot_face = ot_file.get_face (data->index);
|
||||||
|
|
||||||
|
@ -613,6 +618,8 @@ hb_face_t *
|
||||||
hb_face_create (hb_blob_t *blob,
|
hb_face_create (hb_blob_t *blob,
|
||||||
unsigned int index)
|
unsigned int index)
|
||||||
{
|
{
|
||||||
|
hb_face_t *face;
|
||||||
|
|
||||||
if (unlikely (!blob || !hb_blob_get_length (blob)))
|
if (unlikely (!blob || !hb_blob_get_length (blob)))
|
||||||
return &_hb_face_nil;
|
return &_hb_face_nil;
|
||||||
|
|
||||||
|
@ -621,9 +628,13 @@ hb_face_create (hb_blob_t *blob,
|
||||||
if (unlikely (!closure))
|
if (unlikely (!closure))
|
||||||
return &_hb_face_nil;
|
return &_hb_face_nil;
|
||||||
|
|
||||||
return hb_face_create_for_tables (_hb_face_for_data_reference_table,
|
face = hb_face_create_for_tables (_hb_face_for_data_reference_table,
|
||||||
closure,
|
closure,
|
||||||
(hb_destroy_func_t) _hb_face_for_data_closure_destroy);
|
(hb_destroy_func_t) _hb_face_for_data_closure_destroy);
|
||||||
|
|
||||||
|
hb_face_set_index (face, index);
|
||||||
|
|
||||||
|
return face;
|
||||||
}
|
}
|
||||||
|
|
||||||
hb_face_t *
|
hb_face_t *
|
||||||
|
@ -684,16 +695,6 @@ hb_face_is_immutable (hb_face_t *face)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
hb_blob_t *
|
|
||||||
hb_face_get_blob (hb_face_t *face)
|
|
||||||
{
|
|
||||||
if (face->destroy != (hb_destroy_func_t) _hb_face_for_data_closure_destroy)
|
|
||||||
return hb_blob_get_empty ();
|
|
||||||
|
|
||||||
hb_face_for_data_closure_t *data = (hb_face_for_data_closure_t *) face->user_data;
|
|
||||||
return data->blob;
|
|
||||||
}
|
|
||||||
|
|
||||||
hb_blob_t *
|
hb_blob_t *
|
||||||
hb_face_reference_table (hb_face_t *face,
|
hb_face_reference_table (hb_face_t *face,
|
||||||
hb_tag_t tag)
|
hb_tag_t tag)
|
||||||
|
@ -710,10 +711,48 @@ hb_face_reference_table (hb_face_t *face,
|
||||||
return blob;
|
return blob;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hb_blob_t *
|
||||||
|
hb_face_reference_blob (hb_face_t *face)
|
||||||
|
{
|
||||||
|
return hb_face_reference_table (face, HB_TAG_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
hb_face_set_index (hb_face_t *face,
|
||||||
|
unsigned int index)
|
||||||
|
{
|
||||||
|
if (hb_object_is_inert (face))
|
||||||
|
return;
|
||||||
|
|
||||||
|
face->index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
hb_face_get_index (hb_face_t *face)
|
||||||
|
{
|
||||||
|
return face->index;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
hb_face_set_upem (hb_face_t *face,
|
||||||
|
unsigned int upem)
|
||||||
|
{
|
||||||
|
if (hb_object_is_inert (face))
|
||||||
|
return;
|
||||||
|
|
||||||
|
face->upem = upem;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
hb_face_get_upem (hb_face_t *face)
|
hb_face_get_upem (hb_face_t *face)
|
||||||
{
|
{
|
||||||
return _hb_ot_layout_get_upem (face);
|
if (unlikely (!face->upem)) {
|
||||||
|
hb_blob_t *head_blob = Sanitizer<head>::sanitize (hb_face_reference_table (face, HB_OT_TAG_head));
|
||||||
|
const head *head_table = Sanitizer<head>::lock_instance (head_blob);
|
||||||
|
face->upem = head_table->get_upem ();
|
||||||
|
hb_blob_destroy (head_blob);
|
||||||
|
}
|
||||||
|
return face->upem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -79,13 +79,24 @@ hb_bool_t
|
||||||
hb_face_is_immutable (hb_face_t *face);
|
hb_face_is_immutable (hb_face_t *face);
|
||||||
|
|
||||||
|
|
||||||
hb_blob_t *
|
|
||||||
hb_face_get_blob (hb_face_t *face);
|
|
||||||
|
|
||||||
hb_blob_t *
|
hb_blob_t *
|
||||||
hb_face_reference_table (hb_face_t *face,
|
hb_face_reference_table (hb_face_t *face,
|
||||||
hb_tag_t tag);
|
hb_tag_t tag);
|
||||||
|
|
||||||
|
hb_blob_t *
|
||||||
|
hb_face_reference_blob (hb_face_t *face);
|
||||||
|
|
||||||
|
void
|
||||||
|
hb_face_set_index (hb_face_t *face,
|
||||||
|
unsigned int index);
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
hb_face_get_index (hb_face_t *face);
|
||||||
|
|
||||||
|
void
|
||||||
|
hb_face_set_upem (hb_face_t *face,
|
||||||
|
unsigned int upem);
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
hb_face_get_upem (hb_face_t *face);
|
hb_face_get_upem (hb_face_t *face);
|
||||||
|
|
||||||
|
|
|
@ -250,8 +250,7 @@ reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
|
||||||
FT_ULong length = 0;
|
FT_ULong length = 0;
|
||||||
FT_Error error;
|
FT_Error error;
|
||||||
|
|
||||||
if (unlikely (tag == HB_TAG_NONE))
|
/* Note: FreeType like HarfBuzz uses the NONE tag for fetching the entire blob */
|
||||||
return NULL;
|
|
||||||
|
|
||||||
error = FT_Load_Sfnt_Table (ft_face, tag, 0, NULL, &length);
|
error = FT_Load_Sfnt_Table (ft_face, tag, 0, NULL, &length);
|
||||||
if (error)
|
if (error)
|
||||||
|
|
|
@ -70,13 +70,6 @@ _hb_ot_layout_skip_mark (hb_face_t *face,
|
||||||
unsigned int *property_out);
|
unsigned int *property_out);
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* head
|
|
||||||
*/
|
|
||||||
|
|
||||||
HB_INTERNAL unsigned int
|
|
||||||
_hb_ot_layout_get_upem (hb_face_t *face);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* hb_ot_layout_t
|
* hb_ot_layout_t
|
||||||
|
@ -87,12 +80,10 @@ struct hb_ot_layout_t
|
||||||
hb_blob_t *gdef_blob;
|
hb_blob_t *gdef_blob;
|
||||||
hb_blob_t *gsub_blob;
|
hb_blob_t *gsub_blob;
|
||||||
hb_blob_t *gpos_blob;
|
hb_blob_t *gpos_blob;
|
||||||
hb_blob_t *head_blob;
|
|
||||||
|
|
||||||
const struct GDEF *gdef;
|
const struct GDEF *gdef;
|
||||||
const struct GSUB *gsub;
|
const struct GSUB *gsub;
|
||||||
const struct GPOS *gpos;
|
const struct GPOS *gpos;
|
||||||
const struct head *head;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,6 @@
|
||||||
#include "hb-ot-layout-gdef-private.hh"
|
#include "hb-ot-layout-gdef-private.hh"
|
||||||
#include "hb-ot-layout-gsub-private.hh"
|
#include "hb-ot-layout-gsub-private.hh"
|
||||||
#include "hb-ot-layout-gpos-private.hh"
|
#include "hb-ot-layout-gpos-private.hh"
|
||||||
#include "hb-ot-head-private.hh"
|
|
||||||
#include "hb-ot-maxp-private.hh"
|
#include "hb-ot-maxp-private.hh"
|
||||||
|
|
||||||
|
|
||||||
|
@ -57,9 +56,6 @@ _hb_ot_layout_create (hb_face_t *face)
|
||||||
layout->gpos_blob = Sanitizer<GPOS>::sanitize (hb_face_reference_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->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;
|
return layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,7 +65,6 @@ _hb_ot_layout_destroy (hb_ot_layout_t *layout)
|
||||||
hb_blob_destroy (layout->gdef_blob);
|
hb_blob_destroy (layout->gdef_blob);
|
||||||
hb_blob_destroy (layout->gsub_blob);
|
hb_blob_destroy (layout->gsub_blob);
|
||||||
hb_blob_destroy (layout->gpos_blob);
|
hb_blob_destroy (layout->gpos_blob);
|
||||||
hb_blob_destroy (layout->head_blob);
|
|
||||||
|
|
||||||
free (layout);
|
free (layout);
|
||||||
}
|
}
|
||||||
|
@ -89,11 +84,6 @@ _get_gpos (hb_face_t *face)
|
||||||
{
|
{
|
||||||
return likely (face->ot_layout && face->ot_layout->gpos) ? *face->ot_layout->gpos : Null(GPOS);
|
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -505,14 +495,3 @@ 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 ();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -189,7 +189,7 @@ retry:
|
||||||
/* XXX setup ranges */
|
/* XXX setup ranges */
|
||||||
}
|
}
|
||||||
|
|
||||||
hb_blob_t *blob = hb_face_get_blob (font->face);
|
hb_blob_t *blob = hb_face_reference_blob (font->face);
|
||||||
unsigned int blob_length;
|
unsigned int blob_length;
|
||||||
const char *blob_data = hb_blob_get_data (blob, &blob_length);
|
const char *blob_data = hb_blob_get_data (blob, &blob_length);
|
||||||
if (unlikely (!blob_length))
|
if (unlikely (!blob_length))
|
||||||
|
@ -197,6 +197,7 @@ retry:
|
||||||
|
|
||||||
DWORD num_fonts_installed;
|
DWORD num_fonts_installed;
|
||||||
HANDLE fh = AddFontMemResourceEx ((void *) blob_data, blob_length, 0, &num_fonts_installed);
|
HANDLE fh = AddFontMemResourceEx ((void *) blob_data, blob_length, 0, &num_fonts_installed);
|
||||||
|
hb_blob_destroy (blob);
|
||||||
if (unlikely (!fh))
|
if (unlikely (!fh))
|
||||||
FAIL ("AddFontMemResourceEx() failed");
|
FAIL ("AddFontMemResourceEx() failed");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue