ReactOS 0.4.15-dev-7788-g1ad9096
xlateobj.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Win32k subsystem
4 * PURPOSE: GDI Color Translation Functions
5 * FILE: win32ss/gdi/eng/xlateobj.c
6 * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org)
7 */
8
9#include <win32k.h>
10
11#define NDEBUG
12#include <debug.h>
13
15_Function_class_(FN_XLATE)
18EXLATEOBJ_iXlateTrivial(
19 _In_ PEXLATEOBJ pexlo,
21
24EXLATEOBJ gexloTrivial = {{0, XO_TRIVIAL, 0, 0, 0, 0}, EXLATEOBJ_iXlateTrivial};
25
27
28static const BYTE gajXlate5to8[32] =
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};
31
32static const BYTE gajXlate6to8[64] =
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};
37
38
42_Function_class_(FN_XLATE)
45EXLATEOBJ_iXlateTrivial(
46 _In_ PEXLATEOBJ pexlo,
48{
49 return iColor;
50}
51
55EXLATEOBJ_iXlateToMono(_In_ PEXLATEOBJ pexlo, ULONG iColor)
56{
57 return (iColor == pexlo->xlo.pulXlate[0]);
58}
59
60_Function_class_(FN_XLATE)
63EXLATEOBJ_iXlateTable(PEXLATEOBJ pexlo, ULONG iColor)
64{
65 if (iColor >= pexlo->xlo.cEntries) return 0;
66 return pexlo->xlo.pulXlate[iColor];
67}
68
69_Function_class_(FN_XLATE)
72EXLATEOBJ_iXlateRGBtoBGR(PEXLATEOBJ pxlo, ULONG iColor)
73{
74 ULONG iNewColor;
75
76 /* Copy green */
77 iNewColor = iColor & 0xff00ff00;
78
79 /* Mask red and blue */
80 iColor &= 0x00ff00ff;
81
82 /* Shift and copy red and blue */
83 iNewColor |= iColor >> 16;
84 iNewColor |= iColor << 16;
85
86 return iNewColor;
87}
88
89_Function_class_(FN_XLATE)
92EXLATEOBJ_iXlateRGBto555(PEXLATEOBJ pxlo, ULONG iColor)
93{
94 ULONG iNewColor;
95
96 /* Copy red */
97 iColor <<= 7;
98 iNewColor = iColor & 0x7C00;
99
100 /* Copy green */
101 iColor >>= 13;
102 iNewColor |= iColor & 0x3E0;
103
104 /* Copy blue */
105 iColor >>= 13;
106 iNewColor |= iColor & 0x1F;
107
108 return iNewColor;
109}
110
111_Function_class_(FN_XLATE)
112ULONG
114EXLATEOBJ_iXlateBGRto555(PEXLATEOBJ pxlo, ULONG iColor)
115{
116 ULONG iNewColor;
117
118 /* Copy blue */
119 iColor >>= 3;
120 iNewColor = iColor & 0x1f;
121
122 /* Copy green */
123 iColor >>= 3;
124 iNewColor |= (iColor & 0x3E0);
125
126 /* Copy red */
127 iColor >>= 3;
128 iNewColor |= (iColor & 0x7C00);
129
130 return iNewColor;
131}
132
133_Function_class_(FN_XLATE)
134ULONG
136EXLATEOBJ_iXlateRGBto565(PEXLATEOBJ pxlo, ULONG iColor)
137{
138 ULONG iNewColor;
139
140 /* Copy red */
141 iColor <<= 8;
142 iNewColor = iColor & 0xF800;
143
144 /* Copy green */
145 iColor >>= 13;
146 iNewColor |= iColor & 0x7E0;
147
148 /* Copy green */
149 iColor >>= 14;
150 iNewColor |= iColor & 0x1F;
151
152 return iNewColor;
153}
154
155_Function_class_(FN_XLATE)
156ULONG
158EXLATEOBJ_iXlateBGRto565(PEXLATEOBJ pxlo, ULONG iColor)
159{
160 ULONG iNewColor;
161
162 /* Copy blue */
163 iColor >>= 3;
164 iNewColor = iColor & 0x1f;
165
166 /* Copy green */
167 iColor >>= 2;
168 iNewColor |= (iColor & 0x7E0);
169
170 /* Copy red */
171 iColor >>= 3;
172 iNewColor |= (iColor & 0xF800);
173
174 return iNewColor;
175}
176
177_Function_class_(FN_XLATE)
178ULONG
180EXLATEOBJ_iXlateRGBtoPal(PEXLATEOBJ pexlo, ULONG iColor)
181{
183}
184
185_Function_class_(FN_XLATE)
186ULONG
188EXLATEOBJ_iXlate555toRGB(PEXLATEOBJ pxlo, ULONG iColor)
189{
190 ULONG iNewColor;
191
192 /* Copy blue */
193 iNewColor = gajXlate5to8[iColor & 0x1F] << 16;
194
195 /* Copy green */
196 iColor >>= 5;
197 iNewColor |= gajXlate5to8[iColor & 0x1F] << 8;
198
199 /* Copy red */
200 iColor >>= 5;
201 iNewColor |= gajXlate5to8[iColor & 0x1F];
202
203 return iNewColor;
204}
205
206_Function_class_(FN_XLATE)
207ULONG
209EXLATEOBJ_iXlate555toBGR(PEXLATEOBJ pxlo, ULONG iColor)
210{
211 ULONG iNewColor;
212
213 /* Copy blue */
214 iNewColor = gajXlate5to8[iColor & 0x1F];
215
216 /* Copy green */
217 iColor >>= 5;
218 iNewColor |= gajXlate5to8[iColor & 0x1F] << 8;
219
220 /* Copy red */
221 iColor >>= 5;
222 iNewColor |= gajXlate5to8[iColor & 0x1F] << 16;
223
224 return iNewColor;
225}
226
227_Function_class_(FN_XLATE)
228ULONG
230EXLATEOBJ_iXlate555to565(PEXLATEOBJ pxlo, ULONG iColor)
231{
232 ULONG iNewColor;
233
234 /* Copy blue */
235 iNewColor = iColor & 0x1f;
236
237 /* Copy red and green */
238 iColor <<= 1;
239 iNewColor |= iColor & 0xFFC0;
240
241 /* Duplicate highest green bit */
242 iColor >>= 5;
243 iNewColor |= (iColor & 0x20);
244
245 return iNewColor;
246}
247
248_Function_class_(FN_XLATE)
249ULONG
251EXLATEOBJ_iXlate555toPal(PEXLATEOBJ pexlo, ULONG iColor)
252{
253 iColor = EXLATEOBJ_iXlate555toRGB(pexlo, iColor);
254
256}
257
258_Function_class_(FN_XLATE)
259ULONG
261EXLATEOBJ_iXlate565to555(PEXLATEOBJ pxlo, ULONG iColor)
262{
263 ULONG iNewColor;
264
265 /* Copy blue */
266 iNewColor = iColor & 0x1f;
267
268 /* Copy red and green */
269 iColor >>= 1;
270 iNewColor |= iColor & 0x7FE0;
271
272 return iNewColor;
273}
274
275_Function_class_(FN_XLATE)
276ULONG
278EXLATEOBJ_iXlate565toRGB(PEXLATEOBJ pexlo, ULONG iColor)
279{
280 ULONG iNewColor;
281
282 /* Copy blue */
283 iNewColor = gajXlate5to8[iColor & 0x1F] << 16;
284
285 /* Copy green */
286 iColor >>= 5;
287 iNewColor |= gajXlate6to8[iColor & 0x3F] << 8;
288
289 /* Copy red */
290 iColor >>= 6;
291 iNewColor |= gajXlate5to8[iColor & 0x1F];
292
293 return iNewColor;
294}
295
296_Function_class_(FN_XLATE)
297ULONG
299EXLATEOBJ_iXlate565toBGR(PEXLATEOBJ pexlo, ULONG iColor)
300{
301 ULONG iNewColor;
302
303 /* Copy blue */
304 iNewColor = gajXlate5to8[iColor & 0x1F];
305
306 /* Copy green */
307 iColor >>= 5;
308 iNewColor |= gajXlate6to8[iColor & 0x3F] << 8;
309
310 /* Copy blue */
311 iColor >>= 6;
312 iNewColor |= gajXlate5to8[iColor & 0x1F] << 16;
313
314 return iNewColor;
315}
316
317_Function_class_(FN_XLATE)
318ULONG
320EXLATEOBJ_iXlate565toPal(EXLATEOBJ *pexlo, ULONG iColor)
321{
322 iColor = EXLATEOBJ_iXlate565toRGB(pexlo, iColor);
323
325}
326
327_Function_class_(FN_XLATE)
328ULONG
330EXLATEOBJ_iXlateShiftAndMask(PEXLATEOBJ pexlo, ULONG iColor)
331{
332 ULONG iNewColor;
333
334 iNewColor = _rotl(iColor, pexlo->ulRedShift) & pexlo->ulRedMask;
335 iNewColor |= _rotl(iColor, pexlo->ulGreenShift) & pexlo->ulGreenMask;
336 iNewColor |= _rotl(iColor, pexlo->ulBlueShift) & pexlo->ulBlueMask;
337
338 return iNewColor;
339}
340
341_Function_class_(FN_XLATE)
342ULONG
344EXLATEOBJ_iXlateBitfieldsToPal(PEXLATEOBJ pexlo, ULONG iColor)
345{
346 /* Convert bitfields to RGB */
347 iColor = EXLATEOBJ_iXlateShiftAndMask(pexlo, iColor);
348
349 /* Return nearest index */
351}
352
353
356VOID
357NTAPI
359 _Out_ PEXLATEOBJ pexlo,
360 _In_opt_ PALETTE *ppalSrc,
361 _In_opt_ PALETTE *ppalDst,
362 _In_ COLORREF crSrcBackColor,
363 _In_ COLORREF crDstBackColor,
364 _In_ COLORREF crDstForeColor)
365{
367 ULONG i, ulColor;
368
369 if (!ppalSrc) ppalSrc = &gpalRGB;
370 if (!ppalDst) ppalDst = &gpalRGB;
371
372 pexlo->xlo.iUniq = InterlockedIncrement((LONG*)&giUniqueXlate);
373 pexlo->xlo.cEntries = 0;
374 pexlo->xlo.flXlate = 0;
375 pexlo->xlo.pulXlate = pexlo->aulXlate;
376 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial;
377 pexlo->hColorTransform = NULL;
378 pexlo->ppalSrc = ppalSrc;
379 pexlo->ppalDst = ppalDst;
380 pexlo->xlo.iSrcType = (USHORT)ppalSrc->flFlags;
381 pexlo->xlo.iDstType = (USHORT)ppalDst->flFlags;
382 pexlo->ppalDstDc = &gpalRGB;
383
384 if (ppalDst == ppalSrc)
385 {
386 pexlo->xlo.flXlate |= XO_TRIVIAL;
387 return;
388 }
389
390 /* Check if both of the palettes are indexed */
391 if (!(ppalSrc->flFlags & PAL_INDEXED) || !(ppalDst->flFlags & PAL_INDEXED))
392 {
393 /* At least one palette is not indexed, calculate shifts/masks */
394 ULONG aulMasksSrc[3], aulMasksDst[3];
395
396 PALETTE_vGetBitMasks(ppalSrc, aulMasksSrc);
397 PALETTE_vGetBitMasks(ppalDst, aulMasksDst);
398
399 pexlo->ulRedMask = aulMasksDst[0];
400 pexlo->ulGreenMask = aulMasksDst[1];
401 pexlo->ulBlueMask = aulMasksDst[2];
402
403 pexlo->ulRedShift = CalculateShift(aulMasksSrc[0], aulMasksDst[0]);
404 pexlo->ulGreenShift = CalculateShift(aulMasksSrc[1], aulMasksDst[1]);
405 pexlo->ulBlueShift = CalculateShift(aulMasksSrc[2], aulMasksDst[2]);
406 }
407
408 if (ppalSrc->flFlags & PAL_MONOCHROME)
409 {
410 /* This is a monochrome palette */
411 if (!(ppalDst->flFlags & PAL_MONOCHROME))
412 {
413 /* Mono to color, use the dest DC's fore and back color */
414 pexlo->pfnXlate = EXLATEOBJ_iXlateTable;
415 pexlo->xlo.flXlate |= XO_TABLE;
416 pexlo->xlo.cEntries = 2;
417 pexlo->xlo.pulXlate[0] =
418 PALETTE_ulGetNearestIndex(ppalDst, crDstForeColor);
419 pexlo->xlo.pulXlate[1] =
420 PALETTE_ulGetNearestIndex(ppalDst, crDstBackColor);
421 }
422 }
423 else if (ppalDst->flFlags & PAL_MONOCHROME)
424 {
425 pexlo->pfnXlate = EXLATEOBJ_iXlateToMono;
426 pexlo->xlo.flXlate |= XO_TO_MONO;
427 pexlo->xlo.cEntries = 1;
428
429 if (ppalSrc->flFlags & PAL_INDEXED)
430 {
431 pexlo->aulXlate[0] =
432 PALETTE_ulGetNearestPaletteIndex(ppalSrc, crSrcBackColor);
433 }
434 else if (ppalSrc->flFlags & PAL_RGB)
435 {
436 pexlo->aulXlate[0] = crSrcBackColor;
437 }
438 else if (ppalSrc->flFlags & PAL_BGR)
439 {
440 pexlo->aulXlate[0] = RGB(GetBValue(crSrcBackColor),
441 GetGValue(crSrcBackColor),
442 GetRValue(crSrcBackColor));
443 }
444 else if (ppalSrc->flFlags & PAL_BITFIELDS)
445 {
446 PALETTE_vGetBitMasks(ppalSrc, &pexlo->ulRedMask);
447 pexlo->ulRedShift = CalculateShift(RGB(0xFF,0,0), pexlo->ulRedMask);
448 pexlo->ulGreenShift = CalculateShift(RGB(0,0xFF,0), pexlo->ulGreenMask);
449 pexlo->ulBlueShift = CalculateShift(RGB(0,0,0xFF), pexlo->ulBlueMask);
450
451 pexlo->aulXlate[0] = EXLATEOBJ_iXlateShiftAndMask(pexlo, crSrcBackColor);
452 }
453 }
454 else if (ppalSrc->flFlags & PAL_INDEXED)
455 {
456 cEntries = ppalSrc->NumColors;
457
458 /* Allocate buffer if needed */
459 if (cEntries > 6)
460 {
461 pexlo->xlo.pulXlate = EngAllocMem(0,
462 cEntries * sizeof(ULONG),
464 if (!pexlo->xlo.pulXlate)
465 {
466 DPRINT1("Could not allocate pulXlate buffer.\n");
467 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial;
468 pexlo->xlo.flXlate = XO_TRIVIAL;
469 return;
470 }
471 }
472
473 pexlo->pfnXlate = EXLATEOBJ_iXlateTable;
474 pexlo->xlo.cEntries = cEntries;
475 pexlo->xlo.flXlate |= XO_TABLE;
476
477 if (ppalDst->flFlags & PAL_INDEXED)
478 {
479 ULONG cDiff = 0;
480
481 for (i = 0; i < cEntries; i++)
482 {
483 ulColor = RGB(ppalSrc->IndexedColors[i].peRed,
484 ppalSrc->IndexedColors[i].peGreen,
485 ppalSrc->IndexedColors[i].peBlue);
486
487 pexlo->xlo.pulXlate[i] =
488 PALETTE_ulGetNearestPaletteIndex(ppalDst, ulColor);
489
490 if (pexlo->xlo.pulXlate[i] != i) cDiff++;
491 }
492
493 /* Check if we have only trivial mappings */
494 if (cDiff == 0)
495 {
496 if (pexlo->xlo.pulXlate != pexlo->aulXlate)
497 {
498 EngFreeMem(pexlo->xlo.pulXlate);
499 pexlo->xlo.pulXlate = pexlo->aulXlate;
500 }
501 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial;
502 pexlo->xlo.flXlate = XO_TRIVIAL;
503 pexlo->xlo.cEntries = 0;
504 return;
505 }
506 }
507 else
508 {
509 for (i = 0; i < pexlo->xlo.cEntries; i++)
510 {
511 ulColor = RGB(ppalSrc->IndexedColors[i].peRed,
512 ppalSrc->IndexedColors[i].peGreen,
513 ppalSrc->IndexedColors[i].peBlue);
514 pexlo->xlo.pulXlate[i] = PALETTE_ulGetNearestBitFieldsIndex(ppalDst, ulColor);
515 }
516 }
517 }
518 else if (ppalSrc->flFlags & PAL_RGB)
519 {
520 if (ppalDst->flFlags & PAL_INDEXED)
521 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoPal;
522
523 else if (ppalDst->flFlags & PAL_BGR)
524 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoBGR;
525
526 else if (ppalDst->flFlags & PAL_RGB16_555)
527 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBto555;
528
529 else if (ppalDst->flFlags & PAL_RGB16_565)
530 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBto565;
531
532 else if (ppalDst->flFlags & PAL_BITFIELDS)
533 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
534 }
535 else if (ppalSrc->flFlags & PAL_BGR)
536 {
537 if (ppalDst->flFlags & PAL_INDEXED)
538 pexlo->pfnXlate = EXLATEOBJ_iXlateBitfieldsToPal;
539
540 else if (ppalDst->flFlags & PAL_RGB)
541 /* The inverse function works the same */
542 pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoBGR;
543
544 else if (ppalDst->flFlags & PAL_RGB16_555)
545 pexlo->pfnXlate = EXLATEOBJ_iXlateBGRto555;
546
547 else if (ppalDst->flFlags & PAL_RGB16_565)
548 pexlo->pfnXlate = EXLATEOBJ_iXlateBGRto565;
549
550 else if (ppalDst->flFlags & PAL_BITFIELDS)
551 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
552 }
553 else if (ppalSrc->flFlags & PAL_RGB16_555)
554 {
555 if (ppalDst->flFlags & PAL_INDEXED)
556 pexlo->pfnXlate = EXLATEOBJ_iXlate555toPal;
557
558 else if (ppalDst->flFlags & PAL_RGB)
559 pexlo->pfnXlate = EXLATEOBJ_iXlate555toRGB;
560
561 else if (ppalDst->flFlags & PAL_BGR)
562 pexlo->pfnXlate = EXLATEOBJ_iXlate555toBGR;
563
564 else if (ppalDst->flFlags & PAL_RGB16_565)
565 pexlo->pfnXlate = EXLATEOBJ_iXlate555to565;
566
567 else if (ppalDst->flFlags & PAL_BITFIELDS)
568 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
569 }
570 else if (ppalSrc->flFlags & PAL_RGB16_565)
571 {
572 if (ppalDst->flFlags & PAL_INDEXED)
573 pexlo->pfnXlate = EXLATEOBJ_iXlate565toPal;
574
575 else if (ppalDst->flFlags & PAL_RGB)
576 pexlo->pfnXlate = EXLATEOBJ_iXlate565toRGB;
577
578 else if (ppalDst->flFlags & PAL_BGR)
579 pexlo->pfnXlate = EXLATEOBJ_iXlate565toBGR;
580
581 else if (ppalDst->flFlags & PAL_RGB16_555)
582 pexlo->pfnXlate = EXLATEOBJ_iXlate565to555;
583
584 else if (ppalDst->flFlags & PAL_BITFIELDS)
585 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
586 }
587 else if (ppalSrc->flFlags & PAL_BITFIELDS)
588 {
589 if (ppalDst->flFlags & PAL_INDEXED)
590 pexlo->pfnXlate = EXLATEOBJ_iXlateBitfieldsToPal;
591 else
592 pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
593 }
594
595 /* Check for a trivial shift and mask operation */
596 if (pexlo->pfnXlate == EXLATEOBJ_iXlateShiftAndMask &&
597 !pexlo->ulRedShift && !pexlo->ulGreenShift && !pexlo->ulBlueShift)
598 {
599 pexlo->pfnXlate = EXLATEOBJ_iXlateTrivial;
600 }
601
602 /* Check for trivial xlate */
603 if (pexlo->pfnXlate == EXLATEOBJ_iXlateTrivial)
604 pexlo->xlo.flXlate = XO_TRIVIAL;
605 else
606 pexlo->xlo.flXlate &= ~XO_TRIVIAL;
607}
608
609VOID
610NTAPI
612 _Out_ EXLATEOBJ* pexlo,
613 _In_ PDC pdcSrc,
614 _In_ PDC pdcDst)
615{
616 PSURFACE psurfDst, psurfSrc;
617
618 psurfDst = pdcDst->dclevel.pSurface;
619 psurfSrc = pdcSrc->dclevel.pSurface;
620
621 /* Normal initialisation. No surface means DEFAULT_BITMAP */
623 psurfSrc ? psurfSrc->ppal : gppalMono,
624 psurfDst ? psurfDst->ppal : gppalMono,
625 pdcSrc->pdcattr->crBackgroundClr,
626 pdcDst->pdcattr->crBackgroundClr,
627 pdcDst->pdcattr->crForegroundClr);
628
629 pexlo->ppalDstDc = pdcDst->dclevel.ppal;
630}
631
633 PEXLATEOBJ pexlo,
634 PPALETTE ppalDst,
635 COLORREF crBackgroundClr,
636 COLORREF crForegroundClr)
637{
638 /* Normal initialisation, with mono palette as source */
640 gppalMono,
641 ppalDst,
642 0,
643 crBackgroundClr,
644 crForegroundClr);
645}
646
647VOID
648NTAPI
650 _Inout_ PEXLATEOBJ pexlo)
651{
652 if (pexlo->xlo.pulXlate != pexlo->aulXlate)
653 {
654 EngFreeMem(pexlo->xlo.pulXlate);
655 }
656 pexlo->xlo.pulXlate = pexlo->aulXlate;
657}
658
661#undef XLATEOBJ_iXlate
662ULONG
663NTAPI
667{
668 PEXLATEOBJ pexlo = (PEXLATEOBJ)pxlo;
669
670 if (!pxlo)
671 return iColor;
672
673 /* Call the iXlate function */
674 return pexlo->pfnXlate(pexlo, iColor);
675}
676
677ULONG
678NTAPI
681 _In_ ULONG iPal,
682 _In_ ULONG cPal,
683 _Out_cap_(cPal) ULONG *pPalOut)
684{
685 PEXLATEOBJ pexlo = (PEXLATEOBJ)pxlo;
686 PPALETTE ppal;
687 ULONG i;
688
689 if (!pxlo)
690 {
691 return 0;
692 }
693
694 if (iPal > 5)
695 {
696 DPRINT1("XLATEOBJ_cGetPalette called with wrong iPal: %lu\n", iPal);
697 return 0;
698 }
699
700 /* Get the requested palette */
701 if (iPal == XO_DESTDCPALETTE)
702 {
703 ppal = pexlo->ppalDstDc;
704 }
705 else if (iPal == XO_SRCPALETTE || iPal == XO_SRCBITFIELDS)
706 {
707 ppal = pexlo->ppalSrc;
708 }
709 else
710 {
711 ppal = pexlo->ppalDst;
712 }
713
714 /* Verify palette type match */
715 if (!ppal ||
716 ((iPal == XO_SRCPALETTE || iPal == XO_DESTPALETTE)
717 && !(ppal->flFlags & PAL_INDEXED)) ||
718 ((iPal == XO_SRCBITFIELDS || iPal == XO_DESTBITFIELDS)
719 && !(ppal->flFlags & PAL_BITFIELDS)))
720 {
721 return 0;
722 }
723
724 if(!pPalOut)
725 {
726 return ppal->NumColors;
727 }
728
729 /* Copy the values into the buffer */
730 if (ppal->flFlags & PAL_INDEXED)
731 {
732 cPal = min(cPal, ppal->NumColors);
733 for (i = 0; i < cPal; i++)
734 {
735 pPalOut[i] = RGB(ppal->IndexedColors[i].peRed,
736 ppal->IndexedColors[i].peGreen,
737 ppal->IndexedColors[i].peBlue);
738 }
739 }
740 else
741 {
742 // FIXME: should use the above code
743 pPalOut[0] = ppal->RedMask;
744 pPalOut[1] = ppal->GreenMask;
745 pPalOut[2] = ppal->BlueMask;
746 }
747
748 return cPal;
749}
750
751HANDLE
752NTAPI
755{
756 PEXLATEOBJ pexlo = (PEXLATEOBJ)pxlo;
757 return pexlo->hColorTransform;
758}
759
760PULONG
761NTAPI
764{
765 if (pxlo->iSrcType == PAL_INDEXED)
766 {
767 return pxlo->pulXlate;
768 }
769
770 return NULL;
771}
772
773/* EOF */
#define InterlockedIncrement
Definition: armddk.h:53
#define DPRINT1
Definition: precomp.h:8
#define NULL
Definition: types.h:112
#define RGB(r, g, b)
Definition: precomp.h:62
#define GetBValue(quad)
Definition: precomp.h:66
#define GetGValue(quad)
Definition: precomp.h:65
#define GetRValue(quad)
Definition: precomp.h:64
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
_Check_return_ unsigned int __cdecl _rotl(_In_ unsigned int _Value, _In_ int _Shift)
#define min(a, b)
Definition: monoChain.cc:55
#define _Function_class_(x)
Definition: ms_sal.h:2946
#define _Inout_
Definition: ms_sal.h:378
#define _Out_cap_(size)
Definition: ms_sal.h:852
#define _Out_
Definition: ms_sal.h:345
#define _In_
Definition: ms_sal.h:308
#define _In_opt_
Definition: ms_sal.h:309
#define _Post_satisfies_(cond)
Definition: ms_sal.h:588
#define FASTCALL
Definition: nt_native.h:50
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
#define EngFreeMem
Definition: polytest.cpp:56
void * EngAllocMem(int zero, unsigned long size, int tag=0)
Definition: polytest.cpp:70
Definition: polytest.cpp:41
ULONG ulGreenShift
Definition: xlateobj.h:40
XLATEOBJ xlo
Definition: xlateobj.h:21
ULONG ulBlueMask
Definition: xlateobj.h:38
PPALETTE ppalDst
Definition: xlateobj.h:26
PPALETTE ppalSrc
Definition: xlateobj.h:25
ULONG ulGreenMask
Definition: xlateobj.h:37
ULONG ulBlueShift
Definition: xlateobj.h:41
ULONG ulRedMask
Definition: xlateobj.h:36
HANDLE hColorTransform
Definition: xlateobj.h:29
PFN_XLATE pfnXlate
Definition: xlateobj.h:23
PPALETTE ppalDstDc
Definition: xlateobj.h:27
ULONG ulRedShift
Definition: xlateobj.h:39
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
struct _PALETTE *const ppal
Definition: surface.h:11
ULONG * pulXlate
Definition: winddi.h:1260
ULONG cEntries
Definition: winddi.h:1259
uint32_t * PULONG
Definition: typedefs.h:59
#define NTAPI
Definition: typedefs.h:36
uint32_t ULONG
Definition: typedefs.h:59
ULONG NTAPI PALETTE_ulGetNearestBitFieldsIndex(PALETTE *ppal, ULONG ulColor)
Definition: palette.c:294
PALETTE * gppalMono
Definition: palette.c:20
PALETTE gpalRGB
Definition: palette.c:20
ULONG NTAPI PALETTE_ulGetNearestIndex(PALETTE *ppal, ULONG ulColor)
Definition: palette.c:312
VOID NTAPI PALETTE_vGetBitMasks(PPALETTE ppal, PULONG pulColors)
Definition: palette.c:322
ULONG NTAPI PALETTE_ulGetNearestPaletteIndex(PALETTE *ppal, ULONG iColor)
Definition: palette.c:261
@ PAL_MONOCHROME
Definition: palette.h:22
@ PAL_RGB16_565
Definition: palette.h:28
@ PAL_RGB16_555
Definition: palette.h:27
FORCEINLINE ULONG CalculateShift(ULONG ulMask1, ULONG ulMask2)
Definition: palette.h:130
#define GDITAG_PXLATE
Definition: tags.h:181
#define XO_SRCPALETTE
Definition: winddi.h:3151
#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
_In_ SURFOBJ _In_ CLIPOBJ _In_opt_ XLATEOBJ * pxlo
Definition: winddi.h:3416
#define XO_DESTBITFIELDS
Definition: winddi.h:3155
#define PAL_BGR
Definition: winddi.h:1564
#define XO_TRIVIAL
Definition: winddi.h:1247
#define PAL_INDEXED
Definition: winddi.h:1561
#define XO_SRCBITFIELDS
Definition: winddi.h:3154
#define XO_DESTPALETTE
Definition: winddi.h:3152
#define XO_DESTDCPALETTE
Definition: winddi.h:3153
DWORD COLORREF
Definition: windef.h:300
_In_ UINT _In_ UINT cEntries
Definition: wingdi.h:3621
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:358
static const BYTE gajXlate5to8[32]
Definition: xlateobj.c:28
VOID NTAPI EXLATEOBJ_vCleanup(_Inout_ PEXLATEOBJ pexlo)
Definition: xlateobj.c:649
static const BYTE gajXlate6to8[64]
Definition: xlateobj.c:32
ULONG NTAPI XLATEOBJ_cGetPalette(_In_ XLATEOBJ *pxlo, _In_ ULONG iPal, _In_ ULONG cPal, _Out_cap_(cPal) ULONG *pPalOut)
Definition: xlateobj.c:679
VOID NTAPI EXLATEOBJ_vInitXlateFromDCs(_Out_ EXLATEOBJ *pexlo, _In_ PDC pdcSrc, _In_ PDC pdcDst)
Definition: xlateobj.c:611
ULONG NTAPI XLATEOBJ_iXlate(_In_ XLATEOBJ *pxlo, _In_ ULONG iColor)
Definition: xlateobj.c:664
PULONG NTAPI XLATEOBJ_piVector(_In_ XLATEOBJ *pxlo)
Definition: xlateobj.c:762
HANDLE NTAPI XLATEOBJ_hGetColorTransform(_In_ XLATEOBJ *pxlo)
Definition: xlateobj.c:753
VOID NTAPI EXLATEOBJ_vInitSrcMonoXlate(PEXLATEOBJ pexlo, PPALETTE ppalDst, COLORREF crBackgroundClr, COLORREF crForegroundClr)
Definition: xlateobj.c:632
static ULONG giUniqueXlate
Definition: xlateobj.c:26
_In_ ULONG iColor
Definition: xlateobj.h:17
EXLATEOBJ gexloTrivial
struct _EXLATEOBJ * PEXLATEOBJ
unsigned char BYTE
Definition: xxhash.c:193