gst_plugins_base/gst/videoscale/vs_image.c
branchRCL_3
changeset 29 567bb019e3e3
parent 0 0e761a78d257
child 30 7e817e7e631c
--- a/gst_plugins_base/gst/videoscale/vs_image.c	Wed Mar 31 22:03:18 2010 +0300
+++ b/gst_plugins_base/gst/videoscale/vs_image.c	Tue Aug 31 15:30:33 2010 +0300
@@ -49,8 +49,16 @@
   int x;
   int xacc;
 
-  y_increment = ((src->height - 1) << 16) / (dest->height - 1);
-  x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+  if (dest->height == 1)
+    y_increment = 0;
+  else
+    y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+  if (dest->width == 1)
+    x_increment = 0;
+  else
+    x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
 
   acc = 0;
   for (i = 0; i < dest->height; i++) {
@@ -59,7 +67,8 @@
 
     xacc = 0;
     vs_scanline_resample_nearest_RGBA (dest->pixels + i * dest->stride,
-        src->pixels + j * src->stride, dest->width, &xacc, x_increment);
+        src->pixels + j * src->stride, src->width, dest->width, &xacc,
+        x_increment);
 
     acc += y_increment;
   }
@@ -86,8 +95,15 @@
   int dest_size;
   int xacc;
 
-  y_increment = ((src->height - 1) << 16) / (dest->height - 1);
-  x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+  if (dest->height == 1)
+    y_increment = 0;
+  else
+    y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+  if (dest->width == 1)
+    x_increment = 0;
+  else
+    x_increment = ((src->width - 1) << 16) / (dest->width - 1);
 
   dest_size = dest->width * 4;
 
@@ -97,8 +113,8 @@
   acc = 0;
   xacc = 0;
   y2 = -1;
-  vs_scanline_resample_linear_RGBA (tmp1, src->pixels, dest->width, &xacc,
-      x_increment);
+  vs_scanline_resample_linear_RGBA (tmp1, src->pixels, src->width, dest->width,
+      &xacc, x_increment);
   y1 = 0;
   for (i = 0; i < dest->height; i++) {
     j = acc >> 16;
@@ -112,7 +128,7 @@
       } else {
         xacc = 0;
         vs_scanline_resample_linear_RGBA (tmp1, src->pixels + j * src->stride,
-            dest->width, &xacc, x_increment);
+            src->width, dest->width, &xacc, x_increment);
         y1 = j;
         memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
       }
@@ -121,8 +137,8 @@
         if (j + 1 != y2) {
           xacc = 0;
           vs_scanline_resample_linear_RGBA (tmp2,
-              src->pixels + (j + 1) * src->stride, dest->width, &xacc,
-              x_increment);
+              src->pixels + (j + 1) * src->stride, src->width, dest->width,
+              &xacc, x_increment);
           y2 = j + 1;
         }
         vs_scanline_merge_linear_RGBA (dest->pixels + i * dest->stride,
@@ -131,8 +147,8 @@
         if (j + 1 != y1) {
           xacc = 0;
           vs_scanline_resample_linear_RGBA (tmp1,
-              src->pixels + (j + 1) * src->stride, dest->width, &xacc,
-              x_increment);
+              src->pixels + (j + 1) * src->stride, src->width, dest->width,
+              &xacc, x_increment);
           y1 = j + 1;
         }
         vs_scanline_merge_linear_RGBA (dest->pixels + i * dest->stride,
@@ -140,11 +156,11 @@
       } else {
         xacc = 0;
         vs_scanline_resample_linear_RGBA (tmp1, src->pixels + j * src->stride,
-            dest->width, &xacc, x_increment);
+            src->width, dest->width, &xacc, x_increment);
         y1 = j;
         xacc = 0;
         vs_scanline_resample_linear_RGBA (tmp2,
-            src->pixels + (j + 1) * src->stride, dest->width, &xacc,
+            src->pixels + (j + 1) * src->stride, src->width, dest->width, &xacc,
             x_increment);
         y2 = (j + 1);
         vs_scanline_merge_linear_RGBA (dest->pixels + i * dest->stride,
@@ -173,8 +189,15 @@
   int x;
   int xacc;
 
-  y_increment = ((src->height - 1) << 16) / (dest->height - 1);
-  x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+  if (dest->height == 1)
+    y_increment = 0;
+  else
+    y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+  if (dest->width == 1)
+    x_increment = 0;
+  else
+    x_increment = ((src->width - 1) << 16) / (dest->width - 1);
 
   acc = 0;
   for (i = 0; i < dest->height; i++) {
@@ -183,7 +206,8 @@
 
     xacc = 0;
     vs_scanline_resample_nearest_RGB (dest->pixels + i * dest->stride,
-        src->pixels + j * src->stride, dest->width, &xacc, x_increment);
+        src->pixels + j * src->stride, src->width, dest->width, &xacc,
+        x_increment);
 
     acc += y_increment;
   }
