summaryrefslogtreecommitdiff
path: root/twinint.h
diff options
context:
space:
mode:
Diffstat (limited to 'twinint.h')
-rw-r--r--twinint.h213
1 files changed, 213 insertions, 0 deletions
diff --git a/twinint.h b/twinint.h
new file mode 100644
index 0000000..3c2dc6d
--- /dev/null
+++ b/twinint.h
@@ -0,0 +1,213 @@
+/*
+ * $Id$
+ *
+ * Copyright © 2004 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef _TWININT_H_
+#define _TWININT_H_
+
+#include "twin.h"
+#include <string.h>
+
+#define twin_int_mult(a,b,t) ((t) = (a) * (b) + 0x80, \
+ ((((t)>>8 ) + (t))>>8 ))
+#define twin_int_div(a,b) (((uint16_t) (a) * 255) / (b))
+#define twin_get_8(v,i) ((uint16_t) (uint8_t) ((v) >> (i)))
+#define twin_sat(t) ((uint8_t) ((t) | (0 - ((t) >> 8))))
+
+#define twin_in(s,i,m,t) \
+ ((twin_argb32_t) twin_int_mult (twin_get_8(s,i),(m),(t)) << (i))
+
+#define twin_over(s,d,i,m,t) \
+ ((t) = twin_int_mult(twin_get_8(d,i),(m),(t)) + twin_get_8(s,i),\
+ (twin_argb32_t) twin_sat (t) << (i))
+
+#define twin_over(s,d,i,m,t) \
+ ((t) = twin_int_mult(twin_get_8(d,i),(m),(t)) + twin_get_8(s,i),\
+ (twin_argb32_t) twin_sat (t) << (i))
+
+#define twin_argb32_to_rgb16(s) ((((s) >> 3) & 0x001f) | \
+ (((s) >> 5) & 0x07e0) | \
+ (((s) >> 8) & 0xf800))
+#define twin_rgb16_to_argb32(s) \
+ (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \
+ ((((s) << 5) & 0xfc00) | (((s) >> 1) & 0x300)) | \
+ ((((s) << 8) & 0xf80000) | (((s) << 3) & 0x70000)) | \
+ 0xff000000)
+
+typedef union {
+ twin_pointer_t p;
+ twin_argb32_t c;
+} twin_source_u;
+
+typedef void (*twin_src_msk_op) (twin_pointer_t dst,
+ twin_source_u src,
+ twin_source_u msk,
+ int width);
+
+typedef void (*twin_src_op) (twin_pointer_t dst,
+ twin_source_u src,
+ int width);
+
+/* twin_primitive.c */
+
+typedef void twin_in_op_func (twin_pointer_t dst,
+ twin_source_u src,
+ twin_source_u msk,
+ int width);
+
+typedef void twin_op_func (twin_pointer_t dst,
+ twin_source_u src,
+ int width);
+
+twin_in_op_func _twin_argb32_in_argb32_over_argb32;
+twin_in_op_func _twin_argb32_in_rgb16_over_argb32;
+twin_in_op_func _twin_argb32_in_a8_over_argb32;
+twin_in_op_func _twin_argb32_in_c_over_argb32;
+twin_in_op_func _twin_rgb16_in_argb32_over_argb32;
+twin_in_op_func _twin_rgb16_in_rgb16_over_argb32;
+twin_in_op_func _twin_rgb16_in_a8_over_argb32;
+twin_in_op_func _twin_rgb16_in_c_over_argb32;
+twin_in_op_func _twin_a8_in_argb32_over_argb32;
+twin_in_op_func _twin_a8_in_rgb16_over_argb32;
+twin_in_op_func _twin_a8_in_a8_over_argb32;
+twin_in_op_func _twin_a8_in_c_over_argb32;
+twin_in_op_func _twin_c_in_argb32_over_argb32;
+twin_in_op_func _twin_c_in_rgb16_over_argb32;
+twin_in_op_func _twin_c_in_a8_over_argb32;
+twin_in_op_func _twin_c_in_c_over_argb32;
+twin_in_op_func _twin_argb32_in_argb32_over_rgb16;
+twin_in_op_func _twin_argb32_in_rgb16_over_rgb16;
+twin_in_op_func _twin_argb32_in_a8_over_rgb16;
+twin_in_op_func _twin_argb32_in_c_over_rgb16;
+twin_in_op_func _twin_rgb16_in_argb32_over_rgb16;
+twin_in_op_func _twin_rgb16_in_rgb16_over_rgb16;
+twin_in_op_func _twin_rgb16_in_a8_over_rgb16;
+twin_in_op_func _twin_rgb16_in_c_over_rgb16;
+twin_in_op_func _twin_a8_in_argb32_over_rgb16;
+twin_in_op_func _twin_a8_in_rgb16_over_rgb16;
+twin_in_op_func _twin_a8_in_a8_over_rgb16;
+twin_in_op_func _twin_a8_in_c_over_rgb16;
+twin_in_op_func _twin_c_in_argb32_over_rgb16;
+twin_in_op_func _twin_c_in_rgb16_over_rgb16;
+twin_in_op_func _twin_c_in_a8_over_rgb16;
+twin_in_op_func _twin_c_in_c_over_rgb16;
+twin_in_op_func _twin_argb32_in_argb32_over_a8;
+twin_in_op_func _twin_argb32_in_rgb16_over_a8;
+twin_in_op_func _twin_argb32_in_a8_over_a8;
+twin_in_op_func _twin_argb32_in_c_over_a8;
+twin_in_op_func _twin_rgb16_in_argb32_over_a8;
+twin_in_op_func _twin_rgb16_in_rgb16_over_a8;
+twin_in_op_func _twin_rgb16_in_a8_over_a8;
+twin_in_op_func _twin_rgb16_in_c_over_a8;
+twin_in_op_func _twin_a8_in_argb32_over_a8;
+twin_in_op_func _twin_a8_in_rgb16_over_a8;
+twin_in_op_func _twin_a8_in_a8_over_a8;
+twin_in_op_func _twin_a8_in_c_over_a8;
+twin_in_op_func _twin_c_in_argb32_over_a8;
+twin_in_op_func _twin_c_in_rgb16_over_a8;
+twin_in_op_func _twin_c_in_a8_over_a8;
+twin_in_op_func _twin_c_in_c_over_a8;
+twin_in_op_func _twin_argb32_in_argb32_over_c;
+
+twin_in_op_func _twin_argb32_in_argb32_source_argb32;
+twin_in_op_func _twin_argb32_in_rgb16_source_argb32;
+twin_in_op_func _twin_argb32_in_a8_source_argb32;
+twin_in_op_func _twin_argb32_in_c_source_argb32;
+twin_in_op_func _twin_rgb16_in_argb32_source_argb32;
+twin_in_op_func _twin_rgb16_in_rgb16_source_argb32;
+twin_in_op_func _twin_rgb16_in_a8_source_argb32;
+twin_in_op_func _twin_rgb16_in_c_source_argb32;
+twin_in_op_func _twin_a8_in_argb32_source_argb32;
+twin_in_op_func _twin_a8_in_rgb16_source_argb32;
+twin_in_op_func _twin_a8_in_a8_source_argb32;
+twin_in_op_func _twin_a8_in_c_source_argb32;
+twin_in_op_func _twin_c_in_argb32_source_argb32;
+twin_in_op_func _twin_c_in_rgb16_source_argb32;
+twin_in_op_func _twin_c_in_a8_source_argb32;
+twin_in_op_func _twin_c_in_c_source_argb32;
+twin_in_op_func _twin_argb32_in_argb32_source_rgb16;
+twin_in_op_func _twin_argb32_in_rgb16_source_rgb16;
+twin_in_op_func _twin_argb32_in_a8_source_rgb16;
+twin_in_op_func _twin_argb32_in_c_source_rgb16;
+twin_in_op_func _twin_rgb16_in_argb32_source_rgb16;
+twin_in_op_func _twin_rgb16_in_rgb16_source_rgb16;
+twin_in_op_func _twin_rgb16_in_a8_source_rgb16;
+twin_in_op_func _twin_rgb16_in_c_source_rgb16;
+twin_in_op_func _twin_a8_in_argb32_source_rgb16;
+twin_in_op_func _twin_a8_in_rgb16_source_rgb16;
+twin_in_op_func _twin_a8_in_a8_source_rgb16;
+twin_in_op_func _twin_a8_in_c_source_rgb16;
+twin_in_op_func _twin_c_in_argb32_source_rgb16;
+twin_in_op_func _twin_c_in_rgb16_source_rgb16;
+twin_in_op_func _twin_c_in_a8_source_rgb16;
+twin_in_op_func _twin_c_in_c_source_rgb16;
+twin_in_op_func _twin_argb32_in_argb32_source_a8;
+twin_in_op_func _twin_argb32_in_rgb16_source_a8;
+twin_in_op_func _twin_argb32_in_a8_source_a8;
+twin_in_op_func _twin_argb32_in_c_source_a8;
+twin_in_op_func _twin_rgb16_in_argb32_source_a8;
+twin_in_op_func _twin_rgb16_in_rgb16_source_a8;
+twin_in_op_func _twin_rgb16_in_a8_source_a8;
+twin_in_op_func _twin_rgb16_in_c_source_a8;
+twin_in_op_func _twin_a8_in_argb32_source_a8;
+twin_in_op_func _twin_a8_in_rgb16_source_a8;
+twin_in_op_func _twin_a8_in_a8_source_a8;
+twin_in_op_func _twin_a8_in_c_source_a8;
+twin_in_op_func _twin_c_in_argb32_source_a8;
+twin_in_op_func _twin_c_in_rgb16_source_a8;
+twin_in_op_func _twin_c_in_a8_source_a8;
+twin_in_op_func _twin_c_in_c_source_a8;
+twin_in_op_func _twin_argb32_in_argb32_source_c;
+
+twin_op_func _twin_argb32_over_argb32;
+twin_op_func _twin_rgb16_over_argb32;
+twin_op_func _twin_a8_over_argb32;
+twin_op_func _twin_c_over_argb32;
+twin_op_func _twin_argb32_over_rgb16;
+twin_op_func _twin_rgb16_over_rgb16;
+twin_op_func _twin_a8_over_rgb16;
+twin_op_func _twin_c_over_rgb16;
+twin_op_func _twin_argb32_over_a8;
+twin_op_func _twin_rgb16_over_a8;
+twin_op_func _twin_a8_over_a8;
+twin_op_func _twin_c_over_a8;
+twin_op_func _twin_argb32_source_argb32;
+twin_op_func _twin_rgb16_source_argb32;
+twin_op_func _twin_a8_source_argb32;
+twin_op_func _twin_c_source_argb32;
+twin_op_func _twin_argb32_source_rgb16;
+twin_op_func _twin_rgb16_source_rgb16;
+twin_op_func _twin_a8_source_rgb16;
+twin_op_func _twin_c_source_rgb16;
+twin_op_func _twin_argb32_source_a8;
+twin_op_func _twin_rgb16_source_a8;
+twin_op_func _twin_a8_source_a8;
+twin_op_func _twin_c_source_a8;
+
+twin_argb32_t *
+_twin_fetch_rgb16 (twin_pixmap_t *pixmap, int x, int y, int w, twin_argb32_t *span);
+
+twin_argb32_t *
+_twin_fetch_argb32 (twin_pixmap_t *pixmap, int x, int y, int w, twin_argb32_t *span);
+
+#endif /* _TWININT_H_ */