Overview of changes leading to 0.9.20
Thursday, August 29, 2013
=====================================

General:
- Misc substitute_closure() fixes.
- Build fixes.

Documentation:
- gtk-doc boilerplate integrated.  Docs are built now, but
  contain no contents.  By next release hopefully we have
  some content in.  Enable using --enable-gtk-doc.

GObject and Introspection:
- Added harfbuzz-gobject library (hb-gobject.h) that has type
  bindings for all HarfBuzz objects and enums.  Enable using
  --with-gobject.
- Added gobject-introspection boilerplate.  Nothing useful
  right now.  Work in progress.  Gets enabled automatically if
  --with-gobject is used.  Override with --disable-introspection.

OpenType shaper:
- Apply 'mark' in Myanmar shaper.
- Don't apply 'dlig' by default.

Uniscribe shaper:
- Support user features.
- Fix loading of fonts that are also installed on the system.
- Fix shaping of Arabic Presentation Forms.
- Fix build with wide chars.

CoreText shaper:
- Support user features.

Source changes:
- hb_face_t code moved to hb-face.h / hb-face.cc.
- Added hb-deprecated.h.

API changes:
- Added HB_DISABLE_DEPRECATED.
- Deprecated HB_SCRIPT_CANADIAN_ABORIGINAL; replaced by
  HB_SCRIPT_CANADIAN_SYLLABICS.
- Deprecated HB_BUFFER_FLAGS_DEFAULT; replaced by
  HB_BUFFER_FLAG_DEFAULT.
- Deprecated HB_BUFFER_SERIALIZE_FLAGS_DEFAULT; replaced by
  HB_BUFFER_SERIALIZE_FLAG_DEFAULT.


Overview of changes leading to 0.9.19
Tuesday, July 16, 2013
=====================================

- Build fixes.
- Better handling of multiple variation selectors in a row.
- Pass on variation selector to GSUB if not consumed by cmap.
- Fix undefined memory access.
- Add Javanese config to Indic shaper.
- Misc bug fixes.

Overview of changes leading to 0.9.18
Tuesday, May 28, 2013
=====================================

New build system:

- All unneeded code is all disabled by default,

- Uniscribe and CoreText shapers can be enabled with their --with options,

- icu_le and old shapers cannot be enabled for now,

- glib, freetype, and cairo will be detected automatically.
  They can be force on/off'ed with their --with options,

- icu and graphite2 are default off, can be enabled with their --with
  options,

Moreover, ICU support is now build into a separate library:
libharfbuzz-icu.so, and a new harfbuzz-icu.pc is shipped for it.
Distros can enable ICU now without every application on earth
getting linked to via libharfbuzz.so.

For distros I recommend that they make sure they are building --with-glib
--with-freetype --with-cairo, --with-icu, and optionally --with-graphite2;
And package harfbuzz and harfbuzz-icu separately.


Overview of changes leading to 0.9.17
Monday, May 20, 2013
=====================================

- Build fixes.
- Fix bug in hb_set_get_min().
- Fix regression with Arabic mark positioning / width-zeroing.

Overview of changes leading to 0.9.16
Friday, April 19, 2013
=====================================

- Major speedup in OpenType lookup processing.  With the Amiri
  Arabic font, this release is over 3x faster than previous
  release.  All scripts / languages should see this speedup.

- New --num-iterations option for hb-shape / hb-view; useful for
  profiling.

Overview of changes leading to 0.9.15
Friday, April 05, 2013
=====================================

- Build fixes.
- Fix crasher in graphite2 shaper.
- Fix Arabic mark width zeroing regression.
- Don't compose Hangul jamo into Unicode syllables.


Overview of changes leading to 0.9.14
Thursday, March 21, 2013
=====================================

- Build fixes.
- Fix time-consuming sanitize with malicious fonts.
- Implement hb_buffer_deserialize_glyphs() for both json and text.
- Do not ignore Hangul filler characters.
- Indic fixes:
  * Fix Malayalam pre-base reordering interaction with post-forms.
  * Further adjust ZWJ handling.  Should fix known regressions from
    0.9.13.


