blob: 42db2bae747a4f12ed8154606459d3aafa9634a9 [file] [log] [blame]
/*
* Low-level drawing operations for a cfb4 frame buffer
*
* (C) Copyright 2001-2002 Geert Uytterhoeven
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file COPYING in the main directory of this archive for
* more details.
*/
#include "types.h"
#include "drawops.h"
#include "fb.h"
#include "util.h"
static u8 *screen;
static u32 screen_width;
static int cfb4_init(void)
{
if (fb_fix.type != FB_TYPE_PACKED_PIXELS || fb_var.bits_per_pixel != 4)
return 0;
screen = fb;
screen_width = fb_fix.line_length ? fb_fix.line_length
: fb_var.xres_virtual/2;
return cfb_init();
}
static void cfb4_setpixel(u32 x, u32 y, pixel_t pixel)
{
u8 *p = &screen[y*screen_width+x/2];
if (x & 1)
*p = pixel | (*p & 0xf0);
else
*p = (pixel << 4) | (*p & 0x0f);
}
static pixel_t cfb4_getpixel(u32 x, u32 y)
{
u8 d = screen[y*screen_width+x/2];
return (x & 1) ? (d & 0x0f) : (d >> 4);
}
const struct drawops cfb4_drawops = {
.name = "cfb4 (4 bpp packed pixels)",
.init = cfb4_init,
.set_pixel = cfb4_setpixel,
.get_pixel = cfb4_getpixel,
.draw_hline = cfb_draw_hline,
.fill_rect = cfb_fill_rect,
.copy_rect = cfb_copy_rect,
};