498{
501
502 if (!ppalSrc) ppalSrc = &
gpalRGB;
503 if (!ppalDst) ppalDst = &
gpalRGB;
504
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;
516
517 if (ppalDst == ppalSrc)
518 {
520 return;
521 }
522
523
525 {
526
527 ULONG aulMasksSrc[3], aulMasksDst[3];
528
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
542 {
544 {
546
547
549 {
550
552 iColors[0] = iColors[1] ^ 1;
553 }
555 {
556
558 ULONG iWhite = iBlack ^ 1;
561 }
562 else
563 {
564
569 }
570
571
572 if ((iColors[0] == 0) && (iColors[1] == 1))
573 {
574 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial;
576 }
577 else if ((iColors[0] == 1) && (iColors[1] == 0))
578 {
579 pexlo->pfnXlate = EXLATEOBJ_iXlateMonoInvert;
580 }
581 else if (iColors[0] == 0)
582 {
583 pexlo->pfnXlate = EXLATEOBJ_iXlateMonoTo0;
584 }
585 else
586 {
587 pexlo->pfnXlate = EXLATEOBJ_iXlateMonoTo1;
588 }
589 }
590 else
591 {
592
593 pexlo->pfnXlate = EXLATEOBJ_iXlateTable;
595 pexlo->xlo.cEntries = 2;
596
597
598
601 {
602
605 pexlo->aulXlate[0] =
607 pexlo->aulXlate[1] =
609 }
610 else
611 {
612
614 ULONG iWhite = iBlack ^ 1;
617 }
618 }
619 }
621 {
622 pexlo->pfnXlate = EXLATEOBJ_iXlateToMono;
624 pexlo->xlo.cEntries = 1;
625
627 {
628 pexlo->aulXlate[0] =
630 }
631 else if (ppalSrc->flFlags &
PAL_RGB)
632 {
633 pexlo->aulXlate[0] = crSrcBackColor;
634
635
637 {
642 }
643 }
644 else if (ppalSrc->flFlags &
PAL_BGR)
645 {
649
650
652 {
657 }
658 }
660 {
665
666 pexlo->aulXlate[0] = EXLATEOBJ_iXlateShiftAndMask(pexlo, crSrcBackColor);
667 }
668 }
670 {
672
673
675 {
679 if (!pexlo->xlo.pulXlate)
680 {
681 DPRINT1(
"Could not allocate pulXlate buffer.\n");
682 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial;
684 return;
685 }
686 }
687
688 pexlo->pfnXlate = EXLATEOBJ_iXlateTable;
691
693 {
695
697 {
698 ulColor =
RGB(ppalSrc->IndexedColors[
i].peRed,
699 ppalSrc->IndexedColors[
i].peGreen,
700 ppalSrc->IndexedColors[
i].peBlue);
701
702 pexlo->xlo.pulXlate[
i] =
704
705 if (pexlo->xlo.pulXlate[
i] !=
i) cDiff++;
706 }
707
708
709 if (cDiff == 0)
710 {
711 if (pexlo->xlo.pulXlate != pexlo->aulXlate)
712 {
714 pexlo->xlo.pulXlate = pexlo->aulXlate;
715 }
716 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial;
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);
730 }
731 }
732 }
733 else if (ppalSrc->flFlags &
PAL_RGB)
734 {
736 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoPal;
737
738 else if (ppalDst->flFlags &
PAL_BGR)
739 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoBGR;
740
742 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBto555;
743
745 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBto565;
746
748 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
749 }
750 else if (ppalSrc->flFlags &
PAL_BGR)
751 {
753 pexlo->pfnXlate = EXLATEOBJ_iXlateBitfieldsToPal;
754
755 else if (ppalDst->flFlags &
PAL_RGB)
756
757 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoBGR;
758
760 pexlo->pfnXlate = EXLATEOBJ_iXlateBGRto555;
761
763 pexlo->pfnXlate = EXLATEOBJ_iXlateBGRto565;
764
766 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
767 }
769 {
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
780 pexlo->pfnXlate = EXLATEOBJ_iXlate555to565;
781
783 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
784 }
786 {
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
797 pexlo->pfnXlate = EXLATEOBJ_iXlate565to555;
798
800 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
801 }
803 {
805 pexlo->pfnXlate = EXLATEOBJ_iXlateBitfieldsToPal;
806 else
807 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
808 }
809
810
811 if (pexlo->pfnXlate == EXLATEOBJ_iXlateShiftAndMask &&
812 !pexlo->ulRedShift && !pexlo->ulGreenShift && !pexlo->ulBlueShift)
813 {
814 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial;
815 }
816
817
818 if (pexlo->pfnXlate == EXLATEOBJ_iXlateTrivial)
820 else
821 pexlo->xlo.flXlate &= ~XO_TRIVIAL;
822}
#define InterlockedIncrement
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
void * EngAllocMem(int zero, unsigned long size, int tag=0)
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_ UINT _In_ UINT cEntries
static VOID EXLATEOBJ_vInitRGBToMono(_Inout_ PEXLATEOBJ pexlo, _In_ ULONG rgbBack, _In_ ULONG rgbFore, _In_ BOOL bIsBGR)
static ULONG giUniqueXlate