diff --git a/include/cammy/image.h b/include/cammy/image.h new file mode 100644 index 0000000..190da69 --- /dev/null +++ b/include/cammy/image.h @@ -0,0 +1,34 @@ +#ifndef _CAMMY_IMAGE_H +#define _CAMMY_IMAGE_H + +#include + +#include + +typedef enum cammy_image_format { + CAMMY_IMAGE_UNKNOWN = 0, + CAMMY_IMAGE_2BPP_TILE = 1, + CAMMY_IMAGE_8BPP_GRAYSCALE = 2, + CAMMY_IMAGE_8BPP_RGB = 3, + CAMMY_IMAGE_8BPP_RGBA = 4 +}; + +typedef struct _cammy_image { + cammy_image_format format; + + size_t width, height; +} cammy_image; + +cammy_image *cammy_image_new(cammy_image_format format, + size_t width, + size_t height); + +void cammy_image_destroy(cammy_image *image); + +int cammy_image_copy(cammy_image *dest, + cammy_image *src, + size_t dest_x, size_t dest_y, + size_t src_x, size_t src_y, + size_t width, size_t height); + +#endif /* _CAMMY_IMAGE_H */ diff --git a/include/cammy/photo.h b/include/cammy/photo.h new file mode 100644 index 0000000..22a7263 --- /dev/null +++ b/include/cammy/photo.h @@ -0,0 +1,41 @@ +#ifndef _CAMMY_PHOTO_H +#define _CAMMY_PHOTO_H + +#include + +#include + +#define CAMMY_PHOTO_TILES_WIDTH 16 +#define CAMMY_PHOTO_TILES_HEIGHT 14 + +#define CAMMY_PHOTO_WIDTH \ + (CAMMY_TILE_WIDTH * CAMMY_PHOTO_TILES_WIDTH) + +#define CAMMY_PHOTO_HEIGHT \ + (CAMMY_TILE_HEIGHT * CAMMY_PHOTO_TILES_HEIGHT) + +#define CAMMY_PHOTO_THUMB_TILES_WIDTH 4 +#define CAMMY_PHOTO_THUMB_TILES_HEIGHT 4 + +#define CAMMY_PHOTO_INFO_SIZE 256 + +#pragma pack(1) +#pragma pack(push) + +typedef struct _cammy_photo { + cammy_tile tiles[CAMMY_PHOTO_TILES_HEIGHT] + [CAMMY_PHOTO_TILES_WIDTH]; + + cammy_tile thumb[CAMMY_PHOTO_THUMB_TILES_HEIGHT] + [CAMMY_PHOTO_THUMB_TILES_WIDTH]; + + uint8_t info[CAMMY_PHOTO_INFO_SIZE]; +} cammy_photo; + +#pragma pack(pop) + +void cammy_photo_export(cammy_photo *src, uint8_t *dest); + +void cammy_photo_import(cammy_photo *dest, uint8_t *src); + +#endif /* _CAMMY_PHOTO_H */ diff --git a/include/cammy/sram.h b/include/cammy/sram.h index 6c6c295..d38edb6 100644 --- a/include/cammy/sram.h +++ b/include/cammy/sram.h @@ -3,58 +3,22 @@ #include -#define CAMMY_SRAM_SCRATCH_SIZE 4604 -#define CAMMY_SRAM_SCRATCH_2_SIZE 4 -#define CAMMY_SRAM_TILE_SIZE 16 +#include -#define CAMMY_SRAM_TILE_WIDTH 8 -#define CAMMY_SRAM_TILE_HEIGHT 8 - -#define CAMMY_SRAM_PHOTO_TILES_WIDTH 16 -#define CAMMY_SRAM_PHOTO_TILES_HEIGHT 14 - -#define CAMMY_SRAM_PHOTO_WIDTH \ - (CAMMY_SRAM_TILE_WIDTH * CAMMY_SRAM_PHOTO_TILES_WIDTH) - -#define CAMMY_SRAM_PHOTO_HEIGHT \ - (CAMMY_SRAM_TILE_HEIGHT * CAMMY_SRAM_PHOTO_TILES_HEIGHT) - -#define CAMMY_SRAM_THUMB_TILES_WIDTH 4 -#define CAMMY_SRAM_THUMB_TILES_HEIGHT 4 - -#define CAMMY_SRAM_INFO_SIZE 256 - -#define CAMMY_SRAM_FRAME_COUNT 30 +#define CAMMY_SRAM_SCRATCH_SIZE 4604 +#define CAMMY_SRAM_SCRATCH_2_SIZE 4 +#define CAMMY_SRAM_PHOTO_COUNT 30 #pragma pack(1) #pragma pack(push) -typedef struct _cammy_sram_tile { - uint8_t data[CAMMY_SRAM_TILE_SIZE]; -} cammy_sram_tile; - -typedef struct _cammy_sram_thumb { - cammy_sram_tile tiles[CAMMY_SRAM_THUMB_TILES_HEIGHT] - [CAMMY_SRAM_THUMB_TILES_WIDTH]; -} cammy_sram_thumb; - -typedef struct _cammy_sram_photo { - cammy_sram_tile tiles[CAMMY_SRAM_PHOTO_TILES_HEIGHT] - [CAMMY_SRAM_PHOTO_TILES_WIDTH]; -} cammy_sram_photo; - -typedef struct _cammy_sram_frame { - cammy_sram_photo photo; - cammy_sram_thumb thumb; - uint8_t info[CAMMY_SRAM_INFO_SIZE]; -} cammy_sram_frame; - typedef struct _cammy_sram_data { - uint8_t scratch[CAMMY_SRAM_SCRATCH_SIZE]; - cammy_sram_photo gameface; - uint8_t scratch_2[CAMMY_SRAM_SCRATCH_2_SIZE]; + uint8_t scratch[CAMMY_SRAM_SCRATCH_SIZE]; - cammy_sram_frame frames[CAMMY_SRAM_FRAME_COUNT]; + cammy_tile gameface[CAMMY_PHOTO_TILES_HEIGHT] + [CAMMY_PHOTO_TILES_WIDTH]; + + cammy_photo photos[CAMMY_SRAM_PHOTO_COUNT]; } cammy_sram_data; typedef struct _cammy_sram { diff --git a/include/cammy/tile.h b/include/cammy/tile.h new file mode 100644 index 0000000..2bb1e70 --- /dev/null +++ b/include/cammy/tile.h @@ -0,0 +1,19 @@ +#ifndef _CAMMY_TILE_H +#define _CAMMY_TILE_H + +#include + +#define CAMMY_TILE_SIZE 16 +#define CAMMY_TILE_WIDTH 8 +#define CAMMY_TILE_HEIGHT 8 + +#pragma pack(1) +#pragma pack(push) + +typedef struct _cammy_tile { + uint8_t data[CAMMY_TILE_SIZE]; +} cammy_tile; + +#pragma pack(pop) + +#endif /* _CAMMY_TILE_H */ diff --git a/src/Makefile b/src/Makefile index 1b06eae..bd7c991 100644 --- a/src/Makefile +++ b/src/Makefile @@ -7,12 +7,12 @@ CC = $(CROSS)cc CFLAGS = $(CGFLAGS) -fPIC -Wall -O2 -I$(INCLUDE_PATH) LDFLAGS = -lz -HEADERS = sram.h HEADERS_LOCAL = pnglite.h HEADERS_BUILD = $(HEADERS_LOCAL) \ $(addprefix $(INCLUDE_PATH)/$(HEADER_SUBDIR)/,$(HEADERS)) -OBJS = sram.o pnglite.o test.o +HEADERS = sram.h photo.h +OBJS = sram.o photo.o pnglite.o test.o PROGRAM = test diff --git a/src/photo.c b/src/photo.c new file mode 100644 index 0000000..40c6457 --- /dev/null +++ b/src/photo.c @@ -0,0 +1,109 @@ +#include +#include +#include + +#include + +static uint32_t bayer_matrix[256] = { + /* + * Black gamut + */ + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + /* + * Black to dark gray gradient + */ + 0x00018000, 0x00018000, 0x00018000, 0x00018000, 0x00018000, + 0x00018020, 0x00018020, 0x00018020, 0x00018020, 0x00018020, + 0x000180a0, 0x000180a0, 0x000180a0, 0x000180a0, 0x000180a0, + 0x0001a0a0, 0x0001a0a0, 0x0001a0a0, 0x0001a0a0, 0x0001a0a0, + 0x0001a4a0, 0x0001a4a0, 0x0001a4a0, 0x0001a4a0, 0x0001a4a0, 0x0001a4a0, + 0x0001a4a1, 0x0001a4a1, 0x0001a4a1, 0x0001a4a1, 0x0001a4a1, + 0x0001a4a5, 0x0001a4a5, 0x0001a4a5, 0x0001a4a5, 0x0001a4a5, + 0x0001a5a5, 0x0001a5a5, 0x0001a5a5, 0x0001a5a5, 0x0001a5a5, + 0x0001ada5, 0x0001ada5, 0x0001ada5, 0x0001ada5, 0x0001ada5, 0x0001ada5, + 0x0001ada7, 0x0001ada7, 0x0001ada7, 0x0001ada7, 0x0001ada7, + 0x0001adaf, 0x0001adaf, 0x0001adaf, 0x0001adaf, 0x0001adaf, + 0x0001afaf, 0x0001afaf, 0x0001afaf, 0x0001afaf, 0x0001afaf, + 0x0001df5f, 0x0001df5f, 0x0001df5f, 0x0001df5f, 0x0001df5f, 0x0001df5f, + 0x0001df7f, 0x0001df7f, 0x0001df7f, 0x0001df7f, 0x0001df7f, + 0x0001dfff, 0x0001dfff, 0x0001dfff, 0x0001dfff, 0x0001dfff, + 0x0001ffff, 0x0001ffff, 0x0001ffff, 0x0001ffff, 0x0001ffff, + + /* + * Dark gray to light gray gradient + */ + 0x01028000, 0x01028000, 0x01028000, 0x01028000, 0x01028000, 0x01028000, + 0x01028020, 0x01028020, 0x01028020, 0x01028020, 0x01028020, + 0x010280a0, 0x010280a0, 0x010280a0, 0x010280a0, 0x010280a0, + 0x0102a0a0, 0x0102a0a0, 0x0102a0a0, 0x0102a0a0, 0x0102a0a0, + 0x0102a4a0, 0x0102a4a0, 0x0102a4a0, 0x0102a4a0, 0x0102a4a0, 0x0102a4a0, + 0x0102a4a1, 0x0102a4a1, 0x0102a4a1, 0x0102a4a1, 0x0102a4a1, + 0x0102a4a5, 0x0102a4a5, 0x0102a4a5, 0x0102a4a5, 0x0102a4a5, + 0x0102a5a5, 0x0102a5a5, 0x0102a5a5, 0x0102a5a5, 0x0102a5a5, + 0x0102ada5, 0x0102ada5, 0x0102ada5, 0x0102ada5, 0x0102ada5, 0x0102ada5, + 0x0102ada7, 0x0102ada7, 0x0102ada7, 0x0102ada7, 0x0102ada7, + 0x0102adaf, 0x0102adaf, 0x0102adaf, 0x0102adaf, 0x0102adaf, + 0x0102afaf, 0x0102afaf, 0x0102afaf, 0x0102afaf, 0x0102afaf, + 0x0102df5f, 0x0102df5f, 0x0102df5f, 0x0102df5f, 0x0102df5f, 0x0102df5f, + 0x0102df7f, 0x0102df7f, 0x0102df7f, 0x0102df7f, 0x0102df7f, + 0x0102dfff, 0x0102dfff, 0x0102dfff, 0x0102dfff, 0x0102dfff, + 0x0102ffff, 0x0102ffff, 0x0102ffff, 0x0102ffff, 0x0102ffff, + + /* Light gray to white gradient */ + 0x02038000, 0x02038000, 0x02038000, 0x02038000, 0x02038000, 0x02038000, + 0x02038020, 0x02038020, 0x02038020, 0x02038020, 0x02038020, + 0x020380a0, 0x020380a0, 0x020380a0, 0x020380a0, 0x020380a0, + 0x0203a0a0, 0x0203a0a0, 0x0203a0a0, 0x0203a0a0, 0x0203a0a0, + 0x0203a4a0, 0x0203a4a0, 0x0203a4a0, 0x0203a4a0, 0x0203a4a0, 0x0203a4a0, + 0x0203a4a1, 0x0203a4a1, 0x0203a4a1, 0x0203a4a1, 0x0203a4a1, + 0x0203a4a5, 0x0203a4a5, 0x0203a4a5, 0x0203a4a5, 0x0203a4a5, + 0x0203a5a5, 0x0203a5a5, 0x0203a5a5, 0x0203a5a5, 0x0203a5a5, + 0x0203ada5, 0x0203ada5, 0x0203ada5, 0x0203ada5, 0x0203ada5, 0x0203ada5, + 0x0203ada7, 0x0203ada7, 0x0203ada7, 0x0203ada7, 0x0203ada7, + 0x0203adaf, 0x0203adaf, 0x0203adaf, 0x0203adaf, 0x0203adaf, + 0x0203afaf, 0x0203afaf, 0x0203afaf, 0x0203afaf, 0x0203afaf, + 0x0203df5f, 0x0203df5f, 0x0203df5f, 0x0203df5f, 0x0203df5f, 0x0203df5f, + 0x0203df7f, 0x0203df7f, 0x0203df7f, 0x0203df7f, 0x0203df7f, + 0x0203dfff, 0x0203dfff, 0x0203dfff, 0x0203dfff, 0x0203dfff, + 0x0203ffff, 0x0203ffff, 0x0203ffff, 0x0203ffff, 0x0203ffff, +}; + +void cammy_photo_import(cammy_photo *dest, uint8_t *src) { + size_t x, y; + + memset(&dest->tiles, '\x00', sizeof(dest->tiles)); + memset(&dest->thumb, '\xff', sizeof(dest->thumb)); + + for (y=0; ytiles[y>>3][x>>3]; + + int tile_x = x & 7, + tile_y = y & 7; + + uint8_t r = src[4*CAMMY_PHOTO_WIDTH*y+4*x], + g = src[4*CAMMY_PHOTO_WIDTH*y+4*x+1], + b = src[4*CAMMY_PHOTO_WIDTH*y+4*x+2]; + + uint8_t gray = (uint8_t) + ((0.2126 * (float)r) + + (0.7152 * (float)g) + + (0.0722 * (float)b)); + + uint32_t slot = bayer_matrix[gray]; + uint32_t from = (slot & 0x03000000) >> 24; + uint32_t to = (slot & 0x00030000) >> 16; + uint8_t value; + + if (slot & (0x8000 >> ((y & 3) << 2) >> (x & 3))) { + value = to ^ 0x03; + } else { + value = from ^ 0x03; + } + + tile->data[2*tile_y] |= (value & 0x01) << (tile_x ^ 7); + tile->data[2*tile_y+1] |= ((value & 0x02) >> 1) << (tile_x ^ 7); + } + } +} diff --git a/src/sram.c b/src/sram.c index ee0e028..f405875 100644 --- a/src/sram.c +++ b/src/sram.c @@ -34,8 +34,7 @@ cammy_sram *cammy_sram_open(const char *file) { } sram->size = st.st_size; - sram->page_size = (size_t)sysconf(_SC_PAGESIZE); - sram->mapped_size = _mapped_size(st.st_size, sram->page_size); + sram->page_size = (size_t)sysconf(_SC_PAGESIZE); sram->mapped_size = _mapped_size(st.st_size, sram->page_size); if ((sram->data = mmap(NULL, sram->mapped_size, PROT_READ | PROT_WRITE, MAP_SHARED, sram->fd, 0)) == NULL) { diff --git a/src/test.c b/src/test.c index a4a40bf..b729b6f 100644 --- a/src/test.c +++ b/src/test.c @@ -6,71 +6,7 @@ #include "pnglite.h" #include - -static uint32_t bayer_matrix[256] = { - /* - * Black gamut - */ - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - - /* - * Black to dark gray gradient - */ - 0x00018000, 0x00018000, 0x00018000, 0x00018000, 0x00018000, - 0x00018020, 0x00018020, 0x00018020, 0x00018020, 0x00018020, - 0x000180a0, 0x000180a0, 0x000180a0, 0x000180a0, 0x000180a0, - 0x0001a0a0, 0x0001a0a0, 0x0001a0a0, 0x0001a0a0, 0x0001a0a0, - 0x0001a4a0, 0x0001a4a0, 0x0001a4a0, 0x0001a4a0, 0x0001a4a0, 0x0001a4a0, - 0x0001a4a1, 0x0001a4a1, 0x0001a4a1, 0x0001a4a1, 0x0001a4a1, - 0x0001a4a5, 0x0001a4a5, 0x0001a4a5, 0x0001a4a5, 0x0001a4a5, - 0x0001a5a5, 0x0001a5a5, 0x0001a5a5, 0x0001a5a5, 0x0001a5a5, - 0x0001ada5, 0x0001ada5, 0x0001ada5, 0x0001ada5, 0x0001ada5, 0x0001ada5, - 0x0001ada7, 0x0001ada7, 0x0001ada7, 0x0001ada7, 0x0001ada7, - 0x0001adaf, 0x0001adaf, 0x0001adaf, 0x0001adaf, 0x0001adaf, - 0x0001afaf, 0x0001afaf, 0x0001afaf, 0x0001afaf, 0x0001afaf, - 0x0001df5f, 0x0001df5f, 0x0001df5f, 0x0001df5f, 0x0001df5f, 0x0001df5f, - 0x0001df7f, 0x0001df7f, 0x0001df7f, 0x0001df7f, 0x0001df7f, - 0x0001dfff, 0x0001dfff, 0x0001dfff, 0x0001dfff, 0x0001dfff, - 0x0001ffff, 0x0001ffff, 0x0001ffff, 0x0001ffff, 0x0001ffff, - - /* - * Dark gray to light gray gradient - */ - 0x01028000, 0x01028000, 0x01028000, 0x01028000, 0x01028000, 0x01028000, - 0x01028020, 0x01028020, 0x01028020, 0x01028020, 0x01028020, - 0x010280a0, 0x010280a0, 0x010280a0, 0x010280a0, 0x010280a0, - 0x0102a0a0, 0x0102a0a0, 0x0102a0a0, 0x0102a0a0, 0x0102a0a0, - 0x0102a4a0, 0x0102a4a0, 0x0102a4a0, 0x0102a4a0, 0x0102a4a0, 0x0102a4a0, - 0x0102a4a1, 0x0102a4a1, 0x0102a4a1, 0x0102a4a1, 0x0102a4a1, - 0x0102a4a5, 0x0102a4a5, 0x0102a4a5, 0x0102a4a5, 0x0102a4a5, - 0x0102a5a5, 0x0102a5a5, 0x0102a5a5, 0x0102a5a5, 0x0102a5a5, - 0x0102ada5, 0x0102ada5, 0x0102ada5, 0x0102ada5, 0x0102ada5, 0x0102ada5, - 0x0102ada7, 0x0102ada7, 0x0102ada7, 0x0102ada7, 0x0102ada7, - 0x0102adaf, 0x0102adaf, 0x0102adaf, 0x0102adaf, 0x0102adaf, - 0x0102afaf, 0x0102afaf, 0x0102afaf, 0x0102afaf, 0x0102afaf, - 0x0102df5f, 0x0102df5f, 0x0102df5f, 0x0102df5f, 0x0102df5f, 0x0102df5f, - 0x0102df7f, 0x0102df7f, 0x0102df7f, 0x0102df7f, 0x0102df7f, - 0x0102dfff, 0x0102dfff, 0x0102dfff, 0x0102dfff, 0x0102dfff, - 0x0102ffff, 0x0102ffff, 0x0102ffff, 0x0102ffff, 0x0102ffff, - - /* Light gray to white gradient */ - 0x02038000, 0x02038000, 0x02038000, 0x02038000, 0x02038000, 0x02038000, - 0x02038020, 0x02038020, 0x02038020, 0x02038020, 0x02038020, - 0x020380a0, 0x020380a0, 0x020380a0, 0x020380a0, 0x020380a0, - 0x0203a0a0, 0x0203a0a0, 0x0203a0a0, 0x0203a0a0, 0x0203a0a0, - 0x0203a4a0, 0x0203a4a0, 0x0203a4a0, 0x0203a4a0, 0x0203a4a0, 0x0203a4a0, - 0x0203a4a1, 0x0203a4a1, 0x0203a4a1, 0x0203a4a1, 0x0203a4a1, - 0x0203a4a5, 0x0203a4a5, 0x0203a4a5, 0x0203a4a5, 0x0203a4a5, - 0x0203a5a5, 0x0203a5a5, 0x0203a5a5, 0x0203a5a5, 0x0203a5a5, - 0x0203ada5, 0x0203ada5, 0x0203ada5, 0x0203ada5, 0x0203ada5, 0x0203ada5, - 0x0203ada7, 0x0203ada7, 0x0203ada7, 0x0203ada7, 0x0203ada7, - 0x0203adaf, 0x0203adaf, 0x0203adaf, 0x0203adaf, 0x0203adaf, - 0x0203afaf, 0x0203afaf, 0x0203afaf, 0x0203afaf, 0x0203afaf, - 0x0203df5f, 0x0203df5f, 0x0203df5f, 0x0203df5f, 0x0203df5f, 0x0203df5f, - 0x0203df7f, 0x0203df7f, 0x0203df7f, 0x0203df7f, 0x0203df7f, - 0x0203dfff, 0x0203dfff, 0x0203dfff, 0x0203dfff, 0x0203dfff, - 0x0203ffff, 0x0203ffff, 0x0203ffff, 0x0203ffff, 0x0203ffff, -}; +#include static void usage(int argc, char **argv, const char *message, ...) { if (message) { @@ -82,7 +18,7 @@ static void usage(int argc, char **argv, const char *message, ...) { fprintf(stderr, "\n"); } - fprintf(stderr, "usage: %s file.sav frame1..30 photo.png\n", argv[0]); + fprintf(stderr, "usage: %s file.sav photo1..30 photo.png\n", argv[0]); exit(1); } @@ -91,49 +27,10 @@ static inline uint8_t *buf_malloc(png_t *png) { return malloc(4 * png->width * png->height); } -static void image_copy(cammy_sram_frame *frame, uint8_t *buf) { - size_t x, y; - - memset(&frame->thumb, '\xff', sizeof(cammy_sram_thumb)); - memset(&frame->photo, '\x00', sizeof(cammy_sram_photo)); - - for (y=0; yphoto.tiles[y>>3][x>>3]; - - int tile_x = x & 7, - tile_y = y & 7; - - uint8_t r = buf[4*CAMMY_SRAM_PHOTO_WIDTH*y+4*x], - g = buf[4*CAMMY_SRAM_PHOTO_WIDTH*y+4*x+1], - b = buf[4*CAMMY_SRAM_PHOTO_WIDTH*y+4*x+2]; - - uint8_t gray = (uint8_t) - ((0.2126 * (float)r) - + (0.7152 * (float)g) - + (0.0722 * (float)b)); - - uint32_t slot = bayer_matrix[gray]; - uint32_t from = (slot & 0x03000000) >> 24; - uint32_t to = (slot & 0x00030000) >> 16; - uint8_t value; - - if (slot & (0x8000 >> ((y & 3) << 2) >> (x & 3))) { - value = to ^ 0x03; - } else { - value = from ^ 0x03; - } - - tile->data[2*tile_y] |= (value & 0x01) << (tile_x ^ 7); - tile->data[2*tile_y+1] |= ((value & 0x02) >> 1) << (tile_x ^ 7); - } - } -} - int main(int argc, char **argv) { cammy_sram *sram; png_t *png; - int frame = 0; + int photo = 0; uint8_t *buf; int error; @@ -141,15 +38,15 @@ int main(int argc, char **argv) { if (argc < 2) { usage(argc, argv, "No save file provided"); } else if (argc < 3) { - usage(argc, argv, "No frame number provided"); + usage(argc, argv, "No photo number provided"); } else if (argc < 4) { usage(argc, argv, "No photo provided"); } - frame = atoi(argv[2]); + photo = atoi(argv[2]); - if (frame < 1 || frame > CAMMY_SRAM_FRAME_COUNT) { - usage(argc, argv, "Invalid frame number"); + if (photo < 1 || photo > CAMMY_SRAM_PHOTO_COUNT) { + usage(argc, argv, "Invalid photo number"); } if ((sram = cammy_sram_open(argv[1])) == NULL) { @@ -172,8 +69,8 @@ int main(int argc, char **argv) { goto error_png_open_file_read; } - if (png->width != CAMMY_SRAM_PHOTO_WIDTH - || png->height != CAMMY_SRAM_PHOTO_HEIGHT) { + if (png->width != CAMMY_PHOTO_WIDTH + || png->height != CAMMY_PHOTO_HEIGHT) { fprintf(stderr, "%s: %s: %s\n", argv[0], argv[3], "Invalid image dimensions"); @@ -194,7 +91,7 @@ int main(int argc, char **argv) { goto error_png_get_data; } - image_copy(&sram->data->frames[frame-1], buf); + cammy_photo_import(&sram->data->photos[photo-1], buf); free(buf);