Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenxlate.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS Win32k subsystem 00004 * PURPOSE: GDI Color Translation Functions 00005 * FILE: subsystems/win32/win32k/eng/xlate.c 00006 * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org) 00007 */ 00008 00009 #include <win32k.h> 00010 00011 #define NDEBUG 00012 #include <debug.h> 00013 00014 00017 EXLATEOBJ gexloTrivial = {{0, XO_TRIVIAL, 0, 0, 0, 0}, EXLATEOBJ_iXlateTrivial}; 00018 00019 static ULONG giUniqueXlate = 0; 00020 00021 static const BYTE gajXlate5to8[32] = 00022 { 0, 8, 16, 25, 33, 41, 49, 58, 66, 74, 82, 90, 99,107,115,123, 00023 132,140,148,156,165,173,181,189,197,206,214,222,231,239,247,255}; 00024 00025 static const BYTE gajXlate6to8[64] = 00026 { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 45, 49, 52, 57, 61, 00027 65, 69, 73, 77, 81, 85, 89, 93, 97,101,105,109,113,117,121,125, 00028 130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190, 00029 194,198,202,207,210,215,219,223,227,231,235,239,243,247,251,255}; 00030 00031 00034 ULONG 00035 FASTCALL 00036 EXLATEOBJ_iXlateTrivial(PEXLATEOBJ pexlo, ULONG iColor) 00037 { 00038 return iColor; 00039 } 00040 00041 ULONG 00042 FASTCALL 00043 EXLATEOBJ_iXlateToMono(PEXLATEOBJ pexlo, ULONG iColor) 00044 { 00045 return (iColor == pexlo->xlo.pulXlate[0]); 00046 } 00047 00048 ULONG 00049 FASTCALL 00050 EXLATEOBJ_iXlateTable(PEXLATEOBJ pexlo, ULONG iColor) 00051 { 00052 if (iColor >= pexlo->xlo.cEntries) return 0; 00053 return pexlo->xlo.pulXlate[iColor]; 00054 } 00055 00056 ULONG 00057 FASTCALL 00058 EXLATEOBJ_iXlateRGBtoBGR(PEXLATEOBJ pxlo, ULONG iColor) 00059 { 00060 ULONG iNewColor; 00061 00062 /* Copy green */ 00063 iNewColor = iColor & 0xff00ff00; 00064 00065 /* Mask red and blue */ 00066 iColor &= 0x00ff00ff; 00067 00068 /* Shift and copy red and blue */ 00069 iNewColor |= iColor >> 16; 00070 iNewColor |= iColor << 16; 00071 00072 return iNewColor; 00073 } 00074 00075 ULONG 00076 FASTCALL 00077 EXLATEOBJ_iXlateRGBto555(PEXLATEOBJ pxlo, ULONG iColor) 00078 { 00079 ULONG iNewColor; 00080 00081 /* Copy red */ 00082 iColor <<= 7; 00083 iNewColor = iColor & 0x7C00; 00084 00085 /* Copy green */ 00086 iColor >>= 13; 00087 iNewColor |= iColor & 0x3E0; 00088 00089 /* Copy blue */ 00090 iColor >>= 13; 00091 iNewColor |= iColor & 0x1F; 00092 00093 return iNewColor; 00094 } 00095 00096 ULONG 00097 FASTCALL 00098 EXLATEOBJ_iXlateBGRto555(PEXLATEOBJ pxlo, ULONG iColor) 00099 { 00100 ULONG iNewColor; 00101 00102 /* Copy blue */ 00103 iColor >>= 3; 00104 iNewColor = iColor & 0x1f; 00105 00106 /* Copy green */ 00107 iColor >>= 3; 00108 iNewColor |= (iColor & 0x3E0); 00109 00110 /* Copy red */ 00111 iColor >>= 3; 00112 iNewColor |= (iColor & 0x7C00); 00113 00114 return iNewColor; 00115 } 00116 00117 ULONG 00118 FASTCALL 00119 EXLATEOBJ_iXlateRGBto565(PEXLATEOBJ pxlo, ULONG iColor) 00120 { 00121 ULONG iNewColor; 00122 00123 /* Copy red */ 00124 iColor <<= 8; 00125 iNewColor = iColor & 0xF800; 00126 00127 /* Copy green */ 00128 iColor >>= 13; 00129 iNewColor |= iColor & 0x7E0; 00130 00131 /* Copy green */ 00132 iColor >>= 14; 00133 iNewColor |= iColor & 0x1F; 00134 00135 return iNewColor; 00136 } 00137 00138 ULONG 00139 FASTCALL 00140 EXLATEOBJ_iXlateBGRto565(PEXLATEOBJ pxlo, ULONG iColor) 00141 { 00142 ULONG iNewColor; 00143 00144 /* Copy blue */ 00145 iColor >>= 3; 00146 iNewColor = iColor & 0x1f; 00147 00148 /* Copy green */ 00149 iColor >>= 2; 00150 iNewColor |= (iColor & 0x7E0); 00151 00152 /* Copy red */ 00153 iColor >>= 3; 00154 iNewColor |= (iColor & 0xF800); 00155 00156 return iNewColor; 00157 } 00158 00159 ULONG 00160 FASTCALL 00161 EXLATEOBJ_iXlateRGBtoPal(PEXLATEOBJ pexlo, ULONG iColor) 00162 { 00163 return PALETTE_ulGetNearestPaletteIndex(pexlo->ppalDst, iColor); 00164 } 00165 00166 ULONG 00167 FASTCALL 00168 EXLATEOBJ_iXlate555toRGB(PEXLATEOBJ pxlo, ULONG iColor) 00169 { 00170 ULONG iNewColor; 00171 00172 /* Copy blue */ 00173 iNewColor = gajXlate5to8[iColor & 0x1F] << 16; 00174 00175 /* Copy green */ 00176 iColor >>= 5; 00177 iNewColor |= gajXlate5to8[iColor & 0x1F] << 8; 00178 00179 /* Copy red */ 00180 iColor >>= 5; 00181 iNewColor |= gajXlate5to8[iColor & 0x1F]; 00182 00183 return iNewColor; 00184 } 00185 00186 ULONG 00187 FASTCALL 00188 EXLATEOBJ_iXlate555toBGR(PEXLATEOBJ pxlo, ULONG iColor) 00189 { 00190 ULONG iNewColor; 00191 00192 /* Copy blue */ 00193 iNewColor = gajXlate5to8[iColor & 0x1F]; 00194 00195 /* Copy green */ 00196 iColor >>= 5; 00197 iNewColor |= gajXlate5to8[iColor & 0x1F] << 8; 00198 00199 /* Copy red */ 00200 iColor >>= 5; 00201 iNewColor |= gajXlate5to8[iColor & 0x1F] << 16; 00202 00203 return iNewColor; 00204 } 00205 00206 ULONG 00207 FASTCALL 00208 EXLATEOBJ_iXlate555to565(PEXLATEOBJ pxlo, ULONG iColor) 00209 { 00210 ULONG iNewColor; 00211 00212 /* Copy blue */ 00213 iNewColor = iColor & 0x1f; 00214 00215 /* Copy red and green */ 00216 iColor <<= 1; 00217 iNewColor |= iColor & 0xFFC0; 00218 00219 /* Duplicate highest green bit */ 00220 iColor >>= 5; 00221 iNewColor |= (iColor & 0x20); 00222 00223 return iNewColor; 00224 } 00225 00226 ULONG 00227 FASTCALL 00228 EXLATEOBJ_iXlate555toPal(PEXLATEOBJ pexlo, ULONG iColor) 00229 { 00230 iColor = EXLATEOBJ_iXlate555toRGB(pexlo, iColor); 00231 00232 return PALETTE_ulGetNearestPaletteIndex(pexlo->ppalDst, iColor); 00233 } 00234 00235 ULONG 00236 FASTCALL 00237 EXLATEOBJ_iXlate565to555(PEXLATEOBJ pxlo, ULONG iColor) 00238 { 00239 ULONG iNewColor; 00240 00241 /* Copy blue */ 00242 iNewColor = iColor & 0x1f; 00243 00244 /* Copy red and green */ 00245 iColor >>= 1; 00246 iNewColor |= iColor & 0x7FE0; 00247 00248 return iNewColor; 00249 } 00250 00251 ULONG 00252 FASTCALL 00253 EXLATEOBJ_iXlate565toRGB(PEXLATEOBJ pexlo, ULONG iColor) 00254 { 00255 ULONG iNewColor; 00256 00257 /* Copy blue */ 00258 iNewColor = gajXlate5to8[iColor & 0x1F] << 16; 00259 00260 /* Copy green */ 00261 iColor >>= 5; 00262 iNewColor |= gajXlate6to8[iColor & 0x3F] << 8; 00263 00264 /* Copy red */ 00265 iColor >>= 6; 00266 iNewColor |= gajXlate5to8[iColor & 0x1F]; 00267 00268 return iNewColor; 00269 } 00270 00271 ULONG 00272 FASTCALL 00273 EXLATEOBJ_iXlate565toBGR(PEXLATEOBJ pexlo, ULONG iColor) 00274 { 00275 ULONG iNewColor; 00276 00277 /* Copy blue */ 00278 iNewColor = gajXlate5to8[iColor & 0x1F]; 00279 00280 /* Copy green */ 00281 iColor >>= 5; 00282 iNewColor |= gajXlate6to8[iColor & 0x3F] << 8; 00283 00284 /* Copy blue */ 00285 iColor >>= 6; 00286 iNewColor |= gajXlate5to8[iColor & 0x1F] << 16; 00287 00288 return iNewColor; 00289 } 00290 00291 ULONG 00292 FASTCALL 00293 EXLATEOBJ_iXlate565toPal(EXLATEOBJ *pexlo, ULONG iColor) 00294 { 00295 iColor = EXLATEOBJ_iXlate565toRGB(pexlo, iColor); 00296 00297 return PALETTE_ulGetNearestPaletteIndex(pexlo->ppalDst, iColor); 00298 } 00299 00300 ULONG 00301 FASTCALL 00302 EXLATEOBJ_iXlateShiftAndMask(PEXLATEOBJ pexlo, ULONG iColor) 00303 { 00304 ULONG iNewColor; 00305 00306 iNewColor = _rotl(iColor, pexlo->ulRedShift) & pexlo->ulRedMask; 00307 iNewColor |= _rotl(iColor, pexlo->ulGreenShift) & pexlo->ulGreenMask; 00308 iNewColor |= _rotl(iColor, pexlo->ulBlueShift) & pexlo->ulBlueMask; 00309 00310 return iNewColor; 00311 } 00312 00313 ULONG 00314 FASTCALL 00315 EXLATEOBJ_iXlateBitfieldsToPal(PEXLATEOBJ pexlo, ULONG iColor) 00316 { 00317 /* Convert bitfields to RGB */ 00318 iColor = EXLATEOBJ_iXlateShiftAndMask(pexlo, iColor); 00319 00320 /* Return nearest index */ 00321 return PALETTE_ulGetNearestPaletteIndex(pexlo->ppalDst, iColor); 00322 } 00323 00324 00327 VOID 00328 NTAPI 00329 EXLATEOBJ_vInitialize( 00330 PEXLATEOBJ pexlo, 00331 PALETTE *ppalSrc, 00332 PALETTE *ppalDst, 00333 COLORREF crSrcBackColor, 00334 COLORREF crDstBackColor, 00335 COLORREF crDstForeColor) 00336 { 00337 ULONG cEntries; 00338 ULONG i, ulColor; 00339 00340 if (!ppalSrc) ppalSrc = &gpalRGB; 00341 if (!ppalDst) ppalDst = &gpalRGB; 00342 00343 pexlo->xlo.iUniq = InterlockedIncrement((LONG*)&giUniqueXlate); 00344 pexlo->xlo.cEntries = 0; 00345 pexlo->xlo.flXlate = 0; 00346 pexlo->xlo.pulXlate = pexlo->aulXlate; 00347 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial; 00348 pexlo->hColorTransform = NULL; 00349 pexlo->ppalSrc = ppalSrc; 00350 pexlo->ppalDst = ppalDst; 00351 pexlo->xlo.iSrcType = (USHORT)ppalSrc->flFlags; 00352 pexlo->xlo.iDstType = (USHORT)ppalDst->flFlags; 00353 pexlo->ppalDstDc = &gpalRGB; 00354 00355 if (ppalDst == ppalSrc) 00356 { 00357 pexlo->xlo.flXlate |= XO_TRIVIAL; 00358 return; 00359 } 00360 00361 /* Check if both of the pallettes are indexed */ 00362 if (!(ppalSrc->flFlags & PAL_INDEXED) || !(ppalDst->flFlags & PAL_INDEXED)) 00363 { 00364 /* At least one palette is not indexed, calculate shifts/masks */ 00365 ULONG aulMasksSrc[3], aulMasksDst[3]; 00366 00367 PALETTE_vGetBitMasks(ppalSrc, aulMasksSrc); 00368 PALETTE_vGetBitMasks(ppalDst, aulMasksDst); 00369 00370 pexlo->ulRedMask = aulMasksDst[0]; 00371 pexlo->ulGreenMask = aulMasksDst[1]; 00372 pexlo->ulBlueMask = aulMasksDst[2]; 00373 00374 pexlo->ulRedShift = CalculateShift(aulMasksSrc[0], aulMasksDst[0]); 00375 pexlo->ulGreenShift = CalculateShift(aulMasksSrc[1], aulMasksDst[1]); 00376 pexlo->ulBlueShift = CalculateShift(aulMasksSrc[2], aulMasksDst[2]); 00377 } 00378 00379 if (ppalSrc->flFlags & PAL_MONOCHROME) 00380 { 00381 /* This is a monochrome palette */ 00382 if (!(ppalDst->flFlags & PAL_MONOCHROME)) 00383 { 00384 /* Mono to color, use the dest DC's fore and back color */ 00385 pexlo->pfnXlate = EXLATEOBJ_iXlateTable; 00386 pexlo->xlo.flXlate |= XO_TABLE; 00387 pexlo->xlo.cEntries = 2; 00388 pexlo->xlo.pulXlate[0] = 00389 PALETTE_ulGetNearestIndex(ppalDst, crDstForeColor); 00390 pexlo->xlo.pulXlate[1] = 00391 PALETTE_ulGetNearestIndex(ppalDst, crDstBackColor); 00392 } 00393 } 00394 else if (ppalDst->flFlags & PAL_MONOCHROME) 00395 { 00396 pexlo->pfnXlate = EXLATEOBJ_iXlateToMono; 00397 pexlo->xlo.flXlate |= XO_TO_MONO; 00398 pexlo->xlo.cEntries = 1; 00399 00400 if (ppalSrc->flFlags & PAL_INDEXED) 00401 { 00402 pexlo->aulXlate[0] = 00403 PALETTE_ulGetNearestPaletteIndex(ppalSrc, crSrcBackColor); 00404 } 00405 else if (ppalSrc->flFlags & PAL_RGB) 00406 { 00407 pexlo->aulXlate[0] = crSrcBackColor; 00408 } 00409 else if (ppalSrc->flFlags & PAL_BGR) 00410 { 00411 pexlo->aulXlate[0] = RGB(GetBValue(crSrcBackColor), 00412 GetGValue(crSrcBackColor), 00413 GetRValue(crSrcBackColor)); 00414 } 00415 else if (ppalSrc->flFlags & PAL_BITFIELDS) 00416 { 00417 PALETTE_vGetBitMasks(ppalSrc, &pexlo->ulRedMask); 00418 pexlo->ulRedShift = CalculateShift(RGB(0xFF,0,0), pexlo->ulRedMask); 00419 pexlo->ulGreenShift = CalculateShift(RGB(0,0xFF,0), pexlo->ulGreenMask); 00420 pexlo->ulBlueShift = CalculateShift(RGB(0,0,0xFF), pexlo->ulBlueMask); 00421 00422 pexlo->aulXlate[0] = EXLATEOBJ_iXlateShiftAndMask(pexlo, crSrcBackColor); 00423 } 00424 } 00425 else if (ppalSrc->flFlags & PAL_INDEXED) 00426 { 00427 cEntries = ppalSrc->NumColors; 00428 00429 /* Allocate buffer if needed */ 00430 if (cEntries > 6) 00431 { 00432 pexlo->xlo.pulXlate = EngAllocMem(0, 00433 cEntries * sizeof(ULONG), 00434 GDITAG_PXLATE); 00435 if (!pexlo->xlo.pulXlate) 00436 { 00437 DPRINT1("Could not allocate pulXlate buffer.\n"); 00438 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial; 00439 pexlo->xlo.flXlate = XO_TRIVIAL; 00440 return; 00441 } 00442 } 00443 00444 pexlo->pfnXlate = EXLATEOBJ_iXlateTable; 00445 pexlo->xlo.cEntries = cEntries; 00446 pexlo->xlo.flXlate |= XO_TABLE; 00447 00448 if (ppalDst->flFlags & PAL_INDEXED) 00449 { 00450 ULONG cDiff = 0; 00451 00452 for (i = 0; i < cEntries; i++) 00453 { 00454 ulColor = RGB(ppalSrc->IndexedColors[i].peRed, 00455 ppalSrc->IndexedColors[i].peGreen, 00456 ppalSrc->IndexedColors[i].peBlue); 00457 00458 pexlo->xlo.pulXlate[i] = 00459 PALETTE_ulGetNearestPaletteIndex(ppalDst, ulColor); 00460 00461 if (pexlo->xlo.pulXlate[i] != i) cDiff++; 00462 } 00463 00464 /* Check if we have only trivial mappings */ 00465 if (cDiff == 0) 00466 { 00467 if (pexlo->xlo.pulXlate != pexlo->aulXlate) 00468 { 00469 EngFreeMem(pexlo->xlo.pulXlate); 00470 pexlo->xlo.pulXlate = pexlo->aulXlate; 00471 } 00472 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial; 00473 pexlo->xlo.flXlate = XO_TRIVIAL; 00474 pexlo->xlo.cEntries = 0; 00475 return; 00476 } 00477 } 00478 else 00479 { 00480 for (i = 0; i < pexlo->xlo.cEntries; i++) 00481 { 00482 ulColor = RGB(ppalSrc->IndexedColors[i].peRed, 00483 ppalSrc->IndexedColors[i].peGreen, 00484 ppalSrc->IndexedColors[i].peBlue); 00485 pexlo->xlo.pulXlate[i] = PALETTE_ulGetNearestBitFieldsIndex(ppalDst, ulColor); 00486 } 00487 } 00488 } 00489 else if (ppalSrc->flFlags & PAL_RGB) 00490 { 00491 if (ppalDst->flFlags & PAL_INDEXED) 00492 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoPal; 00493 00494 else if (ppalDst->flFlags & PAL_BGR) 00495 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoBGR; 00496 00497 else if (ppalDst->flFlags & PAL_RGB16_555) 00498 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBto555; 00499 00500 else if (ppalDst->flFlags & PAL_RGB16_565) 00501 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBto565; 00502 00503 else if (ppalDst->flFlags & PAL_BITFIELDS) 00504 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask; 00505 } 00506 else if (ppalSrc->flFlags & PAL_BGR) 00507 { 00508 if (ppalDst->flFlags & PAL_INDEXED) 00509 pexlo->pfnXlate = EXLATEOBJ_iXlateBitfieldsToPal; 00510 00511 else if (ppalDst->flFlags & PAL_RGB) 00512 /* The inverse function works the same */ 00513 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoBGR; 00514 00515 else if (ppalDst->flFlags & PAL_RGB16_555) 00516 pexlo->pfnXlate = EXLATEOBJ_iXlateBGRto555; 00517 00518 else if (ppalDst->flFlags & PAL_RGB16_565) 00519 pexlo->pfnXlate = EXLATEOBJ_iXlateBGRto565; 00520 00521 else if (ppalDst->flFlags & PAL_BITFIELDS) 00522 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask; 00523 } 00524 else if (ppalSrc->flFlags & PAL_RGB16_555) 00525 { 00526 if (ppalDst->flFlags & PAL_INDEXED) 00527 pexlo->pfnXlate = EXLATEOBJ_iXlate555toPal; 00528 00529 else if (ppalDst->flFlags & PAL_RGB) 00530 pexlo->pfnXlate = EXLATEOBJ_iXlate555toRGB; 00531 00532 else if (ppalDst->flFlags & PAL_BGR) 00533 pexlo->pfnXlate = EXLATEOBJ_iXlate555toBGR; 00534 00535 else if (ppalDst->flFlags & PAL_RGB16_565) 00536 pexlo->pfnXlate = EXLATEOBJ_iXlate555to565; 00537 00538 else if (ppalDst->flFlags & PAL_BITFIELDS) 00539 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask; 00540 } 00541 else if (ppalSrc->flFlags & PAL_RGB16_565) 00542 { 00543 if (ppalDst->flFlags & PAL_INDEXED) 00544 pexlo->pfnXlate = EXLATEOBJ_iXlate565toPal; 00545 00546 else if (ppalDst->flFlags & PAL_RGB) 00547 pexlo->pfnXlate = EXLATEOBJ_iXlate565toRGB; 00548 00549 else if (ppalDst->flFlags & PAL_BGR) 00550 pexlo->pfnXlate = EXLATEOBJ_iXlate565toBGR; 00551 00552 else if (ppalDst->flFlags & PAL_RGB16_555) 00553 pexlo->pfnXlate = EXLATEOBJ_iXlate565to555; 00554 00555 else if (ppalDst->flFlags & PAL_BITFIELDS) 00556 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask; 00557 } 00558 else if (ppalSrc->flFlags & PAL_BITFIELDS) 00559 { 00560 if (ppalDst->flFlags & PAL_INDEXED) 00561 pexlo->pfnXlate = EXLATEOBJ_iXlateBitfieldsToPal; 00562 else 00563 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask; 00564 } 00565 00566 /* Check for a trivial shift and mask operation */ 00567 if (pexlo->pfnXlate == EXLATEOBJ_iXlateShiftAndMask && 00568 !pexlo->ulRedShift && !pexlo->ulGreenShift && !pexlo->ulBlueShift) 00569 { 00570 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial; 00571 } 00572 00573 /* Check for trivial xlate */ 00574 if (pexlo->pfnXlate == EXLATEOBJ_iXlateTrivial) 00575 pexlo->xlo.flXlate = XO_TRIVIAL; 00576 else 00577 pexlo->xlo.flXlate &= ~XO_TRIVIAL; 00578 } 00579 00580 VOID 00581 NTAPI 00582 EXLATEOBJ_vInitXlateFromDCs( 00583 EXLATEOBJ* pexlo, 00584 PDC pdcSrc, 00585 PDC pdcDst) 00586 { 00587 PSURFACE psurfDst, psurfSrc; 00588 00589 psurfDst = pdcDst->dclevel.pSurface; 00590 psurfSrc = pdcSrc->dclevel.pSurface; 00591 00592 /* Normal initialisation. No surface means DEFAULT_BITMAP */ 00593 EXLATEOBJ_vInitialize(pexlo, 00594 psurfSrc ? psurfSrc->ppal : gppalMono, 00595 psurfDst ? psurfDst->ppal : gppalMono, 00596 pdcSrc->pdcattr->crBackgroundClr, 00597 pdcDst->pdcattr->crBackgroundClr, 00598 pdcDst->pdcattr->crForegroundClr); 00599 00600 pexlo->ppalDstDc = pdcDst->dclevel.ppal; 00601 } 00602 00603 VOID 00604 NTAPI 00605 EXLATEOBJ_vCleanup(PEXLATEOBJ pexlo) 00606 { 00607 if (pexlo->xlo.pulXlate != pexlo->aulXlate) 00608 { 00609 EngFreeMem(pexlo->xlo.pulXlate); 00610 } 00611 pexlo->xlo.pulXlate = pexlo->aulXlate; 00612 } 00613 00616 #undef XLATEOBJ_iXlate 00617 ULONG 00618 NTAPI 00619 XLATEOBJ_iXlate(XLATEOBJ *pxlo, ULONG iColor) 00620 { 00621 PEXLATEOBJ pexlo = (PEXLATEOBJ)pxlo; 00622 00623 if (!pxlo) 00624 return iColor; 00625 00626 /* Call the iXlate function */ 00627 return pexlo->pfnXlate(pexlo, iColor); 00628 } 00629 00630 ULONG 00631 NTAPI 00632 XLATEOBJ_cGetPalette(XLATEOBJ *pxlo, ULONG iPal, ULONG cPal, ULONG *pPalOut) 00633 { 00634 PEXLATEOBJ pexlo = (PEXLATEOBJ)pxlo; 00635 PPALETTE ppal; 00636 ULONG i; 00637 00638 if (!pxlo) 00639 { 00640 return 0; 00641 } 00642 00643 if (iPal > 5) 00644 { 00645 DPRINT1("XLATEOBJ_cGetPalette called with wrong iPal: %d\n", iPal); 00646 return 0; 00647 } 00648 00649 /* Get the requested palette */ 00650 if (iPal == XO_DESTDCPALETTE) 00651 { 00652 ppal = pexlo->ppalDstDc; 00653 } 00654 else if (iPal == XO_SRCPALETTE || iPal == XO_SRCBITFIELDS) 00655 { 00656 ppal = pexlo->ppalSrc; 00657 } 00658 else 00659 { 00660 ppal = pexlo->ppalDst; 00661 } 00662 00663 /* Verify palette type match */ 00664 if (!ppal || 00665 ((iPal == XO_SRCPALETTE || iPal == XO_DESTPALETTE) 00666 && !(ppal->flFlags & PAL_INDEXED)) || 00667 ((iPal == XO_SRCBITFIELDS || iPal == XO_DESTBITFIELDS) 00668 && !(ppal->flFlags & PAL_BITFIELDS))) 00669 { 00670 return 0; 00671 } 00672 00673 if(!pPalOut) 00674 { 00675 return ppal->NumColors; 00676 } 00677 00678 /* Copy the values into the buffer */ 00679 if (ppal->flFlags & PAL_INDEXED) 00680 { 00681 cPal = min(cPal, ppal->NumColors); 00682 for (i = 0; i < cPal; i++) 00683 { 00684 pPalOut[i] = RGB(ppal->IndexedColors[i].peRed, 00685 ppal->IndexedColors[i].peGreen, 00686 ppal->IndexedColors[i].peBlue); 00687 } 00688 } 00689 else 00690 { 00691 // FIXME: should use the above code 00692 pPalOut[0] = ppal->RedMask; 00693 pPalOut[1] = ppal->GreenMask; 00694 pPalOut[2] = ppal->BlueMask; 00695 } 00696 00697 return cPal; 00698 } 00699 00700 HANDLE 00701 NTAPI 00702 XLATEOBJ_hGetColorTransform(XLATEOBJ *pxlo) 00703 { 00704 PEXLATEOBJ pexlo = (PEXLATEOBJ)pxlo; 00705 return pexlo->hColorTransform; 00706 } 00707 00708 PULONG 00709 NTAPI 00710 XLATEOBJ_piVector(XLATEOBJ *pxlo) 00711 { 00712 if (pxlo->iSrcType == PAL_INDEXED) 00713 { 00714 return pxlo->pulXlate; 00715 } 00716 00717 return NULL; 00718 } 00719 00720 /* EOF */ Generated on Sun May 27 2012 04:38:21 for ReactOS by
1.7.6.1
|