Overview of changes leading to 0.9.13
Thursday, February 25, 2013
=====================================

- Build fixes.
- Ngapi HarfBuzz Hackfest in London (February 2013):
  * Fixed all known Indic bugs,
  * New Win8-style Myanmar shaper,
  * New South-East Asian shaper for Tai Tham, Cham, and New Tai Lue,
  * Smartly ignore Default_Ignorable characters (joiners, etc) wheb
    matching GSUB/GPOS lookups,
  * Fix 'Phags-Pa U+A872 shaping,
  * Fix partial disabling of default-on features,
  * Allow disabling of TrueType kerning.
- Fix possible crasher with broken fonts with overlapping tables.
- Removed generated files from git again.  So, one needs ragel to
  bootstrap from the git tree.

API changes:
- hb_shape() and related APIs now abort if buffer direction is
  HB_DIRECTION_INVALID.  Previously, hb_shape() was calling
  hb_buffer_guess_segment_properties() on the buffer before
  shaping.  The heuristics in that function are fragile.  If the
  user really wants the old behvaior, they can call that function
  right before calling hb_shape() to get the old behavior.
- hb_blob_create_sub_blob() always creates sub-blob with
  HB_MEMORY_MODE_READONLY.  See comments for the reason.


Overview of changes leading to 0.9.12
Thursday, January 18, 2013
=====================================

- Build fixes for Sun compiler.
- Minor bug fix.

Overview of changes leading to 0.9.11
Thursday, January 10, 2013
=====================================

- Build fixes.
- Fix GPOS mark attachment with null Anchor offsets.
- [Indic] Fix old-spec reordering of viramas if sequence ends in one.
- Fix multi-threaded shaper data creation crash.
- Add atomic ops for Solaris.

API changes:
- Rename hb_buffer_clear() to hb_buffer_clear_contents().


Overview of changes leading to 0.9.10
Thursday, January 3, 2013
=====================================

- [Indic] Fixed rendering of Malayalam dot-reph
- Updated OT language tags.
- Updated graphite2 backend.
- Improved hb_ot_layout_get_size_params() logic.
- Improve hb-shape/hb-view help output.
- Fixed hb-set.h implementation to not crash.
- Fixed various issues with hb_ot_layout_collect_lookups().
- Various build fixes.

New API:

hb_graphite2_face_get_gr_face()
hb_graphite2_font_get_gr_font()
hb_coretext_face_get_cg_font()

Modified API:

hb_ot_layout_get_size_params()


Overview of changes leading to 0.9.9
Wednesday, December 5, 2012
====================================

- Fix build on Windows.
- Minor improvements.


Overview of changes leading to 0.9.8
Tuesday, December 4, 2012
====================================


- Actually implement hb_shape_plan_get_shaper ().
- Make UCDB data tables const.
- Lots of internal refactoring in OTLayout tables.
- Flesh out hb_ot_layout_lookup_collect_glyphs().

New API:

hb_ot_layout_collect_lookups()
hb_ot_layout_get_size_params()


Overview of changes leading to 0.9.7
Sunday, November 21, 2012
====================================


HarfBuzz "All-You-Can-Eat-Sushi" (aka Vancouver) Hackfest and follow-on fixes.

- Fix Arabic contextual joining using pre-context text.
- Fix Sinhala "split matra" mess.
- Fix Khmer shaping with broken fonts.
- Implement Thai "PUA" shaping for old fonts.
- Do NOT route Kharoshthi script through the Indic shaper.
- Disable fallback positioning for Indic and Thai shapers.
- Misc fixes.


hb-shape / hb-view changes:

- Add --text-before and --text-after
- Add --bot / --eot / --preserve-default-ignorables
- hb-shape --output-format=json


New API:

hb_buffer_clear()

hb_buffer_flags_t

