/* this is the plugin entry point */ enum plugin_status plugin_start(const void* parameter) { (void)parameter; b = rb->lcd_framebuffer; rb->lcd_set_background(LCD_RGBPACK(0,0,0)); rb->lcd_clear_display(); // TODO: Optimizes this by e.g. invalidating rects input_bmp.data = (char*)input_bmp_data; output_bmp.data = (char*)output_bmp_data; int ret = rb->read_bmp_file("/test.bmp", &input_bmp, sizeof(input_bmp_data), FORMAT_NATIVE, NULL); if (ret < 0) { rb->splash(HZ, "Could not load /test.bmp"); return PLUGIN_ERROR; } int button; output_bmp.width = 50; output_bmp.height = 50; DEBUGF("input_bmp_data starts at %p\n", input_bmp_data); DEBUGF("output_bmp_data starts at %p\n", output_bmp_data); int scale_algorithm = 0; while(1) { rb->lcd_clear_display(); rb->lcd_bitmap(input_bmp_data, 0, 0, input_bmp.width, input_bmp.height); switch ( scale_algorithm ) { case 0: smooth_resize_bitmap(&input_bmp, &output_bmp); rb->lcd_putsxy(0,0,"smooth_resize_bitmap"); break; case 1: simple_resize_bitmap(&input_bmp, &output_bmp); rb->lcd_putsxy(0,0,"simple_resize_bitmap"); break; } rb->lcd_bitmap(output_bmp_data, 0, 100, output_bmp.width, output_bmp.height); rb->lcd_update(); button = pluginlib_getaction(HZ, plugin_contexts, ARRAYLEN(plugin_contexts)); switch (button) { case BUTTON_QUIT: return PLUGIN_OK; case SIZE_INCREASE: case SIZE_INCREASE_REPEAT: if (output_bmp.width < MAX_OUTPUT_WIDTH - 2) output_bmp.width += 2; if (output_bmp.height < MAX_OUTPUT_HEIGHT - 2) output_bmp.height += 2; break; case SIZE_DECREASE: case SIZE_DECREASE_REPEAT: if (output_bmp.width > 2) output_bmp.width -= 2; if (output_bmp.height > 2) output_bmp.height -= 2; break; case WIDTH_INCREASE: case WIDTH_INCREASE_REPEAT: if (output_bmp.width < MAX_OUTPUT_WIDTH - 2) output_bmp.width += 2; break; case WIDTH_DECREASE: case WIDTH_DECREASE_REPEAT: if (output_bmp.width > 2) output_bmp.width -= 2; break; case CHANGE_MODE: scale_algorithm = (scale_algorithm+1)%2; break; } } return PLUGIN_OK; }
/* this is the plugin entry point */ enum plugin_status plugin_start(const void* parameter) { static char filename[MAX_PATH]; int fd; int cols; int rows; int maxval; int result; struct bitmap small_bitmap, orig_bitmap; if(!parameter) return PLUGIN_ERROR; size_t buffer_size; char *audiobuf = rb->plugin_get_buffer(&buffer_size); if (buffer_size < PPM_MAXSIZE + LCD_WIDTH * LCD_HEIGHT + 1) { /* steal from audiobuffer if plugin buffer is too small */ audiobuf = rb->plugin_get_audio_buffer(&buffer_size); if (buffer_size < PPM_MAXSIZE + LCD_WIDTH * LCD_HEIGHT + 1) { rb->splash(HZ, "Not enough memory"); return PLUGIN_ERROR; } } /* align on 16 bits */ audiobuf = (char *)(((uintptr_t)audiobuf + 1) & ~1); buffer = (fb_data *)audiobuf; lcd_buf = (fb_data*) (audiobuf + PPM_MAXSIZE); rb->strcpy(filename, parameter); fd = rb->open(filename, O_RDONLY); if (fd < 0) { ppm_error("Couldnt open file: %s, %d", filename, fd); return PLUGIN_ERROR; } result = read_ppm(fd, &cols, &rows, &maxval); rb->close(fd); if(result == PLUGIN_ERROR) return PLUGIN_ERROR; orig_bitmap.width = cols; orig_bitmap.height = rows; orig_bitmap.data = (char*)buffer; if (cols > LCD_WIDTH || rows > LCD_HEIGHT) { if (cols > LCD_WIDTH) { small_bitmap.width = LCD_WIDTH; small_bitmap.height = (int)(((float)LCD_WIDTH / (float)cols) * (float)rows); } else { /* rows > LCD_HEIGHT */ small_bitmap.width = (int)(((float)LCD_HEIGHT / (float)rows) * (float)cols); small_bitmap.height = LCD_HEIGHT; } small_bitmap.data = (char*)lcd_buf; smooth_resize_bitmap( &orig_bitmap, &small_bitmap ); rb->lcd_bitmap((fb_data*)small_bitmap.data, 0, 0, small_bitmap.width, small_bitmap.height); } else { rb->lcd_bitmap((fb_data*)orig_bitmap.data, 0, 0, cols, rows); } rb->lcd_update(); rb->button_get(true); return PLUGIN_OK; }