MMX
[eradicate] / libs / imago / src / conv.c
index 51ecd1f..501b3c4 100644 (file)
@@ -32,6 +32,7 @@ struct pixel {
 static void unpack_grey8(struct pixel *unp, void *pptr, int count);
 static void unpack_rgb24(struct pixel *unp, void *pptr, int count);
 static void unpack_rgba32(struct pixel *unp, void *pptr, int count);
+static void unpack_bgra32(struct pixel *unp, void *pptr, int count);
 static void unpack_greyf(struct pixel *unp, void *pptr, int count);
 static void unpack_rgbf(struct pixel *unp, void *pptr, int count);
 static void unpack_rgbaf(struct pixel *unp, void *pptr, int count);
@@ -40,6 +41,7 @@ static void unpack_rgb565(struct pixel *unp, void *pptr, int count);
 static void pack_grey8(void *pptr, struct pixel *unp, int count);
 static void pack_rgb24(void *pptr, struct pixel *unp, int count);
 static void pack_rgba32(void *pptr, struct pixel *unp, int count);
+static void pack_bgra32(void *pptr, struct pixel *unp, int count);
 static void pack_greyf(void *pptr, struct pixel *unp, int count);
 static void pack_rgbf(void *pptr, struct pixel *unp, int count);
 static void pack_rgbaf(void *pptr, struct pixel *unp, int count);
@@ -50,6 +52,7 @@ static void (*unpack[])(struct pixel*, void*, int) = {
        unpack_grey8,
        unpack_rgb24,
        unpack_rgba32,
+       unpack_bgra32,
        unpack_greyf,
        unpack_rgbf,
        unpack_rgbaf,
@@ -61,6 +64,7 @@ static void (*pack[])(void*, struct pixel*, int) = {
        pack_grey8,
        pack_rgb24,
        pack_rgba32,
+       pack_bgra32,
        pack_greyf,
        pack_rgbf,
        pack_rgbaf,
@@ -145,6 +149,20 @@ static void unpack_rgba32(struct pixel *unp, void *pptr, int count)
        }
 }
 
+static void unpack_bgra32(struct pixel *unp, void *pptr, int count)
+{
+       int i;
+       unsigned char *pix = pptr;
+
+       for(i=0; i<count; i++) {
+               unp->b = (float)*pix++ / 255.0;
+               unp->g = (float)*pix++ / 255.0;
+               unp->r = (float)*pix++ / 255.0;
+               unp->a = (float)*pix++ / 255.0;
+               unp++;
+       }
+}
+
 static void unpack_greyf(struct pixel *unp, void *pptr, int count)
 {
        int i;
@@ -256,6 +274,25 @@ static void pack_rgba32(void *pptr, struct pixel *unp, int count)
        }
 }
 
+static void pack_bgra32(void *pptr, struct pixel *unp, int count)
+{
+       int i;
+       unsigned char *pix = pptr;
+
+       for(i=0; i<count; i++) {
+               int r = (int)(unp->r * 255.0);
+               int g = (int)(unp->g * 255.0);
+               int b = (int)(unp->b * 255.0);
+               int a = (int)(unp->a * 255.0);
+
+               *pix++ = CLAMP(b, 0, 255);
+               *pix++ = CLAMP(g, 0, 255);
+               *pix++ = CLAMP(r, 0, 255);
+               *pix++ = CLAMP(a, 0, 255);
+               unp++;
+       }
+}
+
 static void pack_greyf(void *pptr, struct pixel *unp, int count)
 {
        int i;