HB_BUFFER_FLAGS_DEFAULT
HB_BUFFER_FLAG_BOT
HB_BUFFER_FLAG_EOT
HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES

hb_buffer_set_flags()
hb_buffer_get_flags()

HB_BUFFER_SERIALIZE_FLAGS
hb_buffer_serialize_glyphs()
hb_buffer_deserialize_glyphs()
hb_buffer_serialize_list_formats()

hb_set_add_range()
hb_set_del_range()
hb_set_get_population()
hb_set_next_range()

hb_face_[sg]et_glyph_count()

hb_segment_properties_t
HB_SEGMENT_PROPERTIES_DEFAULT
hb_segment_properties_equal()
hb_segment_properties_hash()

hb_buffer_set_segment_properties()
hb_buffer_get_segment_properties()

hb_ot_layout_glyph_class_t
hb_ot_layout_get_glyph_class()
hb_ot_layout_get_glyphs_in_class()

hb_shape_plan_t
hb_shape_plan_create()
hb_shape_plan_create_cached()
hb_shape_plan_get_empty()
hb_shape_plan_reference()
hb_shape_plan_destroy()
hb_shape_plan_set_user_data()
hb_shape_plan_get_user_data()
hb_shape_plan_execute()
hb_shape_plan_get_shaper()

hb_ot_shape_plan_collect_lookups()


API changes:

- Remove "mask" parameter from hb_buffer_add().
- Rename hb_ot_layout_would_substitute_lookup() and hb_ot_layout_substitute_closure_lookup().
- hb-set.h API const correction.
- Renamed hb_set_min/max() to hb_set_get_min/max().
- Rename hb_ot_layout_feature_get_lookup_indexes() to hb_ot_layout_feature_get_lookups().
- Rename hb_buffer_guess_properties() to hb_buffer_guess_segment_properties().



Overview of changes leading to 0.9.6
Sunday, November 13, 2012
====================================

- Don't clear pre-context text if no new context is provided.
- Fix ReverseChainingSubstLookup, which was totally borked.
- Adjust output format of hb-shape a bit.
- Include config.h.in in-tree.  Makes it easier for alternate build systems.
- Fix hb_buffer_set_length(buffer, 0) invalid memory allocation.
- Use ICU LayoutEngine's C API instead of C++.  Avoids much headache.
- Drop glyphs for all of Unicode Default_Ignorable characters.
- Misc build fixes.

Arabic shaper:
- Enable 'dlig' and 'mset' features in Arabic shaper.
- Implement 'Phags-pa shaping, improve Mongolian.

Indic shaper:
- Decompose Sinhala split matras the way old HarfBuzz / Pango did.
- Initial support for Consonant Medials.
- Start adding new-style Myanmar shaping.
- Make reph and 'pref' logic introspect the font.
- Route Meetei-Mayek through the Indic shaper.
- Don't apply 'liga' in Indic shaper.
- Improve Malayalam pre-base reordering Ra interaction with Chillus.



Overview of changes leading to 0.9.5
Sunday, October 14, 2012
====================================

- Synthetic-GSUB Arabic fallback shaping.

- Misc Indic improvements.

- Add build system support for pthread.

- Imported UCDN for in-tree Unicode callbacks implementation.

- Context-aware Arabic joining.

- Misc other fixes.

- New API:

  hb_feature_to/from-string()
  hb_buffer_[sg]et_content_type()



Overview of changes leading to 0.9.4
Tuesday, Sep 03, 2012
====================================

- Indic improvements with old-spec Malayalam.

- Better fallback glyph positioning, specially with Thai / Lao marks.

- Implement dotted-circle insertion.

- Better Arabic fallback shaping / ligation.

- Added ICU LayoutEngine backend for testing.  Call it by the 'icu_le' name.

- Misc fixes.



Overview of changes leading to 0.9.3
Friday, Aug 18, 2012
====================================

- Fixed fallback mark positioning for left-to-right text.

- Improve mark positioning for the remaining combining classes.

- Unbreak Thai and fallback Arabic shaping.

