ReactOS 0.4.16-dev-2208-g6350669
xlateobj.c File Reference
#include <win32k.h>
#include <debug.h>
Include dependency graph for xlateobj.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

 _Post_satisfies_ (return==iColor)
 
 _Function_class_ (FN_XLATE)
 
static VOID EXLATEOBJ_vInitRGBToMono (_Inout_ PEXLATEOBJ pexlo, _In_ ULONG rgbBack, _In_ ULONG rgbFore, _In_ BOOL bIsBGR)
 
VOID NTAPI EXLATEOBJ_vInitialize (_Out_ PEXLATEOBJ pexlo, _In_opt_ PALETTE *ppalSrc, _In_opt_ PALETTE *ppalDst, _In_ COLORREF crSrcBackColor, _In_ COLORREF crDstBackColor, _In_ COLORREF crDstForeColor)
 
VOID NTAPI EXLATEOBJ_vInitXlateFromDCs (_Out_ EXLATEOBJ *pexlo, _In_ PDC pdcSrc, _In_ PDC pdcDst)
 
VOID NTAPI EXLATEOBJ_vInitXlateFromDCsEx (_Out_ EXLATEOBJ *pexlo, _In_ PDC pdcSrc, _In_ PDC pdcDst, _In_ COLORREF crBackColor)
 
VOID NTAPI EXLATEOBJ_vInitSrcMonoXlate (PEXLATEOBJ pexlo, PPALETTE ppalDst, COLORREF crBackgroundClr, COLORREF crForegroundClr)
 
VOID NTAPI EXLATEOBJ_vCleanup (_Inout_ PEXLATEOBJ pexlo)
 
ULONG NTAPI XLATEOBJ_iXlate (_In_ XLATEOBJ *pxlo, _In_ ULONG iColor)
 
ULONG NTAPI XLATEOBJ_cGetPalette (_In_ XLATEOBJ *pxlo, _In_ ULONG iPal, _In_ ULONG cPal, _Out_cap_(cPal) ULONG *pPalOut)
 
HANDLE NTAPI XLATEOBJ_hGetColorTransform (_In_ XLATEOBJ *pxlo)
 
PULONG NTAPI XLATEOBJ_piVector (_In_ XLATEOBJ *pxlo)
 

Variables

static ULONG giUniqueXlate = 0
 
static const BYTE gajXlate5to8 [32]
 
static const BYTE gajXlate6to8 [64]
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 11 of file xlateobj.c.

Function Documentation

◆ _Function_class_()

_Function_class_ ( FN_XLATE  )

Definition at line 52 of file xlateobj.c.

58{
59 return iColor ^ 1;
60}
_In_ ULONG iColor
Definition: xlateobj.h:17

◆ _Post_satisfies_()

_Post_satisfies_ ( return  = =iColor)

Globals

iXlate functions

Definition at line 14 of file xlateobj.c.

24 {{0, XO_TRIVIAL, 0, 0, 0, 0}, EXLATEOBJ_iXlateTrivial};
#define XO_TRIVIAL
Definition: winddi.h:1247

◆ EXLATEOBJ_vCleanup()

◆ EXLATEOBJ_vInitialize()

VOID NTAPI EXLATEOBJ_vInitialize ( _Out_ PEXLATEOBJ  pexlo,
_In_opt_ PALETTE ppalSrc,
_In_opt_ PALETTE ppalDst,
_In_ COLORREF  crSrcBackColor,
_In_ COLORREF  crDstBackColor,
_In_ COLORREF  crDstForeColor 
)

Private Functions

Definition at line 491 of file xlateobj.c.