@@ -210,8 +234,15 @@
   int dest_size;
   int xacc;
 
-  y_increment = ((src->height - 1) << 16) / (dest->height - 1);
-  x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+  if (dest->height == 1)
+    y_increment = 0;
+  else
+    y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+  if (dest->width == 1)
+    x_increment = 0;
+  else
+    x_increment = ((src->width - 1) << 16) / (dest->width - 1);
 
   dest_size = dest->width * 3;
 
@@ -221,8 +252,8 @@
   acc = 0;
   xacc = 0;
   y2 = -1;
-  vs_scanline_resample_linear_RGB (tmp1, src->pixels, dest->width, &xacc,
-      x_increment);
+  vs_scanline_resample_linear_RGB (tmp1, src->pixels, src->width, dest->width,
+      &xacc, x_increment);
   y1 = 0;
   for (i = 0; i < dest->height; i++) {
     j = acc >> 16;
@@ -236,7 +267,7 @@
       } else {
         xacc = 0;
         vs_scanline_resample_linear_RGB (tmp1, src->pixels + j * src->stride,
-            dest->width, &xacc, x_increment);
+            src->width, dest->width, &xacc, x_increment);
         y1 = j;
         memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
       }
@@ -245,8 +276,8 @@
         if (j + 1 != y2) {
           xacc = 0;
           vs_scanline_resample_linear_RGB (tmp2,
-              src->pixels + (j + 1) * src->stride, dest->width, &xacc,
-              x_increment);
+              src->pixels + (j + 1) * src->stride, src->width, dest->width,
+              &xacc, x_increment);
           y2 = j + 1;
         }
         vs_scanline_merge_linear_RGB (dest->pixels + i * dest->stride,
@@ -255,8 +286,8 @@
         if (j + 1 != y1) {
           xacc = 0;
           vs_scanline_resample_linear_RGB (tmp1,
-              src->pixels + (j + 1) * src->stride, dest->width, &xacc,
-              x_increment);
+              src->pixels + (j + 1) * src->stride, src->width, dest->width,
+              &xacc, x_increment);
           y1 = j + 1;
         }
         vs_scanline_merge_linear_RGB (dest->pixels + i * dest->stride,
@@ -264,11 +295,11 @@
       } else {
         xacc = 0;
         vs_scanline_resample_linear_RGB (tmp1, src->pixels + j * src->stride,
-            dest->width, &xacc, x_increment);
+            src->width, dest->width, &xacc, x_increment);
         y1 = j;
         xacc = 0;
         vs_scanline_resample_linear_RGB (tmp2,
-            src->pixels + (j + 1) * src->stride, dest->width, &xacc,
+            src->pixels + (j + 1) * src->stride, src->width, dest->width, &xacc,
             x_increment);
         y2 = (j + 1);
         vs_scanline_merge_linear_RGB (dest->pixels + i * dest->stride,
@@ -297,12 +328,17 @@
   int j;
   int x;
   int xacc;
-  int n_quads;
+
+  if (dest->height == 1)
+    y_increment = 0;
+  else
+    y_increment = ((src->height - 1) << 16) / (dest->height - 1);
 
-  y_increment = ((src->height - 1) << 16) / (dest->height - 1);
-  x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+  if (dest->width == 1)
+    x_increment = 0;
+  else
+    x_increment = ((src->width - 1) << 16) / (dest->width - 1);
 
-  n_quads = ROUND_UP_2 (dest->width) / 2;
   acc = 0;
   for (i = 0; i < dest->height; i++) {
     j = acc >> 16;
@@ -310,7 +346,8 @@
 
     xacc = 0;
     vs_scanline_resample_nearest_YUYV (dest->pixels + i * dest->stride,
-        src->pixels + j * src->stride, n_quads, &xacc, x_increment);
+        src->pixels + j * src->stride, src->width, dest->width, &xacc,
+        x_increment);
 
     acc += y_increment;
   }
