ref: a3dd6d99a4c9f61667e5c996c0997cdd0207fc73
parent: 7d017ba810d0b29a941f83188ac39cf3c8d52a48
author: Werner Lemberg <[email protected]>
date: Tue Sep 5 19:02:04 EDT 2017
Fix multiple calls of `FT_Bitmap_Convert'. The documentation of `FT_Bitmap_Convert' says that multiple calls do proper reallocation of the target FT_Bitmap object. However, this failed for the sequence non-empty bitmap empty bitmap non-empty bitmap Reason was that `FT_Bitmap_Convert' only reallocated the bitmap buffer if it became too small; it didn't make the buffer smaller. For an empty bitmap following a non-empty one, only the buffer dimension got set to zero, without deallocation. If the next call was a non-empty buffer again, an assertion in `ft_mem_qrealloc' was triggered. * src/base/ftbitmap.c (FT_Bitmap_Convert): Always reallocate target buffer to the correct size. * docs/CHANGES: Document it.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,29 @@
2017-09-05 Werner Lemberg <[email protected]>
+ Fix multiple calls of `FT_Bitmap_Convert'.
+
+ The documentation of `FT_Bitmap_Convert' says that multiple calls do
+ proper reallocation of the target FT_Bitmap object. However, this
+ failed for the sequence
+
+ non-empty bitmap
+ empty bitmap
+ non-empty bitmap
+
+ Reason was that `FT_Bitmap_Convert' only reallocated the bitmap
+ buffer if it became too small; it didn't make the buffer smaller.
+ For an empty bitmap following a non-empty one, only the buffer
+ dimension got set to zero, without deallocation. If the next call
+ was a non-empty buffer again, an assertion in `ft_mem_qrealloc' was
+ triggered.
+
+ * src/base/ftbitmap.c (FT_Bitmap_Convert): Always reallocate target
+ buffer to the correct size.
+
+ * docs/CHANGES: Document it.
+
+2017-09-05 Werner Lemberg <[email protected]>
+
[bdf] Fix size and resolution handling.
* src/bdf/bdfdrivr.c (BDF_Face_Init): Use `SIZE' values if
--- a/docs/CHANGES
+++ b/docs/CHANGES
@@ -54,6 +54,10 @@
missing. Previously, `SIZE' was completely ignored, and
FreeType used heuristic values instead.
+ - Multiple calls to `FT_Bitmap_Convert' do work now as advertised.
+ Previously, they failed with an assertion error if there was an
+ empty bitmap between non-empty ones.
+
======================================================================
--- a/src/base/ftbitmap.c
+++ b/src/base/ftbitmap.c
@@ -534,8 +534,7 @@
(FT_ULong)target->rows > FT_ULONG_MAX / (FT_ULong)target_pitch )
return FT_THROW( Invalid_Argument );
- if ( target->rows * (FT_ULong)target_pitch > old_size &&
- FT_QREALLOC( target->buffer,
+ if ( FT_QREALLOC( target->buffer,
old_size, target->rows * (FT_UInt)target_pitch ) )
return error;