498{
500 ULONG i, ulColor;
501
502 if (!ppalSrc) ppalSrc = &gpalRGB;
503 if (!ppalDst) ppalDst = &gpalRGB;
504
505 pexlo->xlo.iUniq = InterlockedIncrement((LONG*)&giUniqueXlate);
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;
515 pexlo->ppalDstDc = &gpalRGB;
516
517 if (ppalDst == ppalSrc)
518 {
519 pexlo->xlo.flXlate |= XO_TRIVIAL;
520 return;
521 }
522
523 /* Check if both of the palettes are indexed */
524 if (!(ppalSrc->flFlags & PAL_INDEXED) || !(ppalDst->flFlags & PAL_INDEXED))
525 {
526 /* At least one palette is not indexed, calculate shifts/masks */
527 ULONG aulMasksSrc[3], aulMasksDst[3];
528
529 PALETTE_vGetBitMasks(ppalSrc, aulMasksSrc);
530 PALETTE_vGetBitMasks(ppalDst, aulMasksDst);
531
532 pexlo->ulRedMask = aulMasksDst[0];
533 pexlo->ulGreenMask = aulMasksDst[1];
534 pexlo->ulBlueMask = aulMasksDst[2];
535
536 pexlo->ulRedShift = CalculateShift(aulMasksSrc[0], aulMasksDst[0]);
537 pexlo->ulGreenShift = CalculateShift(aulMasksSrc[1], aulMasksDst[1]);
538 pexlo->ulBlueShift = CalculateShift(aulMasksSrc[2], aulMasksDst[2]);
539 }
540
541 if (ppalSrc->flFlags & PAL_MONOCHROME)
542 {
543 if (ppalDst->flFlags & PAL_MONOCHROME)
544 {
545 ULONG iColors[2];
546
547 /* Color mapping depends on whether the source or dest are DIBs */
548 if ((ppalSrc->flFlags & PAL_DIBSECTION) && !(ppalDst->flFlags & PAL_DIBSECTION))
549 {
550 /* DIB -> DDB: Use the source back color */
551 iColors[1] = PALETTE_ulGetNearestPaletteIndex(ppalSrc, crSrcBackColor);
552 iColors[0] = iColors[1] ^ 1;
553 }
554 else if (!(ppalSrc->flFlags & PAL_DIBSECTION) && (ppalDst->flFlags & PAL_DIBSECTION))
555 {
556 /* DDB -> DIB: Use the dest DC's back and fore color (black -> fore, white -> back) */
557 ULONG iBlack = PALETTE_ulGetNearestPaletteIndex(ppalSrc, 0x000000);
558 ULONG iWhite = iBlack ^ 1;
559 iColors[iBlack] = PALETTE_ulGetNearestPaletteIndex(ppalDst, crDstForeColor);
560 iColors[iWhite] = PALETTE_ulGetNearestPaletteIndex(ppalDst, crDstBackColor);
561 }
562 else
563 {
564 /* Either both are DIBs or both are DDBs, fore/back colors are ignored */
565 ULONG rgbColor0 = PALETTE_ulGetRGBColorFromIndex(ppalSrc, 0);
566 ULONG rgbColor1 = PALETTE_ulGetRGBColorFromIndex(ppalSrc, 1);
567 iColors[0] = PALETTE_ulGetNearestPaletteIndex(ppalDst, rgbColor0);
568 iColors[1] = PALETTE_ulGetNearestPaletteIndex(ppalDst, rgbColor1);
569 }
570
571 /* Check for one of 4 cases: trivial, invert, to-0, to-1 */
572 if ((iColors[0] == 0) && (iColors[1] == 1))
573 {
574 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial;
575 pexlo->xlo.flXlate = XO_TRIVIAL;
576 }
577 else if ((iColors[0] == 1) && (iColors[1] == 0))
578 {
579 pexlo->pfnXlate = EXLATEOBJ_iXlateMonoInvert;
580 }
581 else if (iColors[0] == 0) // && (iColors[1] == 0)
582 {
583 pexlo->pfnXlate = EXLATEOBJ_iXlateMonoTo0;
584 }
585 else // if ((iColors[0] == 1) && (iColors[1] == 1))
586 {
587 pexlo->pfnXlate = EXLATEOBJ_iXlateMonoTo1;
588 }
589 }
590 else
591 {
592 /* Mono to color translation uses a 2-entry table */
593 pexlo->pfnXlate = EXLATEOBJ_iXlateTable;
594 pexlo->xlo.flXlate |= XO_TABLE;
595 pexlo->xlo.cEntries = 2;
596
597 /* Check if source is a DIB or direct translation was explicitly
598 requested by passing CLR_INALID as crDstBackColor */
599 if ((ppalSrc->flFlags & PAL_DIBSECTION) ||
600 (crDstBackColor == CLR_INVALID))
601 {
602 /* Direct translation, use the DIB color table */
603 ULONG rgbColor0 = PALETTE_ulGetRGBColorFromIndex(ppalSrc, 0);
604 ULONG rgbColor1 = PALETTE_ulGetRGBColorFromIndex(ppalSrc, 1);
605 pexlo->aulXlate[0] =
606 PALETTE_ulGetNearestIndex(ppalDst, rgbColor0);
607 pexlo->aulXlate[1] =
608 PALETTE_ulGetNearestIndex(ppalDst, rgbColor1);
609 }
610 else
611 {
612 /* Use the dest DCs back and fore color */
613 ULONG iBlack = PALETTE_ulGetNearestPaletteIndex(ppalSrc, 0x000000);
614 ULONG iWhite = iBlack ^ 1;
615 pexlo->xlo.pulXlate[iBlack] = PALETTE_ulGetNearestIndex(ppalDst, crDstForeColor);
616 pexlo->xlo.pulXlate[iWhite] = PALETTE_ulGetNearestIndex(ppalDst, crDstBackColor);
617 }
618 }
619 }
620 else if (ppalDst->flFlags & PAL_MONOCHROME)
621 {
622 pexlo->pfnXlate = EXLATEOBJ_iXlateToMono;
623 pexlo->xlo.flXlate |= XO_TO_MONO;
624 pexlo->xlo.cEntries = 1;
625
626 if (ppalSrc->flFlags & PAL_INDEXED)
627 {
628 pexlo->aulXlate[0] =
629 PALETTE_ulGetNearestPaletteIndex(ppalSrc, crSrcBackColor);
630 }
631 else if (ppalSrc->flFlags & PAL_RGB)
632 {
633 pexlo->aulXlate[0] = crSrcBackColor;
634
635 /* Check if direct translation was requested (e.g. NtGdiSetPixel) */
636 if (crSrcBackColor == CLR_INVALID)
637 {
641 FALSE);
642 }
643 }
644 else if (ppalSrc->flFlags & PAL_BGR)
645 {
646 pexlo->aulXlate[0] = RGB(GetBValue(crSrcBackColor),
647 GetGValue(crSrcBackColor),
648 GetRValue(crSrcBackColor));
649
650 /* Check if direct translation was requested (e.g. NtGdiSetPixel) */
651 if (crSrcBackColor == CLR_INVALID)
652 {
656 TRUE);
657 }
658 }
659 else if (ppalSrc->flFlags & PAL_BITFIELDS)
660 {
661 PALETTE_vGetBitMasks(ppalSrc, &pexlo->ulRedMask);
662 pexlo->ulRedShift = CalculateShift(RGB(0xFF,0,0), pexlo->ulRedMask);
663 pexlo->ulGreenShift = CalculateShift(RGB(0,0xFF,0), pexlo->ulGreenMask);
664 pexlo->ulBlueShift = CalculateShift(RGB(0,0,0xFF), pexlo->ulBlueMask);
665
666 pexlo->aulXlate[0] = EXLATEOBJ_iXlateShiftAndMask(pexlo, crSrcBackColor);
667 }
668 }
669 else if (ppalSrc->flFlags & PAL_INDEXED)
670 {
671 cEntries = ppalSrc->NumColors;
672
673 /* Allocate buffer if needed */
674 if (cEntries > 6)
675 {
676 pexlo->xlo.pulXlate = EngAllocMem(0,
677 cEntries * sizeof(ULONG),
679 if (!pexlo->xlo.pulXlate)
680 {
681 DPRINT1("Could not allocate pulXlate buffer.\n");
682 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial;
683 pexlo->xlo.flXlate = XO_TRIVIAL;
684 return;
685 }
686 }
687
688 pexlo->pfnXlate = EXLATEOBJ_iXlateTable;
689 pexlo->xlo.cEntries = cEntries;
690 pexlo->xlo.flXlate |= XO_TABLE;
691
692 if (ppalDst->flFlags & PAL_INDEXED)
693 {
694 ULONG cDiff = 0;
695
696 for (i = 0; i < cEntries; i++)
697 {
698 ulColor = RGB(ppalSrc->IndexedColors[i].peRed,
699 ppalSrc->IndexedColors[i].peGreen,
700 ppalSrc->IndexedColors[i].peBlue);
701
702 pexlo->xlo.pulXlate[i] =
703 PALETTE_ulGetNearestPaletteIndex(ppalDst, ulColor);
704
705 if (pexlo->xlo.pulXlate[i] != i) cDiff++;
706 }
707
708 /* Check if we have only trivial mappings */
709 if (cDiff == 0)
710 {
711 if (pexlo->xlo.pulXlate != pexlo->aulXlate)
712 {
713 EngFreeMem(pexlo->xlo.pulXlate);
714 pexlo->xlo.pulXlate = pexlo->aulXlate;
715 }
716 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial;
717 pexlo->xlo.flXlate = XO_TRIVIAL;
718 pexlo->xlo.cEntries = 0;
719 return;
720 }
721 }
722 else
723 {
724 for (i = 0; i < pexlo->xlo.cEntries; i++)
725 {
726 ulColor = RGB(ppalSrc->IndexedColors[i].peRed,
727 ppalSrc->IndexedColors[i].peGreen,
728 ppalSrc->IndexedColors[i].peBlue);
729 pexlo->xlo.pulXlate[i] = PALETTE_ulGetNearestIndex(ppalDst, ulColor);
730 }
731 }
732 }
733 else if (ppalSrc->flFlags & PAL_RGB)
734 {
735 if (ppalDst->flFlags & PAL_INDEXED)
736 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoPal;
737
738 else if (ppalDst->flFlags & PAL_BGR)
739 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoBGR;
740
741 else if (ppalDst->flFlags & PAL_RGB16_555)
742 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBto555;
743
744 else if (ppalDst->flFlags & PAL_RGB16_565)
745 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBto565;
746
747 else if (ppalDst->flFlags & PAL_BITFIELDS)
748 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
749 }
750 else if (ppalSrc->flFlags & PAL_BGR)
751 {
752 if (ppalDst->flFlags & PAL_INDEXED)
753 pexlo->pfnXlate = EXLATEOBJ_iXlateBitfieldsToPal;
754
755 else if (ppalDst->flFlags & PAL_RGB)
756 /* The inverse function works the same */
757 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoBGR;
758
759 else if (ppalDst->flFlags & PAL_RGB16_555)
760 pexlo->pfnXlate = EXLATEOBJ_iXlateBGRto555;
761
762 else if (ppalDst->flFlags & PAL_RGB16_565)
763 pexlo->pfnXlate = EXLATEOBJ_iXlateBGRto565;
764
765 else if (ppalDst->flFlags & PAL_BITFIELDS)
766 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
767 }
768 else if (ppalSrc->flFlags & PAL_RGB16_555)
769 {
770 if (ppalDst->flFlags & PAL_INDEXED)
771 pexlo->pfnXlate = EXLATEOBJ_iXlate555toPal;
772
773 else if (ppalDst->flFlags & PAL_RGB)
774 pexlo->pfnXlate = EXLATEOBJ_iXlate555toRGB;
775
776 else if (ppalDst->flFlags & PAL_BGR)
777 pexlo->pfnXlate = EXLATEOBJ_iXlate555toBGR;
778
779 else if (ppalDst->flFlags & PAL_RGB16_565)
780 pexlo->pfnXlate = EXLATEOBJ_iXlate555to565;
781
782 else if (ppalDst->flFlags & PAL_BITFIELDS)
783 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
784 }
785 else if (ppalSrc->flFlags & PAL_RGB16_565)
786 {
787 if (ppalDst->flFlags & PAL_INDEXED)
788 pexlo->pfnXlate = EXLATEOBJ_iXlate565toPal;
789
790 else if (ppalDst->flFlags & PAL_RGB)
791 pexlo->pfnXlate = EXLATEOBJ_iXlate565toRGB;
792
793 else if (ppalDst->flFlags & PAL_BGR)
794 pexlo->pfnXlate = EXLATEOBJ_iXlate565toBGR;
795
796 else if (ppalDst->flFlags & PAL_RGB16_555)
797 pexlo->pfnXlate = EXLATEOBJ_iXlate565to555;
798
799 else if (ppalDst->flFlags & PAL_BITFIELDS)
800 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
801 }
802 else if (ppalSrc->flFlags & PAL_BITFIELDS)
803 {
804 if (ppalDst->flFlags & PAL_INDEXED)
805 pexlo->pfnXlate = EXLATEOBJ_iXlateBitfieldsToPal;
806 else
807 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
808 }
809
810 /* Check for a trivial shift and mask operation */
811 if (pexlo->pfnXlate == EXLATEOBJ_iXlateShiftAndMask &&
812 !pexlo->ulRedShift && !pexlo->ulGreenShift && !pexlo->ulBlueShift)
813 {
814 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial;
815 }
816
817 /* Check for trivial xlate */
818 if (pexlo->pfnXlate == EXLATEOBJ_iXlateTrivial)
819 pexlo->xlo.flXlate = XO_TRIVIAL;
820 else
821 pexlo->xlo.flXlate &= ~XO_TRIVIAL;
822}
#define InterlockedIncrement
Definition: armddk.h:53
#define DPRINT1
Definition: precomp.h:8
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define RGB(r, g, b)
Definition: precomp.h:67
#define GetBValue(quad)
Definition: precomp.h:71
#define GetGValue(quad)
Definition: precomp.h:70
#define GetRValue(quad)
Definition: precomp.h:69
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
Definition: glfuncs.h:248
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
void * EngAllocMem(int zero, unsigned long size, int tag=0)
Definition: polytest.cpp:70
uint32_t ULONG
Definition: typedefs.h:59
PALETTE gpalRGB
Definition: palette.c:20
ULONG NTAPI PALETTE_ulGetNearestIndex(PALETTE *ppal, ULONG ulColor)
Definition: palette.c:317
VOID NTAPI PALETTE_vGetBitMasks(PPALETTE ppal, PULONG pulColors)
Definition: palette.c:331
ULONG NTAPI PALETTE_ulGetNearestPaletteIndex(PALETTE *ppal, ULONG iColor)
Definition: palette.c:264
@ PAL_MONOCHROME
Definition: palette.h:22
@ PAL_RGB16_565
Definition: palette.h:28
@ PAL_RGB16_555
Definition: palette.h:27
@ PAL_DIBSECTION
Definition: palette.h:24
FORCEINLINE ULONG CalculateShift(ULONG ulMask1, ULONG ulMask2)
Definition: palette.h:130
FORCEINLINE ULONG PALETTE_ulGetRGBColorFromIndex(PPALETTE ppal, ULONG ulIndex)
Definition: palette.h:142
#define GDITAG_PXLATE
Definition: tags.h:181
#define PAL_RGB
Definition: winddi.h:1563
#define XO_TO_MONO
Definition: winddi.h:1249
#define PAL_BITFIELDS
Definition: winddi.h:1562
#define XO_TABLE
Definition: winddi.h:1248
#define PAL_BGR
Definition: winddi.h:1564
#define PAL_INDEXED
Definition: winddi.h:1561
#define CLR_INVALID
Definition: wingdi.h:883
_In_ UINT _In_ UINT cEntries
Definition: wingdi.h:4067
static VOID EXLATEOBJ_vInitRGBToMono(_Inout_ PEXLATEOBJ pexlo, _In_ ULONG rgbBack, _In_ ULONG rgbFore, _In_ BOOL bIsBGR)
Definition: xlateobj.c:144
static ULONG giUniqueXlate
Definition: xlateobj.c:26

