QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4460|回复: 3

Framebuffer的16位色,RBG是怎样排列的?

[复制链接]
发表于 2006-12-19 10:27:11 | 显示全部楼层 |阅读模式
Framebuffer的16位色,RBG是怎样排列的?
发表于 2006-12-19 13:02:03 | 显示全部楼层
一般都是 5-6-5 r,b 都是5位. G是6位
回复

使用道具 举报

 楼主| 发表于 2006-12-22 09:57:28 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <asm/page.h>
#include <linux/fb.h>

int fb;
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
typedef struct {
        unsigned char r;
        unsigned char g;
        unsigned char b;
}rgb_t;
unsigned long screen_size;
unsigned char * lpScreenMem;

int main(int argc, char ** argv)
{
        int i, j;
        rgb_t rgb;
        fb = open("/dev/fb0", O_RDWR);
        if (fb < 0) {
                fprintf(stderr, "open /dev/fb0 error!\n");
                return -1;
        }
        if (ioctl(fb, FBIOGET_VSCREENINFO, &vinfo)) {
                fprintf(stderr, "error get var screeninfo!\n");
                return -1;
        }
        printf("%dx%d %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel);
        screen_size = vinfo.xres * vinfo.yres * (vinfo.bits_per_pixel / ;
        lpScreenMem = (unsigned char *)mmap(0, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0);
        if (lpScreenMem == -1) {
                return -1;
        }
        rgb.r = 0xff;
        rgb.g = 0x00;
        rgb.b = 0x00;
        for (i = 0;i < 100;i ++) {
                //draw_point(0, i, rgb);
                for (j = 0;j < 100;j ++) {
                        draw_point(i, j, rgb);
                }
        }
        close(fb);
}

void draw_point(int x, int y, rgb_t rgb)
{
        unsigned short * lpMem = (unsigned short *)(lpScreenMem + (x + y * vinfo.xres * 2));
        *lpMem = (unsigned short)((((unsigned short)rgb.r & 0x1f) << 11) + (((unsigned short)rgb.g & 0x3f) << 5) + (unsigned short)rgb.b);
}

我的颜色老是设置不对,你看看那里有错,先谢谢了!
回复

使用道具 举报

 楼主| 发表于 2006-12-22 10:49:06 | 显示全部楼层
我知道是那里错了,谢谢你了!
把lpScreenMem + (x + y * vinfo.xres * 2)改成
lpScreenMem + (x + y * vinfo.xres) * 2就对了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 02:24 , Processed in 0.074379 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表