Changeset a7d2d78 in mainline for fb/fb.c


Ignore:
Timestamp:
2006-06-03T22:49:28Z (19 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
2400469
Parents:
1f36e90
Message:

Completed graphical console.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • fb/fb.c

    r1f36e90 ra7d2d78  
    5555/* Pixel specific fuctions */
    5656
    57 typedef void (*putpixel_fn_t)(unsigned int x, unsigned int y, int color);
    58 typedef int (*getpixel_fn_t)(unsigned int x, unsigned int y);
     57typedef void (*conv2scr_fn_t)(void *, int);
     58typedef int (*conv2rgb_fn_t)(void *);
    5959
    6060struct {
     
    6666        unsigned int pixelbytes ;
    6767
    68         putpixel_fn_t putpixel;
    69         getpixel_fn_t getpixel;
     68        conv2scr_fn_t rgb2scr;
     69        conv2rgb_fn_t scr2rgb;
    7070} screen;
    7171
     
    9191        unsigned int width;
    9292        unsigned int height;
    93         void *data;
     93        __u8 *data;
    9494} pixmap_t;
    9595static pixmap_t pixmaps[MAX_PIXMAPS];
     
    111111#define POINTPOS(x, y)  ((y) * screen.scanline + (x) * screen.pixelbytes)
    112112
    113 /** Put pixel - 24-bit depth, 1 free byte */
    114 static void putpixel_4byte(unsigned int x, unsigned int y, int color)
    115 {
    116         *((__u32 *)(screen.fbaddress + POINTPOS(x, y))) = color;
    117 }
    118 
    119 /** Return pixel color - 24-bit depth, 1 free byte */
    120 static int getpixel_4byte(unsigned int x, unsigned int y)
    121 {
    122         return *((__u32 *)(screen.fbaddress + POINTPOS(x, y))) & 0xffffff;
    123 }
    124 
    125 /** Put pixel - 24-bit depth */
    126 static void putpixel_3byte(unsigned int x, unsigned int y, int color)
    127 {
    128         unsigned int startbyte = POINTPOS(x, y);
    129 
     113/* Conversion routines between different color representations */
     114static void rgb_4byte(void *dst, int rgb)
     115{
     116        *(int *)dst = rgb;
     117}
     118
     119static int byte4_rgb(void *src)
     120{
     121        return (*(int *)src) & 0xffffff;
     122}
     123
     124static void rgb_3byte(void *dst, int rgb)
     125{
     126        __u8 *scr = dst;
    130127#if (defined(BIG_ENDIAN) || defined(FB_BIG_ENDIAN))
    131         screen.fbaddress[startbyte] = RED(color, 8);
    132         screen.fbaddress[startbyte + 1] = GREEN(color, 8);
    133         screen.fbaddress[startbyte + 2] = BLUE(color, 8);
     128        scr[0] = RED(rgb, 8);
     129        scr[1] = GREEN(rgb, 8);
     130        scr[2] = BLUE(rgb, 8);
    134131#else
    135         screen.fbaddress[startbyte + 2] = RED(color, 8);
    136         screen.fbaddress[startbyte + 1] = GREEN(color, 8);
    137         screen.fbaddress[startbyte + 0] = BLUE(color, 8);
     132        scr[2] = RED(rgb, 8);
     133        scr[1] = GREEN(rgb, 8);
     134        scr[0] = BLUE(rgb, 8);
    138135#endif
    139136
    140 }
    141 
    142 /** Return pixel color - 24-bit depth */
    143 static int getpixel_3byte(unsigned int x, unsigned int y)
    144 {
    145         unsigned int startbyte = POINTPOS(x, y);
    146 
    147 
    148 
     137
     138}
     139
     140static int byte3_rgb(void *src)
     141{
     142        __u8 *scr = src;
    149143#if (defined(BIG_ENDIAN) || defined(FB_BIG_ENDIAN))
    150         return screen.fbaddress[startbyte] << 16 | screen.fbaddress[startbyte + 1] << 8 | screen.fbaddress[startbyte + 2];
     144        return scr[0] << 16 | scr[1] << 8 | scr[2];
    151145#else
    152         return screen.fbaddress[startbyte + 2] << 16 | screen.fbaddress[startbyte + 1] << 8 | screen.fbaddress[startbyte + 0];
    153 #endif
    154                                                                
    155 
    156 }
    157 
    158 /** Put pixel - 16-bit depth (5:6:5) */
    159 static void putpixel_2byte(unsigned int x, unsigned int y, int color)
     146        return scr[2] << 16 | scr[1] << 8 | scr[0];
     147#endif 
     148}
     149
     150/**  16-bit depth (5:6:5) */
     151static void rgb_2byte(void *dst, int rgb)
    160152{
    161153        /* 5-bit, 6-bits, 5-bits */
    162         *((__u16 *)(screen.fbaddress + POINTPOS(x, y))) = RED(color, 5) << 11 | GREEN(color, 6) << 5 | BLUE(color, 5);
    163 }
    164 
    165 /** Return pixel color - 16-bit depth (5:6:5) */
    166 static int getpixel_2byte(unsigned int x, unsigned int y)
    167 {
    168         int color = *((__u16 *)(screen.fbaddress + POINTPOS(x, y)));
     154        *((__u16 *)(dst)) = RED(rgb, 5) << 11 | GREEN(rgb, 6) << 5 | BLUE(rgb, 5);
     155}
     156
     157/** 16-bit depth (5:6:5) */
     158static int byte2_rgb(void *src)
     159{
     160        int color = *(__u16 *)(src);
    169161        return (((color >> 11) & 0x1f) << (16 + 3)) | (((color >> 5) & 0x3f) << (8 + 2)) | ((color & 0x1f) << 3);
    170162}
    171163
    172164/** Put pixel - 8-bit depth (3:2:3) */
    173 static void putpixel_1byte(unsigned int x, unsigned int y, int color)
    174 {
    175         screen.fbaddress[POINTPOS(x, y)] = RED(color, 3) << 5 | GREEN(color, 2) << 3 | BLUE(color, 3);
     165static void rgb_1byte(void *dst, int rgb)
     166{
     167        *(__u8 *)dst = RED(rgb, 3) << 5 | GREEN(rgb, 2) << 3 | BLUE(rgb, 3);
    176168}
    177169
    178170/** Return pixel color - 8-bit depth (3:2:3) */
    179 static int getpixel_1byte(unsigned int x, unsigned int y)
    180 {
    181         int color = screen.fbaddress[POINTPOS(x, y)];
     171static int byte1_rgb(void *src)
     172{
     173        int color = *(__u8 *)src;
    182174        return (((color >> 5) & 0x7) << (16 + 5)) | (((color >> 3) & 0x3) << (8 + 6)) | ((color & 0x7) << 5);
    183175}
     
    192184static void putpixel(int vp, unsigned int x, unsigned int y, int color)
    193185{
    194         screen.putpixel(viewports[vp].x + x, viewports[vp].y + y, color);
     186        int dx = viewports[vp].x + x;
     187        int dy = viewports[vp].y + y;
     188        (*screen.rgb2scr)(&screen.fbaddress[POINTPOS(dx,dy)],color);
    195189}
    196190/** Get pixel from viewport */
    197191static int getpixel(int vp, unsigned int x, unsigned int y)
    198192{
    199         return screen.getpixel(viewports[vp].x + x, viewports[vp].y + y);
     193        int dx = viewports[vp].x + x;
     194        int dy = viewports[vp].y + y;
     195
     196        return (*screen.scr2rgb)(&screen.fbaddress[POINTPOS(dx,dy)]);
    200197}
    201198
     
    359356        switch (bpp) {
    360357                case 8:
    361                         screen.putpixel = putpixel_1byte;
    362                         screen.getpixel = getpixel_1byte;
     358                        screen.rgb2scr = rgb_1byte;
     359                        screen.scr2rgb = byte1_rgb;
    363360                        screen.pixelbytes = 1;
    364361                        break;
    365362                case 16:
    366                         screen.putpixel = putpixel_2byte;
    367                         screen.getpixel = getpixel_2byte;
     363                        screen.rgb2scr = rgb_2byte;
     364                        screen.scr2rgb = byte2_rgb;
    368365                        screen.pixelbytes = 2;
    369366                        break;
    370367                case 24:
    371                         screen.putpixel = putpixel_3byte;
    372                         screen.getpixel = getpixel_3byte;
     368                        screen.rgb2scr = rgb_3byte;
     369                        screen.scr2rgb = byte3_rgb;
    373370                        screen.pixelbytes = 3;
    374371                        break;
    375372                case 32:
    376                         screen.putpixel = putpixel_4byte;
    377                         screen.getpixel = getpixel_4byte;
     373                        screen.rgb2scr = rgb_4byte;
     374                        screen.scr2rgb = byte4_rgb;
    378375                        screen.pixelbytes = 4;
    379376                        break;
     
    478475}
    479476
     477
     478/** Return first free pixmap */
     479static int find_free_pixmap(void)
     480{
     481        int i;
     482       
     483        for (i=0;i < MAX_PIXMAPS;i++)
     484                if (!pixmaps[i].data)
     485                        return i;
     486        return -1;
     487}
     488
     489static void putpixel_pixmap(int pm, unsigned int x, unsigned int y, int color)
     490{
     491        pixmap_t *pmap = &pixmaps[pm];
     492        int pos = (y * pmap->width + x) * screen.pixelbytes;
     493
     494        (*screen.rgb2scr)(&pmap->data[pos],color);
     495}
     496
     497/** Create a new pixmap and return appropriate ID */
     498static int shm2pixmap(char *shm, size_t size)
     499{
     500        int pm;
     501        pixmap_t *pmap;
     502
     503        pm = find_free_pixmap();
     504        if (pm == -1)
     505                return ELIMIT;
     506        pmap = &pixmaps[pm];
     507       
     508        if (ppm_get_data(shm, size, &pmap->width, &pmap->height))
     509                return EINVAL;
     510       
     511        pmap->data = malloc(pmap->width * pmap->height * screen.pixelbytes);
     512        if (!pmap->data)
     513                return ENOMEM;
     514
     515        ppm_draw(shm, size, 0, 0, pmap->width, pmap->height,
     516                 putpixel_pixmap, pm);
     517
     518        return pm;
     519}
     520
    480521/** Handle shared memory communication calls
    481522 *
     
    503544        static size_t intersize = 0;
    504545
    505         static char *pixmap = NULL;
    506         static ipcarg_t pixmap_id = 0;
    507         static size_t pixmap_size;
     546        static char *shm = NULL;
     547        static ipcarg_t shm_id = 0;
     548        static size_t shm_size;
    508549
    509550        int handled = 1;
     
    515556        case IPC_M_AS_AREA_SEND:
    516557                /* We accept one area for data interchange */
    517                 if (IPC_GET_ARG1(*call) == pixmap_id) {
     558                if (IPC_GET_ARG1(*call) == shm_id) {
    518559                        void *dest = as_get_mappable_page(IPC_GET_ARG2(*call));
    519                         pixmap_size = IPC_GET_ARG2(*call);
     560                        shm_size = IPC_GET_ARG2(*call);
    520561                        if (!ipc_answer_fast(callid, 0, (sysarg_t)dest, 0))
    521                                 pixmap = dest;
     562                                shm = dest;
    522563                        else
    523                                 pixmap_id = 0;
    524                         if (pixmap[0] != 'P')
     564                                shm_id = 0;
     565                        if (shm[0] != 'P')
    525566                                while (1)
    526567                                        ;
     
    532573                return 1;
    533574        case FB_PREPARE_SHM:
    534                 if (pixmap_id)
     575                if (shm_id)
    535576                        retval = EBUSY;
    536577                else
    537                         pixmap_id = IPC_GET_ARG1(*call);
     578                        shm_id = IPC_GET_ARG1(*call);
    538579                break;
    539580               
    540581        case FB_DROP_SHM:
    541                 if (pixmap) {
    542                         as_area_destroy(pixmap);
    543                         pixmap = NULL;
    544                 }
    545                 pixmap_id = 0;
     582                if (shm) {
     583                        as_area_destroy(shm);
     584                        shm = NULL;
     585                }
     586                shm_id = 0;
    546587                break;
    547                
     588
     589        case FB_SHM2PIXMAP:
     590                if (!shm) {
     591                        retval = EINVAL;
     592                        break;
     593                }
     594                retval = shm2pixmap(shm, shm_size);
     595                break;
    548596        case FB_DRAW_PPM:
    549                 if (!pixmap) {
     597                if (!shm) {
    550598                        retval = EINVAL;
    551599                        break;
     
    558606                }
    559607               
    560                 draw_ppm(pixmap, pixmap_size, IPC_GET_ARG1(*call), IPC_GET_ARG2(*call),
     608                ppm_draw(shm, shm_size, IPC_GET_ARG1(*call), IPC_GET_ARG2(*call),
    561609                         vport->width - x, vport->height - y, putpixel, vp);
    562610                break;
     
    579627                ipc_answer_fast(callid, retval, 0, 0);
    580628        return handled;
    581 }
    582 
    583 /** Return first free pixmap */
    584 static int find_free_pixmap(void)
    585 {
    586         int i;
    587        
    588         for (i=0;i < MAX_PIXMAPS;i++)
    589                 if (!pixmaps[i].data)
    590                         return i;
    591         return -1;
    592629}
    593630
Note: See TracChangeset for help on using the changeset viewer.