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.
This commit is contained in:
Werner Lemberg 2017-09-05 23:02:04 +02:00
parent 7d017ba810
commit a3dd6d99a4
3 changed files with 29 additions and 2 deletions

View File

@ -1,3 +1,27 @@
2017-09-05 Werner Lemberg <wl@gnu.org>
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 <wl@gnu.org>
[bdf] Fix size and resolution handling.

View File

@ -54,6 +54,10 @@ CHANGES BETWEEN 2.8 and 2.8.1
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.
======================================================================

View File

@ -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;