2010-01-18 12:46:19 +00:00
|
|
|
/***************************************************************************
|
|
|
|
* __________ __ ___.
|
|
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
|
|
* \/ \/ \/ \/ \/
|
|
|
|
* $Id$
|
|
|
|
*
|
2010-11-21 13:47:56 +00:00
|
|
|
* user intereface of image viewer.
|
2010-01-18 12:46:19 +00:00
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
|
|
* KIND, either express or implied.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
2010-11-21 13:47:56 +00:00
|
|
|
#ifndef _IMAGE_VIEWER_H
|
|
|
|
#define _IMAGE_VIEWER_H
|
2010-01-18 12:46:19 +00:00
|
|
|
|
|
|
|
#include "plugin.h"
|
|
|
|
|
|
|
|
/* different graphics libraries */
|
|
|
|
#if LCD_DEPTH < 8
|
|
|
|
#define USEGSLIB
|
|
|
|
#include <lib/grey.h>
|
|
|
|
#else
|
|
|
|
#include <lib/xlcd.h>
|
|
|
|
#endif
|
|
|
|
|
2010-06-04 13:22:50 +00:00
|
|
|
#include <lib/mylcd.h>
|
|
|
|
|
2010-11-21 13:47:56 +00:00
|
|
|
#if defined(USEGSLIB) && defined(IMGDEC)
|
|
|
|
#undef mylcd_ub_
|
|
|
|
#undef myxlcd_ub_
|
|
|
|
#define mylcd_ub_(fn) iv->fn
|
|
|
|
#define myxlcd_ub_(fn) iv->fn
|
|
|
|
#endif
|
|
|
|
|
2010-01-18 12:46:19 +00:00
|
|
|
/* Min memory allowing us to use the plugin buffer
|
|
|
|
* and thus not stopping the music
|
|
|
|
* *Very* rough estimation:
|
|
|
|
* Max 10 000 dir entries * 4bytes/entry (char **) = 40000 bytes
|
|
|
|
* + 30k code size = 70 000
|
|
|
|
* + 50k min for image = 120 000
|
|
|
|
*/
|
|
|
|
#define MIN_MEM 120000
|
|
|
|
|
|
|
|
/* State code for output with return. */
|
2010-10-05 13:17:02 +00:00
|
|
|
enum {
|
|
|
|
PLUGIN_OTHER = 0x200,
|
|
|
|
PLUGIN_ABORT,
|
|
|
|
PLUGIN_OUTOFMEM,
|
|
|
|
|
|
|
|
ZOOM_IN,
|
|
|
|
ZOOM_OUT,
|
2012-11-02 12:03:58 +00:00
|
|
|
NEXT_FRAME,
|
2010-10-05 13:17:02 +00:00
|
|
|
};
|
2010-01-18 12:46:19 +00:00
|
|
|
|
2010-06-21 16:53:00 +00:00
|
|
|
#if (CONFIG_PLATFORM & PLATFORM_NATIVE) && defined(HAVE_DISK_STORAGE)
|
2010-01-18 12:46:19 +00:00
|
|
|
#define DISK_SPINDOWN
|
|
|
|
#endif
|
2010-02-12 14:41:52 +00:00
|
|
|
#if PLUGIN_BUFFER_SIZE >= MIN_MEM
|
|
|
|
#define USE_PLUG_BUF
|
|
|
|
#endif
|
2010-01-18 12:46:19 +00:00
|
|
|
|
|
|
|
/* Settings. jpeg needs these */
|
|
|
|
struct imgview_settings
|
|
|
|
{
|
|
|
|
#ifdef HAVE_LCD_COLOR
|
|
|
|
int jpeg_colour_mode;
|
|
|
|
int jpeg_dither_mode;
|
|
|
|
#endif
|
|
|
|
int ss_timeout;
|
|
|
|
};
|
|
|
|
|
2010-11-21 13:47:56 +00:00
|
|
|
/* structure passed to image decoder. */
|
2010-01-18 12:46:19 +00:00
|
|
|
struct image_info {
|
|
|
|
int x_size, y_size; /* set size of loaded image in load_image(). */
|
|
|
|
int width, height; /* set size of resized image in get_image(). */
|
|
|
|
int x, y; /* display position */
|
2012-11-02 12:03:58 +00:00
|
|
|
int frames_count; /* number of subframes */
|
|
|
|
int delay; /* delay expressed in ticks between frames */
|
2010-01-18 12:46:19 +00:00
|
|
|
void *data; /* use freely in decoder. not touched in ui. */
|
|
|
|
};
|
|
|
|
|
2010-11-21 13:47:56 +00:00
|
|
|
struct imgdec_api {
|
|
|
|
const struct imgview_settings *settings;
|
|
|
|
bool slideshow_enabled; /* run slideshow */
|
|
|
|
bool running_slideshow; /* loading image because of slideshw */
|
2010-01-18 12:46:19 +00:00
|
|
|
#ifdef DISK_SPINDOWN
|
2010-11-21 13:47:56 +00:00
|
|
|
bool immediate_ata_off; /* power down disk after loading */
|
2010-01-18 12:46:19 +00:00
|
|
|
#endif
|
2010-02-12 14:41:52 +00:00
|
|
|
#ifdef USE_PLUG_BUF
|
2010-11-21 13:47:56 +00:00
|
|
|
bool plug_buf; /* are we using the plugin buffer or the audio buffer? */
|
2010-01-18 12:46:19 +00:00
|
|
|
#endif
|
|
|
|
|
2010-11-21 13:47:56 +00:00
|
|
|
/* callback updating a progress meter while image decoding */
|
|
|
|
void (*cb_progress)(int current, int total);
|
|
|
|
|
|
|
|
#ifdef USEGSLIB
|
|
|
|
void (*gray_bitmap_part)(const unsigned char *src, int src_x, int src_y,
|
|
|
|
int stride, int x, int y, int width, int height);
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
2010-01-21 12:06:02 +00:00
|
|
|
/* functions need to be implemented in each image decoders. */
|
2010-11-21 13:47:56 +00:00
|
|
|
struct image_decoder {
|
2011-01-16 12:45:11 +00:00
|
|
|
/* set true if unscaled image can be always displayed even when there isn't
|
|
|
|
* enough memory for resized image. e.g. when using native format to store
|
|
|
|
* image. */
|
2010-11-21 13:47:56 +00:00
|
|
|
const bool unscaled_avail;
|
|
|
|
|
2011-01-16 12:45:11 +00:00
|
|
|
/* return needed size of buffer to store downscaled image by ds.
|
|
|
|
* this is used to calculate min downscale. */
|
2010-11-21 13:47:56 +00:00
|
|
|
int (*img_mem)(int ds);
|
2012-11-02 12:03:58 +00:00
|
|
|
|
2011-01-16 12:45:11 +00:00
|
|
|
/* load image from filename. use the passed buffer to store loaded, decoded
|
|
|
|
* or resized image later, so save it to local variables if needed.
|
|
|
|
* set width and height of info properly. also, set buf_size to remaining
|
|
|
|
* size of buf after load image. it is used to calculate min downscale.
|
|
|
|
* return PLUGIN_ERROR for error. ui will skip to next image. */
|
2010-11-21 13:47:56 +00:00
|
|
|
int (*load_image)(char *filename, struct image_info *info,
|
2010-01-18 12:46:19 +00:00
|
|
|
unsigned char *buf, ssize_t *buf_size);
|
2011-01-16 12:45:11 +00:00
|
|
|
/* downscale loaded image by ds. use the buffer passed to load_image to
|
|
|
|
* reszie image and/or store resized image.
|
|
|
|
* return PLUGIN_ERROR for error. ui will skip to next image. */
|
2012-11-02 12:03:58 +00:00
|
|
|
int (*get_image)(struct image_info *info, int frame, int ds);
|
|
|
|
|
2010-11-21 13:47:56 +00:00
|
|
|
/* draw part of image */
|
|
|
|
void (*draw_image_rect)(struct image_info *info,
|
2010-01-18 12:46:19 +00:00
|
|
|
int x, int y, int width, int height);
|
2010-11-21 13:47:56 +00:00
|
|
|
};
|
|
|
|
|
2023-03-14 12:19:48 +00:00
|
|
|
#define IMGDEC_API_VERSION 1
|
2010-11-21 13:47:56 +00:00
|
|
|
|
|
|
|
/* image decoder header */
|
|
|
|
struct imgdec_header {
|
|
|
|
struct lc_header lc_hdr; /* must be the first */
|
|
|
|
const struct image_decoder *decoder;
|
|
|
|
const struct plugin_api **api;
|
2023-03-14 12:19:48 +00:00
|
|
|
unsigned short plugin_api_version;
|
|
|
|
size_t plugin_api_size;
|
2010-11-21 13:47:56 +00:00
|
|
|
const struct imgdec_api **img_api;
|
2023-03-14 12:19:48 +00:00
|
|
|
size_t img_api_size;
|
2010-11-21 13:47:56 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#ifdef IMGDEC
|
|
|
|
extern const struct imgdec_api *iv;
|
|
|
|
extern const struct image_decoder image_decoder;
|
|
|
|
|
|
|
|
#if (CONFIG_PLATFORM & PLATFORM_NATIVE)
|
|
|
|
#define IMGDEC_HEADER \
|
|
|
|
const struct plugin_api *rb DATA_ATTR; \
|
|
|
|
const struct imgdec_api *iv DATA_ATTR; \
|
|
|
|
const struct imgdec_header __header \
|
|
|
|
__attribute__ ((section (".header")))= { \
|
|
|
|
{ PLUGIN_MAGIC, TARGET_ID, IMGDEC_API_VERSION, \
|
2023-03-14 12:19:48 +00:00
|
|
|
plugin_start_addr, plugin_end_addr, }, &image_decoder, \
|
|
|
|
&rb, PLUGIN_API_VERSION, sizeof(struct plugin_api), \
|
|
|
|
&iv, sizeof(struct imgdec_api) };
|
2010-11-21 13:47:56 +00:00
|
|
|
#else /* PLATFORM_HOSTED */
|
|
|
|
#define IMGDEC_HEADER \
|
|
|
|
const struct plugin_api *rb DATA_ATTR; \
|
|
|
|
const struct imgdec_api *iv DATA_ATTR; \
|
|
|
|
const struct imgdec_header __header \
|
|
|
|
__attribute__((visibility("default"))) = { \
|
2023-03-14 12:19:48 +00:00
|
|
|
{ PLUGIN_MAGIC, TARGET_ID, IMGDEC_API_VERSION, NULL, NULL }, \
|
|
|
|
&image_decoder, &rb, PLUGIN_API_VERSION, sizeof(struct plugin_api), \
|
|
|
|
&iv, sizeof(struct imgdec_api), };
|
2010-11-21 13:47:56 +00:00
|
|
|
#endif /* CONFIG_PLATFORM */
|
|
|
|
#endif
|
2010-01-18 12:46:19 +00:00
|
|
|
|
2010-11-21 13:47:56 +00:00
|
|
|
#endif /* _IMAGE_VIEWER_H */
|