u8 LCD_ImageDimensions(const char *file, u16 *w, u16 *h) { FILE *fh; u32 black, white; fh = fopen(file, "r"); if(! fh) { return 0; } int ret = image_read_header(fh, w, h, &black, &white); fclose(fh); return ret; }
void LCD_DrawWindowedImageFromFile(u16 x, u16 y, const char *file, s16 w, s16 h, u16 x_off, u16 y_off) { FILE *fh; u32 black, white; u8 buf[48]; u16 img_w = 0, img_h = 0; fh = fopen(file, "rb"); if(! fh) { printf("DEBUG: LCD_DrawWindowedImageFromFile: Image not found: %s\n", file); if (w > 0 && h > 0) LCD_FillRect(x, y, w, h, 0); return; } if (! image_read_header(fh, &img_w, &img_h, &black, &white)) { fclose(fh); return; } //printf("DEBUG: LCD_DrawWindowedImageFromFile: %s %dx%d %06x %06x\n", file, img_w, img_h, black, white); if (img_w > sizeof(buf)*8) { printf("DEBUG: LCD_DrawWindowedImageFromFile: Image is too wide: %d > %d\n", img_w, sizeof(buf)*8); fclose(fh); return; } if (w < 0) w = img_w; if (h < 0) h = img_h; LCD_DrawStart(x, y, x + w - 1, y + h -1, DRAW_NWSE); unsigned bytes = (img_w + 7) / 8; fseek(fh, bytes * y_off, SEEK_CUR); for (int i = 0; i < h; i++) { int ret = fread(buf, bytes, 1, fh); if (ret != 1) { //printf("DEBUG: LCD_DrawWindowedImageFromFile: Buffer read issue? (%s, %d, %d)\n", file, ret, i); break; } for (int j = 0; j < w; j++) { unsigned val = buf[(j + x_off) / 8] & (1 << (7 - ((j + x_off) % 8))); LCD_DrawPixelXY(x+j, y+i, val ? black : white); } } fclose(fh); LCD_DrawStop(); }
FILE *open_image_file (NV_CHAR *path) { FILE *fp; NV_INT32 i; OLD_IMAGE_INDEX_T old_record; NV_INT32 big_endian (); swap = (NV_BOOL) big_endian (); l_head.text.data_size = 0; /* Brute force! Load the index into memory, it ain't big anyway. */ if ((fp = fopen64 (path, "rb")) == NULL) { perror (path); } else { old = image_read_header (fp, &l_head); if (records) free (records); records = (IMAGE_INDEX_T *) calloc (l_head.text.number_images, sizeof (IMAGE_INDEX_T)); if (records == NULL) { perror ("Allocating image index"); exit (-1); } if (old) { for (i = 0 ; i < l_head.text.number_images ; i++) { fread (&old_record, sizeof (OLD_IMAGE_INDEX_T), 1, fp); if (swap) { swap_NV_INT64 (&old_record.timestamp); swap_NV_INT64 (&old_record.byte_offset); swap_NV_INT32 (&old_record.image_size); swap_NV_INT32 (&old_record.image_number); } records[i].timestamp = old_record.timestamp; records[i].byte_offset = old_record.byte_offset; records[i].image_size = old_record.image_size; records[i].image_number = old_record.image_number; l_head.text.data_size += records[i].image_size; } } else { for (i = 0 ; i < l_head.text.number_images ; i++) { fread (&records[i], sizeof (IMAGE_INDEX_T), 1, fp); if (swap) { swap_NV_INT64 (&records[i].timestamp); swap_NV_INT64 (&records[i].byte_offset); swap_NV_INT32 (&records[i].image_size); swap_NV_INT32 (&records[i].image_number); } l_head.text.data_size += records[i].image_size; } } } return (fp); }