b4a942
--- a/src/smooth/ftsmooth.c
b4a942
+++ b/src/smooth/ftsmooth.c
b4a942
@@ -232,39 +232,13 @@
b4a942
       FT_UInt   i, j;
b4a942
 
b4a942
       unsigned int  height = bitmap->rows;
b4a942
-      unsigned int  width  = bitmap->width;
b4a942
+      unsigned int  width  = bitmap->width / 3;
b4a942
       int           pitch  = bitmap->pitch;
b4a942
 
b4a942
-
b4a942
-      /* Render 3 separate monochrome bitmaps, shifting the outline  */
b4a942
-      /* by 1/3 pixel.                                               */
b4a942
-      width /= 3;
b4a942
-
b4a942
-      bitmap->buffer += width;
b4a942
-
b4a942
-      error = render->raster_render( render->raster, &params );
b4a942
-      if ( error )
b4a942
-        goto Exit;
b4a942
-
b4a942
-      FT_Outline_Translate( outline, -21, 0 );
b4a942
-      x_shift        -= 21;
b4a942
-      bitmap->buffer += width;
b4a942
-
b4a942
       error = render->raster_render( render->raster, &params );
b4a942
       if ( error )
b4a942
         goto Exit;
b4a942
 
b4a942
-      FT_Outline_Translate( outline,  42, 0 );
b4a942
-      x_shift        += 42;
b4a942
-      bitmap->buffer -= 2 * width;
b4a942
-
b4a942
-      error = render->raster_render( render->raster, &params );
b4a942
-      if ( error )
b4a942
-        goto Exit;
b4a942
-
b4a942
-      /* XXX: Rearrange the bytes according to FT_PIXEL_MODE_LCD.    */
b4a942
-      /* XXX: It is more efficient to render every third byte above. */
b4a942
-
b4a942
       if ( FT_ALLOC( temp, (FT_ULong)pitch ) )
b4a942
         goto Exit;
b4a942
 
b4a942
@@ -272,11 +246,7 @@
b4a942
       {
b4a942
         line = bitmap->buffer + i * (FT_ULong)pitch;
b4a942
         for ( j = 0; j < width; j++ )
b4a942
-        {
b4a942
-          temp[3 * j    ] = line[j];
b4a942
-          temp[3 * j + 1] = line[j + width];
b4a942
-          temp[3 * j + 2] = line[j + width + width];
b4a942
-        }
b4a942
+          temp[3 * j] = temp[3 * j + 1] = temp[3 * j + 2] = line[j];
b4a942
         FT_MEM_COPY( line, temp, pitch );
b4a942
       }
b4a942
 
b4a942
@@ -284,35 +254,23 @@
b4a942
     }
b4a942
     else if ( vmul )  /* lcd_v */
b4a942
     {
b4a942
-      int  pitch  = bitmap->pitch;
b4a942
-
b4a942
+      FT_Byte*  line;
b4a942
+      FT_UInt   i;
b4a942
+      int       original_pitch  = bitmap->pitch;
b4a942
 
b4a942
-      /* Render 3 separate monochrome bitmaps, shifting the outline  */
b4a942
-      /* by 1/3 pixel. Triple the pitch to render on each third row. */
b4a942
       bitmap->pitch *= 3;
b4a942
       bitmap->rows  /= 3;
b4a942
 
b4a942
-      bitmap->buffer += pitch;
b4a942
-
b4a942
-      error = render->raster_render( render->raster, &params );
b4a942
-      if ( error )
b4a942
-        goto Exit;
b4a942
-
b4a942
-      FT_Outline_Translate( outline, 0,  21 );
b4a942
-      y_shift        += 21;
b4a942
-      bitmap->buffer += pitch;
b4a942
-
b4a942
       error = render->raster_render( render->raster, &params );
b4a942
       if ( error )
b4a942
         goto Exit;
b4a942
 
b4a942
-      FT_Outline_Translate( outline, 0, -42 );
b4a942
-      y_shift        -= 42;
b4a942
-      bitmap->buffer -= 2 * pitch;
b4a942
-
b4a942
-      error = render->raster_render( render->raster, &params );
b4a942
-      if ( error )
b4a942
-        goto Exit;
b4a942
+      for ( i = 0; i < bitmap->rows; i++ )
b4a942
+      {
b4a942
+        line = bitmap->buffer + i * bitmap->pitch;
b4a942
+        FT_MEM_COPY( line + original_pitch, line, bitmap->width );
b4a942
+        FT_MEM_COPY( line + 2 * original_pitch, line, bitmap->width );
b4a942
+      }
b4a942
 
b4a942
       bitmap->pitch /= 3;
b4a942
       bitmap->rows  *= 3;