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

* src/base/ftbitmap.c (ft_bitmap_assure_buffer): Handle it.
diff --git a/ChangeLog b/ChangeLog
index 4dc8c55..5cdf5be 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 93efb09..4f5ca5a 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 );