summaryrefslogtreecommitdiff
path: root/liboil/ref
diff options
context:
space:
mode:
authorDavid Schleef <ds@ginger.bigkitten.com>2007-12-08 08:13:00 -0800
committerDavid Schleef <ds@ginger.bigkitten.com>2007-12-08 08:13:00 -0800
commite24a024637e4ddc9c575f79b6a104d3326529c60 (patch)
tree77535e90e497146127d056cc2cdd7a9722f8bc43 /liboil/ref
parent8db0314b67547998af7c0dc33e2800c9c0edd8c6 (diff)
downloadliboil-e24a024637e4ddc9c575f79b6a104d3326529c60.tar.gz
Add a few more classes from schro. Add some mmx code, too.
Diffstat (limited to 'liboil/ref')
-rw-r--r--liboil/ref/Makefile.am1
-rw-r--r--liboil/ref/addc.c53
-rw-r--r--liboil/ref/yuv.c54
3 files changed, 108 insertions, 0 deletions
diff --git a/liboil/ref/Makefile.am b/liboil/ref/Makefile.am
index e2acf32..f812fcb 100644
--- a/liboil/ref/Makefile.am
+++ b/liboil/ref/Makefile.am
@@ -8,6 +8,7 @@ endif
noinst_LTLIBRARIES = libref.la $(opt_libs)
c_sources = \
+ addc.c \
argb_paint.c \
ayuv2argb.c \
clamp.c \
diff --git a/liboil/ref/addc.c b/liboil/ref/addc.c
new file mode 100644
index 0000000..d8fb103
--- /dev/null
+++ b/liboil/ref/addc.c
@@ -0,0 +1,53 @@
+
+#include <liboil/liboilfunction.h>
+#include <liboil/liboiltest.h>
+#include <liboil/liboilrandom.h>
+
+static void
+shift_test (OilTest *test)
+{
+ int16_t *data;
+ int i;
+ int n;
+
+if (0) {
+ data = (int16_t *)oil_test_get_source_data (test, OIL_ARG_SRC1);
+ n = oil_test_get_arg_post_n (test, OIL_ARG_SRC1);
+ for(i=0;i<n;i++){
+ data[i] = CLAMP(data[i], -4096, 4095);
+ }
+}
+
+ data = (int16_t *)oil_test_get_source_data (test, OIL_ARG_SRC2);
+ //data[0] = 10000;
+ data[1] = 8;
+}
+
+OIL_DEFINE_CLASS (addc_s16,
+ "int16_t *d1, int16_t *s1, int16_t *s2_1, int n");
+OIL_DEFINE_CLASS_FULL (addc_rshift_s16,
+ "int16_t *d1, int16_t *s1, int16_t *s2_2, int n", shift_test);
+
+void
+addc_rshift_s16_ref (int16_t *d1, int16_t *s1, int16_t *s2_2, int n)
+{
+ int i;
+ int16_t x;
+
+ for(i=0;i<n;i++){
+ x = s1[i] + s2_2[0];
+ d1[i] = x>>s2_2[1];
+ }
+}
+OIL_DEFINE_IMPL_REF (addc_rshift_s16_ref, addc_rshift_s16);
+
+void
+addc_s16_ref (int16_t *d1, uint16_t *s1, int16_t *s2_1, int n)
+{
+ int i;
+ for(i=0;i<n;i++){
+ d1[i] = s1[i] + s2_1[0];
+ }
+}
+OIL_DEFINE_IMPL_REF (addc_s16_ref, addc_s16);
+
diff --git a/liboil/ref/yuv.c b/liboil/ref/yuv.c
index 37da1d5..82db26f 100644
--- a/liboil/ref/yuv.c
+++ b/liboil/ref/yuv.c
@@ -102,6 +102,30 @@ OIL_DEFINE_CLASS (ayuv2yvyu, "uint32_t *d_n, uint32_t *s_n, int n");
* half of the destination array is written. Alpha values are ignored.
*/
OIL_DEFINE_CLASS (ayuv2uyvy, "uint32_t *d_n, uint32_t *s_n, int n");
+/**
+ * oil_packyuyv:
+ * @d:
+ * @s1_nx2:
+ * @s2:
+ * @s3:
+ * n:
+ *
+ * Packs pixels in separate Y, U, and V arrays to YUYV.
+ */
+OIL_DEFINE_CLASS (packyuyv,
+ "uint32_t *d, uint8_t *s1_nx2, uint8_t *s2, uint8_t *s3, int n");
+/**
+ * oil_unpackyuyv:
+ * @d1_nx2:
+ * @d2:
+ * @d3:
+ * @s:
+ * n:
+ *
+ * Unpacks YUYV pixels into separate Y, U, and V arrays;
+ */
+OIL_DEFINE_CLASS (unpackyuyv,
+ "uint8_t *d1_nx2, uint8_t *d2, uint8_t *d3, uint32_t *s int n");
static void
@@ -217,3 +241,33 @@ ayuv2uyvy_ref (uint32_t *d, uint32_t *src, int n)
}
OIL_DEFINE_IMPL_REF (ayuv2uyvy_ref, ayuv2uyvy);
+static void
+packyuyv_ref (uint32_t *d, uint8_t *s1_nx2, uint8_t *s2, uint8_t *s3, int n)
+{
+ int i;
+ uint8_t *dest = (uint8_t *)d;
+
+ for(i=0;i<n;i++){
+ dest[i*4 + 0] = s1_nx2[i*2+0];
+ dest[i*4 + 2] = s1_nx2[i*2+1];
+ dest[i*4 + 1] = s2[i];
+ dest[i*4 + 3] = s3[i];
+ }
+}
+OIL_DEFINE_IMPL_REF (packyuyv_ref, packyuyv);
+
+static void
+unpackyuyv_ref (uint8_t *d1_nx2, uint8_t *d2, uint8_t *d3, uint32_t *s, int n)
+{
+ int i;
+ uint8_t *src = (uint8_t *)s;
+
+ for(i=0;i<n;i++){
+ d1_nx2[i*2+0] = src[i*4 + 0];
+ d1_nx2[i*2+1] = src[i*4 + 2];
+ d2[i] = src[i*4 + 1];
+ d3[i] = src[i*4 + 3];
+ }
+}
+OIL_DEFINE_IMPL_REF (unpackyuyv_ref, unpackyuyv);
+