- Timestamp:
- 2006-06-03T22:49:28Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 2400469
- Parents:
- 1f36e90
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
fb/fb.c
r1f36e90 ra7d2d78 55 55 /* Pixel specific fuctions */ 56 56 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);57 typedef void (*conv2scr_fn_t)(void *, int); 58 typedef int (*conv2rgb_fn_t)(void *); 59 59 60 60 struct { … … 66 66 unsigned int pixelbytes ; 67 67 68 putpixel_fn_t putpixel;69 getpixel_fn_t getpixel;68 conv2scr_fn_t rgb2scr; 69 conv2rgb_fn_t scr2rgb; 70 70 } screen; 71 71 … … 91 91 unsigned int width; 92 92 unsigned int height; 93 void*data;93 __u8 *data; 94 94 } pixmap_t; 95 95 static pixmap_t pixmaps[MAX_PIXMAPS]; … … 111 111 #define POINTPOS(x, y) ((y) * screen.scanline + (x) * screen.pixelbytes) 112 112 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 */ 114 static void rgb_4byte(void *dst, int rgb) 115 { 116 *(int *)dst = rgb; 117 } 118 119 static int byte4_rgb(void *src) 120 { 121 return (*(int *)src) & 0xffffff; 122 } 123 124 static void rgb_3byte(void *dst, int rgb) 125 { 126 __u8 *scr = dst; 130 127 #if (defined(BIG_ENDIAN) || defined(FB_BIG_ENDIAN)) 131 scr een.fbaddress[startbyte] = RED(color, 8);132 scr een.fbaddress[startbyte + 1] = GREEN(color, 8);133 scr een.fbaddress[startbyte + 2] = BLUE(color, 8);128 scr[0] = RED(rgb, 8); 129 scr[1] = GREEN(rgb, 8); 130 scr[2] = BLUE(rgb, 8); 134 131 #else 135 scr een.fbaddress[startbyte + 2] = RED(color, 8);136 scr een.fbaddress[startbyte + 1] = GREEN(color, 8);137 scr een.fbaddress[startbyte + 0] = BLUE(color, 8);132 scr[2] = RED(rgb, 8); 133 scr[1] = GREEN(rgb, 8); 134 scr[0] = BLUE(rgb, 8); 138 135 #endif 139 136 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 140 static int byte3_rgb(void *src) 141 { 142 __u8 *scr = src; 149 143 #if (defined(BIG_ENDIAN) || defined(FB_BIG_ENDIAN)) 150 return scr een.fbaddress[startbyte] << 16 | screen.fbaddress[startbyte + 1] << 8 | screen.fbaddress[startbyte +2];144 return scr[0] << 16 | scr[1] << 8 | scr[2]; 151 145 #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) */ 151 static void rgb_2byte(void *dst, int rgb) 160 152 { 161 153 /* 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) */ 158 static int byte2_rgb(void *src) 159 { 160 int color = *(__u16 *)(src); 169 161 return (((color >> 11) & 0x1f) << (16 + 3)) | (((color >> 5) & 0x3f) << (8 + 2)) | ((color & 0x1f) << 3); 170 162 } 171 163 172 164 /** 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);165 static void rgb_1byte(void *dst, int rgb) 166 { 167 *(__u8 *)dst = RED(rgb, 3) << 5 | GREEN(rgb, 2) << 3 | BLUE(rgb, 3); 176 168 } 177 169 178 170 /** 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)];171 static int byte1_rgb(void *src) 172 { 173 int color = *(__u8 *)src; 182 174 return (((color >> 5) & 0x7) << (16 + 5)) | (((color >> 3) & 0x3) << (8 + 6)) | ((color & 0x7) << 5); 183 175 } … … 192 184 static void putpixel(int vp, unsigned int x, unsigned int y, int color) 193 185 { 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); 195 189 } 196 190 /** Get pixel from viewport */ 197 191 static int getpixel(int vp, unsigned int x, unsigned int y) 198 192 { 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)]); 200 197 } 201 198 … … 359 356 switch (bpp) { 360 357 case 8: 361 screen. putpixel = putpixel_1byte;362 screen. getpixel = getpixel_1byte;358 screen.rgb2scr = rgb_1byte; 359 screen.scr2rgb = byte1_rgb; 363 360 screen.pixelbytes = 1; 364 361 break; 365 362 case 16: 366 screen. putpixel = putpixel_2byte;367 screen. getpixel = getpixel_2byte;363 screen.rgb2scr = rgb_2byte; 364 screen.scr2rgb = byte2_rgb; 368 365 screen.pixelbytes = 2; 369 366 break; 370 367 case 24: 371 screen. putpixel = putpixel_3byte;372 screen. getpixel = getpixel_3byte;368 screen.rgb2scr = rgb_3byte; 369 screen.scr2rgb = byte3_rgb; 373 370 screen.pixelbytes = 3; 374 371 break; 375 372 case 32: 376 screen. putpixel = putpixel_4byte;377 screen. getpixel = getpixel_4byte;373 screen.rgb2scr = rgb_4byte; 374 screen.scr2rgb = byte4_rgb; 378 375 screen.pixelbytes = 4; 379 376 break; … … 478 475 } 479 476 477 478 /** Return first free pixmap */ 479 static 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 489 static 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 */ 498 static 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 480 521 /** Handle shared memory communication calls 481 522 * … … 503 544 static size_t intersize = 0; 504 545 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; 508 549 509 550 int handled = 1; … … 515 556 case IPC_M_AS_AREA_SEND: 516 557 /* We accept one area for data interchange */ 517 if (IPC_GET_ARG1(*call) == pixmap_id) {558 if (IPC_GET_ARG1(*call) == shm_id) { 518 559 void *dest = as_get_mappable_page(IPC_GET_ARG2(*call)); 519 pixmap_size = IPC_GET_ARG2(*call);560 shm_size = IPC_GET_ARG2(*call); 520 561 if (!ipc_answer_fast(callid, 0, (sysarg_t)dest, 0)) 521 pixmap= dest;562 shm = dest; 522 563 else 523 pixmap_id = 0;524 if ( pixmap[0] != 'P')564 shm_id = 0; 565 if (shm[0] != 'P') 525 566 while (1) 526 567 ; … … 532 573 return 1; 533 574 case FB_PREPARE_SHM: 534 if ( pixmap_id)575 if (shm_id) 535 576 retval = EBUSY; 536 577 else 537 pixmap_id = IPC_GET_ARG1(*call);578 shm_id = IPC_GET_ARG1(*call); 538 579 break; 539 580 540 581 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; 546 587 break; 547 588 589 case FB_SHM2PIXMAP: 590 if (!shm) { 591 retval = EINVAL; 592 break; 593 } 594 retval = shm2pixmap(shm, shm_size); 595 break; 548 596 case FB_DRAW_PPM: 549 if (! pixmap) {597 if (!shm) { 550 598 retval = EINVAL; 551 599 break; … … 558 606 } 559 607 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), 561 609 vport->width - x, vport->height - y, putpixel, vp); 562 610 break; … … 579 627 ipc_answer_fast(callid, retval, 0, 0); 580 628 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;592 629 } 593 630
Note:
See TracChangeset
for help on using the changeset viewer.