[base] Fix bitmap copying where the new pitch is smaller.

* src/base/ftbitmap.c (ft_bitmap_assure_buffer): Handle it.
This commit is contained in:
Werner Lemberg 2018-04-22 11:44:24 +02:00
parent 38ecc949ce
commit c0f1adedcf
2 changed files with 50 additions and 14 deletions

View File

@ -1,3 +1,9 @@
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.

View File

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