+static void *image_to_16bpp(unsigned char *data, int w, int h, int b)
+{
+ unsigned char *p, *row;
+ int i, j;
+
+ if (b <= 2) return data;
+
+ if ((p = malloc(w * h * 2)))
+ {
+ for (i = 0; i < h; i++)
+ {
+ row = data + i * w * b;
+ for (j = 0; j < w; j++)
+ {
+ unsigned short packed, *pp;
+ if (b == 4)
+ packed =
+ (row[j * b] >> 4) << 12 |
+ (row[j * b + 1] >> 4) << 8 |
+ (row[j * b + 2] >> 4) << 4 |
+ row[j * b + 3] >> 4;
+ else
+ packed =
+ (row[j * b] >> 3) << 11 |
+ (row[j * b + 1] >> 2) << 5 |
+ (row[j * b + 2] >> 3);
+ pp = (unsigned short *)&p[i * w * 2 + j * 2];
+ *pp = packed;
+ }
+ }
+ }
+ free(data);
+ return p;
+}
+