diff --git a/backends/frotz/dumb_pic.c b/backends/frotz/dumb_pic.c new file mode 100644 index 0000000000000000000000000000000000000000..33eab0375d2f8f98cd8f067bbb8fc76aaf8572da --- /dev/null +++ b/backends/frotz/dumb_pic.c @@ -0,0 +1,153 @@ +/* dumb-pic.c + * $Id: dumb-pic.c,v 1.1.1.1 2002/03/26 22:38:34 feedle Exp $ + * + * Copyright 1997,1998 Alcibiades Petrofsky + * . + * Any use permitted provided this notice stays intact. + */ +#include "dumb_frotz.h" + +f_setup_t f_setup; + +#define PIC_FILE_HEADER_FLAGS 1 +#define PIC_FILE_HEADER_NUM_IMAGES 4 +#define PIC_FILE_HEADER_ENTRY_SIZE 8 +#define PIC_FILE_HEADER_VERSION 14 + +#define PIC_HEADER_NUMBER 0 +#define PIC_HEADER_WIDTH 2 +#define PIC_HEADER_HEIGHT 4 + +static struct { + int z_num; + int width; + int height; + int orig_width; + int orig_height; +} *pict_info; +static int num_pictures = 0; + +static unsigned char lookupb(unsigned char *p, int n) {return p[n];} +static unsigned short lookupw(unsigned char *p, int n) +{ + return (p[n + 1] << 8) | p[n]; +} + +void dumb_init_pictures (char *filename) +{ + FILE *file = NULL; + int success = FALSE; + unsigned char gheader[16]; + unsigned char *raw_info = NULL; + int i, entry_size, flags; + float x_scaler, y_scaler; + + do { + if ((h_version != V6) + || !filename + || ((file = fopen (filename, "rb")) == NULL) + || (fread(&gheader, sizeof (gheader), 1, file) != 1)) + break; + + num_pictures = lookupw(gheader, PIC_FILE_HEADER_NUM_IMAGES); + entry_size = lookupb(gheader, PIC_FILE_HEADER_ENTRY_SIZE); + flags = lookupb(gheader, PIC_FILE_HEADER_FLAGS); + + raw_info = malloc(num_pictures * entry_size); + + if (fread(raw_info, num_pictures * entry_size, 1, file) != 1) + break; + + pict_info = malloc((num_pictures + 1) * sizeof(*pict_info)); + pict_info[0].z_num = 0; + pict_info[0].height = num_pictures; + pict_info[0].width = lookupw(gheader, PIC_FILE_HEADER_VERSION); + + y_scaler = h_screen_rows / 200.0; + x_scaler = h_screen_cols / ((flags & 0x08) ? 640.0 : 320.0); + + /* Copy and scale. */ + for (i = 1; i <= num_pictures; i++) { + unsigned char *p = raw_info + entry_size * (i - 1); + pict_info[i].z_num = lookupw(p, PIC_HEADER_NUMBER); + pict_info[i].orig_height = lookupw(p, PIC_HEADER_HEIGHT); + pict_info[i].orig_width = lookupw(p, PIC_HEADER_WIDTH); + pict_info[i].height = pict_info[i].orig_height * y_scaler + .5; + pict_info[i].width = pict_info[i].orig_width * x_scaler + .5; + } + success = TRUE; + } while (0); + if (file) + fclose(file); + if (raw_info) + free(raw_info); + if (success) + h_config |= CONFIG_PICTURES; + else + { + h_flags &= ~GRAPHICS_FLAG; + if (filename) + fprintf(stderr, "Warning: could not read graphics file %s\n", filename); + } +} + +/* Convert a Z picture number to an index into pict_info. */ +static int z_num_to_index(int n) +{ + int i; + for (i = 0; i <= num_pictures; i++) + if (pict_info[i].z_num == n) + return i; + return -1; +} + +int os_picture_data(int num, int *height, int *width) +{ + int index; + + *height = 0; + *width = 0; + + if (!pict_info) + return FALSE; + + if ((index = z_num_to_index(num)) == -1) + return FALSE; + + *height = pict_info[index].height; + *width = pict_info[index].width; + + return TRUE; +} + +void os_draw_picture (int num, int row, int col) +{ + int width, height, r, c; + if (!os_picture_data(num, &height, &width) || !width || !height) + return; + col--, row--; + /* Draw corners */ + dumb_set_picture_cell(row, col, '+'); + dumb_set_picture_cell(row, col + width - 1, '+'); + dumb_set_picture_cell(row + height - 1, col, '+'); + dumb_set_picture_cell(row + height - 1, col + width - 1, '+'); + /* sides */ + for (c = col + 1; c < col + width - 1; c++) { + dumb_set_picture_cell(row, c, '-'); + dumb_set_picture_cell(row + height - 1, c, '-'); + } + for (r = row + 1; r < row + height - 1; r++) { + dumb_set_picture_cell(r, col, '|'); + dumb_set_picture_cell(r, col + width - 1, '|'); + } + /* body, but for last line */ + for (r = row + 1; r < row + height - 2; r++) + for (c = col + 1; c < col + width - 1; c++) + dumb_set_picture_cell(r, c, ':'); + /* Last line of body, including picture number. */ + if (height >= 3) + for (c = col + width - 2; c > col; c--, (num /= 10)) + dumb_set_picture_cell(row + height - 2, c, num ? (num % 10 + '0') : ':'); +} + +int os_peek_colour (void) {return BLACK_COLOUR; }