int GGI_kgi_setPalette(struct ggi_visual *vis, size_t start, size_t len, const ggi_color *colormap) { kgic_ilut_set_request_t ilut; size_t nocols = 1 << GT_DEPTH(LIBGGI_GT(vis)); APP_ASSERT(colormap != NULL, "GGI_kgi_setPalette() - colormap == NULL"); DPRINT_COLOR("display-kgi: SetPalVec(%d,%d)\n", start, len); if (start == (size_t)GGI_PALETTE_DONTCARE) { start = 0; } if ((start < 0) || (len < 0) || (start+len > nocols)) { return GGI_ENOSPACE; } memcpy(LIBGGI_PAL(vis)->clut.data, colormap, len*sizeof(ggi_color)); ilut.image = 0; ilut.resource = 0; ilut.lut = 0; ilut.idx = start; ilut.cnt = len; ilut.am = KGI_AM_COLORS; ilut.data = (kgi_u16_t *)KGI_PRIV(vis); for (start = 0; len > 0; start++, colormap++, len--) { ilut.data[start*3] = colormap->r; ilut.data[start*3 + 1] = colormap->g; ilut.data[start*3 + 2] = colormap->b; } if(kgiSetIlut(&KGI_CTX(vis), &ilut) != KGI_EOK) { DPRINT_COLOR("display-kgi: PUTCMAP failed."); return -1; } return 0; }
static int GGI_fbdev_setPalette(ggi_visual *vis, size_t start, size_t size, const ggi_color *colormap) { ggi_fbdev_priv *priv = FBDEV_PRIV(vis); struct fb_cmap cmap; int len = (int)size; const ggi_color* src = colormap; DPRINT_COLOR("display-fbdev: SetPalette(%d,%d)\n", start, size); memcpy(LIBGGI_PAL(vis)->clut.data+start, colormap, size*sizeof(ggi_color)); if (!priv->ismapped) return 0; cmap.start = start; cmap.len = size; cmap.red = priv->reds + start; cmap.green = priv->greens + start; cmap.blue = priv->blues + start; cmap.transp = NULL; for (; len > 0; start++, src++, len--) { priv->reds[start] = src->r; priv->greens[start] = src->g; priv->blues[start] = src->b; } if (fbdev_doioctl(vis, FBIOPUTCMAP, &cmap) < 0) { DPRINT_COLOR("display-fbdev: PUTCMAP failed."); return -1; } return 0; }
int GGI_aa_setPalette(struct ggi_visual *vis,size_t start,size_t size, const ggi_color *colormap) { aa_palette *pal = (aa_palette*)(LIBGGI_PAL(vis)->priv); ggi_color *dest = LIBGGI_PAL(vis)->clut.data + start; const ggi_color *src = colormap; size_t end = start + size; DPRINT_COLOR("AA setpalette.(%d,%d) %d\n", start,size,LIBGGI_PAL(vis)->clut.size); for (; start<end; ++start, ++dest) { *dest = *(src++); aa_setpalette(*pal, start, dest->r>>8, dest->g>>8, dest->b>>8 ); } return 0; }
/* In fbdev the gamma uses the same interface as the palette. * Therefore, no simultaneous use of 8-bit LUT and gamma. * * Since this is the case we reuse some of the priv/vis palette members. * */ static int GGI_fbdev_setgammamap(ggi_visual *vis, int start, int len, const ggi_color *colormap) { ggi_fbdev_priv *priv; struct fb_cmap gam; int i; priv = FBDEV_PRIV(vis); if (colormap == NULL) return GGI_EARGINVAL; if (vis->gamma == NULL) return GGI_ENOMATCH; /* Wrong GT if not hooked */ if (start < 0 || start >= priv->gamma.len) return GGI_ENOSPACE; if (len > (priv->gamma.len - start)) return GGI_ENOSPACE; gam.start = start; gam.len = len; gam.red = priv->reds; gam.green = priv->greens; gam.blue = priv->blues; gam.transp = NULL; i = 0; do { if ((start + i) < priv->gamma.maxwrite_r) vis->gamma->map[start + i].r = priv->reds[start + i] = colormap[i].r; if ((start + i) < priv->gamma.maxwrite_g) vis->gamma->map[start + i].g = priv->greens[start + i] = colormap[i].g; if ((start + i) < priv->gamma.maxwrite_b) vis->gamma->map[start + i].b = priv->blues[start + i] = colormap[i].b; } while (i++ < len); if (fbdev_doioctl(vis, FBIOPUTCMAP, &gam) < 0) { DPRINT_COLOR("display-fbdev: PUTCMAP failed."); return -1; } return 0; }
void GGI_fbdev_color_setup(ggi_visual *vis) { ggi_fbdev_priv *priv = FBDEV_PRIV(vis); struct fb_cmap cmap; int len; /* We rely on caller to have deallocated old storage */ priv->orig_cmap = LIBGGI_PAL(vis)->clut.data = priv->gamma.map = NULL; vis->gamma = NULL; priv->reds = priv->greens = priv->blues = NULL; priv->gamma.maxread_r = priv->gamma.maxread_g = priv->gamma.maxread_b = priv->gamma.maxread_r = priv->gamma.maxwrite_g = priv->gamma.maxwrite_b = -1; priv->gamma.len = priv->gamma.start = 0; if (!priv->var.bits_per_pixel) return; if (priv->fix.visual == FB_VISUAL_TRUECOLOR) return; /* No gamma. */ if (priv->fix.visual == FB_VISUAL_DIRECTCOLOR) { DPRINT("display-fbdev: trying gamma.\n"); priv->gamma.maxwrite_r = priv->gamma.maxread_r = 1 << priv->var.red.length; priv->gamma.maxwrite_g = priv->gamma.maxread_g = 1 << priv->var.green.length; priv->gamma.maxwrite_b = priv->gamma.maxread_b = 1 << priv->var.blue.length; len = priv->gamma.maxread_r; if (len < priv->gamma.maxread_g) len = priv->gamma.maxread_g; if (len < priv->gamma.maxread_b) len = priv->gamma.maxread_b; priv->gamma.len = len; priv->gamma.start = 0; LIBGGI_PAL(vis)->clut.size = len * 2; LIBGGI_PAL(vis)->clut.data = calloc(len * 2 /* orig */, sizeof(ggi_color)); if (LIBGGI_PAL(vis)->clut.data == NULL) return; priv->gamma.map = LIBGGI_PAL(vis)->clut.data; /* All of the above is moot until we turn it on like so: */ vis->gamma = &(priv->gamma); } else { DPRINT("display-fbdev: trying palette.\n"); len = 1 << priv->var.bits_per_pixel; LIBGGI_PAL(vis)->clut.size = len * 2; LIBGGI_PAL(vis)->clut.data = calloc(len * 2 /* orig */, sizeof(ggi_color)); if (LIBGGI_PAL(vis)->clut.data == NULL) return; } cmap.start = 0; cmap.len = len; cmap.red = calloc(len * 3, 2); if (cmap.red == NULL) goto bail; cmap.green = cmap.red + len; cmap.blue = cmap.green + len; cmap.transp = NULL; if (ioctl(LIBGGI_FD(vis), FBIOGETCMAP, &cmap) < 0) { DPRINT_COLOR("display-fbdev: GETCMAP failed.\n"); free(cmap.red); goto bail; } priv->orig_cmap = LIBGGI_PAL(vis)->clut.data + len; if (vis->gamma != NULL) { DPRINT_COLOR("display-fbdev: Saved gamma (len=%d/%d/%d).\n", priv->gamma.maxread_r, priv->gamma.maxread_g, priv->gamma.maxread_b); while (len--) { if (len < priv->gamma.maxread_r) priv->orig_cmap[len].r = cmap.red[len]; if (len < priv->gamma.maxread_g) priv->orig_cmap[len].g = cmap.green[len]; if (len < priv->gamma.maxread_b) priv->orig_cmap[len].b = cmap.blue[len]; } vis->opcolor->getgammamap = GGI_fbdev_getgammamap; vis->opcolor->setgammamap = GGI_fbdev_setgammamap; } else { DPRINT_COLOR("display-fbdev: Saved palette (len=%d).\n", len); while (len--) { priv->orig_cmap[len].r = cmap.red[len]; priv->orig_cmap[len].g = cmap.green[len]; priv->orig_cmap[len].b = cmap.blue[len]; } if (priv->fix.visual != FB_VISUAL_STATIC_PSEUDOCOLOR) { LIBGGI_PAL(vis)->setPalette = GGI_fbdev_setPalette; LIBGGI_PAL(vis)->getPrivSize = GGI_fbdev_getPrivSize; } } LIBGGI_PAL(vis)->priv = cmap.red; priv->reds = cmap.red; priv->greens = cmap.green; priv->blues = cmap.blue; return; bail: free(LIBGGI_PAL(vis)->clut.data); LIBGGI_PAL(vis)->clut.data = NULL; vis->gamma = NULL; return; }