TODO | 4 +- src/hb-buffer.cc | 6 ++++ src/hb-buffer.h | 3 ++ src/hb-common.h | 1 src/hb-font.cc | 18 +++++++++++++ src/hb-font.h | 9 ++++++ src/hb-mutex-private.hh | 65 ++++++++++++++++++++++++++++-------------------- src/hb-private.hh | 8 +++++ src/hb-unicode.cc | 6 ++++ src/hb-unicode.h | 3 ++ src/test.cc | 9 ++++-- test/test-blob.c | 1 test/test-buffer.c | 7 +++++ test/test-object.c | 36 ++++++++++++++++++++++++-- test/test-unicode.c | 10 +++++++ 15 files changed, 152 insertions(+), 34 deletions(-)
New commits: commit daa446f184fa27c9764ff7f8a2444d47cf34d986 Author: Behdad Esfahbod <[email protected]> Date: Wed May 11 21:31:25 2011 -0400 Fix compile with no mutex available diff --git a/src/hb-mutex-private.hh b/src/hb-mutex-private.hh index 24b6d9a..4ff4b32 100644 --- a/src/hb-mutex-private.hh +++ b/src/hb-mutex-private.hh @@ -69,12 +69,12 @@ typedef CRITICAL_SECTION hb_mutex_impl_t; #warning "Could not find any system to define platform macros, library will NOT be thread-safe" -typedef struct { volatile int m; } hb_mutex_impl_t; +typedef volatile int hb_mutex_impl_t; #define HB_MUTEX_IMPL_INIT 0 -#define hb_mutex_impl_init(M) ((void) ((M)->m = 0)) -#define hb_mutex_impl_lock(M) ((void) ((M)->m = 1)) -#define hb_mutex_impl_unlock(M) ((void) ((M)->m = 0)) -#define hb_mutex_impl_free(M) ((void) ((M)-M = 2)) +#define hb_mutex_impl_init(M) ((void) (*(M) = 0)) +#define hb_mutex_impl_lock(M) ((void) (*(M) = 1)) +#define hb_mutex_impl_unlock(M) ((void) (*(M) = 0)) +#define hb_mutex_impl_free(M) ((void) (*(M) = 2)) #endif commit 1e56c476c10577fe319fe553c5ced000bd740940 Author: Behdad Esfahbod <[email protected]> Date: Wed May 11 21:28:01 2011 -0400 Free static mutex'es diff --git a/src/hb-mutex-private.hh b/src/hb-mutex-private.hh index be0f687..24b6d9a 100644 --- a/src/hb-mutex-private.hh +++ b/src/hb-mutex-private.hh @@ -100,6 +100,7 @@ struct hb_mutex_t struct hb_static_mutex_t : hb_mutex_t { hb_static_mutex_t (void) { this->init (); } + ~hb_static_mutex_t (void) { this->free (); } private: NO_COPY (hb_static_mutex_t); commit 831886a9b4073cfe27f7e1db0e957cbd5913fd31 Author: Behdad Esfahbod <[email protected]> Date: Wed May 11 21:27:52 2011 -0400 Streamline mutex stuff diff --git a/src/hb-mutex-private.hh b/src/hb-mutex-private.hh index 49750d5..be0f687 100644 --- a/src/hb-mutex-private.hh +++ b/src/hb-mutex-private.hh @@ -45,49 +45,64 @@ HB_BEGIN_DECLS #include <glib.h> -typedef GStaticMutex hb_mutex_t; -#define HB_MUTEX_INIT G_STATIC_MUTEX_INIT -#define hb_mutex_init(M) g_static_mutex_init (M) -#define hb_mutex_lock(M) g_static_mutex_lock (M) -#define hb_mutex_unlock(M) g_static_mutex_unlock (M) -#define hb_mutex_free(M) g_static_mutex_free (M) +typedef GStaticMutex hb_mutex_impl_t; +#define HB_MUTEX_IMPL_INIT G_STATIC_MUTEX_INIT +#define hb_mutex_impl_init(M) g_static_mutex_init (M) +#define hb_mutex_impl_lock(M) g_static_mutex_lock (M) +#define hb_mutex_impl_unlock(M) g_static_mutex_unlock (M) +#define hb_mutex_impl_free(M) g_static_mutex_free (M) #elif defined(_MSC_VER) #include <Windows.h> -typedef CRITICAL_SECTION hb_mutex_t; -#define HB_MUTEX_INIT { NULL, 0, 0, NULL, NULL, 0 } -#define hb_mutex_init(M) InitializeCriticalSection (M) -#define hb_mutex_lock(M) EnterCriticalSection (M) -#define hb_mutex_unlock(M) LeaveCriticalSection (M) -#define hb_mutex_free(M) DeleteCriticalSection (M) +typedef CRITICAL_SECTION hb_mutex_impl_t; +#define HB_MUTEX_IMPL_INIT { NULL, 0, 0, NULL, NULL, 0 } +#define hb_mutex_impl_init(M) InitializeCriticalSection (M) +#define hb_mutex_impl_lock(M) EnterCriticalSection (M) +#define hb_mutex_impl_unlock(M) LeaveCriticalSection (M) +#define hb_mutex_impl_free(M) DeleteCriticalSection (M) #else #warning "Could not find any system to define platform macros, library will NOT be thread-safe" -typedef struct { volatile int m; } hb_mutex_t; -#define HB_MUTEX_INIT 0 -#define hb_mutex_init(M) ((void) ((M)->m = 0)) -#define hb_mutex_lock(M) ((void) ((M)->m = 1)) -#define hb_mutex_unlock(M) ((void) ((M)->m = 0)) -#define hb_mutex_free(M) ((void) ((M)-M = 2)) +typedef struct { volatile int m; } hb_mutex_impl_t; +#define HB_MUTEX_IMPL_INIT 0 +#define hb_mutex_impl_init(M) ((void) ((M)->m = 0)) +#define hb_mutex_impl_lock(M) ((void) ((M)->m = 1)) +#define hb_mutex_impl_unlock(M) ((void) ((M)->m = 0)) +#define hb_mutex_impl_free(M) ((void) ((M)-M = 2)) #endif +struct hb_mutex_t +{ + hb_mutex_impl_t m; + + inline void init (void) { hb_mutex_impl_init (&m); } + inline void lock (void) { hb_mutex_impl_lock (&m); } + inline void unlock (void) { hb_mutex_impl_unlock (&m); } + inline void free (void) { hb_mutex_impl_free (&m); } +}; + +#define HB_MUTEX_INIT {HB_MUTEX_IMPL_INIT} +#define hb_mutex_init(M) (M)->init () +#define hb_mutex_lock(M) (M)->lock () +#define hb_mutex_unlock(M) (M)->unlock () +#define hb_mutex_free(M) (M)->free () + + struct hb_static_mutex_t : hb_mutex_t { - hb_static_mutex_t (void) { - hb_mutex_init (this); - } + hb_static_mutex_t (void) { this->init (); } - inline void lock (void) { hb_mutex_lock (this); } - inline void unlock (void) { hb_mutex_unlock (this); } + private: + NO_COPY (hb_static_mutex_t); }; diff --git a/src/hb-private.hh b/src/hb-private.hh index 215ef96..09f7bc1 100644 --- a/src/hb-private.hh +++ b/src/hb-private.hh @@ -494,6 +494,14 @@ static inline unsigned char TOLOWER (unsigned char c) ((const char *) s)[3])) +/* C++ helpers */ + +/* Makes class uncopyable. Use in private: section. */ +#define NO_COPY(T) \ + T (const T &o); \ + T &operator = (const T &o); + + /* Debug */ #ifndef HB_DEBUG commit 438c4eee353ddf0de66171d84c6ef9b21cbdf8f6 Author: Behdad Esfahbod <[email protected]> Date: Wed May 11 21:14:34 2011 -0400 Remove unused hb_mutex_trylock() diff --git a/src/hb-mutex-private.hh b/src/hb-mutex-private.hh index 3cc47e9..49750d5 100644 --- a/src/hb-mutex-private.hh +++ b/src/hb-mutex-private.hh @@ -49,7 +49,6 @@ typedef GStaticMutex hb_mutex_t; #define HB_MUTEX_INIT G_STATIC_MUTEX_INIT #define hb_mutex_init(M) g_static_mutex_init (M) #define hb_mutex_lock(M) g_static_mutex_lock (M) -#define hb_mutex_trylock(M) g_static_mutex_trylock (M) #define hb_mutex_unlock(M) g_static_mutex_unlock (M) #define hb_mutex_free(M) g_static_mutex_free (M) @@ -62,7 +61,6 @@ typedef CRITICAL_SECTION hb_mutex_t; #define HB_MUTEX_INIT { NULL, 0, 0, NULL, NULL, 0 } #define hb_mutex_init(M) InitializeCriticalSection (M) #define hb_mutex_lock(M) EnterCriticalSection (M) -#define hb_mutex_trylock(M) TryEnterCriticalSection (M) #define hb_mutex_unlock(M) LeaveCriticalSection (M) #define hb_mutex_free(M) DeleteCriticalSection (M) @@ -75,7 +73,6 @@ typedef struct { volatile int m; } hb_mutex_t; #define HB_MUTEX_INIT 0 #define hb_mutex_init(M) ((void) ((M)->m = 0)) #define hb_mutex_lock(M) ((void) ((M)->m = 1)) -#define hb_mutex_trylock(M) ((M)->m = 1, 1) #define hb_mutex_unlock(M) ((void) ((M)->m = 0)) #define hb_mutex_free(M) ((void) ((M)-M = 2)) commit b8477e1da2785708f3232f8f2577f602a5d320d1 Author: Behdad Esfahbod <[email protected]> Date: Wed May 11 21:12:44 2011 -0400 [test] Add tests for _get_empty() funcs diff --git a/test/test-blob.c b/test/test-blob.c index 22d40b7..beb23a5 100644 --- a/test/test-blob.c +++ b/test/test-blob.c @@ -52,6 +52,7 @@ test_blob_empty (void) g_assert (hb_blob_is_immutable (hb_blob_get_empty ())); g_assert (hb_blob_get_empty () != NULL); + g_assert (hb_blob_get_empty () == hb_blob_create (NULL, 0, HB_MEMORY_MODE_READONLY, NULL, NULL)); blob = hb_blob_get_empty (); g_assert (blob == hb_blob_get_empty ()); diff --git a/test/test-buffer.c b/test/test-buffer.c index 2b1c7b7..0cbb8e0 100644 --- a/test/test-buffer.c +++ b/test/test-buffer.c @@ -711,6 +711,12 @@ test_buffer_utf16_conversion (void) hb_buffer_destroy (b); } +static void +test_buffer_empty (void) +{ + g_assert (hb_buffer_get_empty ()); + g_assert (hb_buffer_create (-1) == hb_buffer_get_empty ()); +} int main (int argc, char **argv) @@ -734,6 +740,7 @@ main (int argc, char **argv) hb_test_add (test_buffer_utf8_conversion); hb_test_add (test_buffer_utf8_validity); hb_test_add (test_buffer_utf16_conversion); + hb_test_add (test_buffer_empty); return hb_test_run(); } diff --git a/test/test-unicode.c b/test/test-unicode.c index f5aae10..2e15e95 100644 --- a/test/test-unicode.c +++ b/test/test-unicode.c @@ -550,6 +550,15 @@ test_unicode_properties_nil (void) hb_unicode_funcs_destroy (uf); } +static void +test_unicode_properties_empty (void) +{ + hb_unicode_funcs_t *uf = hb_unicode_funcs_get_empty (); + + g_assert (hb_unicode_funcs_is_immutable (uf)); + _test_unicode_properties_nil (uf); +} + static void test_unicode_chainup (void) @@ -777,6 +786,7 @@ main (int argc, char **argv) hb_test_init (&argc, &argv); hb_test_add (test_unicode_properties_nil); + hb_test_add (test_unicode_properties_empty); hb_test_add_data_flavor (hb_unicode_funcs_get_default (), "default", test_unicode_properties); hb_test_add_data_flavor ((gconstpointer) script_roundtrip_default, "default", test_unicode_script_roundtrip); commit 3994be3ded40e5a3da0e187ad421b19a78865e02 Author: Behdad Esfahbod <[email protected]> Date: Wed May 11 21:08:31 2011 -0400 [TODO] Update diff --git a/TODO b/TODO index 16a2199..7d38803 100644 --- a/TODO +++ b/TODO @@ -14,8 +14,6 @@ API issues to fix before 1.0: - Figure out how many .so objects, how to link, etc -- Real subclassing support for vfunc vectors - - Add hb-cairo glue - Add sanitize API @@ -26,6 +24,8 @@ API issues to fix before 1.0: API to add (maybe after 1.0): ============================ +- Add hb_face_get_glyph_count()? + - Add hb_font_create_linear()? - Add hb_shape_plan()/hb_shape_execute() commit 80a6833b032bc63b4e8c3da6489d3767af1168f3 Author: Behdad Esfahbod <[email protected]> Date: Wed May 11 18:14:44 2011 -0400 [API] Add hb_*_get_empty() for all objects diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index 6d0d4d4..7e79eef 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -153,6 +153,12 @@ hb_buffer_create (unsigned int pre_alloc_size) } hb_buffer_t * +hb_buffer_get_empty (void) +{ + return &_hb_buffer_nil; +} + +hb_buffer_t * hb_buffer_reference (hb_buffer_t *buffer) { return hb_object_reference (buffer); diff --git a/src/hb-buffer.h b/src/hb-buffer.h index 47a2123..020a120 100644 --- a/src/hb-buffer.h +++ b/src/hb-buffer.h @@ -63,6 +63,9 @@ hb_buffer_t * hb_buffer_create (unsigned int pre_alloc_size); hb_buffer_t * +hb_buffer_get_empty (void); + +hb_buffer_t * hb_buffer_reference (hb_buffer_t *buffer); void diff --git a/src/hb-font.cc b/src/hb-font.cc index 6cd436d..bb8f84c 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -160,6 +160,12 @@ hb_font_funcs_create (void) } hb_font_funcs_t * +hb_font_funcs_get_empty (void) +{ + return &_hb_font_funcs_nil; +} + +hb_font_funcs_t * hb_font_funcs_reference (hb_font_funcs_t *ffuncs) { return hb_object_reference (ffuncs); @@ -404,6 +410,12 @@ hb_face_create_for_data (hb_blob_t *blob, (hb_destroy_func_t) _hb_face_for_data_closure_destroy); } +hb_face_t * +hb_face_get_empty (void) +{ + return &_hb_face_nil; +} + hb_face_t * hb_face_reference (hb_face_t *face) @@ -534,6 +546,12 @@ hb_font_create_sub_font (hb_font_t *parent) } hb_font_t * +hb_font_get_empty (void) +{ + return &_hb_font_nil; +} + +hb_font_t * hb_font_reference (hb_font_t *font) { return hb_object_reference (font); diff --git a/src/hb-font.h b/src/hb-font.h index ce81985..7f05144 100644 --- a/src/hb-font.h +++ b/src/hb-font.h @@ -53,6 +53,9 @@ hb_face_create_for_tables (hb_get_table_func_t get_table, hb_destroy_func_t destroy); hb_face_t * +hb_face_get_empty (void); + +hb_face_t * hb_face_reference (hb_face_t *face); void @@ -88,6 +91,9 @@ hb_font_funcs_t * hb_font_funcs_create (void); hb_font_funcs_t * +hb_font_funcs_get_empty (void); + +hb_font_funcs_t * hb_font_funcs_reference (hb_font_funcs_t *ffuncs); void @@ -207,6 +213,9 @@ hb_font_t * hb_font_create_sub_font (hb_font_t *parent); hb_font_t * +hb_font_get_empty (void); + +hb_font_t * hb_font_reference (hb_font_t *font); void diff --git a/src/hb-unicode.cc b/src/hb-unicode.cc index 943d7a7..c2d7311 100644 --- a/src/hb-unicode.cc +++ b/src/hb-unicode.cc @@ -126,6 +126,12 @@ hb_unicode_funcs_create (hb_unicode_funcs_t *parent) } hb_unicode_funcs_t * +hb_unicode_funcs_get_empty (void) +{ + return &_hb_unicode_funcs_nil; +} + +hb_unicode_funcs_t * hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs) { return hb_object_reference (ufuncs); diff --git a/src/hb-unicode.h b/src/hb-unicode.h index 9e590d8..e7a2005 100644 --- a/src/hb-unicode.h +++ b/src/hb-unicode.h @@ -54,6 +54,9 @@ hb_unicode_funcs_t * hb_unicode_funcs_create (hb_unicode_funcs_t *parent); hb_unicode_funcs_t * +hb_unicode_funcs_get_empty (void); + +hb_unicode_funcs_t * hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs); void diff --git a/test/test-object.c b/test/test-object.c index 1abe65c..1ad3b88 100644 --- a/test/test-object.c +++ b/test/test-object.c @@ -43,7 +43,7 @@ create_blob (void) static void * create_blob_inert (void) { - return hb_blob_get_empty (); + return hb_blob_create (NULL, 0, HB_MEMORY_MODE_DUPLICATE, NULL, NULL); } static void * @@ -68,7 +68,7 @@ create_face (void) static void * create_face_inert (void) { - return hb_face_create_for_data ((hb_blob_t *) create_blob_inert (), 0); + return hb_face_create_for_data (hb_blob_get_empty (), 0); } static void * @@ -82,7 +82,7 @@ create_font (void) static void * create_font_inert (void) { - return hb_font_create (create_face_inert ()); + return hb_font_create (hb_face_get_empty ()); } static void * @@ -124,6 +124,7 @@ typedef hb_bool_t (*is_immutable_func_t) (void *obj); typedef struct { create_func_t create; create_func_t create_inert; + create_func_t get_empty; reference_func_t reference; destroy_func_t destroy; set_user_data_func_t set_user_data; @@ -137,6 +138,7 @@ typedef struct { { \ (create_func_t) create_##name, \ (create_func_t) create_##name##_inert, \ + (create_func_t) hb_##name##_get_empty, \ (reference_func_t) hb_##name##_reference, \ (destroy_func_t) hb_##name##_destroy, \ (set_user_data_func_t) hb_##name##_set_user_data, \ @@ -149,6 +151,7 @@ typedef struct { { \ (create_func_t) create_##name, \ (create_func_t) create_##name##_inert, \ + (create_func_t) hb_##name##_get_empty, \ (reference_func_t) hb_##name##_reference, \ (destroy_func_t) hb_##name##_destroy, \ (set_user_data_func_t) hb_##name##_set_user_data, \ @@ -308,10 +311,37 @@ test_object (void) { data_t data[2] = {{MAGIC0, FALSE}, {MAGIC1, FALSE}}; + g_test_message ("->get_empty()"); + obj = o->get_empty (); + g_assert (obj); + + g_assert (obj == o->reference (obj)); + o->destroy (obj); + + if (o->is_immutable) + g_assert (o->is_immutable (obj)); + + g_assert (!o->set_user_data (obj, &key[0], &data[0], free_up0)); + g_assert (!o->get_user_data (obj, &key[0])); + + o->destroy (obj); + o->destroy (obj); + o->destroy (obj); + o->destroy (obj); + o->destroy (obj); + + g_assert (!data[0].freed); + } + + { + data_t data[2] = {{MAGIC0, FALSE}, {MAGIC1, FALSE}}; + g_test_message ("->create_inert()"); obj = o->create_inert (); if (!obj) continue; + if (obj == o->get_empty ()) + continue; /* Tested already */ g_assert (obj == o->reference (obj)); o->destroy (obj); commit d3b30be378c1dec0259a626d9a408bb9ca1b71ac Author: Behdad Esfahbod <[email protected]> Date: Wed May 11 18:06:12 2011 -0400 [API] Add HB_UNTAG() Useful in C API only. diff --git a/src/hb-common.h b/src/hb-common.h index 9546b21..a30587a 100644 --- a/src/hb-common.h +++ b/src/hb-common.h @@ -74,6 +74,7 @@ typedef union _hb_var_int_t { typedef uint32_t hb_tag_t; #define HB_TAG(a,b,c,d) ((hb_tag_t)((((uint8_t)(a))<<24)|(((uint8_t)(b))<<16)|(((uint8_t)(c))<<8)|((uint8_t)(d)))) +#define HB_UNTAG(tag) ((uint8_t)((tag)>>24)), ((uint8_t)((tag)>>16)), ((uint8_t)((tag)>>8)), ((uint8_t)(tag)) #define HB_TAG_NONE HB_TAG(0,0,0,0) commit 3cc6e9dcb42551761c3a1a9d3c25b1f1bcdc2419 Author: Behdad Esfahbod <[email protected]> Date: Wed May 11 18:02:48 2011 -0400 Minor diff --git a/src/test.cc b/src/test.cc index c185430..79d7841 100644 --- a/src/test.cc +++ b/src/test.cc @@ -57,6 +57,7 @@ main (int argc, char **argv) unsigned int len; hb_destroy_func_t destroy; void *user_data; + hb_memory_mode_t mm; #ifdef HAVE_GLIB GMappedFile *mf = g_mapped_file_new (argv[1], FALSE, NULL); @@ -64,6 +65,7 @@ main (int argc, char **argv) len = g_mapped_file_get_length (mf); destroy = (hb_destroy_func_t) g_mapped_file_unref; user_data = (void *) mf; + mm = HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE; #else FILE *f = fopen (argv[1], "rb"); fseek (f, 0, SEEK_END); @@ -75,13 +77,14 @@ main (int argc, char **argv) destroy = free; user_data = (void *) font_data; fclose (f); + mm = HB_MEMORY_MODE_WRITABLE; #endif - blob = hb_blob_create (font_data, len, - HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE, - user_data, destroy); + blob = hb_blob_create (font_data, len, mm, user_data, destroy); } + printf ("Opened font file %s: %u bytes long\n", argv[1], hb_blob_get_length (blob)); + /* Create the face */ face = hb_face_create_for_data (blob, 0 /* first face */); _______________________________________________ HarfBuzz mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/harfbuzz