- Port Arabic shaper to shape-plan caching.

- Use new ICU normalizer functions.



Overview of changes leading to 0.9.2
Friday, Aug 10, 2012
====================================

- Over a thousand commits!  This is the first major release of HarfBuzz.

- HarfBuzz is feature-complete now!  It should be in par, or better, than
  both Pango's shapers and old HarfBuzz / Qt shapers.

- New Indic shaper, supporting main Indic scripts, Sinhala, and Khmer.

- Improved Arabic shaper, with fallback Arabic shaping, supporting Arabic,
  Sinhala, N'ko, Mongolian, and Mandaic.

- New Thai / Lao shaper.

- Tibetan / Hangul support in the generic shaper.

- Synthetic GDEF support for fonts without a GDEF table.

- Fallback mark positioning for fonts without a GPOS table.

- Unicode normalization shaping heuristic during glyph mapping.

- New experimental Graphite2 backend.

- New Uniscribe backend (primarily for testing).

- New CoreText backend (primarily for testing).

- Major optimization and speedup.

- Test suites and testing infrastructure (work in progress).

- Greatly improved hb-view cmdline tool.

- hb-shape cmdline tool.

- Unicode 6.1 support.

Summary of API changes:

o Changed API:

  - Users are expected to only include main header files now (ie. hb.h,
    hb-glib.h, hb-ft.h, ...)

  - All struct tag names had their initial underscore removed.
    Ie. "struct _hb_buffer_t" is "struct hb_buffer_t" now.

  - All set_user_data() functions now take a "replace" boolean parameter.

  - hb_buffer_create() takes zero arguments now.
    Use hb_buffer_pre_allocate() to pre-allocate.

  - hb_buffer_add_utf*() now accept -1 for length parameteres,
    meaning "nul-terminated".

  - hb_direction_t enum values changed.

  - All *_from_string() APIs now take a length parameter to allow for
    non-nul-terminated strings. A -1 length means "nul-terminated".

  - Typedef for hb_language_t changed.

  - hb_get_table_func_t renamed to hb_reference_table_func_t.

  - hb_ot_layout_table_choose_script()

  - Various renames in hb-unicode.h.

o New API:

  - hb_buffer_guess_properties()
    Automatically called by hb_shape().

  - hb_buffer_normalize_glyphs()

  - hb_tag_from_string()

  - hb-coretext.h

  - hb-uniscribe.h

  - hb_face_reference_blob()
  - hb_face_[sg]et_index()
  - hb_face_set_upem()

  - hb_font_get_glyph_name_func_t
    hb_font_get_glyph_from_name_func_t
    hb_font_funcs_set_glyph_name_func()
    hb_font_funcs_set_glyph_from_name_func()
    hb_font_get_glyph_name()
    hb_font_get_glyph_from_name()
    hb_font_glyph_to_string()
    hb_font_glyph_from_string()

  - hb_font_set_funcs_data()

  - hb_ft_font_set_funcs()
  - hb_ft_font_get_face()

  - hb-gobject.h (work in progress)

  - hb_ot_shape_glyphs_closure()
    hb_ot_layout_substitute_closure_lookup()

  - hb-set.h

  - hb_shape_full()

  - hb_unicode_combining_class_t

  - hb_unicode_compose_func_t
    hb_unicode_decompose_func_t
    hb_unicode_decompose_compatibility_func_t
    hb_unicode_funcs_set_compose_func()
    hb_unicode_funcs_set_decompose_func()
    hb_unicode_funcs_set_decompose_compatibility_func()
    hb_unicode_compose()
    hb_unicode_decompose()
    hb_unicode_decompose_compatibility()

o Removed API:

  - hb_ft_get_font_funcs()

  - hb_ot_layout_substitute_start()
    hb_ot_layout_substitute_lookup()
    hb_ot_layout_substitute_finish()
    hb_ot_layout_position_start()
    hb_ot_layout_position_lookup()
    hb_ot_layout_position_finish()



