Oh come on just freaking work
This commit is contained in:
parent
936b272918
commit
bee7e5c338
8 changed files with 225 additions and 162 deletions
34
include/cammy/image.h
Normal file
34
include/cammy/image.h
Normal file
|
@ -0,0 +1,34 @@
|
|||
#ifndef _CAMMY_IMAGE_H
|
||||
#define _CAMMY_IMAGE_H
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <cammy/tile.h>
|
||||
|
||||
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 */
|
41
include/cammy/photo.h
Normal file
41
include/cammy/photo.h
Normal file
|
@ -0,0 +1,41 @@
|
|||
#ifndef _CAMMY_PHOTO_H
|
||||
#define _CAMMY_PHOTO_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include <cammy/tile.h>
|
||||
|
||||
#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 */
|
|
@ -3,58 +3,22 @@
|
|||
|
||||
#include <stdint.h>
|
||||
|
||||
#define CAMMY_SRAM_SCRATCH_SIZE 4604
|
||||
#define CAMMY_SRAM_SCRATCH_2_SIZE 4
|
||||
#define CAMMY_SRAM_TILE_SIZE 16
|
||||
#include <cammy/photo.h>
|
||||
|
||||
#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 {
|
||||
|
|
19
include/cammy/tile.h
Normal file
19
include/cammy/tile.h
Normal file
|
@ -0,0 +1,19 @@
|
|||
#ifndef _CAMMY_TILE_H
|
||||
#define _CAMMY_TILE_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#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 */
|
|
@ -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
|
||||
|
||||
|
|
109
src/photo.c
Normal file
109
src/photo.c
Normal file
|
@ -0,0 +1,109 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <cammy/photo.h>
|
||||
|
||||
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; y<CAMMY_PHOTO_HEIGHT; y++) {
|
||||
for (x=0; x<CAMMY_PHOTO_WIDTH; x++) {
|
||||
cammy_tile *tile = &dest->tiles[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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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) {
|
||||
|
|
123
src/test.c
123
src/test.c
|
@ -6,71 +6,7 @@
|
|||
#include "pnglite.h"
|
||||
|
||||
#include <cammy/sram.h>
|
||||
|
||||
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 <cammy/photo.h>
|
||||
|
||||
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; y<CAMMY_SRAM_PHOTO_HEIGHT; y++) {
|
||||
for (x=0; x<CAMMY_SRAM_PHOTO_WIDTH; x++) {
|
||||
cammy_sram_tile *tile = &frame->photo.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);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue