ref: c0f1adedcfaad4f7d2fe912ff4b2933845d61d93
parent: 38ecc949ce1bfe4ceb567df7d8c7daf1d620fd3a
author: Werner Lemberg <[email protected]>
date: Sun Apr 22 07:44:24 EDT 2018
[base] Fix bitmap copying where the new pitch is smaller. * src/base/ftbitmap.c (ft_bitmap_assure_buffer): Handle it.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2018-04-22 Werner Lemberg <[email protected]>
+ [base] Fix bitmap copying where the new pitch is smaller.
+
+ * src/base/ftbitmap.c (ft_bitmap_assure_buffer): Handle it.
+
+2018-04-22 Werner Lemberg <[email protected]>
+
Another fix for handling invalid format 2 cmaps.
The previous commit was incomplete.
--- a/src/base/ftbitmap.c
+++ b/src/base/ftbitmap.c
@@ -237,21 +237,36 @@
unsigned char* out = buffer;
unsigned char* limit = bitmap->buffer + pitch * bitmap->rows;
- unsigned int delta = new_pitch - pitch;
FT_MEM_ZERO( out, new_pitch * ypixels );
out += new_pitch * ypixels;
- while ( in < limit )
+ if ( new_pitch > pitch )
{
- FT_MEM_COPY( out, in, len );
- in += pitch;
- out += pitch;
+ unsigned int delta = new_pitch - pitch;
- FT_MEM_ZERO( out, delta );
- out += delta;
+
+ while ( in < limit )
+ {
+ FT_MEM_COPY( out, in, len );
+ in += pitch;
+ out += pitch;
+
+ /* we have to zero out the new (unused) pitch bytes */
+ FT_MEM_ZERO( out, delta );
+ out += delta;
+ }
}
+ else
+ {
+ while ( in < limit )
+ {
+ FT_MEM_COPY( out, in, len );
+ in += pitch;
+ out += new_pitch;
+ }
+ }
}
else
{
@@ -261,17 +276,32 @@
unsigned char* out = buffer;
unsigned char* limit = bitmap->buffer + pitch * bitmap->rows;
- unsigned int delta = new_pitch - pitch;
- while ( in < limit )
+ if ( new_pitch > pitch )
{
- FT_MEM_COPY( out, in, len );
- in += pitch;
- out += pitch;
+ unsigned int delta = new_pitch - pitch;
- FT_MEM_ZERO( out, delta );
- out += delta;
+
+ while ( in < limit )
+ {
+ FT_MEM_COPY( out, in, len );
+ in += pitch;
+ out += pitch;
+
+ /* we have to zero out the new (unused) pitch bytes */
+ FT_MEM_ZERO( out, delta );
+ out += delta;
+ }
+ }
+ else
+ {
+ while ( in < limit )
+ {
+ FT_MEM_COPY( out, in, len );
+ in += pitch;
+ out += new_pitch;
+ }
}
FT_MEM_ZERO( out, new_pitch * ypixels );