Referenced by DIB_16BPP_AlphaBlend(), DIB_XXBPP_AlphaBlend(), EBRUSHOBJ_bRealizeBrush(), EBRUSHOBJ_vSetSolidRGBColor(), EngSetPointerShape(), EXLATEOBJ_vInitSrcMonoXlate(), EXLATEOBJ_vInitXlateFromDCs(), EXLATEOBJ_vInitXlateFromDCsEx(), GreGetDIBitsInternal(), GreGradientFill(), GreSetPointerShape(), IntExtTextOutW(), IntSetDIBits(), IntShowMousePointer(), NtGdiExtFloodFill(), NtGdiGetNearestColor(), NtGdiGetPixel(), NtGdiSetDIBitsToDeviceInternal(), NtGdiSetPixel(), NtGdiStretchDIBitsInternal(), NtGdiTransparentBlt(), TranslateCOLORREF(), and UserDrawIconEx().

◆ EXLATEOBJ_vInitRGBToMono()

static VOID EXLATEOBJ_vInitRGBToMono ( _Inout_ PEXLATEOBJ  pexlo,
_In_ ULONG  rgbBack,
_In_ ULONG  rgbFore,
_In_ BOOL  bIsBGR 
)
static

Definition at line 144 of file xlateobj.c.

149{
150 /* Check if dest durface is B/W or W/B */
151 if ((rgbBack == 0x000000) && (rgbFore == 0xFFFFFF))
152 {
153 /* Black/White (symmetric between RGB and BGR) */
154 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBToBW;
155 }
156 else if ((rgbBack == 0xFFFFFF) && (rgbFore == 0x000000))
157 {
158 /* White/Black (symmetric between RGB and BGR) */
159 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBToWB;
160 }
161 else
162 {
163 /* Use generic mono translation function */
164 if (bIsBGR)
165 pexlo->pfnXlate = EXLATEOBJ_iXlateBGRToMono;
166 else
167 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBToMono;
168
169 /* Precompute evaluation constants */
170 LONG lForeR = GetRValue(rgbFore);
171 LONG lForeG = GetGValue(rgbFore);
172 LONG lForeB = GetBValue(rgbFore);
173 LONG lBackR = GetRValue(rgbBack);
174 LONG lBackG = GetGValue(rgbBack);
175 LONG lBackB = GetBValue(rgbBack);
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;
182 }
183}

