diff options
| author | Kevin Ferrare <kevin@rockbox.org> | 2007-08-04 03:01:46 +0000 |
|---|---|---|
| committer | Kevin Ferrare <kevin@rockbox.org> | 2007-08-04 03:01:46 +0000 |
| commit | 93b2f9fd447b73fff736d71826880ef9ac64bd94 (patch) | |
| tree | 1a4f54016c312738d66fb9dd2348ea0ef14f1255 /apps/plugins/lib | |
| parent | ffbbc60f38ddc8aeadc9cea1102077e22ca84a1a (diff) | |
| download | rockbox-93b2f9fd447b73fff736d71826880ef9ac64bd94.zip rockbox-93b2f9fd447b73fff736d71826880ef9ac64bd94.tar.gz rockbox-93b2f9fd447b73fff736d71826880ef9ac64bd94.tar.bz2 rockbox-93b2f9fd447b73fff736d71826880ef9ac64bd94.tar.xz | |
Rewrote the clock plugin in a cleaner and more modular way so that it can scale on remote screens. Use left-right keys to change the type of clock displayed (analogic, digital, binary) and up/downto change the look of the clock
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14174 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/lib')
| -rw-r--r-- | apps/plugins/lib/SOURCES | 1 | ||||
| -rw-r--r-- | apps/plugins/lib/picture.c | 70 | ||||
| -rw-r--r-- | apps/plugins/lib/picture.h | 40 | ||||
| -rw-r--r-- | apps/plugins/lib/xlcd.h | 3 | ||||
| -rw-r--r-- | apps/plugins/lib/xlcd_draw.c | 135 |
5 files changed, 181 insertions, 68 deletions
diff --git a/apps/plugins/lib/SOURCES b/apps/plugins/lib/SOURCES index 03a990a..88d362a 100644 --- a/apps/plugins/lib/SOURCES +++ b/apps/plugins/lib/SOURCES @@ -21,6 +21,7 @@ profile_plugin.c #endif #ifdef HAVE_LCD_BITMAP checkbox.c +picture.c xlcd_core.c xlcd_draw.c xlcd_scroll.c diff --git a/apps/plugins/lib/picture.c b/apps/plugins/lib/picture.c new file mode 100644 index 0000000..f214dfc --- /dev/null +++ b/apps/plugins/lib/picture.c @@ -0,0 +1,70 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id: jackpot.c 14034 2007-07-28 05:42:55Z kevin $ + * + * Copyright (C) 2007 Copyright Kévin Ferrare + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include "picture.h" + +void picture_draw(struct screen* display, const struct picture* picture, + int x, int y){ + display->bitmap( + picture->data, + x, y, + picture->width, picture->height + ); +} + +/** + * Draws a part of the given picture on the given screen + * Use it when the data contains multiple pictures from top to bottom. + * In that case, picture.height represents the height of one picture, + * not the whole set. + * @param display the screen where to display the picture + * @param picture the picture's data, only a part will be displayed + * @param yoffset display the data in the picture from yoffset to + * yoffset+picture.height + * @param x abscissa where to put the picture + * @param y ordinate where to put the picture + */ +void vertical_picture_draw_part(struct screen* display, const struct picture* picture, + int yoffset, + int x, int y){ + display->bitmap_part( + picture->data, + /*slice into picture->data */ + 0, yoffset, + picture->width, + /* Position on the screen */ + x, y, picture->width, picture->height + ); +} + +/** + * Draws a part of the given picture on the given screen + * Use it when the data contains multiple pictures from top to bottom. + * + * @param display the screen where to display the picture + * @param picture the picture's data, only a part will be displayed + * @param sprite_no display that sprite in the picture + * @param x abscissa where to put the picture + * @param y ordinate where to put the picture + */ +void vertical_picture_draw_sprite(struct screen* display, const struct picture* picture, + int sprite_no, + int x, int y){ + vertical_picture_draw_part(display, picture, sprite_no*picture->height, x, y); +} diff --git a/apps/plugins/lib/picture.h b/apps/plugins/lib/picture.h new file mode 100644 index 0000000..4bd550a --- /dev/null +++ b/apps/plugins/lib/picture.h @@ -0,0 +1,40 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id: jackpot.c 14034 2007-07-28 05:42:55Z kevin $ + * + * Copyright (C) 2007 Copyright Kévin Ferrare + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#ifndef _PICTURE_ +#define _PICTURE_ +#include "plugin.h" + +struct picture{ + const void* data; + int width; + int height; +}; + +void picture_draw(struct screen* display, const struct picture* picture, + int x, int y); + +void vertical_picture_draw_part(struct screen* display, const struct picture* picture, + int yoffset, + int x, int y); + +void vertical_picture_draw_sprite(struct screen* display, const struct picture* picture, + int sprite_no, + int x, int y); +#endif diff --git a/apps/plugins/lib/xlcd.h b/apps/plugins/lib/xlcd.h index 473c51c..59a0482 100644 --- a/apps/plugins/lib/xlcd.h +++ b/apps/plugins/lib/xlcd.h @@ -28,7 +28,8 @@ void xlcd_init(struct plugin_api* newrb); void xlcd_filltriangle(int x1, int y1, int x2, int y2, int x3, int y3); - +void xlcd_filltriangle_screen(struct screen* display, + int x1, int y1, int x2, int y2, int x3, int y3); #if LCD_DEPTH >= 8 void xlcd_gray_bitmap_part(const unsigned char *src, int src_x, int src_y, int stride, int x, int y, int width, int height); diff --git a/apps/plugins/lib/xlcd_draw.c b/apps/plugins/lib/xlcd_draw.c index 3ccdea9..accf3b4 100644 --- a/apps/plugins/lib/xlcd_draw.c +++ b/apps/plugins/lib/xlcd_draw.c @@ -25,46 +25,58 @@ #ifdef HAVE_LCD_BITMAP #include "xlcd.h" -#if (LCD_DEPTH >= 8) || (LCD_PIXELFORMAT == HORIZONTAL_PACKING) -/* draw a filled triangle, using horizontal lines for speed */ -void xlcd_filltriangle(int x1, int y1, int x2, int y2, int x3, int y3) +/* sort the given coordinates by increasing x value */ +void sort_points_by_increasing_x(int* x1, int* y1, + int* x2, int* y2, + int* x3, int* y3) { int x, y; - long fp_x1, fp_x2, fp_dx1, fp_dx2; - - /* sort vertices by increasing y value */ - if (y1 > y3) + if (*x1 > *x3) { - if (y2 < y3) /* y2 < y3 < y1 */ + if (*x2 < *x3) /* x2 < x3 < x1 */ { - x = x1; x1 = x2; x2 = x3; x3 = x; - y = y1; y1 = y2; y2 = y3; y3 = y; + x = *x1; *x1 = *x2; *x2 = *x3; *x3 = x; + y = *y1; *y1 = *y2; *y2 = *y3; *y3 = y; } - else if (y2 > y1) /* y3 < y1 < y2 */ + else if (*x2 > *x1) /* x3 < x1 < x2 */ { - x = x1; x1 = x3; x3 = x2; x2 = x; - y = y1; y1 = y3; y3 = y2; y2 = y; + x = *x1; *x1 = *x3; *x3 = *x2; *x2 = x; + y = *y1; *y1 = *y3; *y3 = *y2; *y2 = y; } - else /* y3 <= y2 <= y1 */ + else /* x3 <= x2 <= x1 */ { - x = x1; x1 = x3; x3 = x; - y = y1; y1 = y3; y3 = y; + x = *x1; *x1 = *x3; *x3 = x; + y = *y1; *y1 = *y3; *y3 = y; } } else { - if (y2 < y1) /* y2 < y1 <= y3 */ + if (*x2 < *x1) /* x2 < x1 <= x3 */ { - x = x1; x1 = x2; x2 = x; - y = y1; y1 = y2; y2 = y; + x = *x1; *x1 = *x2; *x2 = x; + y = *y1; *y1 = *y2; *y2 = y; } - else if (y2 > y3) /* y1 <= y3 < y2 */ + else if (*x2 > *x3) /* x1 <= x3 < x2 */ { - x = x2; x2 = x3; x3 = x; - y = y2; y2 = y3; y3 = y; + x = *x2; *x2 = *x3; *x3 = x; + y = *y2; *y2 = *y3; *y3 = y; } /* else already sorted */ } +} + +#define sort_points_by_increasing_y(x1, y1, x2, y2, x3, y3) \ + sort_points_by_increasing_x(y1, x1, y2, x2, y3, x3) + +/* draw a filled triangle, using horizontal lines for speed */ +void xlcd_filltriangle_horizontal(struct screen* display, + int x1, int y1, + int x2, int y2, + int x3, int y3) +{ + long fp_x1, fp_x2, fp_dx1, fp_dx2; + int y; + sort_points_by_increasing_y(&x1, &y1, &x2, &y2, &x3, &y3); if (y1 < y3) /* draw */ { @@ -72,12 +84,12 @@ void xlcd_filltriangle(int x1, int y1, int x2, int y2, int x3, int y3) fp_x1 = (x1 << 16) + (1<<15) + (fp_dx1 >> 1); if (y1 < y2) /* first part */ - { + { fp_dx2 = ((x2 - x1) << 16) / (y2 - y1); fp_x2 = (x1 << 16) + (1<<15) + (fp_dx2 >> 1); for (y = y1; y < y2; y++) { - _xlcd_rb->lcd_hline(fp_x1 >> 16, fp_x2 >> 16, y); + display->hline(fp_x1 >> 16, fp_x2 >> 16, y); fp_x1 += fp_dx1; fp_x2 += fp_dx2; } @@ -88,53 +100,23 @@ void xlcd_filltriangle(int x1, int y1, int x2, int y2, int x3, int y3) fp_x2 = (x2 << 16) + (1<<15) + (fp_dx2 >> 1); for (y = y2; y < y3; y++) { - _xlcd_rb->lcd_hline(fp_x1 >> 16, fp_x2 >> 16, y); + display->hline(fp_x1 >> 16, fp_x2 >> 16, y); fp_x1 += fp_dx1; fp_x2 += fp_dx2; } } } -} -#else /* (LCD_DEPTH < 8) && (LCD_PIXELFORMAT == VERTICAL_PACKING) */ +} + /* draw a filled triangle, using vertical lines for speed */ -void xlcd_filltriangle(int x1, int y1, int x2, int y2, int x3, int y3) +void xlcd_filltriangle_vertical(struct screen* display, + int x1, int y1, + int x2, int y2, + int x3, int y3) { - int x, y; long fp_y1, fp_y2, fp_dy1, fp_dy2; - - /* sort vertices by increasing x value */ - if (x1 > x3) - { - if (x2 < x3) /* x2 < x3 < x1 */ - { - x = x1; x1 = x2; x2 = x3; x3 = x; - y = y1; y1 = y2; y2 = y3; y3 = y; - } - else if (x2 > x1) /* x3 < x1 < x2 */ - { - x = x1; x1 = x3; x3 = x2; x2 = x; - y = y1; y1 = y3; y3 = y2; y2 = y; - } - else /* x3 <= x2 <= x1 */ - { - x = x1; x1 = x3; x3 = x; - y = y1; y1 = y3; y3 = y; - } - } - else - { - if (x2 < x1) /* x2 < x1 <= x3 */ - { - x = x1; x1 = x2; x2 = x; - y = y1; y1 = y2; y2 = y; - } - else if (x2 > x3) /* x1 <= x3 < x2 */ - { - x = x2; x2 = x3; x3 = x; - y = y2; y2 = y3; y3 = y; - } - /* else already sorted */ - } + int x; + sort_points_by_increasing_x(&x1, &y1, &x2, &y2, &x3, &y3); if (x1 < x3) /* draw */ { @@ -142,12 +124,12 @@ void xlcd_filltriangle(int x1, int y1, int x2, int y2, int x3, int y3) fp_y1 = (y1 << 16) + (1<<15) + (fp_dy1 >> 1); if (x1 < x2) /* first part */ - { + { fp_dy2 = ((y2 - y1) << 16) / (x2 - x1); fp_y2 = (y1 << 16) + (1<<15) + (fp_dy2 >> 1); for (x = x1; x < x2; x++) { - _xlcd_rb->lcd_vline(x, fp_y1 >> 16, fp_y2 >> 16); + display->vline(x, fp_y1 >> 16, fp_y2 >> 16); fp_y1 += fp_dy1; fp_y2 += fp_dy2; } @@ -158,14 +140,33 @@ void xlcd_filltriangle(int x1, int y1, int x2, int y2, int x3, int y3) fp_y2 = (y2 << 16) + (1<<15) + (fp_dy2 >> 1); for (x = x2; x < x3; x++) { - _xlcd_rb->lcd_vline(x, fp_y1 >> 16, fp_y2 >> 16); + display->vline(x, fp_y1 >> 16, fp_y2 >> 16); fp_y1 += fp_dy1; fp_y2 += fp_dy2; } } } } -#endif /* LCD_DEPTH, LCD_PIXELFORMAT */ + +void xlcd_filltriangle(int x1, int y1, + int x2, int y2, + int x3, int y3) +{ + /* default is main screen */ + xlcd_filltriangle_screen(_xlcd_rb->screens[SCREEN_MAIN], + x1, y1, x2, y2, x3, y3); +} + +void xlcd_filltriangle_screen(struct screen* display, + int x1, int y1, + int x2, int y2, + int x3, int y3) +{ + if(display->pixel_format==HORIZONTAL_PACKING || display->depth>=8) + xlcd_filltriangle_horizontal(display, x1, y1, x2, y2, x3, y3); + else + xlcd_filltriangle_vertical(display, x1, y1, x2, y2, x3, y3); +} #if LCD_DEPTH >= 8 |