@@ -335,14 +372,19 @@
   int j;
   int x;
   int dest_size;
-  int n_quads;
   int xacc;
 
-  y_increment = ((src->height - 1) << 16) / (dest->height - 1);
-  x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+  if (dest->height == 1)
+    y_increment = 0;
+  else
+    y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+  if (dest->width == 1)
+    x_increment = 0;
+  else
+    x_increment = ((src->width - 1) << 16) / (dest->width - 1);
 
   dest_size = ROUND_UP_4 (dest->width * 2);
-  n_quads = ROUND_UP_2 (dest->width) / 2;
 
   tmp1 = tmpbuf;
   tmp2 = tmpbuf + dest_size;
@@ -350,8 +392,8 @@
   acc = 0;
   xacc = 0;
   y2 = -1;
-  vs_scanline_resample_linear_YUYV (tmp1, src->pixels, n_quads, &xacc,
-      x_increment);
+  vs_scanline_resample_linear_YUYV (tmp1, src->pixels, src->width, dest->width,
+      &xacc, x_increment);
   y1 = 0;
   for (i = 0; i < dest->height; i++) {
     j = acc >> 16;
@@ -365,7 +407,7 @@
       } else {
         xacc = 0;
         vs_scanline_resample_linear_YUYV (tmp1, src->pixels + j * src->stride,
-            n_quads, &xacc, x_increment);
+            src->width, dest->width, &xacc, x_increment);
         y1 = j;
         memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
       }
@@ -374,31 +416,34 @@
         if (j + 1 != y2) {
           xacc = 0;
           vs_scanline_resample_linear_YUYV (tmp2,
-              src->pixels + (j + 1) * src->stride, n_quads, &xacc, x_increment);
+              src->pixels + (j + 1) * src->stride, src->width, dest->width,
+              &xacc, x_increment);
           y2 = j + 1;
         }
         vs_scanline_merge_linear_YUYV (dest->pixels + i * dest->stride,
-            tmp1, tmp2, n_quads, x);
+            tmp1, tmp2, dest->width, x);
       } else if (j == y2) {
         if (j + 1 != y1) {
           xacc = 0;
           vs_scanline_resample_linear_YUYV (tmp1,
-              src->pixels + (j + 1) * src->stride, n_quads, &xacc, x_increment);
+              src->pixels + (j + 1) * src->stride, src->width, dest->width,
+              &xacc, x_increment);
           y1 = j + 1;
         }
         vs_scanline_merge_linear_YUYV (dest->pixels + i * dest->stride,
-            tmp2, tmp1, n_quads, x);
+            tmp2, tmp1, dest->width, x);
       } else {
         xacc = 0;
         vs_scanline_resample_linear_YUYV (tmp1, src->pixels + j * src->stride,
-            n_quads, &xacc, x_increment);
+            src->width, dest->width, &xacc, x_increment);
         y1 = j;
         xacc = 0;
         vs_scanline_resample_linear_YUYV (tmp2,
-            src->pixels + (j + 1) * src->stride, n_quads, &xacc, x_increment);
+            src->pixels + (j + 1) * src->stride, src->width, dest->width,
+            &xacc, x_increment);
         y2 = (j + 1);
         vs_scanline_merge_linear_YUYV (dest->pixels + i * dest->stride,
-            tmp1, tmp2, n_quads, x);
+            tmp1, tmp2, dest->width, x);
       }
     }
 