Referenced by EXLATEOBJ_vInitialize().

◆ EXLATEOBJ_vInitSrcMonoXlate()

VOID NTAPI EXLATEOBJ_vInitSrcMonoXlate ( PEXLATEOBJ  pexlo,
PPALETTE  ppalDst,
COLORREF  crBackgroundClr,
COLORREF  crForegroundClr 
)

Definition at line 877 of file xlateobj.c.

882{
883 /* Normal initialisation, with mono palette as source */
885 gppalMono,
886 ppalDst,
887 0,
888 crBackgroundClr,
889 crForegroundClr);
890}
PALETTE * gppalMono
Definition: palette.c:20
VOID NTAPI EXLATEOBJ_vInitialize(_Out_ PEXLATEOBJ pexlo, _In_opt_ PALETTE *ppalSrc, _In_opt_ PALETTE *ppalDst, _In_ COLORREF crSrcBackColor, _In_ COLORREF crDstBackColor, _In_ COLORREF crDstForeColor)
Definition: xlateobj.c:491

Referenced by UserDrawIconEx().

◆ EXLATEOBJ_vInitXlateFromDCs()

VOID NTAPI EXLATEOBJ_vInitXlateFromDCs ( _Out_ EXLATEOBJ pexlo,
_In_ PDC  pdcSrc,
_In_ PDC  pdcDst 
)

