1 ========================== 1 ========================== 2 Understanding fbdev's cmap 2 Understanding fbdev's cmap 3 ========================== 3 ========================== 4 4 5 These notes explain how X's dix layer uses fbd 5 These notes explain how X's dix layer uses fbdev's cmap structures. 6 6 7 - example of relevant structures in fbdev as 7 - example of relevant structures in fbdev as used for a 3-bit grayscale cmap:: 8 8 9 struct fb_var_screeninfo { 9 struct fb_var_screeninfo { 10 .bits_per_pixel = 8, 10 .bits_per_pixel = 8, 11 .grayscale = 1, 11 .grayscale = 1, 12 .red = { 4, 3, 0 }, 12 .red = { 4, 3, 0 }, 13 .green = { 0, 0, 0 }, 13 .green = { 0, 0, 0 }, 14 .blue = { 0, 0, 0 }, 14 .blue = { 0, 0, 0 }, 15 } 15 } 16 struct fb_fix_screeninfo { 16 struct fb_fix_screeninfo { 17 .visual = FB_VISUAL_STATIC_P 17 .visual = FB_VISUAL_STATIC_PSEUDOCOLOR, 18 } 18 } 19 for (i = 0; i < 8; i++) 19 for (i = 0; i < 8; i++) 20 info->cmap.red[i] = (((2*i)+1)*(0xFFFF 20 info->cmap.red[i] = (((2*i)+1)*(0xFFFF))/16; 21 memcpy(info->cmap.green, info->cmap.red, s 21 memcpy(info->cmap.green, info->cmap.red, sizeof(u16)*8); 22 memcpy(info->cmap.blue, info->cmap.red, si 22 memcpy(info->cmap.blue, info->cmap.red, sizeof(u16)*8); 23 23 24 - X11 apps do something like the following wh 24 - X11 apps do something like the following when trying to use grayscale:: 25 25 26 for (i=0; i < 8; i++) { 26 for (i=0; i < 8; i++) { 27 char colorspec[64]; 27 char colorspec[64]; 28 memset(colorspec,0,64); 28 memset(colorspec,0,64); 29 sprintf(colorspec, "rgb:%x/%x/%x", i*3 29 sprintf(colorspec, "rgb:%x/%x/%x", i*36,i*36,i*36); 30 if (!XParseColor(outputDisplay, testCo 30 if (!XParseColor(outputDisplay, testColormap, colorspec, &wantedColor)) 31 printf("Can't get color %s\n", 31 printf("Can't get color %s\n",colorspec); 32 XAllocColor(outputDisplay, testColorma 32 XAllocColor(outputDisplay, testColormap, &wantedColor); 33 grays[i] = wantedColor; 33 grays[i] = wantedColor; 34 } 34 } 35 35 36 There's also named equivalents like gray1..x p 36 There's also named equivalents like gray1..x provided you have an rgb.txt. 37 37 38 Somewhere in X's callchain, this results in a 38 Somewhere in X's callchain, this results in a call to X code that handles the 39 colormap. For example, Xfbdev hits the followi 39 colormap. For example, Xfbdev hits the following: 40 40 41 xc-011010/programs/Xserver/dix/colormap.c:: 41 xc-011010/programs/Xserver/dix/colormap.c:: 42 42 43 FindBestPixel(pentFirst, size, prgb, channel 43 FindBestPixel(pentFirst, size, prgb, channel) 44 44 45 dr = (long) pent->co.local.red - prgb->red; 45 dr = (long) pent->co.local.red - prgb->red; 46 dg = (long) pent->co.local.green - prgb->gre 46 dg = (long) pent->co.local.green - prgb->green; 47 db = (long) pent->co.local.blue - prgb->blue 47 db = (long) pent->co.local.blue - prgb->blue; 48 sq = dr * dr; 48 sq = dr * dr; 49 UnsignedToBigNum (sq, &sum); 49 UnsignedToBigNum (sq, &sum); 50 BigNumAdd (&sum, &temp, &sum); 50 BigNumAdd (&sum, &temp, &sum); 51 51 52 co.local.red are entries that were brought in 52 co.local.red are entries that were brought in through FBIOGETCMAP which come 53 directly from the info->cmap.red that was list 53 directly from the info->cmap.red that was listed above. The prgb is the rgb 54 that the app wants to match to. The above code 54 that the app wants to match to. The above code is doing what looks like a least 55 squares matching function. That's why the cmap 55 squares matching function. That's why the cmap entries can't be set to the left 56 hand side boundaries of a color range. 56 hand side boundaries of a color range.
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.