@@ -423,12 +468,17 @@
   int j;
   int x;
   int xacc;
-  int n_quads;
+
+  if (dest->height == 1)
+    y_increment = 0;
+  else
+    y_increment = ((src->height - 1) << 16) / (dest->height - 1);
 
-  y_increment = ((src->height - 1) << 16) / (dest->height - 1);
-  x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+  if (dest->width == 1)
+    x_increment = 0;
+  else
+    x_increment = ((src->width - 1) << 16) / (dest->width - 1);
 
-  n_quads = (dest->width + 1) / 2;
   acc = 0;
   for (i = 0; i < dest->height; i++) {
     j = acc >> 16;
@@ -436,7 +486,8 @@
 
     xacc = 0;
     vs_scanline_resample_nearest_UYVY (dest->pixels + i * dest->stride,
-        src->pixels + j * src->stride, n_quads, &xacc, x_increment);
+        src->pixels + j * src->stride, src->width, dest->width, &xacc,
+        x_increment);
 
     acc += y_increment;
   }
@@ -461,14 +512,19 @@
   int j;
   int x;
   int dest_size;
-  int n_quads;
   int xacc;
 
-  y_increment = ((src->height - 1) << 16) / (dest->height - 1);
-  x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+  if (dest->height == 1)
+    y_increment = 0;
+  else
+    y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+  if (dest->width == 1)
+    x_increment = 0;
+  else
+    x_increment = ((src->width - 1) << 16) / (dest->width - 1);
 
   dest_size = ROUND_UP_4 (dest->width * 2);
-  n_quads = ROUND_UP_2 (dest->width) / 2;
 
   tmp1 = tmpbuf;
   tmp2 = tmpbuf + dest_size;
@@ -476,8 +532,8 @@
   acc = 0;
   xacc = 0;
   y2 = -1;
-  vs_scanline_resample_linear_UYVY (tmp1, src->pixels, n_quads, &xacc,
-      x_increment);
+  vs_scanline_resample_linear_UYVY (tmp1, src->pixels, src->width, dest->width,
+      &xacc, x_increment);
   y1 = 0;
   for (i = 0; i < dest->height; i++) {
     j = acc >> 16;
@@ -491,7 +547,7 @@
       } else {
         xacc = 0;
         vs_scanline_resample_linear_UYVY (tmp1, src->pixels + j * src->stride,
-            n_quads, &xacc, x_increment);
+            src->width, dest->width, &xacc, x_increment);
         y1 = j;
         memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
       }
@@ -500,31 +556,34 @@
         if (j + 1 != y2) {
           xacc = 0;
           vs_scanline_resample_linear_UYVY (tmp2,
-              src->pixels + (j + 1) * src->stride, n_quads, &xacc, x_increment);
+              src->pixels + (j + 1) * src->stride, src->width, dest->width,
+              &xacc, x_increment);
           y2 = j + 1;
         }
         vs_scanline_merge_linear_UYVY (dest->pixels + i * dest->stride,
-            tmp1, tmp2, n_quads, x);
+            tmp1, tmp2, dest->width, x);
       } else if (j == y2) {
         if (j + 1 != y1) {
           xacc = 0;
           vs_scanline_resample_linear_UYVY (tmp1,
-              src->pixels + (j + 1) * src->stride, n_quads, &xacc, x_increment);
+              src->pixels + (j + 1) * src->stride, src->width, dest->width,
+              &xacc, x_increment);
           y1 = j + 1;
         }
         vs_scanline_merge_linear_UYVY (dest->pixels + i * dest->stride,
-            tmp2, tmp1, n_quads, x);
+            tmp2, tmp1, dest->width, x);
       } else {
         xacc = 0;
         vs_scanline_resample_linear_UYVY (tmp1, src->pixels + j * src->stride,
-            n_quads, &xacc, x_increment);
+            src->width, dest->width, &xacc, x_increment);
         y1 = j;
         xacc = 0;
         vs_scanline_resample_linear_UYVY (tmp2,
-            src->pixels + (j + 1) * src->stride, n_quads, &xacc, x_increment);
+            src->pixels + (j + 1) * src->stride, src->width, dest->width,
+            &xacc, x_increment);
         y2 = (j + 1);
         vs_scanline_merge_linear_UYVY (dest->pixels + i * dest->stride,
-            tmp1, tmp2, n_quads, x);
+            tmp1, tmp2, dest->width, x);
       }
     }
 