Overview of changes leading to 0.6.0
Friday, May 27, 2011
====================================

- Vertical text support in GPOS
- Almost all API entries have unit tests now, under test/
- All thread-safety issues are fixed

Summary of API changes follows.


* Simple Types API:

  o New API:
    HB_LANGUAGE_INVALID
    hb_language_get_default()
    hb_direction_to_string()
    hb_direction_from_string()
    hb_script_get_horizontal_direction()
    HB_UNTAG()

  o Renamed API:
    hb_category_t renamed to hb_unicode_general_category_t

  o Changed API:
    hb_language_t is a typed pointers now

  o Removed API:
    HB_TAG_STR()


* Use ISO 15924 tags for hb_script_t:

  o New API:
    hb_script_from_iso15924_tag()
    hb_script_to_iso15924_tag()
    hb_script_from_string()

  o Changed API:
    HB_SCRIPT_* enum members changed value.


* Buffer API streamlined:

  o New API:
    hb_buffer_reset()
    hb_buffer_set_length()
    hb_buffer_allocation_successful()

  o Renamed API:
    hb_buffer_ensure() renamed to hb_buffer_pre_allocate()
    hb_buffer_add_glyph() renamed to hb_buffer_add()

  o Removed API:
    hb_buffer_clear()
    hb_buffer_clear_positions()

  o Changed API:
    hb_buffer_get_glyph_infos() takes an out length parameter now
    hb_buffer_get_glyph_positions() takes an out length parameter now


* Blob API streamlined:

  o New API:
    hb_blob_get_data()
    hb_blob_get_data_writable()

  o Renamed API:
    hb_blob_create_empty() renamed to hb_blob_get_empty()

  o Removed API:
    hb_blob_lock()
    hb_blob_unlock()
    hb_blob_is_writable()
    hb_blob_try_writable()

  o Changed API:
    hb_blob_create() takes user_data before destroy now


* Unicode functions API:

  o Unicode function vectors can subclass other unicode function vectors now.
    Unimplemented callbacks in the subclass automatically chainup to the parent.

  o All hb_unicode_funcs_t callbacks take a user_data now.  Their setters
    take a user_data and its respective destroy callback.

  o New API:
    hb_unicode_funcs_get_empty()
    hb_unicode_funcs_get_default()
    hb_unicode_funcs_get_parent()

  o Changed API:
    hb_unicode_funcs_create() now takes a parent_funcs.

  o Removed func getter functions:
    hb_unicode_funcs_get_mirroring_func()
    hb_unicode_funcs_get_general_category_func()
    hb_unicode_funcs_get_script_func()
    hb_unicode_funcs_get_combining_class_func()
    hb_unicode_funcs_get_eastasian_width_func()


* Face API:

  o Renamed API:
    hb_face_get_table() renamed to hb_face_reference_table()
    hb_face_create_for_data() renamed to hb_face_create()

  o Changed API:
    hb_face_create_for_tables() takes user_data before destroy now
    hb_face_reference_table() returns empty blob instead of NULL
    hb_get_table_func_t accepts the face as first parameter now

* Font API:

  o Fonts can subclass other fonts now.  Unimplemented callbacks in the
    subclass automatically chainup to the parent.  When chaining up,
    scale is adjusted if the parent font has a different scale.

  o All hb_font_funcs_t callbacks take a user_data now.  Their setters
    take a user_data and its respective destroy callback.

  o New API:
    hb_font_get_parent()
    hb_font_funcs_get_empty()
    hb_font_create_sub_font()

  o Removed API:
    hb_font_funcs_copy()
    hb_font_unset_funcs()

  o Removed func getter functions:
    hb_font_funcs_get_glyph_func()
    hb_font_funcs_get_glyph_advance_func()
    hb_font_funcs_get_glyph_extents_func()
    hb_font_funcs_get_contour_point_func()
    hb_font_funcs_get_kerning_func()

  o Changed API:
    hb_font_create() takes a face and references it now
    hb_font_set_funcs() takes user_data before destroy now
    hb_font_set_scale() accepts signed integers now
    hb_font_get_contour_point_func_t now takes glyph first, then point_index
    hb_font_get_glyph_func_t returns a success boolean now