Definition at line 826 of file xlateobj.c.

830{
831 PSURFACE psurfDst, psurfSrc;
832
833 psurfDst = pdcDst->dclevel.pSurface;
834 psurfSrc = pdcSrc->dclevel.pSurface;
835
836 /* Normal initialisation. No surface means DEFAULT_BITMAP */
838 psurfSrc ? psurfSrc->ppal : gppalMono,
839 psurfDst ? psurfDst->ppal : gppalMono,
840 pdcSrc->pdcattr->crBackgroundClr,
841 pdcDst->pdcattr->crBackgroundClr,
842 pdcDst->pdcattr->crForegroundClr);
843
844 pexlo->ppalDstDc = pdcDst->dclevel.ppal;
845}
struct _PALETTE *const ppal
Definition: surface.h:11

Referenced by NtGdiAlphaBlend(), and NtGdiTransparentBlt().

◆ EXLATEOBJ_vInitXlateFromDCsEx()

VOID NTAPI EXLATEOBJ_vInitXlateFromDCsEx ( _Out_ EXLATEOBJ pexlo,
_In_ PDC  pdcSrc,
_In_ PDC  pdcDst,
_In_ COLORREF  crBackColor 
)

Definition at line 849 of file xlateobj.c.

854{
855 PSURFACE psurfDst, psurfSrc;
856
857 psurfDst = pdcDst->dclevel.pSurface;
858 psurfSrc = pdcSrc->dclevel.pSurface;
859
860 if (crBackColor == CLR_INVALID)
861 {
862 crBackColor = pdcSrc->pdcattr->crBackgroundClr;
863 }
864
865 /* Normal initialisation. No surface means DEFAULT_BITMAP */
867 psurfSrc ? psurfSrc->ppal : gppalMono,
868 psurfDst ? psurfDst->ppal : gppalMono,
869 crBackColor,
870 pdcDst->pdcattr->crBackgroundClr,
871 pdcDst->pdcattr->crForegroundClr);
872
873 pexlo->ppalDstDc = pdcDst->dclevel.ppal;
874}

