diff options
author | David Schleef <ds@ginger.bigkitten.com> | 2007-12-08 08:13:00 -0800 |
---|---|---|
committer | David Schleef <ds@ginger.bigkitten.com> | 2007-12-08 08:13:00 -0800 |
commit | e24a024637e4ddc9c575f79b6a104d3326529c60 (patch) | |
tree | 77535e90e497146127d056cc2cdd7a9722f8bc43 /liboil/ref | |
parent | 8db0314b67547998af7c0dc33e2800c9c0edd8c6 (diff) | |
download | liboil-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.am | 1 | ||||
-rw-r--r-- | liboil/ref/addc.c | 53 | ||||
-rw-r--r-- | liboil/ref/yuv.c | 54 |
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); + |