@@ -550,8 +609,15 @@
   int x;
   int xacc;
 
-  y_increment = ((src->height - 1) << 16) / (dest->height - 1);
-  x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+  if (dest->height == 1)
+    y_increment = 0;
+  else
+    y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+  if (dest->width == 1)
+    x_increment = 0;
+  else
+    x_increment = ((src->width - 1) << 16) / (dest->width - 1);
 
   acc = 0;
   for (i = 0; i < dest->height; i++) {
@@ -560,7 +626,8 @@
 
     xacc = 0;
     vs_scanline_resample_nearest_Y (dest->pixels + i * dest->stride,
-        src->pixels + j * src->stride, dest->width, &xacc, x_increment);
+        src->pixels + j * src->stride, src->width, dest->width, &xacc,
+        x_increment);
 
     acc += y_increment;
   }
@@ -587,8 +654,15 @@
   int dest_size;
   int xacc;
 
-  y_increment = ((src->height - 1) << 16) / (dest->height - 1);
-  x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+  if (dest->height == 1)
+    y_increment = 0;
+  else
+    y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+  if (dest->width == 1)
+    x_increment = 0;
+  else
+    x_increment = ((src->width - 1) << 16) / (dest->width - 1);
 
   dest_size = dest->width;
 
@@ -598,8 +672,8 @@
   acc = 0;
   xacc = 0;
   y2 = -1;
-  vs_scanline_resample_linear_Y (tmp1, src->pixels, dest->width, &xacc,
-      x_increment);
+  vs_scanline_resample_linear_Y (tmp1, src->pixels, src->width, dest->width,
+      &xacc, x_increment);
   y1 = 0;
   for (i = 0; i < dest->height; i++) {
     j = acc >> 16;
@@ -613,7 +687,7 @@
       } else {
         xacc = 0;
         vs_scanline_resample_linear_Y (tmp1, src->pixels + j * src->stride,
-            dest->width, &xacc, x_increment);
+            src->width, dest->width, &xacc, x_increment);
         y1 = j;
         memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
       }
@@ -622,8 +696,8 @@
         if (j + 1 != y2) {
           xacc = 0;
           vs_scanline_resample_linear_Y (tmp2,
-              src->pixels + (j + 1) * src->stride, dest->width, &xacc,
-              x_increment);
+              src->pixels + (j + 1) * src->stride, src->width, dest->width,
+              &xacc, x_increment);
           y2 = j + 1;
         }
         vs_scanline_merge_linear_Y (dest->pixels + i * dest->stride,
@@ -632,8 +706,8 @@
         if (j + 1 != y1) {
           xacc = 0;
           vs_scanline_resample_linear_Y (tmp1,
-              src->pixels + (j + 1) * src->stride, dest->width, &xacc,
-              x_increment);
+              src->pixels + (j + 1) * src->stride, src->width, dest->width,
+              &xacc, x_increment);
           y1 = j + 1;
         }
         vs_scanline_merge_linear_Y (dest->pixels + i * dest->stride,
@@ -641,11 +715,11 @@
       } else {
         xacc = 0;
         vs_scanline_resample_linear_Y (tmp1, src->pixels + j * src->stride,
-            dest->width, &xacc, x_increment);
+            src->width, dest->width, &xacc, x_increment);
         y1 = j;
         xacc = 0;
         vs_scanline_resample_linear_Y (tmp2,
-            src->pixels + (j + 1) * src->stride, dest->width, &xacc,
+            src->pixels + (j + 1) * src->stride, src->width, dest->width, &xacc,
             x_increment);
         y2 = (j + 1);
         vs_scanline_merge_linear_Y (dest->pixels + i * dest->stride,
@@ -656,6 +730,142 @@
     acc += y_increment;
   }
 }
