1
0
Fork 0
forked from len0rd/rockbox

Changed the LCD_COLOR pixel value format to packed RGB (unsigned int). Now all LCDs with depth > 1 use the same datatype. Added macros for easy pixel value definition.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7912 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Jens Arnold 2005-11-16 21:09:23 +00:00
parent 15046f99b3
commit 5b2cba17aa
15 changed files with 94 additions and 148 deletions

View file

@ -127,13 +127,8 @@ void internal_splash(struct screen * screen,
int xx = (screen->width-maxw)/2 - 2; int xx = (screen->width-maxw)/2 - 2;
/* The new graphics routines handle clipping, so no need to check */ /* The new graphics routines handle clipping, so no need to check */
#if LCD_DEPTH > 1 #if LCD_DEPTH > 1
#ifdef HAVE_LCD_COLOR
screen->set_background((struct rgb){LCD_MAX_RED-1, LCD_MAX_GREEN-1,
LCD_MAX_BLUE-1});
#else
if(screen->depth>1) if(screen->depth>1)
screen->set_background(LCD_MAX_LEVEL-1); screen->set_background(LCD_LIGHTGRAY);
#endif
#endif #endif
screen->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); screen->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
screen->fillrect(xx, y-2, maxw+4, screen->height-y*2+4); screen->fillrect(xx, y-2, maxw+4, screen->height-y*2+4);
@ -183,7 +178,7 @@ void internal_splash(struct screen * screen,
#if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH > 1) #if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH > 1)
if(screen->depth > 1) if(screen->depth > 1)
screen->set_background(LCD_WHITE); screen->set_background(LCD_DEFAULT_BG);
#endif #endif
#if defined(HAVE_LCD_BITMAP) || defined(SIMULATOR) #if defined(HAVE_LCD_BITMAP) || defined(SIMULATOR)
screen->update(); screen->update();

View file

@ -434,7 +434,7 @@ int plugin_load(const char* plugin, void* parameter)
button_clear_queue(); button_clear_queue();
#ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_BITMAP
#if LCD_DEPTH > 1 #if LCD_DEPTH > 1
lcd_set_drawinfo(DRMODE_SOLID, LCD_BLACK, LCD_WHITE); lcd_set_drawinfo(DRMODE_SOLID, LCD_DEFAULT_FG, LCD_DEFAULT_BG);
#else /* LCD_DEPTH == 1 */ #else /* LCD_DEPTH == 1 */
lcd_set_drawmode(DRMODE_SOLID); lcd_set_drawmode(DRMODE_SOLID);
#endif /* LCD_DEPTH */ #endif /* LCD_DEPTH */

View file

@ -173,17 +173,10 @@ struct plugin_api {
void (*lcd_mono_bitmap)(const unsigned char *src, int x, int y, void (*lcd_mono_bitmap)(const unsigned char *src, int x, int y,
int width, int height); int width, int height);
#if LCD_DEPTH > 1 #if LCD_DEPTH > 1
#ifdef HAVE_LCD_COLOR void (*lcd_set_foreground)(unsigned foreground);
void (*lcd_set_foreground)(struct rgb color); unsigned (*lcd_get_foreground)(void);
struct rgb (*lcd_get_foreground)(void); void (*lcd_set_background)(unsigned foreground);
void (*lcd_set_background)(struct rgb color); unsigned (*lcd_get_background)(void);
struct rgb (*lcd_get_background)(void);
#else
void (*lcd_set_foreground)(int brightness);
int (*lcd_get_foreground)(void);
void (*lcd_set_background)(int brightness);
int (*lcd_get_background)(void);
#endif
void (*lcd_bitmap_part)(const fb_data *src, int src_x, int src_y, void (*lcd_bitmap_part)(const fb_data *src, int src_x, int src_y,
int stride, int x, int y, int width, int height); int stride, int x, int y, int width, int height);
void (*lcd_bitmap)(const fb_data *src, int x, int y, int width, void (*lcd_bitmap)(const fb_data *src, int x, int y, int width,

View file

@ -282,17 +282,14 @@ static void addclock(void)
#define DRAW_WIDTH (LCD_WIDTH + LETTER_WIDTH*2) #define DRAW_WIDTH (LCD_WIDTH + LETTER_WIDTH*2)
#if LCD_DEPTH > 1 #if LCD_DEPTH > 1
static const unsigned face_colors[] =
{
#ifdef HAVE_LCD_COLOR #ifdef HAVE_LCD_COLOR
static const struct rgb face_colors[] = LCD_BLACK, LCD_RGBPACK(0, 0, 255), LCD_RGBPACK(255, 0, 0)
{
LCD_BLACK, {0, 0, LCD_MAX_BLUE}, {LCD_MAX_RED, 0, 0}
};
#else #else
static const int face_colors[] = LCD_BLACK, LCD_LIGHTGRAY, LCD_DARKGRAY
{
0, 2*LCD_MAX_LEVEL/3, LCD_MAX_LEVEL/3
};
#endif #endif
};
#endif #endif
static int scrollit(void) static int scrollit(void)

View file

@ -152,18 +152,16 @@ static const struct face faces[6] =
}; };
#if LCD_DEPTH > 1 #if LCD_DEPTH > 1
static const unsigned face_colors[6] =
{
#ifdef HAVE_LCD_COLOR #ifdef HAVE_LCD_COLOR
static const struct rgb face_colors[6] = LCD_RGBPACK(255, 0, 0), LCD_RGBPACK(255, 0, 0), LCD_RGBPACK(0, 255, 0),
{ LCD_RGBPACK(0, 255, 0), LCD_RGBPACK(0, 0, 255), LCD_RGBPACK(0, 0, 255)
{LCD_MAX_RED, 0, 0}, {LCD_MAX_RED, 0, 0}, {0, LCD_MAX_GREEN, 0},
{0, LCD_MAX_GREEN, 0}, {0, 0, LCD_MAX_BLUE}, {0, 0, LCD_MAX_BLUE}
};
#else #else
static const int face_colors[6] = LCD_LIGHTGRAY, LCD_LIGHTGRAY, LCD_DARKGRAY,
{ LCD_DARKGRAY, LCD_BLACK, LCD_BLACK
2*LCD_MAX_LEVEL/3, 2*LCD_MAX_LEVEL/3, LCD_MAX_LEVEL/3, LCD_MAX_LEVEL/3, 0, 0
};
#endif #endif
};
#endif #endif
enum { enum {

View file

@ -51,11 +51,11 @@ void gray_update_rect(int x, int y, int width, int height);
void gray_set_position(int x, int by); void gray_set_position(int x, int by);
void gray_set_drawmode(int mode); void gray_set_drawmode(int mode);
int gray_get_drawmode(void); int gray_get_drawmode(void);
void gray_set_foreground(int brightness); void gray_set_foreground(unsigned brightness);
int gray_get_foreground(void); unsigned gray_get_foreground(void);
void gray_set_background(int brightness); void gray_set_background(unsigned brightness);
int gray_get_background(void); unsigned gray_get_background(void);
void gray_set_drawinfo(int mode, int fg_brightness, int bg_brightness); void gray_set_drawinfo(int mode, unsigned fg_brightness, unsigned bg_brightness);
void gray_setfont(int newfont); void gray_setfont(int newfont);
int gray_getstringsize(const unsigned char *str, int *w, int *h); int gray_getstringsize(const unsigned char *str, int *w, int *h);

View file

@ -53,7 +53,7 @@ int gray_get_drawmode(void)
} }
/* Set the foreground shade for subsequent drawing operations */ /* Set the foreground shade for subsequent drawing operations */
void gray_set_foreground(int brightness) void gray_set_foreground(unsigned brightness)
{ {
unsigned data = MULU16(_gray_info.depth, brightness & 0xFF) + 127; unsigned data = MULU16(_gray_info.depth, brightness & 0xFF) + 127;
@ -61,14 +61,14 @@ void gray_set_foreground(int brightness)
} }
/* Return the current foreground shade */ /* Return the current foreground shade */
int gray_get_foreground(void) unsigned gray_get_foreground(void)
{ {
return (_gray_info.fg_brightness * 255 + (_gray_info.depth >> 1)) return (_gray_info.fg_brightness * 255 + (_gray_info.depth >> 1))
/ _gray_info.depth; / _gray_info.depth;
} }
/* Set the background shade for subsequent drawing operations */ /* Set the background shade for subsequent drawing operations */
void gray_set_background(int brightness) void gray_set_background(unsigned brightness)
{ {
unsigned data = MULU16(_gray_info.depth, brightness & 0xFF) + 127; unsigned data = MULU16(_gray_info.depth, brightness & 0xFF) + 127;
@ -76,14 +76,14 @@ void gray_set_background(int brightness)
} }
/* Return the current background shade */ /* Return the current background shade */
int gray_get_background(void) unsigned gray_get_background(void)
{ {
return (_gray_info.bg_brightness * 255 + (_gray_info.depth >> 1)) return (_gray_info.bg_brightness * 255 + (_gray_info.depth >> 1))
/ _gray_info.depth; / _gray_info.depth;
} }
/* Set draw mode, foreground and background shades at once */ /* Set draw mode, foreground and background shades at once */
void gray_set_drawinfo(int mode, int fg_brightness, int bg_brightness) void gray_set_drawinfo(int mode, unsigned fg_brightness, unsigned bg_brightness)
{ {
gray_set_drawmode(mode); gray_set_drawmode(mode);
gray_set_foreground(fg_brightness); gray_set_foreground(fg_brightness);

View file

@ -67,16 +67,6 @@ use F3 to see how many mines are left (supposing all your flags are correct)
#endif #endif
#if LCD_DEPTH > 1
#if HAVE_LCD_COLOR
#define LIGHT_GRAY ((struct rgb){2*LCD_MAX_RED/3, 2*LCD_MAX_GREEN/3, 2*LCD_MAX_BLUE/3})
#define DARK_GRAY ((struct rgb){LCD_MAX_RED/3, LCD_MAX_GREEN/3, LCD_MAX_BLUE/3})
#else
#define LIGHT_GRAY (2*LCD_MAX_LEVEL/3)
#define DARK_GRAY (LCD_MAX_LEVEL/3)
#endif
#endif
/* here is a global api struct pointer. while not strictly necessary, /* here is a global api struct pointer. while not strictly necessary,
it's nice not to have to pass the api pointer in all function calls it's nice not to have to pass the api pointer in all function calls
in the plugin */ in the plugin */
@ -385,7 +375,7 @@ int minesweeper(void)
for(i=0;i<height;i++){ for(i=0;i<height;i++){
for(j=0;j<width;j++){ for(j=0;j<width;j++){
#if LCD_DEPTH > 1 #if LCD_DEPTH > 1
rb->lcd_set_foreground(DARK_GRAY); rb->lcd_set_foreground(LCD_DARKGRAY);
rb->lcd_drawrect(j*8,i*8,8,8); rb->lcd_drawrect(j*8,i*8,8,8);
rb->lcd_set_foreground(LCD_BLACK); rb->lcd_set_foreground(LCD_BLACK);
#else #else
@ -404,7 +394,7 @@ int minesweeper(void)
rb->lcd_drawline(j*8+2,i*8+5,j*8+5,i*8+2); rb->lcd_drawline(j*8+2,i*8+5,j*8+5,i*8+2);
} else { } else {
#if LCD_DEPTH > 1 #if LCD_DEPTH > 1
rb->lcd_set_foreground(LIGHT_GRAY); rb->lcd_set_foreground(LCD_LIGHTGRAY);
rb->lcd_fillrect(j*8+1,i*8+1,6,6); rb->lcd_fillrect(j*8+1,i*8+1,6,6);
rb->lcd_set_foreground(LCD_BLACK); rb->lcd_set_foreground(LCD_BLACK);
#else #else

View file

@ -59,10 +59,10 @@
#endif #endif
#if LCD_DEPTH > 1 #if LCD_DEPTH > 1
#if HAVE_LCD_COLOR #ifdef HAVE_LCD_COLOR
#define MEDIUM_GRAY ((struct rgb){LCD_MAX_RED/2, LCD_MAX_GREEN/2, LCD_MAX_BLUE/2}) #define MEDIUM_GRAY LCD_RGBPACK(127, 127, 127)
#else #else
#define MEDIUM_GRAY (LCD_MAX_LEVEL/2) #define MEDIUM_GRAY LCD_BRIGHTNESS(127)
#endif #endif
#endif #endif

View file

@ -135,13 +135,13 @@ static struct plugin_api* rb;
#endif #endif
#if LCD_DEPTH>1 #if LCD_DEPTH>1
static const unsigned colors[4] = {
#ifdef HAVE_LCD_COLOR #ifdef HAVE_LCD_COLOR
static const unsigned struct rgb colors[4] = { LCD_BLACK, LCD_RGBPACK(255, 0, 0), LCD_BLACK, LCD_RGBPACK(255, 0, 0)
{ 0, 0, 0 }, { LCD_MAX_RED, 0, 0 }, { 0, 0, 0 }, { LCD_MAX_RED, 0, 0 }
};
#else #else
static const int colors[4] = { LCD_BLACK, LCD_MAX_LEVEL/2, LCD_BLACK, LCD_MAX_LEVEL/2 }; LCD_BLACK, LCD_BRIGHTNESS(127), LCD_BLACK, LCD_BRIGHTNESS(127)
#endif #endif
};
#endif #endif
static const unsigned char suits[4][8] = { static const unsigned char suits[4][8] = {

View file

@ -362,16 +362,6 @@ static unsigned char num_inverse[10][8]= {
#error SUDOKU: Unsupported LCD size #error SUDOKU: Unsupported LCD size
#endif #endif
#if LCD_DEPTH > 1
#if HAVE_LCD_COLOR
#define LIGHT_GRAY ((struct rgb){2*LCD_MAX_RED/3, 2*LCD_MAX_GREEN/3, 2*LCD_MAX_BLUE/3})
#define DARK_GRAY ((struct rgb){LCD_MAX_RED/3, LCD_MAX_GREEN/3, LCD_MAX_BLUE/3})
#else
#define LIGHT_GRAY (2*LCD_MAX_LEVEL/3)
#define DARK_GRAY (LCD_MAX_LEVEL/3)
#endif
#endif
/* here is a global api struct pointer. while not strictly necessary, /* here is a global api struct pointer. while not strictly necessary,
it's nice not to have to pass the api pointer in all function calls it's nice not to have to pass the api pointer in all function calls
in the plugin */ in the plugin */

View file

@ -76,11 +76,7 @@ struct screen
int x, int y, int width, int height); int x, int y, int width, int height);
void (*set_drawmode)(int mode); void (*set_drawmode)(int mode);
#if LCD_DEPTH > 1 #if LCD_DEPTH > 1
#if HAVE_LCD_COLOR void (*set_background)(unsigned background);
void (*set_background)(struct rgb color);
#else
void (*set_background)(int brightness);
#endif
#endif /* LCD_DEPTH > 1 */ #endif /* LCD_DEPTH > 1 */
void (*update_rect)(int x, int y, int width, int height); void (*update_rect)(int x, int y, int width, int height);
void (*fillrect)(int x, int y, int width, int height); void (*fillrect)(int x, int y, int width, int height);

View file

@ -34,13 +34,11 @@
#define SCROLLABLE_LINES 26 #define SCROLLABLE_LINES 26
#define RGB_PACK(r,g,b) (htobe16(((r)<<11)|((g)<<5)|(b)))
/*** globals ***/ /*** globals ***/
fb_data lcd_framebuffer[LCD_HEIGHT][LCD_WIDTH] __attribute__ ((aligned (4))); fb_data lcd_framebuffer[LCD_HEIGHT][LCD_WIDTH] __attribute__ ((aligned (4)));
static unsigned fg_pattern; static unsigned fg_pattern = LCD_DEFAULT_FG;
static unsigned bg_pattern; static unsigned bg_pattern = LCD_DEFAULT_BG;
static int drawmode = DRMODE_SOLID; static int drawmode = DRMODE_SOLID;
static int xmargin = 0; static int xmargin = 0;
static int ymargin = 0; static int ymargin = 0;
@ -72,9 +70,6 @@ int lcd_default_contrast(void)
/* LCD init */ /* LCD init */
void lcd_init(void) void lcd_init(void)
{ {
fg_pattern = 0x0000; /* Black */
bg_pattern = RGB_PACK(0x17, 0x31, 0x1d); /* "Rockbox blue" */
lcd_clear_display(); lcd_clear_display();
/* Call device specific init */ /* Call device specific init */
lcd_init_device(); lcd_init_device();
@ -94,43 +89,32 @@ int lcd_get_drawmode(void)
return drawmode; return drawmode;
} }
void lcd_set_foreground(struct rgb color) void lcd_set_foreground(unsigned color)
{ {
fg_pattern = RGB_PACK(color.red, color.green, color.blue); fg_pattern = color;
} }
struct rgb lcd_get_foreground(void) unsigned lcd_get_foreground(void)
{ {
struct rgb colour; return fg_pattern;
colour.red = (fg_pattern >> 11) & 0x1f;
colour.green = (fg_pattern >> 5) & 0x3f;
colour.blue = fg_pattern & 0x1f;
return colour;
} }
void lcd_set_background(struct rgb color) void lcd_set_background(unsigned color)
{ {
bg_pattern = RGB_PACK(color.red, color.green, color. blue); bg_pattern = color;
} }
struct rgb lcd_get_background(void) unsigned lcd_get_background(void)
{ {
struct rgb colour; return bg_pattern;
colour.red = (bg_pattern >> 11) & 0x1f;
colour.green = (bg_pattern >> 5) & 0x3f;
colour.blue = bg_pattern & 0x1f;
return colour;
} }
void lcd_set_drawinfo(int mode, struct rgb fg_color, void lcd_set_drawinfo(int mode, unsigned fg_color, unsigned bg_color)
struct rgb bg_color)
{ {
lcd_set_drawmode(mode); lcd_set_drawmode(mode);
lcd_set_foreground(fg_color); fg_pattern = fg_color;
lcd_set_background(bg_color); bg_pattern = bg_color;
} }
void lcd_setmargins(int x, int y) void lcd_setmargins(int x, int y)

View file

@ -307,27 +307,27 @@ int lcd_get_drawmode(void)
return drawmode; return drawmode;
} }
void lcd_set_foreground(int brightness) void lcd_set_foreground(unsigned brightness)
{ {
fg_pattern = 0x55 * (~brightness & 3); fg_pattern = 0x55 * (~brightness & 3);
} }
int lcd_get_foreground(void) unsigned lcd_get_foreground(void)
{ {
return ~fg_pattern & 3; return ~fg_pattern & 3;
} }
void lcd_set_background(int brightness) void lcd_set_background(unsigned brightness)
{ {
bg_pattern = 0x55 * (~brightness & 3); bg_pattern = 0x55 * (~brightness & 3);
} }
int lcd_get_background(void) unsigned lcd_get_background(void)
{ {
return ~bg_pattern & 3; return ~bg_pattern & 3;
} }
void lcd_set_drawinfo(int mode, int fg_brightness, int bg_brightness) void lcd_set_drawinfo(int mode, unsigned fg_brightness, unsigned bg_brightness)
{ {
lcd_set_drawmode(mode); lcd_set_drawmode(mode);
lcd_set_foreground(fg_brightness); lcd_set_foreground(fg_brightness);

View file

@ -140,29 +140,39 @@ typedef void lcd_blockfunc_type(unsigned char *address, unsigned mask, unsigned
#ifdef HAVE_LCD_COLOR #ifdef HAVE_LCD_COLOR
#if LCD_DEPTH == 16 #if LCD_DEPTH == 16
#define LCD_MAX_RED ((1 << 5) - 1) #define LCD_MAX_RED 31
#define LCD_MAX_GREEN ((1 << 6) - 1) #define LCD_MAX_GREEN 63
#define LCD_MAX_BLUE ((1 << 5) - 1) #define LCD_MAX_BLUE 31
#define _RGBPACK(r, g, b) ( ((((r) * 31 + 127) / 255) << 11) \
|((((g) * 63 + 127) / 255) << 5) \
| (((b) * 31 + 127) / 255))
#if (CONFIG_LCD == LCD_IPODCOLOR) || (CONFIG_LCD == LCD_IPODNANO)
#define LCD_RGBPACK(r, g, b) ( ((_RGBPACK((r), (g), (b)) & 0xff00) >> 8) \
|((_RGBPACK((r), (g), (b)) & 0x00ff) << 8))
#else #else
#define LCD_MAX_RED ((1 << (LCD_DEPTH/3)) - 1) #define LCD_RGBPACK(r, g, b) _RGBPACK((r), (g), (b))
#define LCD_MAX_GREEN ((1 << (LCD_DEPTH/3)) - 1)
#define LCD_MAX_BLUE ((1 << (LCD_DEPTH/3)) - 1)
#endif #endif
struct rgb { #else
unsigned char red; /* other colour depths */
unsigned char green; #endif
unsigned char blue;
}; #define LCD_BLACK LCD_RGBPACK(0, 0, 0)
#define LCD_BLACK ((struct rgb){0, 0, 0}) #define LCD_DARKGRAY LCD_RGBPACK(85, 85, 85)
#define LCD_DARKGRAY ((struct rgb){LCD_MAX_RED/3, LCD_MAX_GREEN/3, LCD_MAX_BLUE/3}) #define LCD_LIGHTGRAY LCD_RGBPACK(170, 170, 170)
#define LCD_LIGHTGRAY ((struct rgb){2*LCD_MAX_RED/3, 2*LCD_MAX_GREEN/3, 2*LCD_MAX_BLUE/3}) #define LCD_WHITE LCD_RGBPACK(255, 255, 255)
#define LCD_WHITE ((struct rgb){LCD_MAX_RED, LCD_MAX_GREEN, LCD_MAX_BLUE}) #define LCD_DEFAULT_FG LCD_BLACK
#else /* monochrome */ #define LCD_DEFAULT_BG LCD_RGBPACK(182, 198, 229) /* rockbox blue */
#elif LCD_DEPTH > 1 /* greyscale */
#define LCD_MAX_LEVEL ((1 << LCD_DEPTH) - 1) #define LCD_MAX_LEVEL ((1 << LCD_DEPTH) - 1)
#define LCD_BLACK 0 #define LCD_BRIGHTNESS(y) (((y) * LCD_MAX_LEVEL + 127) / 255)
#define LCD_DARKGRAY (LCD_MAX_LEVEL/3)
#define LCD_LIGHTGRAY (2*LCD_MAX_LEVEL/3) #define LCD_BLACK LCD_BRIGHTNESS(0)
#define LCD_WHITE LCD_MAX_LEVEL #define LCD_DARKGRAY LCD_BRIGHTNESS(85)
#define LCD_LIGHTGRAY LCD_BRIGHTNESS(170)
#define LCD_WHITE LCD_BRIGHTNESS(255)
#define LCD_DEFAULT_FG LCD_BLACK
#define LCD_DEFAULT_BG LCD_WHITE
#endif #endif
/* Memory copy of display bitmap */ /* Memory copy of display bitmap */
@ -207,20 +217,13 @@ extern void lcd_bidir_scroll(int threshold);
extern void lcd_scroll_step(int pixels); extern void lcd_scroll_step(int pixels);
#if LCD_DEPTH > 1 #if LCD_DEPTH > 1
#ifdef HAVE_LCD_COLOR extern void lcd_set_foreground(unsigned foreground);
extern void lcd_set_foreground(struct rgb color); extern unsigned lcd_get_foreground(void);
extern struct rgb lcd_get_foreground(void); extern void lcd_set_background(unsigned background);
extern void lcd_set_background(struct rgb color); extern unsigned lcd_get_background(void);
extern struct rgb lcd_get_background(void); extern void lcd_set_drawinfo(int mode, unsigned foreground,
extern void lcd_set_drawinfo(int mode, struct rgb fg_color, unsigned background);
struct rgb bg_color);
#else /* monochrome */
extern void lcd_set_foreground(int brightness);
extern int lcd_get_foreground(void);
extern void lcd_set_background(int brightness);
extern int lcd_get_background(void);
extern void lcd_set_drawinfo(int mode, int fg_brightness, int bg_brightness);
#endif
extern void lcd_mono_bitmap_part(const unsigned char *src, int src_x, int src_y, extern void lcd_mono_bitmap_part(const unsigned char *src, int src_x, int src_y,
int stride, int x, int y, int width, int height); int stride, int x, int y, int width, int height);
extern void lcd_mono_bitmap(const unsigned char *src, int x, int y, int width, extern void lcd_mono_bitmap(const unsigned char *src, int x, int y, int width,