aboutsummaryrefslogtreecommitdiffstats
path: root/readers.c
diff options
context:
space:
mode:
Diffstat (limited to 'readers.c')
-rw-r--r--readers.c133
1 files changed, 133 insertions, 0 deletions
diff --git a/readers.c b/readers.c
new file mode 100644
index 0000000..065be06
--- /dev/null
+++ b/readers.c
@@ -0,0 +1,133 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "readers.h"
+
+/* ----------------------------------------------------------------------- */
+
+void load_bits_lsb(unsigned char *dst, unsigned char *src, int width,
+ int on, int off)
+{
+ int i,mask,bit;
+
+ for (i = 0; i < width; i++) {
+ mask = 1 << (i & 0x07);
+ bit = src[i>>3] & mask;
+ dst[0] = bit ? on : off;
+ dst[1] = bit ? on : off;
+ dst[2] = bit ? on : off;
+ dst += 3;
+ }
+}
+
+void load_bits_msb(unsigned char *dst, unsigned char *src, int width,
+ int on, int off)
+{
+ int i,mask,bit;
+
+ for (i = 0; i < width; i++) {
+ mask = 1 << (7 - (i & 0x07));
+ bit = src[i>>3] & mask;
+ dst[0] = bit ? on : off;
+ dst[1] = bit ? on : off;
+ dst[2] = bit ? on : off;
+ dst += 3;
+ }
+}
+
+void load_gray(unsigned char *dst, unsigned char *src, int width)
+{
+ int i;
+
+ for (i = 0; i < width; i++) {
+ dst[0] = src[0];
+ dst[1] = src[0];
+ dst[2] = src[0];
+ dst += 3;
+ src += 1;
+ }
+}
+
+void load_graya(unsigned char *dst, unsigned char *src, int width)
+{
+ int i;
+
+ for (i = 0; i < width; i++) {
+ dst[0] = src[0];
+ dst[1] = src[0];
+ dst[2] = src[0];
+ dst += 3;
+ src += 2;
+ }
+}
+
+void load_rgba(unsigned char *dst, unsigned char *src, int width)
+{
+ int i;
+
+ for (i = 0; i < width; i++) {
+ dst[0] = src[0];
+ dst[1] = src[1];
+ dst[2] = src[2];
+ dst += 3;
+ src += 4;
+ }
+}
+
+/* ----------------------------------------------------------------------- */
+
+int load_add_extra(struct ida_image_info *info, enum ida_extype type,
+ unsigned char *data, unsigned int size)
+{
+ struct ida_extra *extra;
+
+ extra = malloc(sizeof(*extra));
+ if (NULL == extra)
+ return -1;
+ memset(extra,0,sizeof(*extra));
+ extra->data = malloc(size);
+ if (NULL == extra->data) {
+ free(extra);
+ return -1;
+ }
+ extra->type = type;
+ extra->size = size;
+ memcpy(extra->data,data,size);
+ extra->next = info->extra;
+ info->extra = extra;
+ return 0;
+};
+
+struct ida_extra* load_find_extra(struct ida_image_info *info,
+ enum ida_extype type)
+{
+ struct ida_extra *extra;
+
+ for (extra = info->extra; NULL != extra; extra = extra->next)
+ if (type == extra->type)
+ return extra;
+ return NULL;
+}
+
+int load_free_extras(struct ida_image_info *info)
+{
+ struct ida_extra *next;
+
+ while (NULL != info->extra) {
+ next = info->extra->next;
+ free(info->extra->data);
+ free(info->extra);
+ info->extra = next;
+ }
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+LIST_HEAD(loaders);
+
+void load_register(struct ida_loader *loader)
+{
+ list_add_tail(&loader->list, &loaders);
+}