summaryrefslogtreecommitdiff
path: root/apps/plugins/pictureflow.c
diff options
context:
space:
mode:
authorAndrew Mahone <andrew.mahone@gmail.com>2008-12-27 00:26:15 +0000
committerAndrew Mahone <andrew.mahone@gmail.com>2008-12-27 00:26:15 +0000
commit932f30d825d1b5c6f5465872957b55d5a9785462 (patch)
tree1e1c172a92f1a99165bfccfcc8acd8c07c0875da /apps/plugins/pictureflow.c
parent78d625f84011ba953e125cf20300b7fc2fea8c4b (diff)
Add support for scaled bitmap loads, and for greylib display, to
pictureflow, as well as several small fixes in the areas modified. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19598 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/pictureflow.c')
-rw-r--r--apps/plugins/pictureflow.c385
1 files changed, 192 insertions, 193 deletions
diff --git a/apps/plugins/pictureflow.c b/apps/plugins/pictureflow.c
index 0dd9f924d7..db5b6fbfb4 100644
--- a/apps/plugins/pictureflow.c
+++ b/apps/plugins/pictureflow.c
@@ -26,11 +26,9 @@
#include "plugin.h"
#include "lib/pluginlib_actions.h"
#include "lib/helper.h"
-#include "lib/bmp.h"
#include "lib/picture.h"
#include "pluginbitmaps/pictureflow_logo.h"
-#include "pluginbitmaps/pictureflow_emptyslide.h"
-
+#include "lib/grey.h"
PLUGIN_HEADER
@@ -43,7 +41,34 @@ const struct button_mapping *plugin_contexts[]
#define NB_ACTION_CONTEXTS sizeof(plugin_contexts)/sizeof(plugin_contexts[0])
+#if LCD_DEPTH < 8
+#define USEGSLIB
+GREY_INFO_STRUCT
+#define FPLUGIN &format_grey
+#define LCD_BUF _grey_info.buffer
+#define MYLCD(fn) grey_ ## fn
+#define G_PIX(r,g,b) \
+ (77 * (unsigned)(r) + 150 * (unsigned)(g) + 29 * (unsigned)(b)) / 256
+#define N_PIX(r,g,b) LCD_BRIGHTNESS(G_PIX(r,g,b))
+#define G_BRIGHT(y) (y)
+#define N_BRIGHT(y) LCD_BRIGHTNESS(y)
+#define BUFFER_WIDTH _grey_info.width
+#define BUFFER_HEIGHT _grey_info.height
+typedef unsigned char pix_t;
+#else
+#define FPLUGIN NULL
+#define LCD_BUF rb->lcd_framebuffer
+#define MYLCD(fn) rb->lcd_ ## fn
+#define G_PIX LCD_RGBPACK
+#define N_PIX LCD_RGBPACK
+#define G_BRIGHT(y) LCD_RGBPACK(y,y,y)
+#define N_BRIGHT(y) LCD_RGBPACK(y,y,y)
+#define BUFFER_WIDTH LCD_WIDTH
+#define BUFFER_HEIGHT LCD_HEIGHT
+typedef fb_data pix_t;
+#endif
+#define WRNDUP(w, size) (((w)+(size)-1)/(size)*(size))
#ifdef HAVE_SCROLLWHEEL
#define PICTUREFLOW_NEXT_ALBUM PLA_DOWN
#define PICTUREFLOW_NEXT_ALBUM_REPEAT PLA_DOWN_REPEAT
@@ -76,20 +101,11 @@ const struct button_mapping *plugin_contexts[]
#define IANGLE_MAX 1024
#define IANGLE_MASK 1023
-/* maximum size of an slide */
-#define MAX_IMG_WIDTH LCD_WIDTH
-#define MAX_IMG_HEIGHT LCD_HEIGHT
-
-#if (LCD_HEIGHT < 100)
-#define PREFERRED_IMG_WIDTH 50
-#define PREFERRED_IMG_HEIGHT 50
-#else
-#define PREFERRED_IMG_WIDTH 100
-#define PREFERRED_IMG_HEIGHT 100
-#endif
-
-#define BUFFER_WIDTH LCD_WIDTH
-#define BUFFER_HEIGHT LCD_HEIGHT
+#define DISPLAY_SIZE (LCD_HEIGHT/2)
+#define REFLECT_TOP (DISPLAY_SIZE * 4 / 3)
+#define REFLECT_HEIGHT ((DISPLAY_SIZE * 2) - REFLECT_TOP)
+#define REFLECT_SC ((0x10000U * 3 + (REFLECT_HEIGHT * 5 - 1)) / \
+ (REFLECT_HEIGHT * 5))
#define SLIDE_CACHE_SIZE 100
@@ -115,6 +131,7 @@ const struct button_mapping *plugin_contexts[]
#define UNIQBUF_SIZE (64*1024)
#define EMPTY_SLIDE CACHE_PREFIX "/emptyslide.pfraw"
+#define EMPTY_SLIDE_BMP PLUGIN_DEMOS_DIR "/pictureflow_emptyslide.bmp"
#define CONFIG_FILE CACHE_PREFIX "/pictureflow.config"
/* Error return values */
@@ -185,8 +202,8 @@ struct config_data {
/** below we allocate the memory we want to use **/
-static fb_data *buffer; /* for now it always points to the lcd framebuffer */
-static PFreal rays[BUFFER_WIDTH];
+static pix_t *buffer; /* for now it always points to the lcd framebuffer */
+static PFreal rays[LCD_WIDTH];
static struct slide_data center_slide;
static struct slide_data left_slides[MAX_SLIDES_COUNT];
static struct slide_data right_slides[MAX_SLIDES_COUNT];
@@ -228,10 +245,12 @@ static int track_index;
static int selected_track;
static int selected_track_pulse;
-static fb_data *input_bmp_buffer;
-static fb_data *output_bmp_buffer;
-static int input_hid;
-static int output_hid;
+#define INPUT_SIZE BM_SIZE(DISPLAY_SIZE, DISPLAY_SIZE, FORMAT_NATIVE, 0)
+#define SC_BUF_SIZE BM_SCALED_SIZE(DISPLAY_SIZE, 0, FORMAT_NATIVE, 0)
+#define OUTPUT_SIZE BM_SIZE(DISPLAY_SIZE * 2, DISPLAY_SIZE, FORMAT_NATIVE, 0)
+
+void * plugin_buf;
+size_t plugin_buf_size;
static struct config_data config;
static int old_drawmode;
@@ -278,7 +297,8 @@ static int pf_state;
/** code */
-bool create_bmp(struct bitmap* input_bmp, char *target_path, bool resize);
+bool create_bmp(struct bitmap* input_bmp, void *buf, size_t buf_size,
+ char *target_path);
int load_surface(int);
static inline PFreal fmul(PFreal a, PFreal b)
@@ -496,17 +516,12 @@ bool get_albumart_for_index_from_db(const int slide_index, char *buf, int buflen
if ( rb->tagcache_get_next(&tcs) ) {
struct mp3entry id3;
- char size[9];
int fd;
- rb->snprintf(size, sizeof(size), ".%dx%d", PREFERRED_IMG_WIDTH,
- PREFERRED_IMG_HEIGHT);
fd = rb->open(tcs.result, O_RDONLY);
rb->get_metadata(&id3, fd, tcs.result);
rb->close(fd);
- if ( rb->search_albumart_files(&id3, size, buf, buflen) )
- result = true;
- else if ( rb->search_albumart_files(&id3, "", buf, buflen) )
+ if ( rb->search_albumart_files(&id3, "", buf, buflen) )
result = true;
else
result = false;
@@ -526,8 +541,8 @@ void draw_splashscreen(void)
{
struct screen* display = rb->screens[0];
- rb->lcd_set_background(LCD_RGBPACK(0,0,0));
- rb->lcd_set_foreground(LCD_RGBPACK(255,255,255));
+ rb->lcd_set_background(N_BRIGHT(0));
+ rb->lcd_set_foreground(N_BRIGHT(255));
rb->lcd_clear_display();
const struct picture* logo = &(logos[display->screen_type]);
@@ -554,60 +569,17 @@ void draw_progressbar(int step)
rb->lcd_putsxy((LCD_WIDTH - txt_w)/2, y, "Preparing album artwork");
y += (txt_h + 5);
- rb->lcd_set_foreground(LCD_RGBPACK(100,100,100));
+ rb->lcd_set_foreground(N_BRIGHT(100));
rb->lcd_drawrect(x, y, w+2, bar_height);
- rb->lcd_set_foreground(LCD_RGBPACK(165, 231, 82));
+ rb->lcd_set_foreground(N_PIX(165, 231, 82));
rb->lcd_fillrect(x+1, y+1, step * w / album_count, bar_height-2);
- rb->lcd_set_foreground(LCD_RGBPACK(255,255,255));
+ rb->lcd_set_foreground(N_BRIGHT(255));
rb->lcd_update();
rb->yield();
}
/**
- Allocate temporary buffers
- */
-bool allocate_buffers(void)
-{
- int input_size = MAX_IMG_WIDTH * MAX_IMG_HEIGHT * sizeof( fb_data );
- int output_size = MAX_IMG_WIDTH * MAX_IMG_HEIGHT * sizeof( fb_data ) * 2;
-
- input_hid = rb->bufalloc(NULL, input_size, TYPE_BITMAP);
-
- if (input_hid < 0)
- return false;
-
- if (rb->bufgetdata(input_hid, 0, (void *)&input_bmp_buffer) < input_size) {
- rb->bufclose(input_hid);
- return false;
- }
-
- output_hid = rb->bufalloc(NULL, output_size, TYPE_BITMAP);
-
- if (output_hid < 0) {
- rb->bufclose(input_hid);
- return false;
- }
-
- if (rb->bufgetdata(output_hid, 0, (void *)&output_bmp_buffer) < output_size) {
- rb->bufclose(output_hid);
- return false;
- }
- return true;
-}
-
-
-/**
- Free the temporary buffers
- */
-bool free_buffers(void)
-{
- rb->bufclose(input_hid);
- rb->bufclose(output_hid);
- return true;
-}
-
-/**
Precomupte the album art images and store them in CACHE_PREFIX.
*/
bool create_albumart_cache(bool force)
@@ -622,7 +594,7 @@ bool create_albumart_cache(bool force)
config.avg_album_width = 0;
char pfraw_file[MAX_PATH];
- char arlbumart_file[MAX_PATH];
+ char albumart_file[MAX_PATH];
for (i=0; i < album_count; i++)
{
rb->snprintf(pfraw_file, sizeof(pfraw_file), CACHE_PREFIX "/%d.pfraw", i);
@@ -630,18 +602,23 @@ bool create_albumart_cache(bool force)
if(rb->file_exists(pfraw_file))
rb->remove(pfraw_file);
draw_progressbar(i);
- if (!get_albumart_for_index_from_db(i, arlbumart_file, MAX_PATH))
+ if (!get_albumart_for_index_from_db(i, albumart_file, MAX_PATH))
continue;
- input_bmp.data = (char *)input_bmp_buffer;
- ret = rb->read_bmp_file(arlbumart_file, &input_bmp,
- sizeof(fb_data)*MAX_IMG_WIDTH*MAX_IMG_HEIGHT,
- FORMAT_NATIVE, NULL);
+ input_bmp.data = plugin_buf;
+ input_bmp.width = DISPLAY_SIZE;
+ input_bmp.height = DISPLAY_SIZE;
+ ret = rb->read_bmp_file(albumart_file, &input_bmp,
+ plugin_buf_size,
+ FORMAT_NATIVE|FORMAT_RESIZE|FORMAT_KEEP_ASPECT,
+ FPLUGIN);
if (ret <= 0) {
rb->splash(HZ, "Could not read bmp");
continue; /* skip missing/broken files */
}
- if (!create_bmp(&input_bmp, pfraw_file, false)) {
+ if (!create_bmp(&input_bmp, plugin_buf + WRNDUP(ret, 4),
+ plugin_buf_size - WRNDUP(ret, 4), pfraw_file))
+ {
rb->splash(HZ, "Could not write bmp");
}
config.avg_album_width += input_bmp.width;
@@ -850,8 +827,8 @@ bool save_pfraw(char* filename, struct bitmap *bm)
int y;
for( y = 0; y < bm->height; y++ )
{
- fb_data *d = (fb_data*)( bm->data ) + (y*bm->width);
- rb->write( fh, d, sizeof( fb_data ) * bm->width );
+ pix_t *d = (pix_t*)( bm->data ) + (y*bm->width);
+ rb->write( fh, d, sizeof( pix_t ) * bm->width );
}
rb->close( fh );
return true;
@@ -870,7 +847,8 @@ int read_pfraw(char* filename)
return empty_slide_hid;
}
- int size = sizeof(struct bitmap) + sizeof( fb_data ) * bmph.width * bmph.height;
+ int size = sizeof(struct bitmap) + sizeof( pix_t ) *
+ bmph.width * bmph.height;
int hid = rb->bufalloc(NULL, size, TYPE_BITMAP);
if (hid < 0) {
@@ -892,8 +870,8 @@ int read_pfraw(char* filename)
int y;
for( y = 0; y < bm->height; y++ )
{
- fb_data *d = (fb_data*)( bm->data ) + (y*bm->width);
- rb->read( fh, d , sizeof( fb_data ) * bm->width );
+ pix_t *d = (pix_t*)( bm->data ) + (y*bm->width);
+ rb->read( fh, d , sizeof( pix_t ) * bm->width );
}
rb->close( fh );
return hid;
@@ -904,39 +882,26 @@ int read_pfraw(char* filename)
Create the slide with its reflection for the given slide_index and filename
and store it as pfraw in CACHE_PREFIX/[slide_index].pfraw
*/
-bool create_bmp(struct bitmap *input_bmp, char *target_path, bool resize)
+bool create_bmp(struct bitmap *input_bmp, void * buffer, size_t buffer_len,
+ char *target_path)
{
struct bitmap output_bmp;
output_bmp.format = input_bmp->format;
- output_bmp.data = (char *)output_bmp_buffer;
+ output_bmp.data = (char *)buffer;
- if ( resize ) {
- /* resize image */
- output_bmp.width = config.avg_album_width;
- output_bmp.height = config.avg_album_width;
- smooth_resize_bitmap(input_bmp, &output_bmp);
-
- /* Resized bitmap is now in the output buffer,
- copy it back to the input buffer */
- rb->memcpy(input_bmp_buffer, output_bmp_buffer,
- config.avg_album_width * config.avg_album_width * sizeof(fb_data));
- input_bmp->data = (char *)input_bmp_buffer;
- input_bmp->width = output_bmp.width;
- input_bmp->height = output_bmp.height;
- }
-
- output_bmp.width = input_bmp->width * 2;
- output_bmp.height = input_bmp->height;
-
- fb_data *src = (fb_data *)input_bmp->data;
- fb_data *dst = (fb_data *)output_bmp.data;
+ output_bmp.width = 2 * DISPLAY_SIZE;
+ output_bmp.height = input_bmp->width;
+ pix_t *src = (pix_t *)input_bmp->data;
+ pix_t *dst = (pix_t *)output_bmp.data;
+ if (sizeof(pix_t) * output_bmp.width * output_bmp.height > buffer_len)
+ return 0;
/* transpose the image, this is to speed-up the rendering
because we process one column at a time
(and much better and faster to work row-wise, i.e in one scanline) */
- int hofs = input_bmp->width / 3;
- rb->memset(dst, 0, sizeof(fb_data) * output_bmp.width * output_bmp.height);
+ int hofs = REFLECT_TOP - input_bmp->height;
+ rb->memset(dst, 0, sizeof(pix_t) * output_bmp.width * output_bmp.height);
int x, y;
for (x = 0; x < input_bmp->width; x++)
for (y = 0; y < input_bmp->height; y++)
@@ -944,16 +909,20 @@ bool create_bmp(struct bitmap *input_bmp, char *target_path, bool resize)
src[y * input_bmp->width + x];
/* create the reflection */
- int ht = input_bmp->height - hofs;
- int hte = ht;
- for (x = 0; x < input_bmp->width; x++) {
- for (y = 0; y < ht; y++) {
- fb_data color = src[x + input_bmp->width * (input_bmp->height - y - 1)];
- int r = RGB_UNPACK_RED(color) * (hte - y) / hte * 3 / 5;
- int g = RGB_UNPACK_GREEN(color) * (hte - y) / hte * 3 / 5;
- int b = RGB_UNPACK_BLUE(color) * (hte - y) / hte * 3 / 5;
- dst[output_bmp.height + hofs + y + output_bmp.width * x] =
- LCD_RGBPACK(r, g, b);
+ for (y = 0; y < REFLECT_HEIGHT; y++) {
+ uint32_t sc = (REFLECT_HEIGHT - y) * REFLECT_SC;
+ for (x = 0; x < input_bmp->width; x++) {
+ pix_t color = src[x + input_bmp->width *
+ (input_bmp->height - y - 1)];
+#ifdef USEGSLIB
+ pix_t out = color * sc >> 16;
+#else
+ int r = RGB_UNPACK_RED(color) * sc >> 16;
+ int g = RGB_UNPACK_GREEN(color) * sc >> 16;
+ int b = RGB_UNPACK_BLUE(color) * sc >> 16;
+ pix_t out = LCD_RGBPACK(r, g, b);
+#endif
+ dst[input_bmp->height + hofs + y + output_bmp.width * x] = out;
}
}
return save_pfraw(target_path, &output_bmp);
@@ -1093,8 +1062,8 @@ void reset_slides(void)
*/
void recalc_table(void)
{
- int w = (BUFFER_WIDTH + 1) / 2;
- int h = (BUFFER_HEIGHT + 1) / 2;
+ int w = (LCD_WIDTH + 1) / 2;
+ int h = (LCD_HEIGHT + 1) / 2;
int i;
for (i = 0; i < w; i++) {
PFreal gg = (PFREAL_HALF + i * PFREAL_ONE) / (2 * h);
@@ -1106,7 +1075,7 @@ void recalc_table(void)
offsetX = config.avg_album_width / 2 * (PFREAL_ONE - fcos(itilt));
offsetY = config.avg_album_width / 2 * fsin(itilt);
- offsetX += config.avg_album_width * PFREAL_ONE;
+ offsetX += config.avg_album_width * PFREAL_ONE * 3 / 4;
offsetY += config.avg_album_width * PFREAL_ONE / 4;
offsetX += config.extra_spacing_for_center_slide << PFREAL_SHIFT;
}
@@ -1117,23 +1086,25 @@ void recalc_table(void)
to an uint, multiply and compress the result back to a ushort.
*/
#if (LCD_PIXELFORMAT == RGB565SWAPPED)
-static inline fb_data fade_color(fb_data c, unsigned int a)
+static inline pix_t fade_color(pix_t c, unsigned int a)
{
c = swap16(c);
unsigned int p = ((((c|(c<<16)) & 0x07e0f81f) * a) >> 5) & 0x07e0f81f;
- return swap16( (fb_data) (p | ( p >> 16 )) );
+ return swap16( (pix_t) (p | ( p >> 16 )) );
}
-#else
-static inline fb_data fade_color(fb_data c, unsigned int a)
+#elif LCD_PIXELFORMAT == RGB565
+static inline pix_t fade_color(pix_t c, unsigned int a)
{
unsigned int p = ((((c|(c<<16)) & 0x07e0f81f) * a) >> 5) & 0x07e0f81f;
return (p | ( p >> 16 ));
}
+#else
+static inline pix_t fade_color(pix_t c, unsigned int a)
+{
+ return (unsigned int)c * a >> 8;
+}
#endif
-
-
-
/**
Render a single slide
*/
@@ -1145,7 +1116,7 @@ void render_slide(struct slide_data *slide, struct rect *result_rect,
if (!bmp) {
return;
}
- fb_data *src = (fb_data *)bmp->data;
+ pix_t *src = (pix_t *)bmp->data;
const int sw = bmp->height;
const int sh = bmp->width;
@@ -1172,7 +1143,11 @@ void render_slide(struct slide_data *slide, struct rect *result_rect,
PFreal ys = slide->cy - bmp->width * sdy / 4;
PFreal dist = distance * PFREAL_ONE;
- const int alpha4 = alpha >> 3;
+#ifdef USEGSLIB
+ const int alphasc = alpha;
+#else
+ const int alphasc = alpha >> 3;
+#endif
int xi = fmax((PFreal) 0,
((w * PFREAL_ONE / 2) +
@@ -1189,9 +1164,10 @@ void render_slide(struct slide_data *slide, struct rect *result_rect,
PFreal fk = rays[x];
if (sdy) {
fk = fk - fdiv(sdx, sdy);
- hity = -fdiv(( rays[x] * distance
- - slide->cx
- + slide->cy * sdx / sdy), fk);
+ if (fk)
+ hity = -fdiv(( rays[x] * distance
+ - slide->cx
+ + slide->cy * sdx / sdy), fk);
}
dist = distance * PFREAL_ONE + hity;
@@ -1216,8 +1192,8 @@ void render_slide(struct slide_data *slide, struct rect *result_rect,
int y1 = (h >> 1);
int y2 = y1 + 1;
- fb_data *pixel1 = &buffer[y1 * BUFFER_WIDTH + x];
- fb_data *pixel2 = &buffer[y2 * BUFFER_WIDTH + x];
+ pix_t *pixel1 = &buffer[y1 * BUFFER_WIDTH + x];
+ pix_t *pixel2 = &buffer[y2 * BUFFER_WIDTH + x];
const int pixelstep = pixel2 - pixel1;
int center = (sh >> 1);
@@ -1225,7 +1201,7 @@ void render_slide(struct slide_data *slide, struct rect *result_rect,
int p1 = center * PFREAL_ONE - (dy >> 2);
int p2 = center * PFREAL_ONE + (dy >> 2);
- const fb_data *ptr = &src[column * bmp->width];
+ const pix_t *ptr = &src[column * bmp->width];
if (alpha == 256)
while ((y1 >= 0) && (y2 < h) && (p1 >= 0)) {
@@ -1239,8 +1215,8 @@ void render_slide(struct slide_data *slide, struct rect *result_rect,
pixel2 += pixelstep;
} else
while ((y1 >= 0) && (y2 < h) && (p1 >= 0)) {
- *pixel1 = fade_color(ptr[p1 >> PFREAL_SHIFT], alpha4);
- *pixel2 = fade_color(ptr[p2 >> PFREAL_SHIFT], alpha4);
+ *pixel1 = fade_color(ptr[p1 >> PFREAL_SHIFT], alphasc);
+ *pixel2 = fade_color(ptr[p2 >> PFREAL_SHIFT], alphasc);
p1 -= dy;
p2 += dy;
y1--;
@@ -1332,8 +1308,9 @@ static inline bool is_empty_rect(struct rect *r)
*/
void render_all_slides(void)
{
- rb->lcd_set_background(LCD_RGBPACK(0,0,0));
- rb->lcd_clear_display(); /* TODO: Optimizes this by e.g. invalidating rects */
+ MYLCD(set_background)(G_BRIGHT(0));
+ /* TODO: Optimizes this by e.g. invalidating rects */
+ MYLCD(clear_display)();
int nleft = config.show_slides;
int nright = config.show_slides;
@@ -1342,7 +1319,7 @@ void render_all_slides(void)
r.left = LCD_WIDTH; r.top = 0; r.bottom = 0; r.right = 0;
render_slide(&center_slide, &r, 256, -1, -1);
#ifdef DEBUG_DRAW
- rb->lcd_drawrect(r.left, r.top, r.right - r.left, r.bottom - r.top);
+ MYLCD(drawrect)(r.left, r.top, r.right - r.left, r.bottom - r.top);
#endif
int c1 = r.left;
int c2 = r.right;
@@ -1356,7 +1333,8 @@ void render_all_slides(void)
render_slide(&left_slides[index], &r, alpha, 0, c1 - 1);
if (!is_empty_rect(&r)) {
#ifdef DEBUG_DRAW
- rb->lcd_drawrect(r.left, r.top, r.right - r.left, r.bottom - r.top);
+ MYLCD->(drawrect)(r.left, r.top, r.right - r.left,
+ r.bottom - r.top);
#endif
c1 = r.left;
}
@@ -1366,16 +1344,17 @@ void render_all_slides(void)
alpha -= extra_fade;
if (alpha < 0 ) alpha = 0;
render_slide(&right_slides[index], &r, alpha, c2 + 1,
- BUFFER_WIDTH);
+ LCD_WIDTH);
if (!is_empty_rect(&r)) {
#ifdef DEBUG_DRAW
- rb->lcd_drawrect(r.left, r.top, r.right - r.left, r.bottom - r.top);
+ MYLCD(drawrect)(r.left, r.top, r.right - r.left,
+ r.bottom - r.top);
#endif
c2 = r.right;
}
}
} else {
- if ( step < 0 ) c1 = BUFFER_WIDTH;
+ if ( step < 0 ) c1 = LCD_WIDTH;
/* the first and last slide must fade in/fade out */
for (index = 0; index < nleft; index++) {
int alpha = 256;
@@ -1389,7 +1368,8 @@ void render_all_slides(void)
if (!is_empty_rect(&r)) {
#ifdef DEBUG_DRAW
- rb->lcd_drawrect(r.left, r.top, r.right - r.left, r.bottom - r.top);
+ MYLCD(drawrect)(r.left, r.top, r.right - r.left,
+ r.bottom - r.top);
#endif
c1 = r.left;
}
@@ -1404,10 +1384,11 @@ void render_all_slides(void)
if (index == nright - 3)
alpha = (step > 0) ? 256 : 128 + fade / 2;
render_slide(&right_slides[index], &r, alpha, c2 + 1,
- BUFFER_WIDTH);
+ LCD_WIDTH);
if (!is_empty_rect(&r)) {
#ifdef DEBUG_DRAW
- rb->lcd_drawrect(r.left, r.top, r.right - r.left, r.bottom - r.top);
+ MYLCD(drawrect)(r.left, r.top, r.right - r.left,
+ r.bottom - r.top);
#endif
c2 = r.right;
}
@@ -1531,6 +1512,9 @@ void cleanup(void *parameter)
}
if ( empty_slide_hid != - 1)
rb->bufclose(empty_slide_hid);
+#ifdef USEGSLIB
+ grey_release();
+#endif
rb->lcd_set_drawmode(old_drawmode);
}
@@ -1542,11 +1526,18 @@ int create_empty_slide(bool force)
{
if ( force || ! rb->file_exists( EMPTY_SLIDE ) ) {
struct bitmap input_bmp;
- input_bmp.width = BMPWIDTH_pictureflow_emptyslide;
- input_bmp.height = BMPHEIGHT_pictureflow_emptyslide;
+ int ret;
+ input_bmp.width = DISPLAY_SIZE;
+ input_bmp.height = DISPLAY_SIZE;
input_bmp.format = FORMAT_NATIVE;
- input_bmp.data = (char*) &pictureflow_emptyslide;
- if ( ! create_bmp(&input_bmp, EMPTY_SLIDE, true) ) return false;
+ input_bmp.data = (char*)plugin_buf;
+ ret = rb->read_bmp_file(EMPTY_SLIDE_BMP, &input_bmp,
+ plugin_buf_size,
+ FORMAT_NATIVE|FORMAT_RESIZE|FORMAT_KEEP_ASPECT,
+ FPLUGIN);
+ if ( ! create_bmp(&input_bmp, plugin_buf + WRNDUP(ret, 4),
+ plugin_buf_size - WRNDUP(ret, 4), EMPTY_SLIDE) )
+ return false;
}
empty_slide_hid = read_pfraw( EMPTY_SLIDE );
@@ -1623,11 +1614,10 @@ int main_menu(void)
int selection = 0;
int result;
- rb->lcd_set_foreground(LCD_RGBPACK(255,255,255));
+ rb->lcd_set_foreground(N_BRIGHT(255));
MENUITEM_STRINGLIST(main_menu,"PictureFlow Main Menu",NULL,
"Settings", "Return", "Quit");
-
while (1) {
switch (rb->do_menu(&main_menu,&selection, NULL, false)) {
case 0:
@@ -1750,9 +1740,9 @@ static inline void draw_gradient(int y, int h)
selected_track_pulse = (selected_track_pulse+1) % 10;
int c2 = selected_track_pulse - 5;
for (r=0; r<h; r++) {
- rb->lcd_set_foreground(LCD_RGBPACK(c2+80-(c >> 9), c2+100-(c >> 9),
+ MYLCD(set_foreground)(G_PIX(c2+80-(c >> 9), c2+100-(c >> 9),
c2+250-(c >> 8)));
- rb->lcd_hline(0, LCD_WIDTH, r+y);
+ MYLCD(hline)(0, LCD_WIDTH, r+y);
if ( r > h/2 )
c-=inc;
else
@@ -1768,7 +1758,7 @@ void reset_track_list(void)
{
int albumtxt_w, albumtxt_h;
const char* albumtxt = get_album_name(center_index);
- rb->lcd_getstringsize(albumtxt, &albumtxt_w, &albumtxt_h);
+ MYLCD(getstringsize)(albumtxt, &albumtxt_w, &albumtxt_h);
const int height =
LCD_HEIGHT-albumtxt_h-10 - (config.show_fps?(albumtxt_h + 5):0);
track_list_visible_entries = fmin( height/albumtxt_h , track_count );
@@ -1783,18 +1773,18 @@ void reset_track_list(void)
*/
void show_track_list(void)
{
- rb->lcd_clear_display();
+ MYLCD(clear_display)();
if ( center_slide.slide_index != track_index ) {
create_track_index(center_slide.slide_index);
reset_track_list();
}
static int titletxt_w, titletxt_h, titletxt_y, titletxt_x, i, color;
- rb->lcd_getstringsize("W", NULL, &titletxt_h);
+ MYLCD(getstringsize)("W", NULL, &titletxt_h);
if (track_list_visible_entries >= track_count)
{
int albumtxt_h;
const char* albumtxt = get_album_name(center_index);
- rb->lcd_getstringsize(albumtxt, NULL, &albumtxt_h);
+ MYLCD(getstringsize)(albumtxt, NULL, &albumtxt_h);
titletxt_y = ((LCD_HEIGHT-albumtxt_h-10)-(track_count*albumtxt_h))/2;
}
else if (config.show_fps)
@@ -1805,11 +1795,11 @@ void show_track_list(void)
int track_i;
for (i=0; i < track_list_visible_entries; i++) {
track_i = i+start_index_track_list;
- rb->lcd_getstringsize(get_track_name(track_i), &titletxt_w, NULL);
+ MYLCD(getstringsize)(get_track_name(track_i), &titletxt_w, NULL);
titletxt_x = (LCD_WIDTH-titletxt_w)/2;
if ( track_i == selected_track ) {
draw_gradient(titletxt_y, titletxt_h);
- rb->lcd_set_foreground(LCD_RGBPACK(255,255,255));
+ MYLCD(set_foreground)(G_BRIGHT(255));
if (titletxt_w > LCD_WIDTH ) {
if ( titletxt_w + track_scroll_index <= LCD_WIDTH )
track_scroll_dir = 1;
@@ -1817,12 +1807,12 @@ void show_track_list(void)
track_scroll_index += track_scroll_dir*2;
titletxt_x = track_scroll_index;
}
- rb->lcd_putsxy(titletxt_x,titletxt_y,get_track_name(track_i));
+ MYLCD(putsxy)(titletxt_x,titletxt_y,get_track_name(track_i));
}
else {
color = 250 - (abs(selected_track - track_i) * 200 / track_count);
- rb->lcd_set_foreground(LCD_RGBPACK(color,color,color));
- rb->lcd_putsxy(titletxt_x,titletxt_y,get_track_name(track_i));
+ MYLCD(set_foreground)(G_BRIGHT(color));
+ MYLCD(putsxy)(titletxt_x,titletxt_y,get_track_name(track_i));
}
titletxt_y += titletxt_h;
}
@@ -1877,8 +1867,8 @@ void draw_album_text(void)
albumtxt = get_album_name(center_index);
}
- rb->lcd_set_foreground(LCD_RGBPACK(c,c,c));
- rb->lcd_getstringsize(albumtxt, &albumtxt_w, &albumtxt_h);
+ MYLCD(set_foreground)(G_BRIGHT(c));
+ MYLCD(getstringsize)(albumtxt, &albumtxt_w, &albumtxt_h);
if (center_index != prev_center_index) {
albumtxt_x = 0;
albumtxt_dir = -1;
@@ -1887,7 +1877,7 @@ void draw_album_text(void)
albumtxt_y = LCD_HEIGHT-albumtxt_h-10;
if (albumtxt_w > LCD_WIDTH ) {
- rb->lcd_putsxy(albumtxt_x, albumtxt_y , albumtxt);
+ MYLCD(putsxy)(albumtxt_x, albumtxt_y , albumtxt);
if ( pf_state == pf_idle || pf_state == pf_show_tracks ) {
if ( albumtxt_w + albumtxt_x <= LCD_WIDTH ) albumtxt_dir = 1;
else if ( albumtxt_x >= 0 ) albumtxt_dir = -1;
@@ -1895,7 +1885,7 @@ void draw_album_text(void)
}
}
else {
- rb->lcd_putsxy((LCD_WIDTH - albumtxt_w) /2, albumtxt_y , albumtxt);
+ MYLCD(putsxy)((LCD_WIDTH - albumtxt_w) /2, albumtxt_y , albumtxt);
}
@@ -1923,11 +1913,6 @@ int main(void)
return PLUGIN_ERROR;
}
- if (!allocate_buffers()) {
- rb->splash(HZ, "Could not allocate temporary buffers");
- return PLUGIN_ERROR;
- }
-
ret = create_album_index();
if (ret == ERROR_BUFFER_FULL) {
rb->splash(HZ, "Not enough memory for album names");
@@ -1947,11 +1932,6 @@ int main(void)
return PLUGIN_ERROR;
}
- if (!free_buffers()) {
- rb->splash(HZ, "Could not free temporary buffers");
- return PLUGIN_ERROR;
- }
-
if (!create_pf_thread()) {
rb->splash(HZ, "Cannot create thread!");
return PLUGIN_ERROR;
@@ -1968,7 +1948,12 @@ int main(void)
}
slide_cache_stack_index = min_slide_cache-1;
slide_cache_in_use = 0;
- buffer = rb->lcd_framebuffer;
+#ifdef USEGSLIB
+ if (!grey_init(rb, plugin_buf, plugin_buf_size, GREY_BUFFERED|GREY_ON_COP,
+ LCD_WIDTH, LCD_HEIGHT, NULL))
+ rb->splash(HZ, "Greylib init failed!");
+#endif
+ buffer = LCD_BUF;
pf_state = pf_idle;
@@ -1994,7 +1979,10 @@ int main(void)
bool instant_update;
old_drawmode = rb->lcd_get_drawmode();
- rb->lcd_set_drawmode(DRMODE_FG);
+#ifdef USEGSLIB
+ grey_show(true);
+#endif
+ MYLCD(set_drawmode)(DRMODE_FG);
while (true) {
current_update = *rb->current_tick;
frames++;
@@ -2033,19 +2021,21 @@ int main(void)
last_update = current_update;
frames = 0;
}
-
/* Draw FPS */
if (config.show_fps) {
- rb->lcd_set_foreground(LCD_RGBPACK(255, 0, 0));
+#ifdef USEGSLIB
+ MYLCD(set_foreground)(G_BRIGHT(255));
+#else
+ MYLCD(set_foreground)(G_PIX(255,0,0));
+#endif
rb->snprintf(fpstxt, sizeof(fpstxt), "FPS: %d", fps);
- rb->lcd_putsxy(0, 0, fpstxt);
+ MYLCD(putsxy)(0, 0, fpstxt);
}
-
draw_album_text();
/* Copy offscreen buffer to LCD and give time to other threads */
- rb->lcd_update();
+ MYLCD(update)();
rb->yield();
/*/ Handle buttons */
@@ -2058,10 +2048,16 @@ int main(void)
case PICTUREFLOW_MENU:
if ( pf_state == pf_idle || pf_state == pf_scrolling ) {
+#ifdef USEGSLIB
+ grey_show(false);
+#endif
ret = main_menu();
if ( ret == -1 ) return PLUGIN_OK;
if ( ret != 0 ) return i;
- rb->lcd_set_drawmode(DRMODE_FG);
+#ifdef USEGSLIB
+ grey_show(true);
+#endif
+ MYLCD(set_drawmode)(DRMODE_FG);
}
else {
pf_state = pf_cover_out;
@@ -2137,6 +2133,9 @@ enum plugin_status plugin_start(const struct plugin_api *api, const void *parame
#ifdef HAVE_ADJUSTABLE_CPU_FREQ
rb->cpu_boost(true);
#endif
+ plugin_buf = rb->plugin_get_buffer(&plugin_buf_size);
+ plugin_buf_size = rb->align_buffer(PUN_PTR(void**,&plugin_buf),
+ plugin_buf_size, 4);
ret = main();
#ifdef HAVE_ADJUSTABLE_CPU_FREQ
rb->cpu_boost(false);