ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

xlate.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.