18EXLATEOBJ_iXlateTrivial(
29{ 0, 8, 16, 25, 33, 41, 49, 58, 66, 74, 82, 90, 99,107,115,123,
30 132,140,148,156,165,173,181,189,197,206,214,222,231,239,247,255};
33{ 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 45, 49, 52, 57, 61,
34 65, 69, 73, 77, 81, 85, 89, 93, 97,101,105,109,113,117,121,125,
35130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,
36194,198,202,207,210,215,219,223,227,231,235,239,243,247,251,255};
45EXLATEOBJ_iXlateTrivial(
55EXLATEOBJ_iXlateMonoInvert(
65EXLATEOBJ_iXlateMonoTo0(
75EXLATEOBJ_iXlateMonoTo1(
90 return ((
r +
g +
b) >= 383);
101 return ((
r +
g +
b) < 383);
116 LONG lDist =
r * pexlo->ToMono.lDeltaR +
117 g * pexlo->ToMono.lDeltaG +
118 b * pexlo->ToMono.lDeltaB;
120 return (lDist > pexlo->ToMono.lHalfDist);
135 LONG lDist =
r * pexlo->ToMono.lDeltaR +
136 g * pexlo->ToMono.lDeltaG +
137 b * pexlo->ToMono.lDeltaB;
139 return (lDist > pexlo->ToMono.lHalfDist);
151 if ((rgbBack == 0x000000) && (rgbFore == 0xFFFFFF))
154 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBToBW;
156 else if ((rgbBack == 0xFFFFFF) && (rgbFore == 0x000000))
159 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBToWB;
165 pexlo->pfnXlate = EXLATEOBJ_iXlateBGRToMono;
167 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBToMono;
176 pexlo->ToMono.lDeltaR = lForeR - lBackR;
177 pexlo->ToMono.lDeltaG = lForeG - lBackG;
178 pexlo->ToMono.lDeltaB = lForeB - lBackB;
179 pexlo->ToMono.lHalfDist =
180 (((lForeR * lForeR) + (lForeG * lForeG) + (lForeB * lForeB)) -
181 ((lBackR * lBackR) + (lBackG * lBackG) + (lBackB * lBackB))) / 2;
190 return (
iColor == pexlo->xlo.pulXlate[0]);
210 iNewColor =
iColor & 0xff00ff00;
216 iNewColor |=
iColor >> 16;
217 iNewColor |=
iColor << 16;
231 iNewColor =
iColor & 0x7C00;
235 iNewColor |=
iColor & 0x3E0;
239 iNewColor |=
iColor & 0x1F;
253 iNewColor =
iColor & 0x1f;
257 iNewColor |= (
iColor & 0x3E0);
261 iNewColor |= (
iColor & 0x7C00);
275 iNewColor =
iColor & 0xF800;
279 iNewColor |=
iColor & 0x7E0;
283 iNewColor |=
iColor & 0x1F;
297 iNewColor =
iColor & 0x1f;
301 iNewColor |= (
iColor & 0x7E0);
305 iNewColor |= (
iColor & 0xF800);
368 iNewColor =
iColor & 0x1f;
372 iNewColor |=
iColor & 0xFFC0;
376 iNewColor |= (
iColor & 0x20);
399 iNewColor =
iColor & 0x1f;
403 iNewColor |=
iColor & 0x7FE0;
502 if (!ppalSrc) ppalSrc = &
gpalRGB;
503 if (!ppalDst) ppalDst = &
gpalRGB;
506 pexlo->xlo.cEntries = 0;
507 pexlo->xlo.flXlate = 0;
508 pexlo->xlo.pulXlate = pexlo->aulXlate;
509 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial;
510 pexlo->hColorTransform =
NULL;
511 pexlo->ppalSrc = ppalSrc;
512 pexlo->ppalDst = ppalDst;
513 pexlo->xlo.iSrcType = (
USHORT)ppalSrc->flFlags;
514 pexlo->xlo.iDstType = (
USHORT)ppalDst->flFlags;
517 if (ppalDst == ppalSrc)
527 ULONG aulMasksSrc[3], aulMasksDst[3];
532 pexlo->ulRedMask = aulMasksDst[0];
533 pexlo->ulGreenMask = aulMasksDst[1];
534 pexlo->ulBlueMask = aulMasksDst[2];
536 pexlo->ulRedShift =
CalculateShift(aulMasksSrc[0], aulMasksDst[0]);
537 pexlo->ulGreenShift =
CalculateShift(aulMasksSrc[1], aulMasksDst[1]);
538 pexlo->ulBlueShift =
CalculateShift(aulMasksSrc[2], aulMasksDst[2]);
552 iColors[0] = iColors[1] ^ 1;
558 ULONG iWhite = iBlack ^ 1;
572 if ((iColors[0] == 0) && (iColors[1] == 1))
574 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial;
577 else if ((iColors[0] == 1) && (iColors[1] == 0))
579 pexlo->pfnXlate = EXLATEOBJ_iXlateMonoInvert;
581 else if (iColors[0] == 0)
583 pexlo->pfnXlate = EXLATEOBJ_iXlateMonoTo0;
587 pexlo->pfnXlate = EXLATEOBJ_iXlateMonoTo1;
593 pexlo->pfnXlate = EXLATEOBJ_iXlateTable;
595 pexlo->xlo.cEntries = 2;
614 ULONG iWhite = iBlack ^ 1;
622 pexlo->pfnXlate = EXLATEOBJ_iXlateToMono;
624 pexlo->xlo.cEntries = 1;
631 else if (ppalSrc->flFlags &
PAL_RGB)
633 pexlo->aulXlate[0] = crSrcBackColor;
644 else if (ppalSrc->flFlags &
PAL_BGR)
666 pexlo->aulXlate[0] = EXLATEOBJ_iXlateShiftAndMask(pexlo, crSrcBackColor);
679 if (!pexlo->xlo.pulXlate)
681 DPRINT1(
"Could not allocate pulXlate buffer.\n");
682 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial;
688 pexlo->pfnXlate = EXLATEOBJ_iXlateTable;
698 ulColor =
RGB(ppalSrc->IndexedColors[
i].peRed,
699 ppalSrc->IndexedColors[
i].peGreen,
700 ppalSrc->IndexedColors[
i].peBlue);
702 pexlo->xlo.pulXlate[
i] =
705 if (pexlo->xlo.pulXlate[
i] !=
i) cDiff++;
711 if (pexlo->xlo.pulXlate != pexlo->aulXlate)
714 pexlo->xlo.pulXlate = pexlo->aulXlate;
716 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial;
718 pexlo->xlo.cEntries = 0;
724 for (
i = 0;
i < pexlo->xlo.cEntries;
i++)
726 ulColor =
RGB(ppalSrc->IndexedColors[
i].peRed,
727 ppalSrc->IndexedColors[
i].peGreen,
728 ppalSrc->IndexedColors[
i].peBlue);
733 else if (ppalSrc->flFlags &
PAL_RGB)
736 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoPal;
738 else if (ppalDst->flFlags &
PAL_BGR)
739 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoBGR;
742 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBto555;
745 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBto565;
748 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
750 else if (ppalSrc->flFlags &
PAL_BGR)
753 pexlo->pfnXlate = EXLATEOBJ_iXlateBitfieldsToPal;
755 else if (ppalDst->flFlags &
PAL_RGB)
757 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoBGR;
760 pexlo->pfnXlate = EXLATEOBJ_iXlateBGRto555;
763 pexlo->pfnXlate = EXLATEOBJ_iXlateBGRto565;
766 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
771 pexlo->pfnXlate = EXLATEOBJ_iXlate555toPal;
773 else if (ppalDst->flFlags &
PAL_RGB)
774 pexlo->pfnXlate = EXLATEOBJ_iXlate555toRGB;
776 else if (ppalDst->flFlags &
PAL_BGR)
777 pexlo->pfnXlate = EXLATEOBJ_iXlate555toBGR;
780 pexlo->pfnXlate = EXLATEOBJ_iXlate555to565;
783 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
788 pexlo->pfnXlate = EXLATEOBJ_iXlate565toPal;
790 else if (ppalDst->flFlags &
PAL_RGB)
791 pexlo->pfnXlate = EXLATEOBJ_iXlate565toRGB;
793 else if (ppalDst->flFlags &
PAL_BGR)
794 pexlo->pfnXlate = EXLATEOBJ_iXlate565toBGR;
797 pexlo->pfnXlate = EXLATEOBJ_iXlate565to555;
800 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
805 pexlo->pfnXlate = EXLATEOBJ_iXlateBitfieldsToPal;
807 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
811 if (pexlo->pfnXlate == EXLATEOBJ_iXlateShiftAndMask &&
812 !pexlo->ulRedShift && !pexlo->ulGreenShift && !pexlo->ulBlueShift)
814 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial;
818 if (pexlo->pfnXlate == EXLATEOBJ_iXlateTrivial)
821 pexlo->xlo.flXlate &= ~XO_TRIVIAL;
833 psurfDst = pdcDst->dclevel.pSurface;
834 psurfSrc = pdcSrc->dclevel.pSurface;
840 pdcSrc->pdcattr->crBackgroundClr,
841 pdcDst->pdcattr->crBackgroundClr,
842 pdcDst->pdcattr->crForegroundClr);
844 pexlo->ppalDstDc = pdcDst->dclevel.ppal;
857 psurfDst = pdcDst->dclevel.pSurface;
858 psurfSrc = pdcSrc->dclevel.pSurface;
862 crBackColor = pdcSrc->pdcattr->crBackgroundClr;
870 pdcDst->pdcattr->crBackgroundClr,
871 pdcDst->pdcattr->crForegroundClr);
873 pexlo->ppalDstDc = pdcDst->dclevel.ppal;
897 if (pexlo->xlo.pulXlate != pexlo->aulXlate)
901 pexlo->xlo.pulXlate = pexlo->aulXlate;
906#undef XLATEOBJ_iXlate
941 DPRINT1(
"XLATEOBJ_cGetPalette called with wrong iPal: %lu\n", iPal);
978 for (
i = 0;
i < cPal;
i++)
1012 return pxlo->pulXlate;
#define InterlockedIncrement
_ACRTIMP unsigned int __cdecl _rotl(unsigned int, int)
GLdouble GLdouble GLdouble r
GLboolean GLboolean GLboolean b
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define _Post_satisfies_(e)
#define _Function_class_(n)
void * EngAllocMem(int zero, unsigned long size, int tag=0)
PALETTEENTRY * IndexedColors
struct _PALETTE *const ppal
ULONG NTAPI PALETTE_ulGetNearestIndex(PALETTE *ppal, ULONG ulColor)
VOID NTAPI PALETTE_vGetBitMasks(PPALETTE ppal, PULONG pulColors)
ULONG NTAPI PALETTE_ulGetNearestPaletteIndex(PALETTE *ppal, ULONG iColor)
FORCEINLINE ULONG CalculateShift(ULONG ulMask1, ULONG ulMask2)
FORCEINLINE ULONG PALETTE_ulGetRGBColorFromIndex(PPALETTE ppal, ULONG ulIndex)
_In_ SURFOBJ _In_ CLIPOBJ _In_opt_ XLATEOBJ * pxlo
_In_ UINT _In_ UINT cEntries
VOID NTAPI EXLATEOBJ_vInitialize(_Out_ PEXLATEOBJ pexlo, _In_opt_ PALETTE *ppalSrc, _In_opt_ PALETTE *ppalDst, _In_ COLORREF crSrcBackColor, _In_ COLORREF crDstBackColor, _In_ COLORREF crDstForeColor)
static const BYTE gajXlate5to8[32]
static VOID EXLATEOBJ_vInitRGBToMono(_Inout_ PEXLATEOBJ pexlo, _In_ ULONG rgbBack, _In_ ULONG rgbFore, _In_ BOOL bIsBGR)
VOID NTAPI EXLATEOBJ_vCleanup(_Inout_ PEXLATEOBJ pexlo)
static const BYTE gajXlate6to8[64]
VOID NTAPI EXLATEOBJ_vInitXlateFromDCsEx(_Out_ EXLATEOBJ *pexlo, _In_ PDC pdcSrc, _In_ PDC pdcDst, _In_ COLORREF crBackColor)
ULONG NTAPI XLATEOBJ_cGetPalette(_In_ XLATEOBJ *pxlo, _In_ ULONG iPal, _In_ ULONG cPal, _Out_cap_(cPal) ULONG *pPalOut)
VOID NTAPI EXLATEOBJ_vInitXlateFromDCs(_Out_ EXLATEOBJ *pexlo, _In_ PDC pdcSrc, _In_ PDC pdcDst)
ULONG NTAPI XLATEOBJ_iXlate(_In_ XLATEOBJ *pxlo, _In_ ULONG iColor)
PULONG NTAPI XLATEOBJ_piVector(_In_ XLATEOBJ *pxlo)
HANDLE NTAPI XLATEOBJ_hGetColorTransform(_In_ XLATEOBJ *pxlo)
VOID NTAPI EXLATEOBJ_vInitSrcMonoXlate(PEXLATEOBJ pexlo, PPALETTE ppalDst, COLORREF crBackgroundClr, COLORREF crForegroundClr)
static ULONG giUniqueXlate
struct _EXLATEOBJ * PEXLATEOBJ