+#ifdef __SYMBIAN32__
+EXPORT_C
+#endif
+
+void
+vs_image_scale_nearest_Y16 (const VSImage * dest, const VSImage * src,
+    uint8_t * tmpbuf)
+{
+  int acc;
+  int y_increment;
+  int x_increment;
+  int i;
+  int j;
+  int x;
+  int xacc;
+
+  if (dest->height == 1)
+    y_increment = 0;
+  else
+    y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+  if (dest->width == 1)
+    x_increment = 0;
+  else
+    x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+  acc = 0;
+  for (i = 0; i < dest->height; i++) {
+    j = acc >> 16;
+    x = acc & 0xffff;
+
+    xacc = 0;
+    vs_scanline_resample_nearest_Y16 (dest->pixels + i * dest->stride,
+        src->pixels + j * src->stride, src->width, dest->width, &xacc,
+        x_increment);
+
+    acc += y_increment;
+  }
+}
+#ifdef __SYMBIAN32__
+EXPORT_C
+#endif
+
+void
+vs_image_scale_linear_Y16 (const VSImage * dest, const VSImage * src,
+    uint8_t * tmpbuf)
+{
+  int acc;
+  int y_increment;
+  int x_increment;
+  uint8_t *tmp1;
+  uint8_t *tmp2;
+  int y1;
+  int y2;
+  int i;
+  int j;
+  int x;
+  int dest_size;
+  int xacc;
+
+  if (dest->height == 1)
+    y_increment = 0;
+  else
+    y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+  if (dest->width == 1)
+    x_increment = 0;
+  else
+    x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+
+  dest_size = 2 * dest->width;
+
+  tmp1 = tmpbuf;
+  tmp2 = tmpbuf + dest_size;
+
+  acc = 0;
+  xacc = 0;
+  y2 = -1;
+  vs_scanline_resample_linear_Y16 (tmp1, src->pixels, src->width, dest->width,
+      &xacc, x_increment);
+  y1 = 0;
+  for (i = 0; i < dest->height; i++) {
+    j = acc >> 16;
+    x = acc & 0xffff;
+
+    if (x == 0) {
+      if (j == y1) {
+        memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
+      } else if (j == y2) {
+        memcpy (dest->pixels + i * dest->stride, tmp2, dest_size);
+      } else {
+        xacc = 0;
+        vs_scanline_resample_linear_Y16 (tmp1, src->pixels + j * src->stride,
+            src->width, dest->width, &xacc, x_increment);
+        y1 = j;
+        memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
+      }
+    } else {
+      if (j == y1) {
+        if (j + 1 != y2) {
+          xacc = 0;
+          vs_scanline_resample_linear_Y16 (tmp2,
+              src->pixels + (j + 1) * src->stride, src->width, dest->width,
+              &xacc, x_increment);
+          y2 = j + 1;
+        }
+        vs_scanline_merge_linear_Y16 (dest->pixels + i * dest->stride,
+            tmp1, tmp2, dest->width, x);
+      } else if (j == y2) {
+        if (j + 1 != y1) {
+          xacc = 0;
+          vs_scanline_resample_linear_Y16 (tmp1,
+              src->pixels + (j + 1) * src->stride, src->width, dest->width,
+              &xacc, x_increment);
+          y1 = j + 1;
+        }
+        vs_scanline_merge_linear_Y16 (dest->pixels + i * dest->stride,
+            tmp2, tmp1, dest->width, x);
+      } else {
+        xacc = 0;
+        vs_scanline_resample_linear_Y16 (tmp1, src->pixels + j * src->stride,
+            src->width, dest->width, &xacc, x_increment);
+        y1 = j;
+        xacc = 0;
+        vs_scanline_resample_linear_Y16 (tmp2,
+            src->pixels + (j + 1) * src->stride, src->width, dest->width, &xacc,
+            x_increment);
+        y2 = (j + 1);
+        vs_scanline_merge_linear_Y16 (dest->pixels + i * dest->stride,
+            tmp1, tmp2, dest->width, x);
+      }
+    }
+
+    acc += y_increment;
+  }
+}
 
 /* RGB565 */
 #ifdef __SYMBIAN32__
