Cleanup hb_face_create_for_data()
This commit is contained in:
parent
d6b3c83a90
commit
1cebfbb063
@ -11,6 +11,7 @@ HBCFLAGS =
|
|||||||
HBLIBS =
|
HBLIBS =
|
||||||
HBSOURCES = \
|
HBSOURCES = \
|
||||||
hb-blob.c \
|
hb-blob.c \
|
||||||
|
hb-blob-private.h \
|
||||||
hb-buffer.c \
|
hb-buffer.c \
|
||||||
hb-buffer-private.h \
|
hb-buffer-private.h \
|
||||||
hb-font.cc \
|
hb-font.cc \
|
||||||
|
57
src/hb-blob-private.h
Normal file
57
src/hb-blob-private.h
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2010 Red Hat, 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.
|
||||||
|
*
|
||||||
|
* Red Hat Author(s): Behdad Esfahbod
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HB_BLOB_PRIVATE_H
|
||||||
|
#define HB_BLOB_PRIVATE_H
|
||||||
|
|
||||||
|
#include "hb-private.h"
|
||||||
|
|
||||||
|
#include "hb-blob.h"
|
||||||
|
|
||||||
|
HB_BEGIN_DECLS
|
||||||
|
|
||||||
|
struct _hb_blob_t {
|
||||||
|
hb_reference_count_t ref_count;
|
||||||
|
|
||||||
|
unsigned int length;
|
||||||
|
|
||||||
|
hb_mutex_t lock;
|
||||||
|
/* the rest are protected by lock */
|
||||||
|
|
||||||
|
unsigned int lock_count;
|
||||||
|
hb_memory_mode_t mode;
|
||||||
|
|
||||||
|
const char *data;
|
||||||
|
|
||||||
|
hb_destroy_func_t destroy;
|
||||||
|
void *user_data;
|
||||||
|
};
|
||||||
|
|
||||||
|
HB_INTERNAL hb_blob_t _hb_blob_nil;
|
||||||
|
|
||||||
|
HB_END_DECLS
|
||||||
|
|
||||||
|
#endif /* HB_BLOB_PRIVATE_H */
|
@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
#include "hb-private.h"
|
#include "hb-private.h"
|
||||||
|
|
||||||
#include "hb-blob.h"
|
#include "hb-blob-private.h"
|
||||||
|
|
||||||
#ifdef HAVE_SYS_MMAN_H
|
#ifdef HAVE_SYS_MMAN_H
|
||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
@ -44,23 +44,7 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct _hb_blob_t {
|
hb_blob_t _hb_blob_nil = {
|
||||||
hb_reference_count_t ref_count;
|
|
||||||
|
|
||||||
unsigned int length;
|
|
||||||
|
|
||||||
hb_mutex_t lock;
|
|
||||||
/* the rest are protected by lock */
|
|
||||||
|
|
||||||
unsigned int lock_count;
|
|
||||||
hb_memory_mode_t mode;
|
|
||||||
|
|
||||||
const char *data;
|
|
||||||
|
|
||||||
hb_destroy_func_t destroy;
|
|
||||||
void *user_data;
|
|
||||||
};
|
|
||||||
static hb_blob_t _hb_blob_nil = {
|
|
||||||
HB_REFERENCE_COUNT_INVALID, /* ref_count */
|
HB_REFERENCE_COUNT_INVALID, /* ref_count */
|
||||||
|
|
||||||
0, /* length */
|
0, /* length */
|
||||||
|
@ -60,9 +60,6 @@ _hb_font_funcs_nil;
|
|||||||
struct _hb_face_t {
|
struct _hb_face_t {
|
||||||
hb_reference_count_t ref_count;
|
hb_reference_count_t ref_count;
|
||||||
|
|
||||||
hb_blob_t *blob;
|
|
||||||
unsigned int index;
|
|
||||||
|
|
||||||
hb_get_table_func_t get_table;
|
hb_get_table_func_t get_table;
|
||||||
hb_destroy_func_t destroy;
|
hb_destroy_func_t destroy;
|
||||||
void *user_data;
|
void *user_data;
|
||||||
|
@ -27,8 +27,8 @@
|
|||||||
#include "hb-private.h"
|
#include "hb-private.h"
|
||||||
|
|
||||||
#include "hb-font-private.h"
|
#include "hb-font-private.h"
|
||||||
|
#include "hb-blob-private.h"
|
||||||
#include "hb-open-file-private.hh"
|
#include "hb-open-file-private.hh"
|
||||||
#include "hb-blob.h"
|
|
||||||
|
|
||||||
#include "hb-ot-layout-private.h"
|
#include "hb-ot-layout-private.h"
|
||||||
|
|
||||||
@ -218,33 +218,14 @@ hb_font_get_kerning (hb_font_t *font, hb_face_t *face,
|
|||||||
first_glyph, second_glyph);
|
first_glyph, second_glyph);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* hb_face_t
|
* hb_face_t
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static hb_blob_t *
|
|
||||||
_hb_face_get_table_from_blob (hb_tag_t tag, void *user_data)
|
|
||||||
{
|
|
||||||
hb_face_t *face = (hb_face_t *) user_data;
|
|
||||||
|
|
||||||
const OpenTypeFontFile &ot_file = *CastP<OpenTypeFontFile> (hb_blob_lock (face->blob));
|
|
||||||
const OpenTypeFontFace &ot_face = ot_file.get_face (face->index);
|
|
||||||
|
|
||||||
const OpenTypeTable &table = ot_face.get_table_by_tag (tag);
|
|
||||||
|
|
||||||
hb_blob_t *blob = hb_blob_create_sub_blob (face->blob, table.offset, table.length);
|
|
||||||
|
|
||||||
hb_blob_unlock (face->blob);
|
|
||||||
|
|
||||||
return blob;
|
|
||||||
}
|
|
||||||
|
|
||||||
static hb_face_t _hb_face_nil = {
|
static hb_face_t _hb_face_nil = {
|
||||||
HB_REFERENCE_COUNT_INVALID, /* ref_count */
|
HB_REFERENCE_COUNT_INVALID, /* ref_count */
|
||||||
|
|
||||||
NULL, /* blob */
|
|
||||||
0, /* index */
|
|
||||||
|
|
||||||
NULL, /* get_table */
|
NULL, /* get_table */
|
||||||
NULL, /* destroy */
|
NULL, /* destroy */
|
||||||
NULL, /* user_data */
|
NULL, /* user_data */
|
||||||
@ -252,6 +233,7 @@ static hb_face_t _hb_face_nil = {
|
|||||||
{} /* ot_layout */
|
{} /* ot_layout */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
hb_face_t *
|
hb_face_t *
|
||||||
hb_face_create_for_tables (hb_get_table_func_t get_table,
|
hb_face_create_for_tables (hb_get_table_func_t get_table,
|
||||||
hb_destroy_func_t destroy,
|
hb_destroy_func_t destroy,
|
||||||
@ -274,6 +256,58 @@ hb_face_create_for_tables (hb_get_table_func_t get_table,
|
|||||||
return face;
|
return face;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _hb_face_for_data_closure_t {
|
||||||
|
hb_blob_t *blob;
|
||||||
|
unsigned int index;
|
||||||
|
} hb_face_for_data_closure_t;
|
||||||
|
|
||||||
|
static hb_face_for_data_closure_t _hb_face_for_data_closure_nil = {
|
||||||
|
&_hb_blob_nil,
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
static hb_face_for_data_closure_t *
|
||||||
|
_hb_face_for_data_closure_create (hb_blob_t *blob, unsigned int index)
|
||||||
|
{
|
||||||
|
hb_face_for_data_closure_t *closure;
|
||||||
|
|
||||||
|
closure = (hb_face_for_data_closure_t *) malloc (sizeof (hb_face_for_data_closure_t));
|
||||||
|
if (HB_UNLIKELY (!closure))
|
||||||
|
return &_hb_face_for_data_closure_nil;
|
||||||
|
|
||||||
|
closure->blob = hb_blob_reference (blob);
|
||||||
|
closure->index = index;
|
||||||
|
|
||||||
|
return closure;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_hb_face_for_data_closure_destroy (hb_face_for_data_closure_t *closure)
|
||||||
|
{
|
||||||
|
if (HB_LIKELY (closure != &_hb_face_for_data_closure_nil)) {
|
||||||
|
hb_blob_destroy (closure->blob);
|
||||||
|
free (closure);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static hb_blob_t *
|
||||||
|
_hb_face_for_data_get_table (hb_tag_t tag, void *user_data)
|
||||||
|
{
|
||||||
|
hb_face_for_data_closure_t *data = (hb_face_for_data_closure_t *) user_data;
|
||||||
|
|
||||||
|
const OpenTypeFontFile &ot_file = *CastP<OpenTypeFontFile> (hb_blob_lock (data->blob));
|
||||||
|
const OpenTypeFontFace &ot_face = ot_file.get_face (data->index);
|
||||||
|
|
||||||
|
const OpenTypeTable &table = ot_face.get_table_by_tag (tag);
|
||||||
|
|
||||||
|
hb_blob_t *blob = hb_blob_create_sub_blob (data->blob, table.offset, table.length);
|
||||||
|
|
||||||
|
hb_blob_unlock (data->blob);
|
||||||
|
|
||||||
|
return blob;
|
||||||
|
}
|
||||||
|
|
||||||
hb_face_t *
|
hb_face_t *
|
||||||
hb_face_create_for_data (hb_blob_t *blob,
|
hb_face_create_for_data (hb_blob_t *blob,
|
||||||
unsigned int index)
|
unsigned int index)
|
||||||
@ -283,16 +317,18 @@ hb_face_create_for_data (hb_blob_t *blob,
|
|||||||
if (!HB_OBJECT_DO_CREATE (hb_face_t, face))
|
if (!HB_OBJECT_DO_CREATE (hb_face_t, face))
|
||||||
return &_hb_face_nil;
|
return &_hb_face_nil;
|
||||||
|
|
||||||
face->blob = Sanitizer<OpenTypeFontFile>::sanitize (hb_blob_reference (blob));
|
face->get_table = _hb_face_for_data_get_table;
|
||||||
face->index = index;
|
face->destroy = (hb_destroy_func_t) _hb_face_for_data_closure_destroy;
|
||||||
face->get_table = _hb_face_get_table_from_blob;
|
hb_blob_reference (blob);
|
||||||
face->user_data = face;
|
face->user_data = _hb_face_for_data_closure_create (Sanitizer<OpenTypeFontFile>::sanitize (blob), index);
|
||||||
|
hb_blob_destroy (blob);
|
||||||
|
|
||||||
_hb_ot_layout_init (face);
|
_hb_ot_layout_init (face);
|
||||||
|
|
||||||
return face;
|
return face;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
hb_face_t *
|
hb_face_t *
|
||||||
hb_face_reference (hb_face_t *face)
|
hb_face_reference (hb_face_t *face)
|
||||||
{
|
{
|
||||||
@ -312,8 +348,6 @@ hb_face_destroy (hb_face_t *face)
|
|||||||
|
|
||||||
_hb_ot_layout_fini (face);
|
_hb_ot_layout_fini (face);
|
||||||
|
|
||||||
hb_blob_destroy (face->blob);
|
|
||||||
|
|
||||||
if (face->destroy)
|
if (face->destroy)
|
||||||
face->destroy (face->user_data);
|
face->destroy (face->user_data);
|
||||||
|
|
||||||
@ -327,11 +361,11 @@ hb_face_get_table (hb_face_t *face,
|
|||||||
hb_blob_t *blob;
|
hb_blob_t *blob;
|
||||||
|
|
||||||
if (HB_UNLIKELY (!face || !face->get_table))
|
if (HB_UNLIKELY (!face || !face->get_table))
|
||||||
return hb_blob_create_empty ();
|
return &_hb_blob_nil;
|
||||||
|
|
||||||
blob = face->get_table (tag, face->user_data);
|
blob = face->get_table (tag, face->user_data);
|
||||||
|
|
||||||
return blob? blob : hb_blob_create_empty ();
|
return blob? blob : &_hb_blob_nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user