Merge branch 'master' into cff-renaming
This commit is contained in:
commit
785408d4f7
15
NEWS
15
NEWS
|
@ -1,3 +1,18 @@
|
|||
Overview of changes leading to 2.3.0
|
||||
Thursday, December 20, 2018
|
||||
====================================
|
||||
- Fix regression on big-endian architectures. Ouch!
|
||||
- Misc bug and build fixes.
|
||||
- Fix subsetting of simple GSUB/GDEF.
|
||||
- Merge CFF / CFF2 support contributed by Adobe. This mostly involves
|
||||
the subsetter, but also get_glyph_extents on CFF fonts.
|
||||
|
||||
New API in hb-aat.h:
|
||||
+hb_aat_layout_has_substitution()
|
||||
+hb_aat_layout_has_positioning()
|
||||
+hb_aat_layout_has_tracking()
|
||||
|
||||
|
||||
Overview of changes leading to 2.2.0
|
||||
Thursday, November 29, 2018
|
||||
====================================
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
AC_PREREQ([2.64])
|
||||
AC_INIT([HarfBuzz],
|
||||
[2.2.0],
|
||||
[2.3.0],
|
||||
[https://github.com/harfbuzz/harfbuzz/issues/new],
|
||||
[harfbuzz],
|
||||
[http://harfbuzz.org/])
|
||||
|
|
|
@ -384,14 +384,20 @@ dump_use_data_SOURCES = dump-use-data.cc hb-ot-shape-complex-use-table.cc
|
|||
dump_use_data_CPPFLAGS = $(HBCFLAGS)
|
||||
dump_use_data_LDADD = libharfbuzz.la $(HBLIBS)
|
||||
|
||||
check_PROGRAMS += test-ot-tag test-unicode-ranges
|
||||
TESTS += test-ot-tag test-unicode-ranges
|
||||
COMPILED_TESTS = test-iter test-ot-tag test-unicode-ranges
|
||||
check_PROGRAMS += $(COMPILED_TESTS)
|
||||
TESTS += $(COMPILED_TESTS)
|
||||
|
||||
test_iter_SOURCES = test-iter.cc hb-static.cc
|
||||
test_iter_CPPFLAGS = $(HBCFLAGS) -DMAIN
|
||||
test_iter_LDADD = libharfbuzz.la $(HBLIBS)
|
||||
|
||||
test_ot_tag_SOURCES = hb-ot-tag.cc
|
||||
test_ot_tag_CPPFLAGS = $(HBCFLAGS) -DMAIN
|
||||
test_ot_tag_LDADD = libharfbuzz.la $(HBLIBS)
|
||||
|
||||
test_unicode_ranges_SOURCES = test-unicode-ranges.cc
|
||||
test_unicode_ranges_CPPFLAGS = $(HBCFLAGS) -DMAIN
|
||||
test_unicode_ranges_LDADD = libharfbuzz.la $(HBLIBS)
|
||||
|
||||
TESTS_ENVIRONMENT = \
|
||||
|
|
|
@ -36,6 +36,7 @@ HB_BASE_sources = \
|
|||
hb-face.hh \
|
||||
hb-font.cc \
|
||||
hb-font.hh \
|
||||
hb-iter.hh \
|
||||
hb-kern.hh \
|
||||
hb-machinery.hh \
|
||||
hb-map.cc \
|
||||
|
|
|
@ -209,7 +209,7 @@ hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper,
|
|||
* @face:
|
||||
*
|
||||
* Returns:
|
||||
* Since: REPLACEME
|
||||
* Since: 2.3.0
|
||||
*/
|
||||
hb_bool_t
|
||||
hb_aat_layout_has_substitution (hb_face_t *face)
|
||||
|
@ -270,7 +270,7 @@ hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer)
|
|||
* @face:
|
||||
*
|
||||
* Returns:
|
||||
* Since: REPLACEME
|
||||
* Since: 2.3.0
|
||||
*/
|
||||
hb_bool_t
|
||||
hb_aat_layout_has_positioning (hb_face_t *face)
|
||||
|
@ -300,7 +300,7 @@ hb_aat_layout_position (const hb_ot_shape_plan_t *plan,
|
|||
* @face:
|
||||
*
|
||||
* Returns:
|
||||
* Since: REPLACEME
|
||||
* Since: 2.3.0
|
||||
*/
|
||||
hb_bool_t
|
||||
hb_aat_layout_has_tracking (hb_face_t *face)
|
||||
|
|
|
@ -36,7 +36,7 @@ struct hb_sorted_array_t;
|
|||
template <typename Type>
|
||||
struct hb_array_t
|
||||
{
|
||||
typedef Type ItemType;
|
||||
typedef Type item_t;
|
||||
enum { item_size = hb_static_size (Type) };
|
||||
|
||||
/*
|
||||
|
|
|
@ -0,0 +1,105 @@
|
|||
/*
|
||||
* Copyright © 2018 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_ITER_HH
|
||||
#define HB_ITER_HH
|
||||
|
||||
#include "hb.hh"
|
||||
|
||||
|
||||
/* Unified iterator object.
|
||||
*
|
||||
* The goal of this template is to make the same iterator interface
|
||||
* available to all types, and make it very easy and compact to use.
|
||||
* hb_iter_tator objects are small, light-weight, objects that can be
|
||||
* copied by value. If the collection / object being iterated on
|
||||
* is writable, then the iterator returns lvalues, otherwise it
|
||||
* returns rvalues.
|
||||
*/
|
||||
|
||||
/* Base class for all iterators. */
|
||||
template <typename Iter, typename Item = typename Iter::__item_type__>
|
||||
struct hb_iter_t
|
||||
{
|
||||
typedef Iter iter_t;
|
||||
typedef Item item_t;
|
||||
|
||||
/* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */
|
||||
const iter_t* thiz () const { return static_cast<const iter_t *> (this); }
|
||||
iter_t* thiz () { return static_cast< iter_t *> (this); }
|
||||
|
||||
/* Operators. */
|
||||
operator iter_t () { return iter(); }
|
||||
explicit_operator bool () const { return more (); }
|
||||
item_t& operator * () { return item (); }
|
||||
item_t& operator [] (unsigned i) { return item (i); }
|
||||
iter_t& operator += (unsigned count) { forward (count); return *thiz(); }
|
||||
iter_t& operator ++ () { next (); return *thiz(); }
|
||||
iter_t& operator -= (unsigned count) { rewind (count); return *thiz(); }
|
||||
iter_t& operator -- () { prev (); return *thiz(); }
|
||||
iter_t operator + (unsigned count) { iter_t c (*thiz()); c += count; return c; }
|
||||
iter_t operator ++ (int) { iter_t c (*thiz()); ++*thiz(); return c; }
|
||||
iter_t operator - (unsigned count) { iter_t c (*thiz()); c -= count; return c; }
|
||||
iter_t operator -- (int) { iter_t c (*thiz()); --*thiz(); return c; }
|
||||
|
||||
/* Methods. */
|
||||
iter_t iter () const { return *thiz(); }
|
||||
item_t& item () const { return thiz()->__item__ (); }
|
||||
item_t& item_at (unsigned i) const { return thiz()->__item_at__ (i); }
|
||||
bool more () const { return thiz()->__more__ (); }
|
||||
void next () { thiz()->__next__ (); }
|
||||
void forward (unsigned n) { thiz()->__forward__ (n); }
|
||||
void prev () { thiz()->__prev__ (); }
|
||||
void rewind (unsigned n) { thiz()->__rewind__ (n); }
|
||||
unsigned len () const { return thiz()->__len__ (); }
|
||||
|
||||
/*
|
||||
* Subclasses overrides:
|
||||
*/
|
||||
|
||||
/* Access: Implement __item__(), or __item_at__() if random-access. */
|
||||
item_t& __item__ () const { return thiz()->item_at (0); }
|
||||
item_t& __item_at__ (unsigned i) const { return *(thiz() + i); }
|
||||
|
||||
/* Termination: Implement __more__() or __end__(). */
|
||||
bool __more__ () const { return item () != thiz()->__end__ (); }
|
||||
const item_t& __end__ () const { return iter_t::__sentinel__; }
|
||||
|
||||
/* Advancing: Implement __next__(), or __forward__() if random-access. */
|
||||
void __next__ () { thiz()->forward (1); }
|
||||
void __forward__ (unsigned n) { while (n--) next (); }
|
||||
|
||||
/* Rewinding: Implement __prev__() or __rewind__() if bidirectional. */
|
||||
void __prev__ () { thiz()->rewind (1); }
|
||||
void __rewind__ (unsigned n) { while (n--) prev (); }
|
||||
|
||||
/* Population: Implement __len__() if known. */
|
||||
unsigned __len__ () const
|
||||
{ iter_t c (*thiz()); unsigned l = 0; while (c) { c++; l++; }; return l; }
|
||||
};
|
||||
|
||||
|
||||
#endif /* HB_ITER_HH */
|
|
@ -390,7 +390,7 @@ struct hb_sanitize_context_t :
|
|||
{
|
||||
if (this->may_edit (obj, hb_static_size (Type)))
|
||||
{
|
||||
const_cast<Type *> (obj)->set (v);
|
||||
hb_assign (* const_cast<Type *> (obj), v);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -599,6 +599,8 @@ struct hb_serialize_context_t
|
|||
memcpy (ret, &obj, size);
|
||||
return ret;
|
||||
}
|
||||
template <typename Type>
|
||||
hb_serialize_context_t &operator << (const Type &obj) { embed (obj); return *this; }
|
||||
|
||||
template <typename Type>
|
||||
Type *extend_size (Type &obj, unsigned int size)
|
||||
|
@ -665,7 +667,6 @@ template <typename Type>
|
|||
struct BEInt<Type, 1>
|
||||
{
|
||||
public:
|
||||
typedef Type type;
|
||||
void set (Type V) { v = V; }
|
||||
operator Type () const { return v; }
|
||||
private: uint8_t v;
|
||||
|
@ -674,7 +675,6 @@ template <typename Type>
|
|||
struct BEInt<Type, 2>
|
||||
{
|
||||
public:
|
||||
typedef Type type;
|
||||
void set (Type V)
|
||||
{
|
||||
v[0] = (V >> 8) & 0xFF;
|
||||
|
@ -703,7 +703,6 @@ template <typename Type>
|
|||
struct BEInt<Type, 3>
|
||||
{
|
||||
public:
|
||||
typedef Type type;
|
||||
void set (Type V)
|
||||
{
|
||||
v[0] = (V >> 16) & 0xFF;
|
||||
|
|
|
@ -59,7 +59,10 @@ struct hb_null_size
|
|||
{ enum { value = _hb_null_size<T, _hb_bool_type<true> >::value }; };
|
||||
#define hb_null_size(T) hb_null_size<T>::value
|
||||
|
||||
/* This doesn't belong here, but since is copy/paste from above, put it here. */
|
||||
/* These doesn't belong here, but since is copy/paste from above, put it here. */
|
||||
|
||||
/* hb_static_size (T)
|
||||
* Returns T::static_size if T::min_size is defined, or sizeof (T) otherwise. */
|
||||
|
||||
template <typename T, typename B>
|
||||
struct _hb_static_size
|
||||
|
@ -74,6 +77,25 @@ struct hb_static_size
|
|||
#define hb_static_size(T) hb_static_size<T>::value
|
||||
|
||||
|
||||
/* hb_assign (obj, value)
|
||||
* Calls obj.set (value) if obj.min_size is defined and value has different type
|
||||
* from obj, or obj = v otherwise. */
|
||||
|
||||
template <typename T, typename V, typename B>
|
||||
struct _hb_assign
|
||||
{ static inline void value (T &o, const V v) { o = v; } };
|
||||
template <typename T, typename V>
|
||||
struct _hb_assign<T, V, _hb_bool_type<(bool) (1 + (unsigned int) T::min_size)> >
|
||||
{ static inline void value (T &o, const V v) { o.set (v); } };
|
||||
template <typename T>
|
||||
struct _hb_assign<T, T, _hb_bool_type<(bool) (1 + (unsigned int) T::min_size)> >
|
||||
{ static inline void value (T &o, const T v) { o = v; } };
|
||||
|
||||
template <typename T, typename V>
|
||||
static inline void hb_assign (T &o, const V v)
|
||||
{ _hb_assign<T, V, _hb_bool_type<true> >::value (o, v); };
|
||||
|
||||
|
||||
/*
|
||||
* Null()
|
||||
*/
|
||||
|
|
|
@ -352,7 +352,7 @@ static inline Type& operator + (Base &base, OffsetTo<Type, OffsetType, has_null>
|
|||
template <typename Type>
|
||||
struct UnsizedArrayOf
|
||||
{
|
||||
typedef Type ItemType;
|
||||
typedef Type item_t;
|
||||
enum { item_size = hb_static_size (Type) };
|
||||
|
||||
HB_NO_CREATE_COPY_ASSIGN_TEMPLATE (UnsizedArrayOf, Type);
|
||||
|
@ -508,7 +508,7 @@ struct SortedUnsizedArrayOf : UnsizedArrayOf<Type>
|
|||
template <typename Type, typename LenType=HBUINT16>
|
||||
struct ArrayOf
|
||||
{
|
||||
typedef Type ItemType;
|
||||
typedef Type item_t;
|
||||
enum { item_size = hb_static_size (Type) };
|
||||
|
||||
HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2 (ArrayOf, Type, LenType);
|
||||
|
@ -553,12 +553,13 @@ struct ArrayOf
|
|||
if (unlikely (!c->extend (*this))) return_trace (false);
|
||||
return_trace (true);
|
||||
}
|
||||
bool serialize (hb_serialize_context_t *c, hb_array_t<const Type> items)
|
||||
template <typename T>
|
||||
bool serialize (hb_serialize_context_t *c, hb_array_t<const T> items)
|
||||
{
|
||||
TRACE_SERIALIZE (this);
|
||||
if (unlikely (!serialize (c, items.len))) return_trace (false);
|
||||
for (unsigned int i = 0; i < items.len; i++)
|
||||
arrayZ[i] = items[i];
|
||||
hb_assign (arrayZ[i], items[i]);
|
||||
return_trace (true);
|
||||
}
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
template <typename Type, unsigned int PreallocedCount=8>
|
||||
struct hb_vector_t
|
||||
{
|
||||
typedef Type ItemType;
|
||||
typedef Type item_t;
|
||||
enum { item_size = hb_static_size (Type) };
|
||||
|
||||
HB_NO_COPY_ASSIGN_TEMPLATE2 (hb_vector_t, Type, PreallocedCount);
|
||||
|
@ -89,6 +89,8 @@ struct hb_vector_t
|
|||
return arrayZ()[i];
|
||||
}
|
||||
|
||||
explicit_operator bool () const { return len; }
|
||||
|
||||
hb_array_t<Type> as_array ()
|
||||
{ return hb_array (arrayZ(), len); }
|
||||
hb_array_t<const Type> as_array () const
|
||||
|
|
|
@ -37,10 +37,10 @@ HB_BEGIN_DECLS
|
|||
|
||||
|
||||
#define HB_VERSION_MAJOR 2
|
||||
#define HB_VERSION_MINOR 2
|
||||
#define HB_VERSION_MINOR 3
|
||||
#define HB_VERSION_MICRO 0
|
||||
|
||||
#define HB_VERSION_STRING "2.2.0"
|
||||
#define HB_VERSION_STRING "2.3.0"
|
||||
|
||||
#define HB_VERSION_ATLEAST(major,minor,micro) \
|
||||
((major)*10000+(minor)*100+(micro) <= \
|
||||
|
|
|
@ -0,0 +1,97 @@
|
|||
/*
|
||||
* Copyright © 2018 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-iter.hh"
|
||||
|
||||
#include "hb-array.hh"
|
||||
|
||||
template <typename T>
|
||||
struct array_iter_t : hb_iter_t<array_iter_t<T>, T>
|
||||
{
|
||||
array_iter_t (hb_array_t<T> arr_) : arr (arr_) {}
|
||||
|
||||
typedef T __item_type__;
|
||||
T& __item_at__ (unsigned i) const { return arr[i]; }
|
||||
bool __more__ () const { return arr.len; }
|
||||
void __forward__ (unsigned n) { arr += n; }
|
||||
void __rewind__ (unsigned n) { arr -= n; }
|
||||
unsigned __len__ () const { return arr.len; }
|
||||
|
||||
private:
|
||||
hb_array_t<T> arr;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct some_array_t
|
||||
{
|
||||
some_array_t (hb_array_t<T> arr_) : arr (arr_) {}
|
||||
|
||||
typedef array_iter_t<T> iter_t;
|
||||
array_iter_t<T> iter () { return array_iter_t<T> (arr); }
|
||||
operator array_iter_t<T> () { return iter (); }
|
||||
operator hb_iter_t<array_iter_t<T> > () { return iter (); }
|
||||
|
||||
private:
|
||||
hb_array_t<T> arr;
|
||||
};
|
||||
|
||||
|
||||
template <typename I, typename V> inline void
|
||||
hb_fill (hb_iter_t<I> &i, const V &v)
|
||||
{
|
||||
for (; i; i++)
|
||||
hb_assign (*i, v);
|
||||
}
|
||||
|
||||
template <typename S, typename D> inline bool
|
||||
hb_copy (hb_iter_t<D> &id, hb_iter_t<S> &is)
|
||||
{
|
||||
for (; id && is; ++id, ++is)
|
||||
*id = *is;
|
||||
return !id;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
const int src[10] = {};
|
||||
int dst[20];
|
||||
hb_vector_t<int> v;
|
||||
|
||||
array_iter_t<const int> s (src); /* Implicit conversion from static array. */
|
||||
array_iter_t<const int> s2 (v); /* Implicit conversion from vector. */
|
||||
array_iter_t<int> t (dst);
|
||||
|
||||
some_array_t<const int> a (src);
|
||||
|
||||
s2 = s;
|
||||
|
||||
hb_fill (t, 42);
|
||||
hb_copy (t, s);
|
||||
// hb_copy (t, a.iter ());
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -24,8 +24,6 @@
|
|||
* Google Author(s): Garret Rieger
|
||||
*/
|
||||
|
||||
#include "hb.hh"
|
||||
|
||||
#include "hb-ot-os2-unicode-ranges.hh"
|
||||
|
||||
static void
|
||||
|
|
Loading…
Reference in New Issue