Referenced by GreStretchBltMask(), and NtGdiMaskBlt().

◆ XLATEOBJ_cGetPalette()

ULONG NTAPI XLATEOBJ_cGetPalette ( _In_ XLATEOBJ pxlo,
_In_ ULONG  iPal,
_In_ ULONG  cPal,
_Out_cap_(cPal) ULONG pPalOut 
)

Definition at line 924 of file xlateobj.c.

929{
930 PEXLATEOBJ pexlo = (PEXLATEOBJ)pxlo;
931 PPALETTE ppal;
932 ULONG i;
933
934 if (!pxlo)
935 {
936 return 0;
937 }
938
939 if (iPal > 5)
940 {
941 DPRINT1("XLATEOBJ_cGetPalette called with wrong iPal: %lu\n", iPal);
942 return 0;
943 }
944
945 /* Get the requested palette */
946 if (iPal == XO_DESTDCPALETTE)
947 {
948 ppal = pexlo->ppalDstDc;
949 }
950 else if (iPal == XO_SRCPALETTE || iPal == XO_SRCBITFIELDS)
951 {
952 ppal = pexlo->ppalSrc;
953 }
954 else
955 {
956 ppal = pexlo->ppalDst;
957 }
958
959 /* Verify palette type match */
960 if (!ppal ||
961 ((iPal == XO_SRCPALETTE || iPal == XO_DESTPALETTE)
962 && !(ppal->flFlags & PAL_INDEXED)) ||
963 ((iPal == XO_SRCBITFIELDS || iPal == XO_DESTBITFIELDS)
964 && !(ppal->flFlags & PAL_BITFIELDS)))
965 {
966 return 0;
967 }
968
969 if(!pPalOut)
970 {
971 return ppal->NumColors;
972 }
973
974 /* Copy the values into the buffer */
975 if (ppal->flFlags & PAL_INDEXED)
976 {
977 cPal = min(cPal, ppal->NumColors);
978 for (i = 0; i < cPal; i++)
979 {
980 pPalOut[i] = RGB(ppal->IndexedColors[i].peRed,
981 ppal->IndexedColors[i].peGreen,
982 ppal->IndexedColors[i].peBlue);
983 }
984 }
985 else
986 {
987 // FIXME: should use the above code
988 pPalOut[0] = ppal->RedMask;
989 pPalOut[1] = ppal->GreenMask;
990 pPalOut[2] = ppal->BlueMask;
991 }
992
993 return cPal;
994}
#define min(a, b)
Definition: monoChain.cc:55
PPALETTE ppalDst
Definition: xlateobj.h:26
PPALETTE ppalSrc
Definition: xlateobj.h:25
PPALETTE ppalDstDc
Definition: xlateobj.h:27
ULONG BlueMask
Definition: palette.h:45
ULONG GreenMask
Definition: palette.h:44
ULONG NumColors
Definition: palette.h:41
PALETTEENTRY * IndexedColors
Definition: palette.h:42
FLONG flFlags
Definition: palette.h:40
ULONG RedMask
Definition: palette.h:43
#define XO_SRCPALETTE
Definition: winddi.h:3151
_In_ SURFOBJ _In_ CLIPOBJ _In_opt_ XLATEOBJ * pxlo
Definition: winddi.h:3416
#define XO_DESTBITFIELDS
Definition: winddi.h:3155
#define XO_SRCBITFIELDS
Definition: winddi.h:3154
#define XO_DESTPALETTE
Definition: winddi.h:3152
#define XO_DESTDCPALETTE
Definition: winddi.h:3153
struct _EXLATEOBJ * PEXLATEOBJ