@@ -675,8 +885,15 @@
   int x;
   int xacc;
 
-  y_increment = ((src->height - 1) << 16) / (dest->height - 1);
-  x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+  if (dest->height == 1)
+    y_increment = 0;
+  else
+    y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+  if (dest->width == 1)
+    x_increment = 0;
+  else
+    x_increment = ((src->width - 1) << 16) / (dest->width - 1);
 
   acc = 0;
   for (i = 0; i < dest->height; i++) {
@@ -685,7 +902,8 @@
 
     xacc = 0;
     vs_scanline_resample_nearest_RGB565 (dest->pixels + i * dest->stride,
-        src->pixels + j * src->stride, dest->width, &xacc, x_increment);
+        src->pixels + j * src->stride, src->width, dest->width, &xacc,
+        x_increment);
 
     acc += y_increment;
   }
@@ -712,8 +930,15 @@
   int dest_size;
   int xacc;
 
-  y_increment = ((src->height - 1) << 16) / (dest->height - 1);
-  x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+  if (dest->height == 1)
+    y_increment = 0;
+  else
+    y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+  if (dest->width == 1)
+    x_increment = 0;
+  else
+    x_increment = ((src->width - 1) << 16) / (dest->width - 1);
 
   dest_size = dest->width * 2;
 
@@ -723,8 +948,8 @@
   acc = 0;
   xacc = 0;
   y2 = -1;
-  vs_scanline_resample_linear_RGB565 (tmp1, src->pixels, dest->width, &xacc,
-      x_increment);
+  vs_scanline_resample_linear_RGB565 (tmp1, src->pixels, src->width,
+      dest->width, &xacc, x_increment);
   y1 = 0;
   for (i = 0; i < dest->height; i++) {
     j = acc >> 16;
@@ -738,7 +963,7 @@
       } else {
         xacc = 0;
         vs_scanline_resample_linear_RGB565 (tmp1, src->pixels + j * src->stride,
-            dest->width, &xacc, x_increment);
+            src->width, dest->width, &xacc, x_increment);
         y1 = j;
         memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
       }
@@ -747,8 +972,8 @@
         if (j + 1 != y2) {
           xacc = 0;
           vs_scanline_resample_linear_RGB565 (tmp2,
-              src->pixels + (j + 1) * src->stride, dest->width, &xacc,
-              x_increment);
+              src->pixels + (j + 1) * src->stride, src->width, dest->width,
+              &xacc, x_increment);
           y2 = j + 1;
         }
         vs_scanline_merge_linear_RGB565 (dest->pixels + i * dest->stride,
@@ -757,8 +982,8 @@
         if (j + 1 != y1) {
           xacc = 0;
           vs_scanline_resample_linear_RGB565 (tmp1,
-              src->pixels + (j + 1) * src->stride, dest->width, &xacc,
-              x_increment);
+              src->pixels + (j + 1) * src->stride, src->width, dest->width,
+              &xacc, x_increment);
           y1 = j + 1;
         }
         vs_scanline_merge_linear_RGB565 (dest->pixels + i * dest->stride,
@@ -766,11 +991,11 @@
       } else {
         xacc = 0;
         vs_scanline_resample_linear_RGB565 (tmp1, src->pixels + j * src->stride,
-            dest->width, &xacc, x_increment);
+            src->width, dest->width, &xacc, x_increment);
         y1 = j;
         xacc = 0;
         vs_scanline_resample_linear_RGB565 (tmp2,
-            src->pixels + (j + 1) * src->stride, dest->width, &xacc,
+            src->pixels + (j + 1) * src->stride, src->width, dest->width, &xacc,
             x_increment);
         y2 = (j + 1);
         vs_scanline_merge_linear_RGB565 (dest->pixels + i * dest->stride,
@@ -800,8 +1025,15 @@
   int x;
   int xacc;
 
-  y_increment = ((src->height - 1) << 16) / (dest->height - 1);
-  x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+  if (dest->height == 1)
+    y_increment = 0;
+  else
+    y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+  if (dest->width == 1)
+    x_increment = 0;
+  else
+    x_increment = ((src->width - 1) << 16) / (dest->width - 1);
 
   acc = 0;
   for (i = 0; i < dest->height; i++) {
@@ -810,7 +1042,8 @@
 
     xacc = 0;
     vs_scanline_resample_nearest_RGB555 (dest->pixels + i * dest->stride,
-        src->pixels + j * src->stride, dest->width, &xacc, x_increment);
+        src->pixels + j * src->stride, src->width, dest->width, &xacc,
+        x_increment);
 
     acc += y_increment;
   }
