diff options
author | Werner Lemberg <wl@gnu.org> | 2018-04-22 11:44:24 +0200 |
---|---|---|
committer | Werner Lemberg <wl@gnu.org> | 2018-04-22 11:44:24 +0200 |
commit | c0f1adedcfaad4f7d2fe912ff4b2933845d61d93 (patch) | |
tree | 3c5a6b548273b0d6d18ed4da6758c6f042307d3d | |
parent | 38ecc949ce1bfe4ceb567df7d8c7daf1d620fd3a (diff) | |
download | freetype2-c0f1adedcfaad4f7d2fe912ff4b2933845d61d93.tar.gz |
[base] Fix bitmap copying where the new pitch is smaller.
* src/base/ftbitmap.c (ft_bitmap_assure_buffer): Handle it.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | src/base/ftbitmap.c | 58 |
2 files changed, 50 insertions, 14 deletions
@@ -1,5 +1,11 @@ 2018-04-22 Werner Lemberg <wl@gnu.org> + [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 <wl@gnu.org> + Another fix for handling invalid format 2 cmaps. The previous commit was incomplete. diff --git a/src/base/ftbitmap.c b/src/base/ftbitmap.c index 93efb0944..4f5ca5a59 100644 --- a/src/base/ftbitmap.c +++ b/src/base/ftbitmap.c @@ -237,20 +237,35 @@ 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 ); |