| 
 | 
 
小弟初学framebuffer,想要画直线,找了网上一段程序,只能画出横线,其他线显示的都是一堆点,分析了好久都找不出问题,拜托各位帮助! 
 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <math.h> 
#include <stdint.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <sys/ioctl.h> 
#include <sys/mman.h> 
#include <asm/page.h> 
#include <linux/fb.h> 
#define TRUE    1 
#define FALSE   0 
#define MIN(x,y)        ((x)>(y)?(y) x)) 
#define MAX(x,y)        ((x)>(y)?(x) y)) 
typedef struct fbdev{ 
        int fb; 
        unsigned long fb_mem_offset; 
        unsigned long fb_mem; 
        struct fb_fix_screeninfo fb_fix; 
        struct fb_var_screeninfo fb_var; 
        char dev[20]; 
} FBDEV, *PFBDEV; 
typedef struct point{ 
        int x; 
        int y; 
        int z; 
} POINT, *PPOINT; 
 
void draw_dot (PFBDEV pFbdev, POINT p, uint8_t r, uint8_t g, uint8_t b); 
void draw_line(PFBDEV pFbdev, POINT p1, POINT p2, uint8_t r, uint8_t g, uint8_t b); 
 
int fb_open(PFBDEV pFbdev) 
{ 
        pFbdev->fb = open(pFbdev->dev, O_RDWR); 
        if(pFbdev->fb < 0) 
        { 
                printf("Error opening %s: %m. Check kernel config\n", pFbdev->dev); 
                return FALSE; 
        } 
        if (-1 == ioctl(pFbdev->fb,FBIOGET_VSCREENINFO,&(pFbdev->fb_var))) 
        { 
                printf("ioctl FBIOGET_VSCREENINFO\n"); 
                return FALSE; 
        } 
        if (-1 == ioctl(pFbdev->fb,FBIOGET_FSCREENINFO,&(pFbdev->fb_fix))) 
        { 
                printf("ioctl FBIOGET_FSCREENINFO\n"); 
                return FALSE; 
        } 
        pFbdev->fb_mem_offset = (unsigned long)(pFbdev->fb_fix.smem_start) & (~PAGE_MASK); 
        pFbdev->fb_mem = (unsigned long int)mmap(NULL, pFbdev->fb_fix.smem_len +  
                        pFbdev->fb_mem_offset, 
                        PROT_READ | PROT_WRITE, MAP_SHARED, pFbdev->fb, 0); 
        if (-1L == (long) pFbdev->fb_mem)  
        { 
                printf("mmap error! mem:%ld offset:%ld\n", pFbdev->fb_mem,  
                                pFbdev->fb_mem_offset); 
                return FALSE; 
        } 
/* 
        printf("depth(bits per pixel) =  %d\n",fb.fb_var.bits_per_pixel); 
        printf("smemlen = %d\n",fb.fb_fix.smem_len); 
        printf("fix_line(in byte) = %d\n",fb.fb_fix.line_length); 
*/ 
        return TRUE; 
} 
void fb_close(PFBDEV pFbdev) 
{ 
        close(pFbdev->fb); 
        pFbdev->fb=-1; 
} 
void fb_memcpy(void *addr, void *color, size_t len) 
{ 
        memcpy(addr, color, len); 
} 
void draw_dot (PFBDEV pFbdev, POINT p, uint8_t r, uint8_t g, uint8_t b) 
{ 
        uint32_t offset; 
        uint8_t color[4]; 
        color[0] = b; 
        color[1] = g; 
        color[2] = r; 
        color[3] = 0x0; 
        offset = p.y*pFbdev->fb_fix.line_length+4*p.x; 
        fb_memcpy((void*)(pFbdev->fb_mem + pFbdev->fb_mem_offset + offset), color, 4); 
} 
void draw_line(PFBDEV pFbdev, POINT p1, POINT p2, uint8_t r, uint8_t g, uint8_t b) 
{ 
        POINT p; 
        int x,y; 
        for( x=MIN(p1.x,p2.x); x<=MAX(p1.x,p2.x); x++ ) 
        { 
                y = (p2.y-p1.y)*(x-p1.x)/(p2.x-p1.x) + p1.y; 
                p.x = x; 
                p.y = y; 
                draw_dot(pFbdev, p, r, g, b); 
        } 
} 
 
int main(void) 
{ 
        FBDEV fb; 
        memset(&fb, 0, sizeof(FBDEV)); 
        strcpy(fb.dev, "/dev/fb0"); 
        if(fb_open(&fb)==FALSE) 
        { 
                printf("open frame buffer error\n"); 
                return 0; 
        } 
        POINT p1, p2; 
        p1.x = 300; 
        p1.y = 450; 
        p2.x = 600; 
        p2.y = 450; 
        draw_line( &fb, p1, p2, 0xff, 0x0, 0x0 ); 
        
        fb_close(&fb); 
        return 0; 
} |   
 
 
 
 |