◆ XLATEOBJ_hGetColorTransform()

HANDLE NTAPI XLATEOBJ_hGetColorTransform ( _In_ XLATEOBJ pxlo)

Definition at line 998 of file xlateobj.c.

1000{
1001 PEXLATEOBJ pexlo = (PEXLATEOBJ)pxlo;
1002 return pexlo->hColorTransform;
1003}
HANDLE hColorTransform
Definition: xlateobj.h:29

◆ XLATEOBJ_iXlate()

◆ XLATEOBJ_piVector()

PULONG NTAPI XLATEOBJ_piVector ( _In_ XLATEOBJ pxlo)

Definition at line 1007 of file xlateobj.c.

1009{
1010 if (pxlo->iSrcType == PAL_INDEXED)
1011 {
1012 return pxlo->pulXlate;
1013 }
1014
1015 return NULL;
1016}

Variable Documentation

◆ gajXlate5to8

const BYTE gajXlate5to8[32]
static
Initial value:
=
{ 0, 8, 16, 25, 33, 41, 49, 58, 66, 74, 82, 90, 99,107,115,123,
132,140,148,156,165,173,181,189,197,206,214,222,231,239,247,255}

Definition at line 28 of file xlateobj.c.

◆ gajXlate6to8

const BYTE gajXlate6to8[64]
static
Initial value:
=
{ 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 45, 49, 52, 57, 61,
65, 69, 73, 77, 81, 85, 89, 93, 97,101,105,109,113,117,121,125,
130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,
194,198,202,207,210,215,219,223,227,231,235,239,243,247,251,255}

Definition at line 32 of file xlateobj.c.

◆ giUniqueXlate

ULONG giUniqueXlate = 0
static

Definition at line 26 of file xlateobj.c.

Referenced by EXLATEOBJ_vInitialize().