static int xf86RandR12ChangeGamma(int scrnIndex, Gamma gamma) { CARD16 *points, *red, *green, *blue; ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); RRCrtcPtr crtc = config->output[config->compat_output]->crtc->randr_crtc; int size = max(0, crtc->gammaSize); if (!size) return Success; points = xcalloc(size, 3 * sizeof(CARD16)); if (!points) return BadAlloc; red = points; green = points + size; blue = points + 2 * size; gamma_to_ramp(gamma.red, red, size); gamma_to_ramp(gamma.green, green, size); gamma_to_ramp(gamma.blue, blue, size); RRCrtcGammaSet(crtc, red, green, blue); xfree(points); pScrn->gamma = gamma; return Success; }
int ProcRRSetCrtcGamma (ClientPtr client) { REQUEST(xRRSetCrtcGammaReq); RRCrtcPtr crtc; unsigned long len; CARD16 *red, *green, *blue; REQUEST_AT_LEAST_SIZE(xRRSetCrtcGammaReq); VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess); len = client->req_len - bytes_to_int32(sizeof (xRRSetCrtcGammaReq)); if (len < (stuff->size * 3 + 1) >> 1) return BadLength; if (stuff->size != crtc->gammaSize) return BadMatch; red = (CARD16 *) (stuff + 1); green = red + crtc->gammaSize; blue = green + crtc->gammaSize; RRCrtcGammaSet (crtc, red, green, blue); return Success; }
static int xf86RandR12ChangeGamma(int scrnIndex, Gamma gamma) { CARD16 *points, *red, *green, *blue; ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; RRCrtcPtr crtc = xf86CompatRRCrtc(pScrn); int size; if (!crtc) return Success; size = max(0, crtc->gammaSize); if (!size) return Success; points = xcalloc(size, 3 * sizeof(CARD16)); if (!points) return BadAlloc; red = points; green = points + size; blue = points + 2 * size; gamma_to_ramp(gamma.red, red, size); gamma_to_ramp(gamma.green, green, size); gamma_to_ramp(gamma.blue, blue, size); RRCrtcGammaSet(crtc, red, green, blue); xfree(points); pScrn->gamma = gamma; return Success; }