@@ -837,8 +1070,15 @@
   int dest_size;
   int xacc;
 
-  y_increment = ((src->height - 1) << 16) / (dest->height - 1);
-  x_increment = ((src->width - 1) << 16) / (dest->width - 1);
+  if (dest->height == 1)
+    y_increment = 0;
+  else
+    y_increment = ((src->height - 1) << 16) / (dest->height - 1);
+
+  if (dest->width == 1)
+    x_increment = 0;
+  else
+    x_increment = ((src->width - 1) << 16) / (dest->width - 1);
 
   dest_size = dest->width * 2;
 
@@ -848,8 +1088,8 @@
   acc = 0;
   xacc = 0;
   y2 = -1;
-  vs_scanline_resample_linear_RGB555 (tmp1, src->pixels, dest->width, &xacc,
-      x_increment);
+  vs_scanline_resample_linear_RGB555 (tmp1, src->pixels, src->width,
+      dest->width, &xacc, x_increment);
   y1 = 0;
   for (i = 0; i < dest->height; i++) {
     j = acc >> 16;
@@ -863,7 +1103,7 @@
       } else {
         xacc = 0;
         vs_scanline_resample_linear_RGB555 (tmp1, src->pixels + j * src->stride,
-            dest->width, &xacc, x_increment);
+            src->width, dest->width, &xacc, x_increment);
         y1 = j;
         memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
       }
@@ -872,8 +1112,8 @@
         if (j + 1 != y2) {
           xacc = 0;
           vs_scanline_resample_linear_RGB555 (tmp2,
-              src->pixels + (j + 1) * src->stride, dest->width, &xacc,
-              x_increment);
+              src->pixels + (j + 1) * src->stride, src->width, dest->width,
+              &xacc, x_increment);
           y2 = j + 1;
         }
         vs_scanline_merge_linear_RGB555 (dest->pixels + i * dest->stride,
@@ -882,8 +1122,8 @@
         if (j + 1 != y1) {
           xacc = 0;
           vs_scanline_resample_linear_RGB555 (tmp1,
-              src->pixels + (j + 1) * src->stride, dest->width, &xacc,
-              x_increment);
+              src->pixels + (j + 1) * src->stride, src->width, dest->width,
+              &xacc, x_increment);
           y1 = j + 1;
         }
         vs_scanline_merge_linear_RGB555 (dest->pixels + i * dest->stride,
@@ -891,11 +1131,11 @@
       } else {
         xacc = 0;
         vs_scanline_resample_linear_RGB555 (tmp1, src->pixels + j * src->stride,
-            dest->width, &xacc, x_increment);
+            src->width, dest->width, &xacc, x_increment);
         y1 = j;
         xacc = 0;
         vs_scanline_resample_linear_RGB555 (tmp2,
-            src->pixels + (j + 1) * src->stride, dest->width, &xacc,
+            src->pixels + (j + 1) * src->stride, src->width, dest->width, &xacc,
             x_increment);
         y2 = (j + 1);
         vs_scanline_merge_linear_RGB555 (dest->pixels + i * dest->stride,