/* returns a bitmap description string */ static void get_jpeg_desc(AL_CONST DATAFILE *dat, char *s) { BITMAP *bmp = (BITMAP *)load_memory_jpg(dat->dat, dat->size, NULL); sprintf(s, "JPG image (%dx%d truecolor, %ld KB)", bmp->w, bmp->h, dat->size / 1024); destroy_bitmap(bmp); }
static void trans_mjpeg2bgr(const unsigned char * src, unsigned char * dst, int width, int height, int srcsize) { unsigned char * bmp; unsigned char * jpegbuff; jpegbuff = malloc(srcsize + 0x1a4); int newsrcsize = mjpeg2jpeg(jpegbuff, src, srcsize); bmp = load_memory_jpg(jpegbuff, newsrcsize); memcpy(dst, bmp, width * height * 3); free(jpegbuff); free(bmp); }
/* draws a bitmap onto the grabber object view window */ static void plot_jpeg(AL_CONST DATAFILE *dat, int x, int y) { BITMAP *b = load_memory_jpg(dat->dat, dat->size, NULL); int w = b->w; int h = b->h; fixed scale; if (w > SCREEN_W-x-8) { scale = itofix(SCREEN_W-x-8) / w; w = (w * scale) >> 16; h = (h * scale) >> 16; }
static int preview_proc(int msg, DIALOG *d, int c) { BITMAP *bmp; static int quality = 75, flags = JPG_SAMPLING_444; int new_quality, new_flags = 0; int size; (void)c; new_quality = settings_dialog[QUALITY_SLIDER].d2 + 1; if (settings_dialog[SS_444_RADIO].flags & D_SELECTED) new_flags = JPG_SAMPLING_444; if (settings_dialog[SS_422_RADIO].flags & D_SELECTED) new_flags = JPG_SAMPLING_422; if (settings_dialog[SS_411_RADIO].flags & D_SELECTED) new_flags = JPG_SAMPLING_411; if (settings_dialog[GREYSCALE_CHECK].flags & D_SELECTED) new_flags |= JPG_GREYSCALE; if (settings_dialog[OPTIMIZE_CHECK].flags & D_SELECTED) new_flags |= JPG_OPTIMIZE; switch (msg) { case MSG_START: d->dp2 = (void *)create_bitmap(d->w, d->h); bmp = (BITMAP *)d->dp; d->dp3 = malloc(ESTIMATED_MAX_JPG_SIZE(bmp)); clear_to_color((BITMAP *)d->dp2, gui_mg_color); d->d2 = 20; sprintf(size_string, "Size: ?"); break; case MSG_END: destroy_bitmap((BITMAP *)d->dp2); free(d->dp3); break; case MSG_DRAW: clear_to_color((BITMAP *)d->dp2, gui_mg_color); bmp = (BITMAP *)d->dp; bmp = create_sub_bitmap(bmp, MAX(0, (bmp->w - d->w) / 2), MAX(0, (bmp->h - d->h) / 2), d->w, d->h); if (!bmp) goto preview_error; size = ESTIMATED_MAX_JPG_SIZE(bmp); if (save_memory_jpg_ex(d->dp3, &size, bmp, NULL, quality, flags, NULL)) goto preview_error; size = ESTIMATED_MAX_JPG_SIZE(bmp); destroy_bitmap(bmp); bmp = load_memory_jpg(d->dp3, size, NULL); if (!bmp) goto preview_error; blit(bmp, (BITMAP *)d->dp2, 0, 0, 0, 0, bmp->w, bmp->h); rect(screen, d->x - 1, d->y - 1, d->x + d->w, d->y + d->h, gui_fg_color); blit((BITMAP *)d->dp2, screen, 0, 0, d->x, d->y, d->w, d->h); destroy_bitmap(bmp); object_message(&settings_dialog[QUALITY_TEXT], MSG_DRAW, 0); break; case MSG_IDLE: if (d->d2 > 0) { d->d2--; if (d->d2 == 0) { quality = new_quality; flags = new_flags; bmp = (BITMAP *)d->dp; size = ESTIMATED_MAX_JPG_SIZE(bmp); if (save_memory_jpg_ex(d->dp3, &size, bmp, NULL, quality, flags, NULL)) goto preview_error; sprintf(size_string, "Size: %dx%d, %.1f Kbytes ", bmp->w, bmp->h, (double)size / 1024.0); object_message(&settings_dialog[SIZE_TEXT], MSG_DRAW, 0); return D_REDRAWME; } } if ((new_quality != quality) || (new_flags != flags)) { quality = new_quality; flags = new_flags; d->d2 = 20; if (flags & JPG_GREYSCALE) { settings_dialog[SS_444_RADIO].flags |= D_DISABLED; settings_dialog[SS_422_RADIO].flags |= D_DISABLED; settings_dialog[SS_411_RADIO].flags |= D_DISABLED; } else { settings_dialog[SS_444_RADIO].flags &= ~D_DISABLED; settings_dialog[SS_422_RADIO].flags &= ~D_DISABLED; settings_dialog[SS_411_RADIO].flags &= ~D_DISABLED; } settings_dialog[SS_444_RADIO].fg = (flags & JPG_GREYSCALE ? gui_mg_color : gui_fg_color); settings_dialog[SS_422_RADIO].fg = (flags & JPG_GREYSCALE ? gui_mg_color : gui_fg_color); settings_dialog[SS_411_RADIO].fg = (flags & JPG_GREYSCALE ? gui_mg_color : gui_fg_color); object_message(&settings_dialog[SS_444_RADIO], MSG_DRAW, 0); object_message(&settings_dialog[SS_422_RADIO], MSG_DRAW, 0); object_message(&settings_dialog[SS_411_RADIO], MSG_DRAW, 0); return D_REDRAWME; } break; } return D_O_K; preview_error: line((BITMAP *)d->dp2, 0, 0, d->w - 1, d->h - 1, 0); line((BITMAP *)d->dp2, d->w - 1, 0, 0, d->h - 1, 0); blit((BITMAP *)d->dp2, screen, 0, 0, d->x, d->y, d->w, d->h); return D_O_K; }
int main(int argc, char **argv) { BITMAP *bmp; PACKFILE *f; char *file = NULL, *times = NULL, *memory = NULL; int arg, i, n, start, end, size; allegro_init(); install_keyboard(); install_timer(); jpgalleg_init(); set_color_conversion(COLORCONV_NONE); for (arg = 1; arg < argc; arg++) { if (!strcmp(argv[arg], "-nommx")) cpu_capabilities &= ~CPU_MMX; else if (!strcmp(argv[arg], "-f")) file = argv[++arg]; else if (!times) times = argv[arg]; else about(); } if (times) n = atoi(times); else n = 30; if (!file) file = "jpgalleg.jpg"; bmp = load_jpg(file, NULL); if (!bmp) { printf("Cannot find %s!\n", file); return -1; } size = file_size(file); memory = (char *)malloc(size); if (!memory) { printf("Not enough memory!\n"); return -1; } f = pack_fopen(file, F_READ); pack_fread(memory, size, f); pack_fclose(f); LOCK_FUNCTION(timer_handler); LOCK_VARIABLE(timer); install_int(timer_handler, 10); printf("Average timing for %d function calls:\n", n); start = timer; for (i = 0; i < n; i++) bmp = load_jpg(file, NULL); end = timer; printf("load_jpg: %f seconds\n", ((float)end - (float)start) / 1000.0 / (float)n); start = timer; for (i = 0; i < n; i++) bmp = load_memory_jpg(memory, size, NULL); end = timer; printf("load_memory_jpg: %f seconds\n", ((float)end - (float)start) / 1000.0 / (float)n); free(memory); return 0; }