* Changed object model:

  o All object types have a _get_empty() now:
    hb_blob_get_empty()
    hb_buffer_get_empty()
    hb_face_get_empty()
    hb_font_get_empty()
    hb_font_funcs_get_empty()
    hb_unicode_funcs_get_empty()

  o Added _set_user_data() and _get_user_data() for all object types:
    hb_blob_get_user_data()
    hb_blob_set_user_data()
    hb_buffer_get_user_data()
    hb_buffer_set_user_data()
    hb_face_get_user_data()
    hb_face_set_user_data()
    hb_font_funcs_get_user_data()
    hb_font_funcs_set_user_data()
    hb_font_get_user_data()
    hb_font_set_user_data()
    hb_unicode_funcs_get_user_data()
    hb_unicode_funcs_set_user_data()

  o Removed the _get_reference_count() from all object types:
    hb_blob_get_reference_count()
    hb_buffer_get_reference_count()
    hb_face_get_reference_count()
    hb_font_funcs_get_reference_count()
    hb_font_get_reference_count()
    hb_unicode_funcs_get_reference_count()

  o Added _make_immutable() and _is_immutable() for all object types except for buffer:
    hb_blob_make_immutable()
    hb_blob_is_immutable()
    hb_face_make_immutable()
    hb_face_is_immutable()


* Changed API for vertical text support

  o The following callbacks where removed:
    hb_font_get_glyph_advance_func_t
    hb_font_get_kerning_func_t

  o The following new callbacks added instead:
    hb_font_get_glyph_h_advance_func_t
    hb_font_get_glyph_v_advance_func_t
    hb_font_get_glyph_h_origin_func_t
    hb_font_get_glyph_v_origin_func_t
    hb_font_get_glyph_h_kerning_func_t
    hb_font_get_glyph_v_kerning_func_t

  o The following API removed as such:
    hb_font_funcs_set_glyph_advance_func()
    hb_font_funcs_set_kerning_func()
    hb_font_get_glyph_advance()
    hb_font_get_kerning()

  o New API added instead:
    hb_font_funcs_set_glyph_h_advance_func()
    hb_font_funcs_set_glyph_v_advance_func()
    hb_font_funcs_set_glyph_h_origin_func()
    hb_font_funcs_set_glyph_v_origin_func()
    hb_font_funcs_set_glyph_h_kerning_func()
    hb_font_funcs_set_glyph_v_kerning_func()
    hb_font_get_glyph_h_advance()
    hb_font_get_glyph_v_advance()
    hb_font_get_glyph_h_origin()
    hb_font_get_glyph_v_origin()
    hb_font_get_glyph_h_kerning()
    hb_font_get_glyph_v_kerning()

  o The following higher-leve API added for convenience:
    hb_font_get_glyph_advance_for_direction()
    hb_font_get_glyph_origin_for_direction()
    hb_font_add_glyph_origin_for_direction()
    hb_font_subtract_glyph_origin_for_direction()
    hb_font_get_glyph_kerning_for_direction()
    hb_font_get_glyph_extents_for_origin()
    hb_font_get_glyph_contour_point_for_origin()


* OpenType Layout API:

  o New API:
    hb_ot_layout_position_start()
    hb_ot_layout_substitute_start()
    hb_ot_layout_substitute_finish()


* Glue code:

  o New API:
    hb_glib_script_to_script()
    hb_glib_script_from_script()
    hb_icu_script_to_script()
    hb_icu_script_from_script()


* Version API added:

  o New API:
    HB_VERSION_MAJOR
    HB_VERSION_MINOR
    HB_VERSION_MICRO
    HB_VERSION_STRING
    HB_VERSION_CHECK()
    hb_version()
    hb_version_string()
    hb_version_check()


