Testing GXA icon blit; Cleanup FB and pictureviwer code; This is work in progress, any bugs possible

git-svn-id: file:///home/bas/coolstream_public_svn/THIRDPARTY/applications/neutrino-experimental@258 e54a6e83-5905-42d5-8d5c-058d10e6a962


Origin commit data
------------------
Commit: 2f6462c65d
Author: [CST] Focus <focus.cst@gmail.com>
Date: 2010-02-04 (Thu, 04 Feb 2010)
This commit is contained in:
[CST] Focus
2010-02-04 20:18:42 +00:00
parent f27d5aa5f4
commit a8160d1e91
12 changed files with 319 additions and 524 deletions

View File

@@ -1,3 +1,7 @@
/* FrameBuffer Image Display Function
* (c) smoku/2000
*/
#include <linux/fb.h>
#include <config.h>
@@ -14,336 +18,83 @@
#include "fb_display.h"
#include "pictureviewer.h"
#include "driver/framebuffer.h"
/*
* FrameBuffer Image Display Function
* (c) smoku/2000
*
*/
/* Public Use Functions:
*
* extern void fb_display(unsigned char *rgbbuff,
* int x_size, int y_size,
* int x_pan, int y_pan,
* int x_offs, int y_offs);
*
* extern void getCurrentRes(int *x,int *y);
*
*/
static unsigned short red[256], green[256], blue[256];
static struct fb_cmap map332 = {0, 256, red, green, blue, NULL};
//static unsigned short red_b[256], green_b[256], blue_b[256];
//static struct fb_cmap map_back = {0, 256, red_b, green_b, blue_b, NULL};
static unsigned char *lfb = 0;
int openFB(const char *name);
//void closeFB(int fh);
//void getVarScreenInfo(int fh, struct fb_var_screeninfo *var);
//void setVarScreenInfo(int fh, struct fb_var_screeninfo *var);
void getFixScreenInfo(struct fb_fix_screeninfo *fix);
void set332map();
void blit2FB(void *fbbuff,
unsigned int pic_xs, unsigned int pic_ys,
unsigned int scr_xs, unsigned int scr_ys,
unsigned int xp, unsigned int yp,
unsigned int xoffs, unsigned int yoffs,
int cpp);
void clearFB(int bpp,int cpp);
inline unsigned short make16color(uint32_t r, uint32_t g,
uint32_t b, uint32_t rl,
uint32_t ro, uint32_t gl,
uint32_t go, uint32_t bl,
uint32_t bo, uint32_t tl,
uint32_t to);
unsigned int xoffs, unsigned int yoffs);
void fb_display(unsigned char *rgbbuff, int x_size, int y_size, int x_pan, int y_pan, int x_offs, int y_offs, bool clearfb, int transp)
{
struct fb_var_screeninfo *var;
unsigned short *fbbuff = NULL;
int bp = 0;
if(rgbbuff==NULL)
return;
/* read current video mode */
var = CFrameBuffer::getInstance()->getScreenInfo();
lfb = (unsigned char *)CFrameBuffer::getInstance()->getFrameBufferPointer();
struct fb_var_screeninfo *var;
unsigned short *fbbuff = NULL;
/* correct panning */
if(x_pan > x_size - (int)var->xres) x_pan = 0;
if(y_pan > y_size - (int)var->yres) y_pan = 0;
/* correct offset */
if(x_offs + x_size > (int)var->xres) x_offs = 0;
if(y_offs + y_size > (int)var->yres) y_offs = 0;
if(rgbbuff == NULL)
return;
//printf("fb_display: bits_per_pixel: %d\n", var->bits_per_pixel);
//printf("fb_display: var->xres %d var->yres %d x_size %d y_size %d\n", var->xres, var->yres, x_size, y_size);
/* blit buffer 2 fb */
fbbuff = (unsigned short *) convertRGB2FB(rgbbuff, x_size, y_size, var->bits_per_pixel, &bp, transp);
if(fbbuff==NULL)
return;
/* ClearFB if image is smaller */
//if(x_size < (int)var->xres || y_size < (int)var->yres)
if(clearfb)
clearFB(var->bits_per_pixel, bp);
blit2FB(fbbuff, x_size, y_size, var->xres, var->yres, x_pan, y_pan, x_offs, y_offs, bp);
free(fbbuff);
}
/* read current video mode */
var = CFrameBuffer::getInstance()->getScreenInfo();
lfb = (unsigned char *)CFrameBuffer::getInstance()->getFrameBufferPointer();
void getCurrentRes(int *x, int *y)
{
struct fb_var_screeninfo *var;
var = CFrameBuffer::getInstance()->getScreenInfo();
*x = var->xres;
*y = var->yres;
//printf("getCurrentRes: %dx%d\n", var->xres, var->yres);
}
/* correct panning */
if(x_pan > x_size - (int)var->xres) x_pan = 0;
if(y_pan > y_size - (int)var->yres) y_pan = 0;
/* correct offset */
if(x_offs + x_size > (int)var->xres) x_offs = 0;
if(y_offs + y_size > (int)var->yres) y_offs = 0;
void make332map(struct fb_cmap *map)
{
int rs, gs, bs, i;
int r = 8, g = 8, b = 4;
/* blit buffer 2 fb */
fbbuff = (unsigned short *) convertRGB2FB(rgbbuff, x_size, y_size, transp);
if(fbbuff==NULL)
return;
map->red = red;
map->green = green;
map->blue = blue;
rs = 256 / (r - 1);
gs = 256 / (g - 1);
bs = 256 / (b - 1);
for (i = 0; i < 256; i++) {
map->red[i] = (rs * ((i / (g * b)) % r)) * 255;
map->green[i] = (gs * ((i / b) % g)) * 255;
map->blue[i] = (bs * ((i) % b)) * 255;
}
}
/*
void set8map(int fh, struct fb_cmap *map)
{
if (ioctl(fh, FBIOPUTCMAP, map) < 0) {
fprintf(stderr, "Error putting colormap");
exit(1);
}
}
void get8map(int fh, struct fb_cmap *map)
{
if (ioctl(fh, FBIOGETCMAP, map) < 0) {
fprintf(stderr, "Error getting colormap");
exit(1);
}
}
*/
void set332map()
{
make332map(&map332);
CFrameBuffer::getInstance()->paletteSet(&map332);
/* ClearFB if image is smaller */
//if(x_size < (int)var->xres || y_size < (int)var->yres)
if(clearfb)
CFrameBuffer::getInstance()->Clear();
blit2FB(fbbuff, x_size, y_size, var->xres, var->yres, x_pan, y_pan, x_offs, y_offs);
free(fbbuff);
}
void blit2FB(void *fbbuff,
unsigned int pic_xs, unsigned int pic_ys,
unsigned int scr_xs, unsigned int scr_ys,
unsigned int xp, unsigned int yp,
unsigned int xoffs, unsigned int yoffs,
int cpp)
unsigned int xoffs, unsigned int yoffs)
{
int i, xc, yc;
unsigned char *cp; unsigned short *sp; unsigned int *ip;
ip = (unsigned int *) fbbuff;
sp = (unsigned short *) ip;
cp = (unsigned char *) sp;
int i, xc, yc;
unsigned char *cp; unsigned short *sp; unsigned int *ip;
ip = (unsigned int *) fbbuff;
sp = (unsigned short *) ip;
cp = (unsigned char *) sp;
xc = (pic_xs > scr_xs) ? scr_xs : pic_xs;
yc = (pic_ys > scr_ys) ? scr_ys : pic_ys;
xc = (pic_xs > scr_xs) ? scr_xs : pic_xs;
yc = (pic_ys > scr_ys) ? scr_ys : pic_ys;
unsigned int stride = CFrameBuffer::getInstance()->getStride();
switch(cpp){
case 1:
set332map();
for(i = 0; i < yc; i++){
memcpy(lfb+(i+yoffs)*stride+xoffs*cpp, cp + (i+yp)*pic_xs+xp,xc*cpp);
}
break;
case 2:
for(i = 0; i < yc; i++){
memcpy(lfb+(i+yoffs)*stride+xoffs*cpp, sp + (i+yp)*pic_xs+xp, xc*cpp);
}
break;
case 4:
for(i = 0; i < yc; i++){
memcpy(lfb+(i+yoffs)*stride+xoffs*cpp, ip + (i+yp)*pic_xs+xp, xc*cpp);
}
break;
}
}
void clearFB(int /*bpp*/, int cpp)
{
int x,y;
getCurrentRes(&x,&y);
unsigned int stride = CFrameBuffer::getInstance()->getStride();
//printf("clearFB: stride %d y %d cpp %d bpp %d total %d\n", stride, y, cpp, bpp, stride*y*cpp);
switch(cpp){
case 2:
{
uint32_t rl, ro, gl, go, bl, bo, tl, to;
unsigned int i;
struct fb_var_screeninfo *var;
var = CFrameBuffer::getInstance()->getScreenInfo();
rl = (var->red).length;
ro = (var->red).offset;
gl = (var->green).length;
go = (var->green).offset;
bl = (var->blue).length;
bo = (var->blue).offset;
tl = (var->transp).length;
to = (var->transp).offset;
short black=make16color(0,0,0, rl, ro, gl, go, bl, bo, tl, to);
unsigned short *s_fbbuff = (unsigned short *) malloc(y*stride/2 * sizeof(unsigned short));
if(s_fbbuff==NULL)
{
printf("Error: malloc\n");
return;
}
for(i = 0; i < y*stride/2; i++)
s_fbbuff[i] = black;
memcpy(lfb, s_fbbuff, y*stride);
free(s_fbbuff);
}
break;
case 4:
{
uint32_t col = 0xFF000000;
uint32_t * dest = (uint32_t *) lfb;
for(unsigned int i = 0; i < stride*y/4; i ++)
dest[i] = col;
}
break;
default:
//memset(lfb, 0xFF, stride*y);
memset(lfb, 0, stride*y);
break;
for(i = 0; i < yc; i++){
memcpy(lfb+(i+yoffs)*stride+xoffs*4, ip + (i+yp)*pic_xs+xp, xc*4);
}
}
inline unsigned char make8color(unsigned char r, unsigned char g, unsigned char b)
void* convertRGB2FB(unsigned char *rgbbuff, unsigned long x, unsigned long y, int transp)
{
return (
(((r >> 5) & 7) << 5) |
(((g >> 5) & 7) << 2) |
((b >> 6) & 3) );
}
inline unsigned short make15color(unsigned char r, unsigned char g, unsigned char b)
{
return (
(((b >> 3) & 31) << 10) |
(((g >> 3) & 31) << 5) |
((r >> 3) & 31) );
}
inline unsigned short make16color(uint32_t r, uint32_t g, uint32_t b,
uint32_t rl, uint32_t ro,
uint32_t gl, uint32_t go,
uint32_t bl, uint32_t bo,
uint32_t /*tl*/, uint32_t /*to*/)
{
return (
// ((0xFF >> (8 - tl)) << to) |
((r >> (8 - rl)) << ro) |
((g >> (8 - gl)) << go) |
((b >> (8 - bl)) << bo));
}
void* convertRGB2FB(unsigned char *rgbbuff, unsigned long x, unsigned long y, int bpp, int *cpp, int transp)
{
unsigned long i;
void *fbbuff = NULL;
unsigned char *c_fbbuff;
unsigned short *s_fbbuff;
unsigned int *i_fbbuff;
unsigned long count = x*y;
uint32_t rl, ro, gl, go, bl, bo, tl, to;
struct fb_var_screeninfo *var;
var = CFrameBuffer::getInstance()->getScreenInfo();
rl = (var->red).length;
ro = (var->red).offset;
gl = (var->green).length;
go = (var->green).offset;
bl = (var->blue).length;
bo = (var->blue).offset;
tl = (var->transp).length;
to = (var->transp).offset;
switch(bpp)
{
case 8:
*cpp = 1;
c_fbbuff = (unsigned char *) malloc(count * sizeof(unsigned char));
if(c_fbbuff==NULL)
{
printf("Error: malloc\n");
return NULL;
}
for(i = 0; i < count; i++)
c_fbbuff[i] = make8color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]);
fbbuff = (void *) c_fbbuff;
break;
case 15:
*cpp = 2;
#if HAVE_DVB_API_VERSION < 3
s_fbbuff = (unsigned short *) malloc(count * sizeof(unsigned short));
if(s_fbbuff==NULL)
{
printf("Error: malloc\n");
return NULL;
}
for(i = 0; i < count ; i++)
s_fbbuff[i] = make15color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]);
#else
s_fbbuff = (unsigned short*) make15color_errdiff(rgbbuff, x, y);
#endif
fbbuff = (void *) s_fbbuff;
break;
case 16:
*cpp = 2;
#if HAVE_DVB_API_VERSION < 3
s_fbbuff = (unsigned short *) malloc(count * sizeof(unsigned short));
if(s_fbbuff==NULL)
{
printf("Error: malloc\n");
return NULL;
}
for(i = 0; i < count ; i++)
s_fbbuff[i]=make16color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2], rl, ro, gl, go, bl, bo, tl, to);
#else
s_fbbuff = (unsigned short*) make15color_errdiff(rgbbuff, x, y);
#endif
fbbuff = (void *) s_fbbuff;
break;
case 24:
case 32:
*cpp = 4;
i_fbbuff = (unsigned int *) malloc(count * sizeof(unsigned int));
if(i_fbbuff==NULL)
{
printf("Error: malloc\n");
return NULL;
}
// red rgbbuff[i*3] green rgbbuff[i*3+1] blue rgbbuff[i*3+2]
for(i = 0; i < count ; i++)
i_fbbuff[i] = (transp << 24) | ((rgbbuff[i*3] << 16) & 0xFF0000) | ((rgbbuff[i*3+1] << 8) & 0xFF00) | (rgbbuff[i*3+2] & 0xFF);
//i_fbbuff[i] = (transp << 24) | ((rgbbuff[i*3+2] << 16) & 0xFF0000) | ((rgbbuff[i*3+1] << 8) & 0xFF00) | (rgbbuff[i*3] & 0xFF);
fbbuff = (void *) i_fbbuff;
break;
default:
fprintf(stderr, "Unsupported video mode! You've got: %dbpp\n", bpp);
exit(1);
}
return fbbuff;
unsigned long i;
unsigned int *fbbuff;
unsigned long count = x*y;
fbbuff = (unsigned int *) malloc(count * sizeof(unsigned int));
if(fbbuff == NULL)
{
printf("convertRGB2FB: Error: malloc\n");
return NULL;
}
for(i = 0; i < count ; i++)
fbbuff[i] = (transp << 24) | ((rgbbuff[i*3] << 16) & 0xFF0000) | ((rgbbuff[i*3+1] << 8) & 0xFF00) | (rgbbuff[i*3+2] & 0xFF);
return (void *) fbbuff;
}