diff options
Diffstat (limited to 'readers.c')
-rw-r--r-- | readers.c | 133 |
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); +} |