ReactOS 0.4.16-dev-1875-g3000d45
dibobj.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS win32 kernel mode subsystem
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: win32ss/gdi/ntgdi/dibobj.c
5 * PURPOSE: Dib object functions
6 * PROGRAMMER:
7 */
8
9#include <win32k.h>
10
11#define NDEBUG
12#include <debug.h>
13
14static const RGBQUAD DefLogPaletteQuads[20] = /* Copy of Default Logical Palette */
15{
16 /* rgbBlue, rgbGreen, rgbRed, rgbReserved */
17 { 0x00, 0x00, 0x00, 0x00 },
18 { 0x00, 0x00, 0x80, 0x00 },
19 { 0x00, 0x80, 0x00, 0x00 },
20 { 0x00, 0x80, 0x80, 0x00 },
21 { 0x80, 0x00, 0x00, 0x00 },
22 { 0x80, 0x00, 0x80, 0x00 },
23 { 0x80, 0x80, 0x00, 0x00 },
24 { 0xc0, 0xc0, 0xc0, 0x00 },
25 { 0xc0, 0xdc, 0xc0, 0x00 },
26 { 0xf0, 0xca, 0xa6, 0x00 },
27 { 0xf0, 0xfb, 0xff, 0x00 },
28 { 0xa4, 0xa0, 0xa0, 0x00 },
29 { 0x80, 0x80, 0x80, 0x00 },
30 { 0x00, 0x00, 0xff, 0x00 },
31 { 0x00, 0xff, 0x00, 0x00 },
32 { 0x00, 0xff, 0xff, 0x00 },
33 { 0xff, 0x00, 0x00, 0x00 },
34 { 0xff, 0x00, 0xff, 0x00 },
35 { 0xff, 0xff, 0x00, 0x00 },
36 { 0xff, 0xff, 0xff, 0x00 }
37};
38
42 _In_ const BITMAPINFO *pbmi,
43 _In_ PDC pdc,
45{
46 PPALETTE ppal;
47 ULONG i, cBitsPixel, cColors;
48
50 {
52 cBitsPixel = pbci->bmciHeader.bcBitCount;
53 }
54 else
55 {
56 cBitsPixel = pbmi->bmiHeader.biBitCount;
57 }
58
59 /* Check if the colors are indexed */
60 if (cBitsPixel <= 8)
61 {
62 /* We create a "full" palette */
63 cColors = 1 << cBitsPixel;
64
65 /* Allocate the palette */
67 cColors,
68 NULL,
69 0,
70 0,
71 0);
72 if (ppal == NULL)
73 {
74 DPRINT1("Failed to allocate palette.\n");
75 return NULL;
76 }
77
78 /* Check if the BITMAPINFO specifies how many colors to use */
79 if ((pbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) &&
80 (pbmi->bmiHeader.biClrUsed != 0))
81 {
82 /* This is how many colors we can actually process */
83 cColors = min(cColors, pbmi->bmiHeader.biClrUsed);
84 }
85
86 /* Check how to use the colors */
88 {
89 COLORREF crColor;
90
91 /* The colors are an array of WORD indices into the DC palette */
92 PWORD pwColors = (PWORD)((PCHAR)pbmi + pbmi->bmiHeader.biSize);
93
94 /* Use the DCs palette or, if no DC is given, the default one */
95 PPALETTE ppalDC = pdc ? pdc->dclevel.ppal : gppalDefault;
96
97 /* Loop all color indices in the DIB */
98 for (i = 0; i < cColors; i++)
99 {
100 /* Get the palette index and handle wraparound when exceeding
101 the number of colors in the DC palette */
102 WORD wIndex = pwColors[i] % ppalDC->NumColors;
103
104 /* USe the RGB value from the DC palette */
105 crColor = PALETTE_ulGetRGBColorFromIndex(ppalDC, wIndex);
106 PALETTE_vSetRGBColorForIndex(ppal, i, crColor);
107 }
108 }
109 else if (iUsage == DIB_PAL_BRUSHHACK)
110 {
111 /* The colors are an array of WORD indices into the DC palette */
112 PWORD pwColors = (PWORD)((PCHAR)pbmi + pbmi->bmiHeader.biSize);
113
114 /* Loop all color indices in the DIB */
115 for (i = 0; i < cColors; i++)
116 {
117 /* Set the index directly as the RGB color, the real palette
118 containing RGB values will be calculated when the brush is
119 realized */
120 PALETTE_vSetRGBColorForIndex(ppal, i, pwColors[i]);
121 }
122
123 /* Mark the palette as a brush hack palette */
124 ppal->flFlags |= PAL_BRUSHHACK;
125 }
126// else if (iUsage == 2)
127// {
128 // FIXME: this one is undocumented
129// ASSERT(FALSE);
130// }
131 else if (pbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER))
132 {
133 /* The colors are an array of RGBQUAD values */
134 RGBQUAD *prgb = (RGBQUAD*)((PCHAR)pbmi + pbmi->bmiHeader.biSize);
135 RGBQUAD colors[256] = {{0}};
136
137 // FIXME: do we need to handle PALETTEINDEX / PALETTERGB macro?
138
139 /* Use SEH to verify we can READ prgb[] succesfully */
141 {
142 RtlCopyMemory(colors, prgb, cColors * sizeof(colors[0]));
143 }
145 {
146 /* Do Nothing */
147 }
148 _SEH2_END;
149
150 for (i = 0; i < cColors; ++i)
151 {
152 /* Get the color value and translate it to a COLORREF */
153 COLORREF crColor = RGB(colors[i].rgbRed, colors[i].rgbGreen, colors[i].rgbBlue);
154
155 /* Set the RGB value in the palette */
156 PALETTE_vSetRGBColorForIndex(ppal, i, crColor);
157 }
158 }
159 else
160 {
161 /* The colors are an array of RGBTRIPLE values */
163
164 /* Loop all color indices in the DIB */
165 for (i = 0; i < cColors; i++)
166 {
167 /* Get the color value and translate it to a COLORREF */
168 RGBTRIPLE rgb = prgb[i];
169 COLORREF crColor = RGB(rgb.rgbtRed, rgb.rgbtGreen, rgb.rgbtBlue);
170
171 /* Set the RGB value in the palette */
172 PALETTE_vSetRGBColorForIndex(ppal, i, crColor);
173 }
174 }
175 }
176 else
177 {
178 /* This is a bitfield / RGB palette */
179 ULONG flRedMask, flGreenMask, flBlueMask;
180
181 /* Check if the DIB contains bitfield values */
182 if ((pbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) &&
184 {
185 /* Check if we have a v4/v5 header */
186 if (pbmi->bmiHeader.biSize >= sizeof(BITMAPV4HEADER))
187 {
188 /* The masks are dedicated fields in the header */
190 flRedMask = pbmV4Header->bV4RedMask;
191 flGreenMask = pbmV4Header->bV4GreenMask;
192 flBlueMask = pbmV4Header->bV4BlueMask;
193 }
194 else
195 {
196 /* The masks are the first 3 values in the DIB color table */
197 PDWORD pdwColors = (PVOID)((PCHAR)pbmi + pbmi->bmiHeader.biSize);
198 flRedMask = pdwColors[0];
199 flGreenMask = pdwColors[1];
200 flBlueMask = pdwColors[2];
201 }
202 }
203 else
204 {
205 /* Check what bit depth we have. Note: optimization flags are
206 calculated in PALETTE_AllocPalette() */
207 if (cBitsPixel == 16)
208 {
209 /* This is an RGB 555 palette */
210 flRedMask = 0x7C00;
211 flGreenMask = 0x03E0;
212 flBlueMask = 0x001F;
213 }
214 else
215 {
216 /* This is an RGB 888 palette */
217 flRedMask = 0xFF0000;
218 flGreenMask = 0x00FF00;
219 flBlueMask = 0x0000FF;
220 }
221 }
222
223 /* Allocate the bitfield palette */
225 0,
226 NULL,
227 flRedMask,
228 flGreenMask,
229 flBlueMask);
230 }
231
232 /* We're done, return the palette */
233 return ppal;
234}
235
236// Converts a DIB to a device-dependent bitmap
237static INT
240 PDC DC,
242 UINT StartScan,
243 UINT ScanLines,
244 CONST VOID *Bits,
246 CONST BITMAPINFO *bmi,
247 UINT ColorUse)
248{
249 HBITMAP SourceBitmap;
250 PSURFACE psurfDst, psurfSrc;
251 INT result = 0;
252 RECT rcDst;
253 POINTL ptSrc;
254 EXLATEOBJ exlo;
255 PPALETTE ppalDIB = 0;
256 ULONG cjSizeImage;
257
258 if (!bmi || !Bits) return 0;
259
260 /* Check for uncompressed formats */
261 if ((bmi->bmiHeader.biCompression == BI_RGB) ||
262 (bmi->bmiHeader.biCompression == BI_BITFIELDS))
263 {
264 /* Calculate the image size */
265 cjSizeImage = DIB_GetDIBImageBytes(bmi->bmiHeader.biWidth,
266 ScanLines,
267 bmi->bmiHeader.biBitCount);
268 }
269 /* Check if the header provided an image size */
270 else if (bmi->bmiHeader.biSizeImage != 0)
271 {
272 /* Use the given size */
273 cjSizeImage = bmi->bmiHeader.biSizeImage;
274 }
275 else
276 {
277 /* Compressed format without a size. This is invalid. */
278 DPRINT1("Compressed format without a size\n");
279 return 0;
280 }
281
282 /* Check if the size that we have is ok */
283 if ((cjSizeImage > cjMaxBits) || (cjSizeImage == 0))
284 {
285 DPRINT1("Invalid bitmap size! cjSizeImage = %lu, cjMaxBits = %lu\n",
286 cjSizeImage, cjMaxBits);
287 return 0;
288 }
289
290 SourceBitmap = GreCreateBitmapEx(bmi->bmiHeader.biWidth,
291 ScanLines,
292 0,
293 BitmapFormat(bmi->bmiHeader.biBitCount,
294 bmi->bmiHeader.biCompression),
295 bmi->bmiHeader.biHeight < 0 ? BMF_TOPDOWN : 0,
296 cjSizeImage,
297 (PVOID)Bits,
298 0);
299 if (!SourceBitmap)
300 {
301 DPRINT1("Error: Could not create a bitmap.\n");
303 return 0;
304 }
305
307 psurfSrc = SURFACE_ShareLockSurface(SourceBitmap);
308
309 if(!(psurfSrc && psurfDst))
310 {
311 DPRINT1("Error: Could not lock surfaces\n");
312 goto cleanup;
313 }
314
315 /* Create a palette for the DIB */
316 ppalDIB = CreateDIBPalette(bmi, DC, ColorUse);
317 if (!ppalDIB)
318 {
320 goto cleanup;
321 }
322
323 /* Initialize EXLATEOBJ */
325 ppalDIB,
326 psurfDst->ppal,
327 RGB(0xff, 0xff, 0xff),
328 RGB(0xff, 0xff, 0xff), //DC->pdcattr->crBackgroundClr,
329 0); // DC->pdcattr->crForegroundClr);
330
331 rcDst.top = StartScan;
332 rcDst.left = 0;
333 rcDst.bottom = rcDst.top + ScanLines;
334 rcDst.right = psurfDst->SurfObj.sizlBitmap.cx;
335 ptSrc.x = 0;
336 ptSrc.y = 0;
337
338 result = IntEngCopyBits(&psurfDst->SurfObj,
339 &psurfSrc->SurfObj,
340 NULL,
341 &exlo.xlo,
342 &rcDst,
343 &ptSrc);
344 if(result)
345 result = ScanLines;
346
347 EXLATEOBJ_vCleanup(&exlo);
348
349cleanup:
350 if (ppalDIB) PALETTE_ShareUnlockPalette(ppalDIB);
351 if(psurfSrc) SURFACE_ShareUnlockSurface(psurfSrc);
352 if(psurfDst) SURFACE_ShareUnlockSurface(psurfDst);
353 GreDeleteObject(SourceBitmap);
354
355 return result;
356}
357
358static
361 DWORD Width,
363 ULONG Compression,
364 const BYTE* Bits,
365 DWORD BitsSize)
366{
368 DWORD x, y;
369 SURFOBJ* SurfObj;
370 UINT i = 0;
371 BYTE Data, NumPixels, ToSkip;
372
373 ASSERT((Compression == BI_RLE8) || (Compression == BI_RLE4));
374
375 /* Create the bitmap */
377 if (!Mask)
378 return NULL;
379
380 SurfObj = EngLockSurface((HSURF)Mask);
381 if (!SurfObj)
382 {
384 return NULL;
385 }
386 ASSERT(SurfObj->pvBits != NULL);
387
388 x = y = 0;
389
390 while (i < BitsSize)
391 {
392 NumPixels = Bits[i];
393 Data = Bits[i + 1];
394 i += 2;
395
396 if (NumPixels != 0)
397 {
398 if ((x + NumPixels) > Width)
399 NumPixels = Width - x;
400
401 if (NumPixels == 0)
402 continue;
403
404 DIB_1BPP_HLine(SurfObj, x, x + NumPixels, y, 1);
405 x += NumPixels;
406 continue;
407 }
408
409 if (Data < 3)
410 {
411 switch (Data)
412 {
413 case 0:
414 /* End of line */
415 y++;
416 if (y == Height)
417 goto done;
418 x = 0;
419 break;
420 case 1:
421 /* End of file */
422 goto done;
423 case 2:
424 /* Jump */
425 if (i >= (BitsSize - 1))
426 goto done;
427 x += Bits[i];
428 if (x > Width)
429 x = Width;
430 y += Bits[i + 1];
431 if (y >= Height)
432 goto done;
433 i += 2;
434 break;
435 }
436 /* Done for this run */
437 continue;
438 }
439
440 /* Embedded data into the RLE */
441 NumPixels = Data;
442 if (Compression == BI_RLE8)
443 ToSkip = NumPixels;
444 else
445 ToSkip = (NumPixels / 2) + (NumPixels & 1);
446
447 if ((i + ToSkip) > BitsSize)
448 goto done;
449 ToSkip = (ToSkip + 1) & ~1;
450
451 if ((x + NumPixels) > Width)
452 NumPixels = Width - x;
453
454 if (NumPixels != 0)
455 {
456 DIB_1BPP_HLine(SurfObj, x, x + NumPixels, y, 1);
457 x += NumPixels;
458 }
459 i += ToSkip;
460 }
461
462done:
463 EngUnlockSurface(SurfObj);
464 return Mask;
465}
466
468INT
471 IN HDC hDC,
472 IN INT XDest,
473 IN INT YDest,
474 IN DWORD Width,
476 IN INT XSrc,
477 IN INT YSrc,
478 IN DWORD StartScan,
479 IN DWORD ScanLines,
480 IN LPBYTE Bits,
481 IN LPBITMAPINFO bmi,
482 IN DWORD ColorUse,
485 IN BOOL bTransformCoordinates,
487{
488 INT ret;
489 PDC pDC = NULL;
490 HBITMAP hSourceBitmap = NULL, hMaskBitmap = NULL;
491 SURFOBJ *pDestSurf, *pSourceSurf = NULL, *pMaskSurf = NULL;
492 SURFACE *pSurf;
493 RECTL rcDest;
494 POINTL ptSource;
495 //INT DIBWidth;
496 SIZEL SourceSize;
497 EXLATEOBJ exlo;
498 PPALETTE ppalDIB = NULL;
499 LPBITMAPINFO pbmiSafe;
500 BOOL bResult;
501
502 if (!Bits) return 0;
503
504 pbmiSafe = ExAllocatePoolWithTag(PagedPool, cjMaxInfo, 'pmTG');
505 if (!pbmiSafe) return 0;
506
508 {
509 ProbeForRead(bmi, cjMaxInfo, 1);
510 ProbeForRead(Bits, cjMaxBits, 1);
511 RtlCopyMemory(pbmiSafe, bmi, cjMaxInfo);
512 bmi = pbmiSafe;
513 }
515 {
516 ret = 0;
517 goto Exit;
518 }
519 _SEH2_END;
520
521 DPRINT("StartScan %d ScanLines %d Bits %p bmi %p ColorUse %d\n"
522 " Height %d Width %d biSizeImage %d\n"
523 " biHeight %d biWidth %d biBitCount %d\n"
524 " XSrc %d YSrc %d XDest %d YDest %d\n",
525 StartScan, ScanLines, Bits, bmi, ColorUse,
526 Height, Width, bmi->bmiHeader.biSizeImage,
527 bmi->bmiHeader.biHeight, bmi->bmiHeader.biWidth,
528 bmi->bmiHeader.biBitCount,
529 XSrc, YSrc, XDest, YDest);
530
531 if (YDest < 0)
532 {
533 ScanLines = min(ScanLines, abs(bmi->bmiHeader.biHeight) - StartScan);
534 }
535
536 if (ScanLines == 0)
537 {
538 DPRINT1("ScanLines == 0\n");
539 ret = 0;
540 goto Exit;
541 }
542
543 pDC = DC_LockDc(hDC);
544 if (!pDC)
545 {
547 ret = 0;
548 goto Exit;
549 }
550
551 if (pDC->dctype == DCTYPE_INFO)
552 {
553 ret = 0;
554 goto Exit;
555 }
556
557 rcDest.left = XDest;
558 rcDest.top = YDest;
559 if (bTransformCoordinates)
560 {
561 IntLPtoDP(pDC, (LPPOINT)&rcDest, 2);
562 }
563 rcDest.left += pDC->ptlDCOrig.x;
564 rcDest.top += pDC->ptlDCOrig.y;
565 rcDest.right = rcDest.left + Width;
566 rcDest.bottom = rcDest.top + Height;
567 rcDest.top += StartScan;
568
569 if (pDC->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR))
570 {
571 IntUpdateBoundsRect(pDC, &rcDest);
572 }
573
574 ptSource.x = XSrc;
575 ptSource.y = YSrc;
576
577 SourceSize.cx = bmi->bmiHeader.biWidth;
578 SourceSize.cy = ScanLines;
579
580 //DIBWidth = WIDTH_BYTES_ALIGN32(SourceSize.cx, bmi->bmiHeader.biBitCount);
581
582 hSourceBitmap = GreCreateBitmapEx(bmi->bmiHeader.biWidth,
583 ScanLines,
584 0,
585 BitmapFormat(bmi->bmiHeader.biBitCount,
586 bmi->bmiHeader.biCompression),
587 bmi->bmiHeader.biHeight < 0 ? BMF_TOPDOWN : 0,
588 bmi->bmiHeader.biSizeImage,
589 Bits,
590 0);
591
592 if (!hSourceBitmap)
593 {
595 ret = 0;
596 goto Exit;
597 }
598
599 pSourceSurf = EngLockSurface((HSURF)hSourceBitmap);
600 if (!pSourceSurf)
601 {
602 ret = 0;
603 goto Exit;
604 }
605
606 /* HACK: If this is a RLE bitmap, only the relevant pixels must be set. */
607 if ((bmi->bmiHeader.biCompression == BI_RLE8) || (bmi->bmiHeader.biCompression == BI_RLE4))
608 {
609 hMaskBitmap = IntGdiCreateMaskFromRLE(bmi->bmiHeader.biWidth,
610 ScanLines,
611 bmi->bmiHeader.biCompression,
612 Bits,
613 cjMaxBits);
614 if (!hMaskBitmap)
615 {
617 ret = 0;
618 goto Exit;
619 }
620 pMaskSurf = EngLockSurface((HSURF)hMaskBitmap);
621 if (!pMaskSurf)
622 {
623 ret = 0;
624 goto Exit;
625 }
626 }
627
628 /* Create a palette for the DIB */
629 ppalDIB = CreateDIBPalette(bmi, pDC, ColorUse);
630 if (!ppalDIB)
631 {
633 ret = 0;
634 goto Exit;
635 }
636
637 /* This is actually a blit */
638 DC_vPrepareDCsForBlit(pDC, &rcDest, NULL, NULL);
639 pSurf = pDC->dclevel.pSurface;
640 if (!pSurf)
641 {
642 DC_vFinishBlit(pDC, NULL);
643 ret = ScanLines;
644 goto Exit;
645 }
646
647 ASSERT(pSurf->ppal);
648
649 /* Initialize EXLATEOBJ */
651 ppalDIB,
652 pSurf->ppal,
653 RGB(0xff, 0xff, 0xff),
654 pDC->pdcattr->crBackgroundClr,
655 pDC->pdcattr->crForegroundClr);
656
657 pDestSurf = &pSurf->SurfObj;
658
659 /* Copy the bits */
660 DPRINT("BitsToDev with rcDest=(%d|%d) (%d|%d), ptSource=(%d|%d) w=%d h=%d\n",
661 rcDest.left, rcDest.top, rcDest.right, rcDest.bottom,
662 ptSource.x, ptSource.y, SourceSize.cx, SourceSize.cy);
663
664 /* This fixes the large Google text on Google.com from being upside down */
665 if (rcDest.top > rcDest.bottom)
666 {
667 RECTL_vMakeWellOrdered(&rcDest);
668 ptSource.y -= SourceSize.cy;
669 }
670
671 bResult = IntEngBitBlt(pDestSurf,
672 pSourceSurf,
673 pMaskSurf,
674 (CLIPOBJ *)&pDC->co,
675 &exlo.xlo,
676 &rcDest,
677 &ptSource,
678 pMaskSurf ? &ptSource : NULL,
679 NULL,
680 NULL,
682
683 /* Cleanup EXLATEOBJ */
684 EXLATEOBJ_vCleanup(&exlo);
685
686 /* We're done */
687 DC_vFinishBlit(pDC, NULL);
688
689 ret = bResult ? ScanLines : 0;
690
691Exit:
692
693 if (ppalDIB) PALETTE_ShareUnlockPalette(ppalDIB);
694 if (pSourceSurf) EngUnlockSurface(pSourceSurf);
695 if (hSourceBitmap) EngDeleteSurface((HSURF)hSourceBitmap);
696 if (pMaskSurf) EngUnlockSurface(pMaskSurf);
697 if (hMaskBitmap) EngDeleteSurface((HSURF)hMaskBitmap);
698 if (pDC) DC_UnlockDc(pDC);
699 ExFreePoolWithTag(pbmiSafe, 'pmTG');
700
701 return ret;
702}
703
704/* Converts a device-dependent bitmap to a DIB */
705INT
708 HDC hDC,
710 UINT StartScan,
711 UINT ScanLines,
712 LPBYTE Bits,
714 UINT Usage,
715 UINT MaxBits,
716 UINT MaxInfo)
717{
718 BITMAPCOREINFO* pbmci = NULL;
719 PSURFACE psurf = NULL;
720 PDC pDC;
722 WORD planes, bpp;
723 DWORD compr, size ;
724 USHORT i;
725 int bitmap_type;
726 RGBQUAD* rgbQuads;
727 VOID* colorPtr;
728
729 DPRINT("Entered GreGetDIBitsInternal()\n");
730
731 if ((Usage && Usage != DIB_PAL_COLORS) || !Info || !hBitmap)
732 return 0;
733
734 pDC = DC_LockDc(hDC);
735 if (pDC == NULL || pDC->dctype == DCTYPE_INFO)
736 {
737 ScanLines = 0;
738 goto done;
739 }
740
741 /* Get a pointer to the source bitmap object */
743 if (psurf == NULL)
744 {
745 ScanLines = 0;
746 goto done;
747 }
748
749 colorPtr = (LPBYTE)Info + Info->bmiHeader.biSize;
750 rgbQuads = colorPtr;
751
752 bitmap_type = DIB_GetBitmapInfo(&Info->bmiHeader,
753 &width,
754 &height,
755 &planes,
756 &bpp,
757 &compr,
758 &size);
759 if(bitmap_type == -1)
760 {
761 DPRINT1("Wrong bitmap format\n");
763 ScanLines = 0;
764 goto done;
765 }
766 else if(bitmap_type == 0)
767 {
768 /* We need a BITMAPINFO to create a DIB, but we have to fill
769 * the BITMAPCOREINFO we're provided */
770 pbmci = (BITMAPCOREINFO*)Info;
771 /* fill in the the bit count, so we can calculate the right ColorsSize during the conversion */
774 if(Info == NULL)
775 {
776 DPRINT1("Error, could not convert the BITMAPCOREINFO!\n");
777 ScanLines = 0;
778 goto done;
779 }
780 rgbQuads = Info->bmiColors;
781 }
782
783 /* Validate input:
784 - negative width is always an invalid value
785 - non-null Bits and zero bpp is an invalid combination
786 - only check the rest of the input params if either bpp is non-zero or Bits are set */
787 if (width < 0 || (bpp == 0 && Bits))
788 {
789 ScanLines = 0;
790 goto done;
791 }
792
793 if (Bits || bpp)
794 {
795 if ((height == 0 || width == 0) || (compr && compr != BI_BITFIELDS && compr != BI_RGB))
796 {
797 ScanLines = 0;
798 goto done;
799 }
800 }
801
802 Info->bmiHeader.biClrUsed = 0;
803 Info->bmiHeader.biClrImportant = 0;
804
805 /* Fill in the structure */
806 switch(bpp)
807 {
808 case 0: /* Only info */
809 Info->bmiHeader.biWidth = psurf->SurfObj.sizlBitmap.cx;
810 Info->bmiHeader.biHeight = (psurf->SurfObj.fjBitmap & BMF_TOPDOWN) ?
811 -psurf->SurfObj.sizlBitmap.cy :
812 psurf->SurfObj.sizlBitmap.cy;
813 Info->bmiHeader.biPlanes = 1;
814 Info->bmiHeader.biBitCount = BitsPerFormat(psurf->SurfObj.iBitmapFormat);
815 Info->bmiHeader.biSizeImage = DIB_GetDIBImageBytes( Info->bmiHeader.biWidth,
816 Info->bmiHeader.biHeight,
817 Info->bmiHeader.biBitCount);
818 Info->bmiHeader.biCompression = (Info->bmiHeader.biBitCount == 16 || Info->bmiHeader.biBitCount == 32) ?
820 Info->bmiHeader.biXPelsPerMeter = 0;
821 Info->bmiHeader.biYPelsPerMeter = 0;
822
823 if (Info->bmiHeader.biBitCount <= 8 && Info->bmiHeader.biClrUsed == 0)
824 Info->bmiHeader.biClrUsed = 1 << Info->bmiHeader.biBitCount;
825
826 ScanLines = 1;
827 goto done;
828
829 case 1:
830 case 4:
831 case 8:
832 Info->bmiHeader.biClrUsed = 1 << bpp;
833
834 /* If the bitmap is a DIB section and has the same format as what
835 * is requested, go ahead! */
836 if((psurf->hSecure) &&
838 {
839 if(Usage == DIB_RGB_COLORS)
840 {
841 ULONG colors = min(psurf->ppal->NumColors, 256);
842 if(colors != 256) Info->bmiHeader.biClrUsed = colors;
843 for(i = 0; i < colors; i++)
844 {
845 rgbQuads[i].rgbRed = psurf->ppal->IndexedColors[i].peRed;
846 rgbQuads[i].rgbGreen = psurf->ppal->IndexedColors[i].peGreen;
847 rgbQuads[i].rgbBlue = psurf->ppal->IndexedColors[i].peBlue;
848 rgbQuads[i].rgbReserved = 0;
849 }
850 }
851 else
852 {
853 for(i = 0; i < 256; i++)
854 ((WORD*)rgbQuads)[i] = i;
855 }
856 }
857 else
858 {
859 if(Usage == DIB_PAL_COLORS)
860 {
861 for(i = 0; i < 256; i++)
862 {
863 ((WORD*)rgbQuads)[i] = i;
864 }
865 }
866 else if(bpp > 1 && bpp == BitsPerFormat(psurf->SurfObj.iBitmapFormat))
867 {
868 /* For color DDBs in native depth (mono DDBs always have
869 a black/white palette):
870 Generate the color map from the selected palette */
871 PPALETTE pDcPal = PALETTE_ShareLockPalette(pDC->dclevel.hpal);
872 if(!pDcPal)
873 {
874 ScanLines = 0 ;
875 goto done ;
876 }
877 for (i = 0; i < pDcPal->NumColors; i++)
878 {
879 rgbQuads[i].rgbRed = pDcPal->IndexedColors[i].peRed;
880 rgbQuads[i].rgbGreen = pDcPal->IndexedColors[i].peGreen;
881 rgbQuads[i].rgbBlue = pDcPal->IndexedColors[i].peBlue;
882 rgbQuads[i].rgbReserved = 0;
883 }
885 }
886 else
887 {
888 switch (bpp)
889 {
890 case 1:
891 rgbQuads[0].rgbRed = rgbQuads[0].rgbGreen = rgbQuads[0].rgbBlue = 0;
892 rgbQuads[0].rgbReserved = 0;
893 rgbQuads[1].rgbRed = rgbQuads[1].rgbGreen = rgbQuads[1].rgbBlue = 0xff;
894 rgbQuads[1].rgbReserved = 0;
895 break;
896
897 case 4:
898 /* The EGA palette is the first and last 8 colours of the default palette
899 with the innermost pair swapped */
900 RtlCopyMemory(rgbQuads, DefLogPaletteQuads, 7 * sizeof(RGBQUAD));
901 RtlCopyMemory(rgbQuads + 7, DefLogPaletteQuads + 12, 1 * sizeof(RGBQUAD));
902 RtlCopyMemory(rgbQuads + 8, DefLogPaletteQuads + 7, 1 * sizeof(RGBQUAD));
903 RtlCopyMemory(rgbQuads + 9, DefLogPaletteQuads + 13, 7 * sizeof(RGBQUAD));
904 break;
905
906 case 8:
907 {
908 INT i;
909
910 memcpy(rgbQuads, DefLogPaletteQuads, 10 * sizeof(RGBQUAD));
911 memcpy(rgbQuads + 246, DefLogPaletteQuads + 10, 10 * sizeof(RGBQUAD));
912
913 for (i = 10; i < 246; i++)
914 {
915 rgbQuads[i].rgbRed = (i & 0x07) << 5;
916 rgbQuads[i].rgbGreen = (i & 0x38) << 2;
917 rgbQuads[i].rgbBlue = i & 0xc0;
918 rgbQuads[i].rgbReserved = 0;
919 }
920 }
921 }
922 }
923 }
924 break;
925
926 case 15:
927 if (Info->bmiHeader.biCompression == BI_BITFIELDS)
928 {
929 ((PDWORD)Info->bmiColors)[0] = 0x7c00;
930 ((PDWORD)Info->bmiColors)[1] = 0x03e0;
931 ((PDWORD)Info->bmiColors)[2] = 0x001f;
932 }
933 break;
934
935 case 16:
936 if (Info->bmiHeader.biCompression == BI_BITFIELDS)
937 {
938 if (psurf->hSecure)
939 {
940 ((PDWORD)Info->bmiColors)[0] = psurf->ppal->RedMask;
941 ((PDWORD)Info->bmiColors)[1] = psurf->ppal->GreenMask;
942 ((PDWORD)Info->bmiColors)[2] = psurf->ppal->BlueMask;
943 }
944 else
945 {
946 ((PDWORD)Info->bmiColors)[0] = 0xf800;
947 ((PDWORD)Info->bmiColors)[1] = 0x07e0;
948 ((PDWORD)Info->bmiColors)[2] = 0x001f;
949 }
950 }
951 break;
952
953 case 24:
954 case 32:
955 if (Info->bmiHeader.biCompression == BI_BITFIELDS)
956 {
957 if (psurf->hSecure)
958 {
959 ((PDWORD)Info->bmiColors)[0] = psurf->ppal->RedMask;
960 ((PDWORD)Info->bmiColors)[1] = psurf->ppal->GreenMask;
961 ((PDWORD)Info->bmiColors)[2] = psurf->ppal->BlueMask;
962 }
963 else
964 {
965 ((PDWORD)Info->bmiColors)[0] = 0xff0000;
966 ((PDWORD)Info->bmiColors)[1] = 0x00ff00;
967 ((PDWORD)Info->bmiColors)[2] = 0x0000ff;
968 }
969 }
970 break;
971
972 default:
973 ScanLines = 0;
974 goto done;
975 }
976
977 Info->bmiHeader.biSizeImage = DIB_GetDIBImageBytes(width, height, bpp);
978 Info->bmiHeader.biPlanes = 1;
979
980 if(Bits && ScanLines)
981 {
982 /* Create a DIBSECTION, blt it, profit */
983 PVOID pDIBits ;
984 HBITMAP hBmpDest;
985 PSURFACE psurfDest;
986 EXLATEOBJ exlo;
987 RECT rcDest;
988 POINTL srcPoint;
989 BOOL ret ;
990 int newLines = -1;
991
992 if (StartScan >= abs(Info->bmiHeader.biHeight))
993 {
994 ScanLines = 1;
995 goto done;
996 }
997 else
998 {
999 ScanLines = min(ScanLines, abs(Info->bmiHeader.biHeight) - StartScan);
1000 }
1001
1002 if (abs(Info->bmiHeader.biHeight) < psurf->SurfObj.sizlBitmap.cy)
1003 {
1004 StartScan += psurf->SurfObj.sizlBitmap.cy - abs(Info->bmiHeader.biHeight);
1005 }
1006 /* Fixup values */
1007 Info->bmiHeader.biHeight = (height < 0) ?
1008 -(LONG)ScanLines : ScanLines;
1009 /* Create the DIB */
1010 hBmpDest = DIB_CreateDIBSection(pDC, Info, Usage, &pDIBits, NULL, 0, 0);
1011 /* Restore them */
1012 Info->bmiHeader.biHeight = height;
1013
1014 if(!hBmpDest)
1015 {
1016 DPRINT1("Unable to create a DIB Section!\n");
1018 ScanLines = 0;
1019 goto done ;
1020 }
1021
1022 psurfDest = SURFACE_ShareLockSurface(hBmpDest);
1023
1024 RECTL_vSetRect(&rcDest, 0, 0, Info->bmiHeader.biWidth, ScanLines);
1025 Info->bmiHeader.biWidth = width;
1026 srcPoint.x = 0;
1027
1028 if (abs(Info->bmiHeader.biHeight) <= psurf->SurfObj.sizlBitmap.cy)
1029 {
1030 srcPoint.y = psurf->SurfObj.sizlBitmap.cy - StartScan - ScanLines;
1031 }
1032 else
1033 {
1034 /* Determine the actual number of lines copied from the */
1035 /* original bitmap. It might be different from ScanLines. */
1036 newLines = abs(Info->bmiHeader.biHeight) - psurf->SurfObj.sizlBitmap.cy;
1037 newLines = min((int)(StartScan + ScanLines - newLines), psurf->SurfObj.sizlBitmap.cy);
1038 if (newLines > 0)
1039 {
1040 srcPoint.y = psurf->SurfObj.sizlBitmap.cy - newLines;
1041 if (StartScan > psurf->SurfObj.sizlBitmap.cy)
1042 {
1043 newLines -= (StartScan - psurf->SurfObj.sizlBitmap.cy);
1044 }
1045 }
1046 else
1047 {
1048 newLines = 0;
1049 srcPoint.y = psurf->SurfObj.sizlBitmap.cy;
1050 }
1051 }
1052
1053 EXLATEOBJ_vInitialize(&exlo, psurf->ppal, psurfDest->ppal, 0xffffff, 0xffffff, 0);
1054
1055 ret = IntEngCopyBits(&psurfDest->SurfObj,
1056 &psurf->SurfObj,
1057 NULL,
1058 &exlo.xlo,
1059 &rcDest,
1060 &srcPoint);
1061
1062 SURFACE_ShareUnlockSurface(psurfDest);
1063
1064 if(!ret)
1065 ScanLines = 0;
1066 else
1067 {
1068 RtlCopyMemory(Bits, pDIBits, DIB_GetDIBImageBytes (width, ScanLines, bpp));
1069 }
1070 /* Update if line count has changed */
1071 if (newLines != -1)
1072 {
1073 ScanLines = (UINT)newLines;
1074 }
1075 GreDeleteObject(hBmpDest);
1076 EXLATEOBJ_vCleanup(&exlo);
1077 }
1078 else
1079 {
1080 /* Signals success and not the actual number of scan lines*/
1081 ScanLines = 1;
1082 }
1083
1084done:
1085
1086 if (pbmci)
1088
1089 if (psurf)
1091
1092 if (pDC)
1093 DC_UnlockDc(pDC);
1094
1095 return ScanLines;
1096}
1097
1098_Success_(return!=0)
1100INT
1102NtGdiGetDIBitsInternal(
1103 _In_ HDC hdc,
1112{
1113 PBITMAPINFO pbmiSafe;
1114 HANDLE hSecure = NULL;
1115 INT iResult = 0;
1116 UINT cjAlloc;
1117
1118 /* Check for bad iUsage */
1119 if (iUsage > 2) return 0;
1120
1121 /* Check if the size of the bitmap info is large enough */
1122 if (cjMaxInfo < sizeof(BITMAPCOREHEADER))
1123 {
1124 return 0;
1125 }
1126
1127 /* Use maximum size */
1128 cjMaxInfo = min(cjMaxInfo, sizeof(BITMAPV5HEADER) + 256 * sizeof(RGBQUAD));
1129
1130 // HACK: the underlying code sucks and doesn't care for the size, so we
1131 // give it the maximum ever needed
1132 cjAlloc = sizeof(BITMAPV5HEADER) + 256 * sizeof(RGBQUAD);
1133
1134 /* Allocate a buffer the bitmapinfo */
1135 pbmiSafe = ExAllocatePoolWithTag(PagedPool, cjAlloc, 'imBG');
1136 if (!pbmiSafe)
1137 {
1138 /* Fail */
1139 return 0;
1140 }
1141
1142 /* Use SEH */
1143 _SEH2_TRY
1144 {
1145 /* Probe and copy the BITMAPINFO */
1147 RtlCopyMemory(pbmiSafe, pbmi, cjMaxInfo);
1148 }
1150 {
1151 goto cleanup;
1152 }
1153 _SEH2_END;
1154
1155 /* Check if the header size is large enough */
1156 if ((pbmiSafe->bmiHeader.biSize < sizeof(BITMAPCOREHEADER)) ||
1157 (pbmiSafe->bmiHeader.biSize > cjMaxInfo))
1158 {
1159 goto cleanup;
1160 }
1161
1162 /* Check if the caller provided bitmap bits */
1163 if (pjBits)
1164 {
1165 /* Secure the user mode memory */
1166 hSecure = EngSecureMem(pjBits, cjMaxBits);
1167 if (!hSecure)
1168 {
1169 goto cleanup;
1170 }
1171 }
1172
1173 /* Now call the internal function */
1174 iResult = GreGetDIBitsInternal(hdc,
1175 hbm,
1176 iStartScan,
1177 cScans,
1178 pjBits,
1179 pbmiSafe,
1180 iUsage,
1181 cjMaxBits,
1182 cjMaxInfo);
1183
1184 /* Check for success */
1185 if (iResult)
1186 {
1187 /* Use SEH to copy back to user mode */
1188 _SEH2_TRY
1189 {
1190 /* Copy the data back */
1193 RtlCopyMemory(pbmi, pbmiSafe, cjMaxInfo);
1194 }
1196 {
1197 /* Ignore */
1198 (VOID)0;
1199 }
1200 _SEH2_END;
1201 }
1202
1203cleanup:
1204 if (hSecure) EngUnsecureMem(hSecure);
1205 ExFreePoolWithTag(pbmiSafe, 'imBG');
1206
1207 return iResult;
1208}
1209
1210W32KAPI
1211INT
1214 IN HDC hdc,
1215 IN INT xDst,
1216 IN INT yDst,
1217 IN INT cxDst,
1218 IN INT cyDst,
1219 IN INT xSrc,
1220 IN INT ySrc,
1221 IN INT cxSrc,
1222 IN INT cySrc,
1223 IN OPTIONAL LPBYTE pjInit,
1225 IN DWORD dwUsage,
1226 IN DWORD dwRop, // MS ntgdi.h says dwRop4(?)
1230{
1231 SIZEL sizel;
1232 RECTL rcSrc, rcDst;
1233 PDC pdc;
1234 HBITMAP hbmTmp = 0;
1235 PSURFACE psurfTmp = 0, psurfDst = 0;
1236 PPALETTE ppalDIB = 0;
1237 EXLATEOBJ exlo;
1238 PBYTE pvBits;
1239
1240 LPBITMAPINFO pbmiSafe;
1241 UINT cjAlloc;
1242 HBITMAP hBitmap, hOldBitmap = NULL;
1243 HDC hdcMem;
1244 HPALETTE hPal = NULL;
1245 ULONG BmpFormat = 0;
1246 INT LinesCopied = 0;
1247
1248 /* Check for bad iUsage */
1249 if (dwUsage > 2) return 0;
1250
1251 /* We must have LPBITMAPINFO */
1252 if (!pbmi)
1253 {
1254 DPRINT1("Error, Invalid Parameter.\n");
1256 return 0;
1257 }
1258
1259 /* Check if the size of the bitmap info is large enough */
1260 if (cjMaxInfo < sizeof(BITMAPCOREHEADER))
1261 {
1262 return 0;
1263 }
1264
1265 /* Use maximum size */
1266 cjMaxInfo = min(cjMaxInfo, sizeof(BITMAPV5HEADER) + 256 * sizeof(RGBQUAD));
1267
1268 // HACK: the underlying code sucks and doesn't care for the size, so we
1269 // give it the maximum ever needed
1270 cjAlloc = sizeof(BITMAPV5HEADER) + 256 * sizeof(RGBQUAD);
1271
1272 /* Allocate a buffer the bitmapinfo */
1273 pbmiSafe = ExAllocatePoolWithTag(PagedPool, cjAlloc, 'imBG');
1274 if (!pbmiSafe)
1275 {
1276 /* Fail */
1277 return 0;
1278 }
1279
1280 /* Use SEH */
1281 _SEH2_TRY
1282 {
1283 /* Probe and copy the BITMAPINFO */
1285 RtlCopyMemory(pbmiSafe, pbmi, cjMaxInfo);
1286 }
1288 {
1289 ExFreePoolWithTag(pbmiSafe, 'imBG');
1290 return 0;
1291 }
1292 _SEH2_END;
1293
1294 /* Check if the header size is large enough */
1295 if ((pbmiSafe->bmiHeader.biSize < sizeof(BITMAPCOREHEADER)) ||
1296 (pbmiSafe->bmiHeader.biSize > cjMaxInfo))
1297 {
1298 ExFreePoolWithTag(pbmiSafe, 'imBG');
1299 return 0;
1300 }
1301
1302 if (!(pdc = DC_LockDc(hdc)))
1303 {
1305 return 0;
1306 }
1307
1308 /* Check for info / mem DC without surface */
1309 if (!pdc->dclevel.pSurface)
1310 {
1311 DC_UnlockDc(pdc);
1312 // CHECKME
1313 return TRUE;
1314 }
1315
1316 /* Transform dest size */
1317 sizel.cx = cxDst;
1318 sizel.cy = cyDst;
1319 IntLPtoDP(pdc, (POINTL*)&sizel, 1);
1320 DC_UnlockDc(pdc);
1321
1322 if (pjInit && (cjMaxBits > 0))
1323 {
1325 if (!pvBits)
1326 {
1327 return 0;
1328 }
1329
1330 _SEH2_TRY
1331 {
1332 ProbeForRead(pjInit, cjMaxBits, 1);
1333 RtlCopyMemory(pvBits, pjInit, cjMaxBits);
1334 }
1336 {
1337 ExFreePoolWithTag(pvBits, TAG_DIB);
1338 return 0;
1339 }
1340 _SEH2_END;
1341 }
1342 else
1343 {
1344 pvBits = NULL;
1345 }
1346
1347 /* Here we select between the dwRop with SRCCOPY or not. */
1348 if (dwRop == SRCCOPY)
1349 {
1351 if (hdcMem == NULL)
1352 {
1353 DPRINT1("NtGdiCreateCompatibleDC failed to create hdc.\n");
1355 return 0;
1356 }
1357
1359 abs(pbmiSafe->bmiHeader.biWidth),
1360 abs(pbmiSafe->bmiHeader.biHeight));
1361 if (hBitmap == NULL)
1362 {
1363 DPRINT1("NtGdiCreateCompatibleBitmap failed to create bitmap.\n");
1364 DPRINT1("hdc : 0x%08x \n", hdc);
1365 DPRINT1("width : 0x%08x \n", pbmiSafe->bmiHeader.biWidth);
1366 DPRINT1("height : 0x%08x \n", pbmiSafe->bmiHeader.biHeight);
1368 return 0;
1369 }
1370
1371 /* Select the bitmap into hdcMem, and save a handle to the old bitmap */
1372 hOldBitmap = NtGdiSelectBitmap(hdcMem, hBitmap);
1373
1374 if (dwUsage == DIB_PAL_COLORS)
1375 {
1377 hPal = GdiSelectPalette(hdcMem, hPal, FALSE);
1378 }
1379
1380 pdc = DC_LockDc(hdcMem);
1381 if (pdc != NULL)
1382 {
1383 IntSetDIBits(pdc, hBitmap, 0, abs(pbmiSafe->bmiHeader.biHeight), pvBits,
1384 cjMaxBits, pbmiSafe, dwUsage);
1385 DC_UnlockDc(pdc);
1386 }
1387
1388 /* Origin for DIBitmap may be bottom left (positive biHeight) or top
1389 left (negative biHeight) */
1390 if (cxSrc == cxDst && cySrc == cyDst)
1391 {
1392 NtGdiBitBlt(hdc, xDst, yDst, cxDst, cyDst,
1393 hdcMem, xSrc, abs(pbmiSafe->bmiHeader.biHeight) - cySrc - ySrc,
1394 dwRop, 0, 0);
1395 }
1396 else
1397 {
1398 NtGdiStretchBlt(hdc, xDst, yDst, cxDst, cyDst,
1399 hdcMem, xSrc, abs(pbmiSafe->bmiHeader.biHeight) - cySrc - ySrc,
1400 cxSrc, cySrc, dwRop, 0);
1401 }
1402
1403 /* cleanup */
1404 if (hPal)
1406
1407 if (hOldBitmap)
1408 NtGdiSelectBitmap(hdcMem, hOldBitmap);
1409
1412
1413 } /* End of dwRop == SRCCOPY */
1414 else
1415 { /* Start of dwRop != SRCCOPY */
1416 /* FIXME: Locking twice is cheesy, coord tranlation in UM will fix it */
1417 if (!(pdc = DC_LockDc(hdc)))
1418 {
1419 DPRINT1("Could not lock dc\n");
1421 goto cleanup;
1422 }
1423
1424 /* Calculate source and destination rect */
1425 rcSrc.left = xSrc;
1426 rcSrc.top = ySrc;
1427 rcSrc.right = xSrc + abs(cxSrc);
1428 rcSrc.bottom = ySrc + abs(cySrc);
1429 rcDst.left = xDst;
1430 rcDst.top = yDst;
1431 rcDst.right = rcDst.left + cxDst;
1432 rcDst.bottom = rcDst.top + cyDst;
1433 IntLPtoDP(pdc, (POINTL*)&rcDst, 2);
1434 RECTL_vOffsetRect(&rcDst, pdc->ptlDCOrig.x, pdc->ptlDCOrig.y);
1435
1436 if (pdc->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR))
1437 {
1438 IntUpdateBoundsRect(pdc, &rcDst);
1439 }
1440
1441 BmpFormat = BitmapFormat(pbmiSafe->bmiHeader.biBitCount,
1442 pbmiSafe->bmiHeader.biCompression);
1443
1444 hbmTmp = GreCreateBitmapEx(pbmiSafe->bmiHeader.biWidth,
1445 abs(pbmiSafe->bmiHeader.biHeight),
1446 0,
1447 BmpFormat,
1448 pbmiSafe->bmiHeader.biHeight < 0 ? BMF_TOPDOWN : 0,
1449 cjMaxBits,
1450 pvBits,
1451 0);
1452
1453 if (!hbmTmp)
1454 {
1455 goto cleanup;
1456 }
1457
1458 psurfTmp = SURFACE_ShareLockSurface(hbmTmp);
1459 if (!psurfTmp)
1460 {
1461 goto cleanup;
1462 }
1463
1464 /* Create a palette for the DIB */
1465 ppalDIB = CreateDIBPalette(pbmiSafe, pdc, dwUsage);
1466 if (!ppalDIB)
1467 {
1468 goto cleanup;
1469 }
1470
1471 /* Prepare DC for blit */
1472 DC_vPrepareDCsForBlit(pdc, &rcDst, NULL, NULL);
1473
1474 psurfDst = pdc->dclevel.pSurface;
1475
1476 /* Initialize XLATEOBJ */
1478 ppalDIB,
1479 psurfDst->ppal,
1480 RGB(0xff, 0xff, 0xff),
1481 pdc->pdcattr->crBackgroundClr,
1482 pdc->pdcattr->crForegroundClr);
1483
1484 /* Perform the stretch operation */
1485 IntEngStretchBlt(&psurfDst->SurfObj,
1486 &psurfTmp->SurfObj,
1487 NULL,
1488 (CLIPOBJ *)&pdc->co,
1489 &exlo.xlo,
1490 &pdc->dclevel.ca,
1491 &rcDst,
1492 &rcSrc,
1493 NULL,
1494 &pdc->eboFill.BrushObject,
1495 NULL,
1496 WIN32_ROP3_TO_ENG_ROP4(dwRop));
1497
1498 /* Cleanup */
1499 DC_vFinishBlit(pdc, NULL);
1500 EXLATEOBJ_vCleanup(&exlo);
1501
1502 cleanup:
1503 if (ppalDIB) PALETTE_ShareUnlockPalette(ppalDIB);
1504 if (psurfTmp) SURFACE_ShareUnlockSurface(psurfTmp);
1505 if (hbmTmp) GreDeleteObject(hbmTmp);
1506 if (pdc) DC_UnlockDc(pdc);
1507 }
1508
1509 if (pvBits) ExFreePoolWithTag(pvBits, TAG_DIB);
1510
1511 /* This is not what MSDN says is returned from this function, but it
1512 * follows Wine's dlls/gdi32/dib.c function nulldrv_StretchDIBits
1513 * and it fixes over 100 gdi32:dib regression tests. */
1514 if (dwRop == SRCCOPY)
1515 {
1516 LinesCopied = abs(pbmiSafe->bmiHeader.biHeight);
1517 }
1518 else
1519 {
1520 LinesCopied = pbmiSafe->bmiHeader.biHeight;
1521 }
1522
1523 ExFreePoolWithTag(pbmiSafe, 'imBG');
1524
1525 return LinesCopied;
1526}
1527
1528HBITMAP
1531 PDC Dc,
1532 INT width,
1533 INT height,
1534 UINT planes,
1535 UINT bpp,
1537 DWORD init,
1538 LPBYTE bits,
1541 DWORD coloruse)
1542{
1544 BOOL fColor;
1545 ULONG BmpFormat = 0;
1546
1547 if (planes && bpp)
1548 BmpFormat = BitmapFormat(planes * bpp, compression);
1549
1550 // Check if we should create a monochrome or color bitmap. We create a monochrome bitmap only if it has exactly 2
1551 // colors, which are black followed by white, nothing else. In all other cases, we create a color bitmap.
1552
1553 if (BmpFormat != BMF_1BPP) fColor = TRUE;
1554 else if ((coloruse > DIB_RGB_COLORS) || ((init & CBM_INIT) == 0) || !data) fColor = FALSE;
1555 else
1556 {
1557 const RGBQUAD *rgb = (RGBQUAD*)((PBYTE)data + data->bmiHeader.biSize);
1558 DWORD col = RGB(rgb->rgbRed, rgb->rgbGreen, rgb->rgbBlue);
1559
1560 // Check if the first color of the colormap is black
1561 if (col == RGB(0, 0, 0))
1562 {
1563 rgb++;
1564 col = RGB(rgb->rgbRed, rgb->rgbGreen, rgb->rgbBlue);
1565
1566 // If the second color is white, create a monochrome bitmap
1567 fColor = (col != RGB(0xff,0xff,0xff));
1568 }
1569 else fColor = TRUE;
1570 }
1571
1572 // Now create the bitmap
1573 if (fColor)
1574 {
1575 if (init & CBM_CREATDIB)
1576 {
1577 PSURFACE Surface;
1578 PPALETTE Palette;
1579
1580 /* Undocumented flag which creates a DDB of the format specified by the bitmap info. */
1582 if (!handle)
1583 {
1584 DPRINT1("IntCreateCompatibleBitmap() failed!\n");
1585 return NULL;
1586 }
1587
1588 /* The palette must also match the given data */
1590 ASSERT(Surface);
1591 Palette = CreateDIBPalette(data, Dc, coloruse);
1592 if (Palette == NULL)
1593 {
1596 return NULL;
1597 }
1598
1599 SURFACE_vSetPalette(Surface, Palette);
1600
1603 }
1604 else
1605 {
1606 /* Create a regular compatible bitmap, in the same format as the device */
1608 }
1609 }
1610 else
1611 {
1613 abs(height),
1614 1,
1615 1,
1616 NULL);
1617 }
1618
1619 if (height < 0)
1620 height = -height;
1621
1622 if ((NULL != handle) && (CBM_INIT & init))
1623 {
1624 IntSetDIBits(Dc, handle, 0, height, bits, cjMaxBits, data, coloruse);
1625 }
1626
1627 return handle;
1628}
1629
1630// The CreateDIBitmap function creates a device-dependent bitmap (DDB) from a DIB and, optionally, sets the bitmap bits
1631// The DDB that is created will be whatever bit depth your reference DC is
1632HBITMAP
1635 IN HDC hDc,
1636 IN INT cx,
1637 IN INT cy,
1638 IN DWORD fInit,
1639 IN OPTIONAL LPBYTE pjInit,
1641 IN DWORD iUsage,
1642 IN UINT cjMaxInitInfo,
1644 IN FLONG fl,
1646{
1648 PBYTE safeBits = NULL;
1649 HBITMAP hbmResult = NULL;
1650
1651 if (pjInit == NULL)
1652 {
1653 fInit &= ~CBM_INIT;
1654 }
1655
1656 if(pjInit && (fInit & CBM_INIT))
1657 {
1658 if (cjMaxBits == 0) return NULL;
1660 if(!safeBits)
1661 {
1662 DPRINT1("Failed to allocate %lu bytes\n", cjMaxBits);
1664 return NULL;
1665 }
1666 }
1667
1668 _SEH2_TRY
1669 {
1670 if(pbmi) ProbeForRead(pbmi, cjMaxInitInfo, 1);
1671 if(pjInit && (fInit & CBM_INIT))
1672 {
1673 ProbeForRead(pjInit, cjMaxBits, 1);
1674 RtlCopyMemory(safeBits, pjInit, cjMaxBits);
1675 }
1676 }
1678 {
1680 }
1681 _SEH2_END;
1682
1683 if(!NT_SUCCESS(Status))
1684 {
1685 DPRINT1("Got an exception! pjInit = %p\n", pjInit);
1687 goto cleanup;
1688 }
1689
1690 hbmResult = GreCreateDIBitmapInternal(hDc,
1691 cx,
1692 cy,
1693 fInit,
1694 safeBits,
1695 pbmi,
1696 iUsage,
1697 fl,
1698 cjMaxBits,
1699 hcmXform);
1700
1701cleanup:
1702 if (safeBits) ExFreePoolWithTag(safeBits, TAG_DIB);
1703 return hbmResult;
1704}
1705
1706HBITMAP
1707NTAPI
1709 IN HDC hDc,
1710 IN INT cx,
1711 IN INT cy,
1712 IN DWORD fInit,
1713 IN OPTIONAL LPBYTE pjInit,
1715 IN DWORD iUsage,
1716 IN FLONG fl,
1719{
1720 PDC Dc;
1721 HBITMAP Bmp;
1722 USHORT bpp, planes;
1724 HDC hdcDest;
1725
1726 if (!hDc) /* 1bpp monochrome bitmap */
1727 {
1728 // Should use System Bitmap DC hSystemBM, with CreateCompatibleDC for this.
1729 hdcDest = NtGdiCreateCompatibleDC(0);
1730 if(!hdcDest)
1731 {
1732 DPRINT1("NtGdiCreateCompatibleDC failed\n");
1733 return NULL;
1734 }
1735 }
1736 else
1737 {
1738 hdcDest = hDc;
1739 }
1740
1741 Dc = DC_LockDc(hdcDest);
1742 if (!Dc)
1743 {
1744 DPRINT1("Failed to lock hdcDest %p\n", hdcDest);
1746 return NULL;
1747 }
1748 /* It's OK to set bpp=0 here, as IntCreateDIBitmap will create a compatible Bitmap
1749 * if bpp != 1 and ignore the real value that was passed */
1750 if (pbmi)
1751 {
1752 if (pbmi->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
1753 {
1755 bpp = CoreHeader->bcBitCount;
1756 planes = CoreHeader->bcPlanes ? CoreHeader->bcPlanes : 1;
1758 }
1759 else
1760 {
1762 planes = pbmi->bmiHeader.biPlanes ? pbmi->bmiHeader.biPlanes : 1;
1764 }
1765 }
1766 else
1767 {
1768 bpp = 0;
1769 planes = 0;
1770 compression = 0;
1771 }
1772 Bmp = IntCreateDIBitmap(Dc, cx, cy, planes, bpp, compression, fInit, pjInit, cjMaxBits, pbmi, iUsage);
1773 DC_UnlockDc(Dc);
1774
1775 if(!hDc)
1776 {
1777 NtGdiDeleteObjectApp(hdcDest);
1778 }
1779 return Bmp;
1780}
1781
1782HBITMAP
1783NTAPI
1785 _In_reads_(cjPackedDIB )PVOID pvPackedDIB,
1786 _In_ UINT cjPackedDIB,
1787 _In_ ULONG uUsage)
1788{
1790 PBYTE pjBits;
1791 UINT cjInfo, cjBits;
1792 HBITMAP hbm;
1793
1794 /* We only support BITMAPINFOHEADER, make sure the size is ok */
1795 if (cjPackedDIB < sizeof(BITMAPINFOHEADER))
1796 {
1797 return NULL;
1798 }
1799
1800 /* The packed DIB starts with the BITMAPINFOHEADER */
1801 pbmi = pvPackedDIB;
1802
1803 if (cjPackedDIB < pbmi->bmiHeader.biSize)
1804 {
1805 return NULL;
1806 }
1807
1808 /* Calculate the info size and make sure the packed DIB is large enough */
1809 cjInfo = DIB_BitmapInfoSize(pbmi, uUsage);
1810 if (cjPackedDIB <= cjInfo)
1811 {
1812 return NULL;
1813 }
1814
1815 /* The bitmap bits start after the header */
1816 pjBits = (PBYTE)pvPackedDIB + cjInfo;
1817 cjBits = cjPackedDIB - cjInfo;
1818
1823 pjBits,
1824 pbmi,
1825 uUsage,
1826 0,
1827 cjBits,
1828 NULL);
1829
1830 return hbm;
1831}
1832
1833HBITMAP
1836 IN HDC hDC,
1839 IN BITMAPINFO* bmi,
1840 IN DWORD Usage,
1841 IN UINT cjHeader,
1842 IN FLONG fl,
1843 IN ULONG_PTR dwColorSpace,
1844 OUT PVOID *Bits)
1845{
1846 HBITMAP hbitmap = 0;
1847 DC *dc;
1848 BOOL bDesktopDC = FALSE;
1850
1851 if (!bmi) return hbitmap; // Make sure.
1852
1853 _SEH2_TRY
1854 {
1855 ProbeForRead(&bmi->bmiHeader.biSize, sizeof(DWORD), 1);
1856 ProbeForRead(bmi, bmi->bmiHeader.biSize, 1);
1857 ProbeForRead(bmi, DIB_BitmapInfoSize(bmi, (WORD)Usage), 1);
1858 }
1860 {
1862 }
1863 _SEH2_END;
1864
1865 if(!NT_SUCCESS(Status))
1866 {
1868 return NULL;
1869 }
1870
1871 // If the reference hdc is null, take the desktop dc
1872 if (hDC == 0)
1873 {
1875 bDesktopDC = TRUE;
1876 }
1877
1878 if ((dc = DC_LockDc(hDC)))
1879 {
1881 bmi,
1882 Usage,
1883 Bits,
1884 hSection,
1885 dwOffset,
1886 0);
1887 DC_UnlockDc(dc);
1888 }
1889 else
1890 {
1892 }
1893
1894 if (bDesktopDC)
1896
1897 return hbitmap;
1898}
1899
1900HBITMAP
1903 PDC dc,
1904 CONST BITMAPINFO *bmi,
1905 UINT usage,
1906 LPVOID *bits,
1908 DWORD offset,
1909 DWORD ovr_pitch)
1910{
1911 HBITMAP res = 0;
1912 SURFACE *bmp = NULL;
1913 void *mapBits = NULL;
1914 PPALETTE ppalDIB = NULL;
1915
1916 // Fill BITMAP32 structure with DIB data
1917 CONST BITMAPINFOHEADER *bi = &bmi->bmiHeader;
1918 INT effHeight;
1919 ULONG totalSize;
1920 BITMAP bm;
1921 //SIZEL Size;
1922 HANDLE hSecure;
1923
1924 DPRINT("format (%ld,%ld), planes %u, bpp %u, size %lu, colors %lu (%s)\n",
1925 bi->biWidth, bi->biHeight, bi->biPlanes, bi->biBitCount,
1926 bi->biSizeImage, bi->biClrUsed, usage == DIB_PAL_COLORS? "PAL" : "RGB");
1927
1928 /* CreateDIBSection should fail for compressed formats */
1929 if (bi->biCompression == BI_RLE4 || bi->biCompression == BI_RLE8)
1930 {
1931 DPRINT1("no compressed format allowed\n");
1932 return (HBITMAP)NULL;
1933 }
1934
1935 effHeight = bi->biHeight >= 0 ? bi->biHeight : -bi->biHeight;
1936 bm.bmType = 0;
1937 bm.bmWidth = bi->biWidth;
1938 bm.bmHeight = effHeight;
1939 bm.bmWidthBytes = ovr_pitch ? ovr_pitch : WIDTH_BYTES_ALIGN32(bm.bmWidth, bi->biBitCount);
1940
1941 bm.bmPlanes = bi->biPlanes;
1942 bm.bmBitsPixel = bi->biBitCount;
1943 bm.bmBits = NULL;
1944
1945 // Get storage location for DIB bits. Only use biSizeImage if it's valid and
1946 // we're dealing with a compressed bitmap. Otherwise, use width * height.
1947 totalSize = (bi->biSizeImage && (bi->biCompression != BI_RGB) && (bi->biCompression != BI_BITFIELDS))
1948 ? bi->biSizeImage : (ULONG)(bm.bmWidthBytes * effHeight);
1949
1950 if (section)
1951 {
1954 DWORD mapOffset;
1956 SIZE_T mapSize;
1957
1959 &Sbi,
1960 sizeof Sbi,
1961 0);
1962 if (!NT_SUCCESS(Status))
1963 {
1964 DPRINT1("ZwQuerySystemInformation failed (0x%lx)\n", Status);
1965 return NULL;
1966 }
1967
1968 mapOffset = offset - (offset % Sbi.AllocationGranularity);
1969 mapSize = totalSize + (offset - mapOffset);
1970
1971 SectionOffset.LowPart = mapOffset;
1972 SectionOffset.HighPart = 0;
1973
1974 Status = ZwMapViewOfSection(section,
1976 &mapBits,
1977 0,
1978 0,
1980 &mapSize,
1981 ViewShare,
1982 0,
1984 if (!NT_SUCCESS(Status))
1985 {
1986 DPRINT1("ZwMapViewOfSection failed (0x%lx)\n", Status);
1988 return NULL;
1989 }
1990
1991 if (mapBits) bm.bmBits = (char *)mapBits + (offset - mapOffset);
1992 }
1993 else if (ovr_pitch && offset)
1994 bm.bmBits = UlongToPtr(offset);
1995 else
1996 {
1997 offset = 0;
1998 bm.bmBits = EngAllocUserMem(totalSize, 0);
1999 if(!bm.bmBits)
2000 {
2001 DPRINT1("Failed to allocate memory\n");
2002 goto cleanup;
2003 }
2004 }
2005
2006// hSecure = MmSecureVirtualMemory(bm.bmBits, totalSize, PAGE_READWRITE);
2007 hSecure = (HANDLE)0x1; // HACK OF UNIMPLEMENTED KERNEL STUFF !!!!
2008
2009 // Create Device Dependent Bitmap and add DIB pointer
2010 //Size.cx = bm.bmWidth;
2011 //Size.cy = abs(bm.bmHeight);
2012 res = GreCreateBitmapEx(bm.bmWidth,
2013 abs(bm.bmHeight),
2014 bm.bmWidthBytes,
2015 BitmapFormat(bi->biBitCount * bi->biPlanes, bi->biCompression),
2017 ((bi->biHeight < 0) ? BMF_TOPDOWN : 0),
2018 totalSize,
2019 bm.bmBits,
2020 0);
2021 if (!res)
2022 {
2023 DPRINT1("GreCreateBitmapEx failed\n");
2025 goto cleanup;
2026 }
2027 bmp = SURFACE_ShareLockSurface(res); // HACK
2028 if (NULL == bmp)
2029 {
2030 DPRINT1("SURFACE_LockSurface failed\n");
2032 goto cleanup;
2033 }
2034
2035 /* WINE NOTE: WINE makes use of a colormap, which is a color translation
2036 table between the DIB and the X physical device. Obviously,
2037 this is left out of the ReactOS implementation. Instead,
2038 we call NtGdiSetDIBColorTable. */
2039 bmp->hDIBSection = section;
2040 bmp->hSecure = hSecure;
2041 bmp->dwOffset = offset;
2042 bmp->flags = API_BITMAP;
2043 bmp->biClrImportant = bi->biClrImportant;
2044
2045 /* Create a palette for the DIB */
2046 ppalDIB = CreateDIBPalette(bmi, dc, usage);
2047
2048 // Clean up in case of errors
2049cleanup:
2050 if (!res || !bmp || !bm.bmBits || !ppalDIB)
2051 {
2052 DPRINT("Got an error res=%p, bmp=%p, bm.bmBits=%p\n", res, bmp, bm.bmBits);
2053 if (bm.bmBits)
2054 {
2055 // MmUnsecureVirtualMemory(hSecure); // FIXME: Implement this!
2056 if (section)
2057 {
2058 ZwUnmapViewOfSection(NtCurrentProcess(), mapBits);
2059 bm.bmBits = NULL;
2060 }
2061 else if (!offset)
2062 EngFreeUserMem(bm.bmBits), bm.bmBits = NULL;
2063 }
2064
2065 if (bmp)
2066 {
2068 bmp = NULL;
2069 }
2070
2071 if (res)
2072 {
2074 res = 0;
2075 }
2076
2077 if(ppalDIB)
2078 {
2080 }
2081 }
2082
2083 if (bmp)
2084 {
2085 /* If we're here, everything went fine */
2086 SURFACE_vSetPalette(bmp, ppalDIB);
2089 }
2090
2091 // Return BITMAP handle and storage location
2092 if (NULL != bm.bmBits && NULL != bits)
2093 {
2094 *bits = bm.bmBits;
2095 }
2096
2097 return res;
2098}
2099
2100/***********************************************************************
2101 * DIB_GetBitmapInfo
2102 *
2103 * Get the info from a bitmap header.
2104 * Return 0 for COREHEADER, 1 for INFOHEADER, -1 for error.
2105 */
2106int
2109 LONG *height, WORD *planes, WORD *bpp, DWORD *compr, DWORD *size )
2110{
2111 if (header->biSize == sizeof(BITMAPCOREHEADER))
2112 {
2113 const BITMAPCOREHEADER *core = (const BITMAPCOREHEADER *)header;
2114 *width = core->bcWidth;
2115 *height = core->bcHeight;
2116 *planes = core->bcPlanes;
2117 *bpp = core->bcBitCount;
2118 *compr = BI_RGB;
2119 *size = 0;
2120 return 0;
2121 }
2122 if (header->biSize >= sizeof(BITMAPINFOHEADER)) /* Assume BITMAPINFOHEADER */
2123 {
2124 *width = header->biWidth;
2125 *height = header->biHeight;
2126 *planes = header->biPlanes;
2127 *bpp = header->biBitCount;
2128 *compr = header->biCompression;
2129 *size = header->biSizeImage;
2130 return 1;
2131 }
2132 DPRINT1("(%u): unknown/wrong size for header\n", header->biSize );
2133 return -1;
2134}
2135
2136/***********************************************************************
2137 * DIB_GetDIBImageBytes
2138 *
2139 * Return the number of bytes used to hold the image in a DIB bitmap.
2140 * 11/16/1999 (RJJ) lifted from wine
2141 */
2142
2144{
2145 return WIDTH_BYTES_ALIGN32(width, depth) * (height < 0 ? -height : height);
2146}
2147
2148/***********************************************************************
2149 * DIB_BitmapInfoSize
2150 *
2151 * Return the size of the bitmap info structure including color table.
2152 * 11/16/1999 (RJJ) lifted from wine
2153 */
2154
2156{
2157 unsigned int colors, size, masks = 0;
2158 unsigned int colorsize;
2159
2160 colorsize = (coloruse == DIB_RGB_COLORS) ? sizeof(RGBQUAD) :
2161 (coloruse == DIB_PAL_INDICES) ? 0 :
2162 sizeof(WORD);
2163
2164 if (info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
2165 {
2166 const BITMAPCOREHEADER *core = (const BITMAPCOREHEADER *)info;
2167 colors = (core->bcBitCount <= 8) ? 1 << core->bcBitCount : 0;
2168 return sizeof(BITMAPCOREHEADER) + colors * colorsize;
2169 }
2170 else /* Assume BITMAPINFOHEADER */
2171 {
2172 colors = info->bmiHeader.biClrUsed;
2173 if (colors > 256) colors = 256;
2174 if (!colors && (info->bmiHeader.biBitCount <= 8))
2175 colors = 1 << info->bmiHeader.biBitCount;
2176 if (info->bmiHeader.biCompression == BI_BITFIELDS) masks = 3;
2177 size = max( info->bmiHeader.biSize, sizeof(BITMAPINFOHEADER) + masks * sizeof(DWORD) );
2178 return size + colors * colorsize;
2179 }
2180}
2181
2182HPALETTE
2185{
2186 PPALETTE ppalNew;
2187 ULONG nNumColors,i;
2188 USHORT *lpIndex;
2189 HPALETTE hpal;
2190
2191 if (!(ppalDc->flFlags & PAL_INDEXED))
2192 {
2193 return NULL;
2194 }
2195
2196 nNumColors = 1 << lpbmi->bmiHeader.biBitCount;
2197 if (lpbmi->bmiHeader.biClrUsed)
2198 {
2199 nNumColors = min(nNumColors, lpbmi->bmiHeader.biClrUsed);
2200 }
2201
2202 ppalNew = PALETTE_AllocPalWithHandle(PAL_INDEXED, nNumColors, NULL, 0, 0, 0);
2203 if (ppalNew == NULL)
2204 {
2205 DPRINT1("Could not allocate palette\n");
2206 return NULL;
2207 }
2208
2209 lpIndex = (USHORT *)((PBYTE)lpbmi + lpbmi->bmiHeader.biSize);
2210
2211 for (i = 0; i < nNumColors; i++)
2212 {
2213 ULONG iColorIndex = *lpIndex % ppalDc->NumColors;
2214 ppalNew->IndexedColors[i] = ppalDc->IndexedColors[iColorIndex];
2215 lpIndex++;
2216 }
2217
2218 hpal = ppalNew->BaseObject.hHmgr;
2219 PALETTE_UnlockPalette(ppalNew);
2220
2221 return hpal;
2222}
2223
2224/* Converts a BITMAPCOREINFO to a BITMAPINFO structure,
2225 * or does nothing if it's already a BITMAPINFO (or V4 or V5) */
2229{
2231 BITMAPINFO* pNewBmi ;
2232 UINT numColors = 0, ColorsSize = 0;
2233
2234 if(pbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) return (BITMAPINFO*)pbmi;
2235 if(pbmi->bmiHeader.biSize != sizeof(BITMAPCOREHEADER)) return NULL;
2236
2237 if(pbmci->bmciHeader.bcBitCount <= 8)
2238 {
2239 numColors = 1 << pbmci->bmciHeader.bcBitCount;
2240 if(Usage == DIB_PAL_COLORS)
2241 {
2242 ColorsSize = numColors * sizeof(WORD);
2243 }
2244 else
2245 {
2246 ColorsSize = numColors * sizeof(RGBQUAD);
2247 }
2248 }
2249 else if (Usage == DIB_PAL_COLORS)
2250 {
2251 /* Invalid at high-res */
2252 return NULL;
2253 }
2254
2255 pNewBmi = ExAllocatePoolWithTag(PagedPool, sizeof(BITMAPINFOHEADER) + ColorsSize, TAG_DIB);
2256 if(!pNewBmi) return NULL;
2257
2258 RtlZeroMemory(pNewBmi, sizeof(BITMAPINFOHEADER) + ColorsSize);
2259
2260 pNewBmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
2261 pNewBmi->bmiHeader.biBitCount = pbmci->bmciHeader.bcBitCount;
2262 pNewBmi->bmiHeader.biWidth = pbmci->bmciHeader.bcWidth;
2263 pNewBmi->bmiHeader.biHeight = pbmci->bmciHeader.bcHeight;
2264 pNewBmi->bmiHeader.biPlanes = pbmci->bmciHeader.bcPlanes;
2265 pNewBmi->bmiHeader.biCompression = BI_RGB ;
2267 pNewBmi->bmiHeader.biHeight,
2268 pNewBmi->bmiHeader.biBitCount);
2269 pNewBmi->bmiHeader.biClrUsed = numColors;
2270
2271 if(Usage == DIB_PAL_COLORS)
2272 {
2273 RtlCopyMemory(pNewBmi->bmiColors, pbmci->bmciColors, ColorsSize);
2274 }
2275 else
2276 {
2277 UINT i;
2278 for(i=0; i<numColors; i++)
2279 {
2280 pNewBmi->bmiColors[i].rgbRed = pbmci->bmciColors[i].rgbtRed;
2281 pNewBmi->bmiColors[i].rgbGreen = pbmci->bmciColors[i].rgbtGreen;
2282 pNewBmi->bmiColors[i].rgbBlue = pbmci->bmciColors[i].rgbtBlue;
2283 }
2284 }
2285
2286 return pNewBmi ;
2287}
2288
2289/* Frees a BITMAPINFO created with DIB_ConvertBitmapInfo */
2290VOID
2293{
2294 BITMAPCOREINFO* pbmci;
2295 if(converted == orig)
2296 return;
2297
2298 if(usage == -1)
2299 {
2300 /* Caller don't want any conversion */
2301 ExFreePoolWithTag(converted, TAG_DIB);
2302 return;
2303 }
2304
2305 /* Perform inverse conversion */
2306 pbmci = (BITMAPCOREINFO*)orig;
2307
2308 ASSERT(pbmci->bmciHeader.bcSize == sizeof(BITMAPCOREHEADER));
2309 pbmci->bmciHeader.bcBitCount = converted->bmiHeader.biBitCount;
2310 pbmci->bmciHeader.bcWidth = converted->bmiHeader.biWidth;
2311 pbmci->bmciHeader.bcHeight = converted->bmiHeader.biHeight;
2312 pbmci->bmciHeader.bcPlanes = converted->bmiHeader.biPlanes;
2313
2314 if(pbmci->bmciHeader.bcBitCount <= 8)
2315 {
2316 UINT numColors = converted->bmiHeader.biClrUsed;
2317 if(!numColors) numColors = 1 << pbmci->bmciHeader.bcBitCount;
2318 if(usage == DIB_PAL_COLORS)
2319 {
2320 RtlZeroMemory(pbmci->bmciColors, (1 << pbmci->bmciHeader.bcBitCount) * sizeof(WORD));
2321 RtlCopyMemory(pbmci->bmciColors, converted->bmiColors, numColors * sizeof(WORD));
2322 }
2323 else
2324 {
2325 UINT i;
2326 RtlZeroMemory(pbmci->bmciColors, (1 << pbmci->bmciHeader.bcBitCount) * sizeof(RGBTRIPLE));
2327 for(i=0; i<numColors; i++)
2328 {
2329 pbmci->bmciColors[i].rgbtRed = converted->bmiColors[i].rgbRed;
2330 pbmci->bmciColors[i].rgbtGreen = converted->bmiColors[i].rgbGreen;
2331 pbmci->bmciColors[i].rgbtBlue = converted->bmiColors[i].rgbBlue;
2332 }
2333 }
2334 }
2335 /* Now free it, it's not needed anymore */
2336 ExFreePoolWithTag(converted, TAG_DIB);
2337}
2338
2339/* EOF */
static HDC hDC
Definition: 3dtext.c:33
#define DIB_PAL_INDICES
#define CBM_CREATDIB
static HBITMAP hbitmap
#define VOID
Definition: acefi.h:82
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
#define R3_OPINDEX_SRCCOPY
Definition: bitblt.h:27
BOOL APIENTRY IntEngCopyBits(SURFOBJ *psoTrg, SURFOBJ *psoSrc, CLIPOBJ *pco, XLATEOBJ *pxlo, RECTL *prclTrg, POINTL *pptlSrc)
Definition: bitblt_new.c:678
HBITMAP FASTCALL IntCreateCompatibleBitmap(PDC Dc, INT Width, INT Height, UINT Planes, UINT Bpp)
Definition: bitmaps.c:273
HBITMAP NTAPI GreCreateBitmapEx(_In_ ULONG nWidth, _In_ ULONG nHeight, _In_ ULONG cjWidthBytes, _In_ ULONG iFormat, _In_ USHORT fjBitmap, _In_ ULONG cjSizeImage, _In_opt_ PVOID pvBits, _In_ FLONG flags)
Definition: bitmaps.c:101
HBITMAP NTAPI GreCreateBitmap(_In_ ULONG nWidth, _In_ ULONG nHeight, _In_ ULONG cPlanes, _In_ ULONG cBitsPixel, _In_opt_ PVOID pvBits)
Definition: bitmaps.c:172
_In_ fcb _In_ chunk _In_ uint64_t _In_ uint64_t _In_ bool _In_opt_ void _In_opt_ PIRP _In_ LIST_ENTRY _In_ uint8_t compression
Definition: btrfs_drv.h:1365
HGDIOBJ hHmgr(VOID)
Definition: baseobj.hpp:95
static BOOLEAN IntLPtoDP(DC *pdc, PPOINTL ppt, UINT count)
Definition: coord.h:182
HDC dc
Definition: cylfrac.c:34
VOID FASTCALL DC_vPrepareDCsForBlit(PDC pdcDest, const RECT *rcDest, PDC pdcSrc, const RECT *rcSrc)
Definition: dclife.c:505
VOID FASTCALL DC_vFinishBlit(PDC pdc1, PDC pdc2)
Definition: dclife.c:614
FORCEINLINE VOID DC_UnlockDc(PDC pdc)
Definition: dc.h:238
VOID FASTCALL IntUpdateBoundsRect(PDC, PRECTL)
Definition: dcutil.c:694
HPALETTE NTAPI GdiSelectPalette(_In_ HDC hDC, _In_ HPALETTE hpal, _In_ BOOL ForceBackground)
@ DCTYPE_INFO
Definition: dc.h:43
@ DC_ACCUM_APP
Definition: dc.h:25
@ DC_ACCUM_WMGR
Definition: dc.h:24
FORCEINLINE PDC DC_LockDc(HDC hdc)
Definition: dc.h:220
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
HBITMAP NTAPI GreCreateDIBitmapFromPackedDIB(_In_reads_(cjPackedDIB) PVOID pvPackedDIB, _In_ UINT cjPackedDIB, _In_ ULONG uUsage)
Definition: dibobj.c:1784
static const RGBQUAD DefLogPaletteQuads[20]
Definition: dibobj.c:14
BITMAPINFO *FASTCALL DIB_ConvertBitmapInfo(CONST BITMAPINFO *pbmi, DWORD Usage)
Definition: dibobj.c:2228
int FASTCALL DIB_GetBitmapInfo(const BITMAPINFOHEADER *header, LONG *width, LONG *height, WORD *planes, WORD *bpp, DWORD *compr, DWORD *size)
Definition: dibobj.c:2108
VOID FASTCALL DIB_FreeConvertedBitmapInfo(BITMAPINFO *converted, BITMAPINFO *orig, DWORD usage)
Definition: dibobj.c:2292
static INT FASTCALL IntSetDIBits(PDC DC, HBITMAP hBitmap, UINT StartScan, UINT ScanLines, CONST VOID *Bits, ULONG cjMaxBits, CONST BITMAPINFO *bmi, UINT ColorUse)
Definition: dibobj.c:239
INT FASTCALL DIB_BitmapInfoSize(const BITMAPINFO *info, WORD coloruse)
Definition: dibobj.c:2155
W32KAPI INT APIENTRY NtGdiSetDIBitsToDeviceInternal(IN HDC hDC, IN INT XDest, IN INT YDest, IN DWORD Width, IN DWORD Height, IN INT XSrc, IN INT YSrc, IN DWORD StartScan, IN DWORD ScanLines, IN LPBYTE Bits, IN LPBITMAPINFO bmi, IN DWORD ColorUse, IN UINT cjMaxBits, IN UINT cjMaxInfo, IN BOOL bTransformCoordinates, IN OPTIONAL HANDLE hcmXform)
Definition: dibobj.c:470
HBITMAP NTAPI GreCreateDIBitmapInternal(IN HDC hDc, IN INT cx, IN INT cy, IN DWORD fInit, IN OPTIONAL LPBYTE pjInit, IN OPTIONAL PBITMAPINFO pbmi, IN DWORD iUsage, IN FLONG fl, IN UINT cjMaxBits, IN HANDLE hcmXform)
Definition: dibobj.c:1708
HBITMAP APIENTRY NtGdiCreateDIBSection(IN HDC hDC, IN OPTIONAL HANDLE hSection, IN DWORD dwOffset, IN BITMAPINFO *bmi, IN DWORD Usage, IN UINT cjHeader, IN FLONG fl, IN ULONG_PTR dwColorSpace, OUT PVOID *Bits)
Definition: dibobj.c:1835
HPALETTE FASTCALL DIB_MapPaletteColors(PPALETTE ppalDc, CONST BITMAPINFO *lpbmi)
Definition: dibobj.c:2184
static HBITMAP IntGdiCreateMaskFromRLE(DWORD Width, DWORD Height, ULONG Compression, const BYTE *Bits, DWORD BitsSize)
Definition: dibobj.c:360
INT APIENTRY DIB_GetDIBImageBytes(INT width, INT height, INT depth)
Definition: dibobj.c:2143
W32KAPI INT APIENTRY NtGdiStretchDIBitsInternal(IN HDC hdc, IN INT xDst, IN INT yDst, IN INT cxDst, IN INT cyDst, IN INT xSrc, IN INT ySrc, IN INT cxSrc, IN INT cySrc, IN OPTIONAL LPBYTE pjInit, IN LPBITMAPINFO pbmi, IN DWORD dwUsage, IN DWORD dwRop, IN UINT cjMaxInfo, IN UINT cjMaxBits, IN HANDLE hcmXform)
Definition: dibobj.c:1213
PPALETTE NTAPI CreateDIBPalette(_In_ const BITMAPINFO *pbmi, _In_ PDC pdc, _In_ ULONG iUsage)
Definition: dibobj.c:41
INT APIENTRY GreGetDIBitsInternal(HDC hDC, HBITMAP hBitmap, UINT StartScan, UINT ScanLines, LPBYTE Bits, LPBITMAPINFO Info, UINT Usage, UINT MaxBits, UINT MaxInfo)
Definition: dibobj.c:707
HBITMAP APIENTRY NtGdiCreateDIBitmapInternal(IN HDC hDc, IN INT cx, IN INT cy, IN DWORD fInit, IN OPTIONAL LPBYTE pjInit, IN OPTIONAL LPBITMAPINFO pbmi, IN DWORD iUsage, IN UINT cjMaxInitInfo, IN UINT cjMaxBits, IN FLONG fl, IN HANDLE hcmXform)
Definition: dibobj.c:1634
HBITMAP APIENTRY DIB_CreateDIBSection(PDC dc, CONST BITMAPINFO *bmi, UINT usage, LPVOID *bits, HANDLE section, DWORD offset, DWORD ovr_pitch)
Definition: dibobj.c:1902
HBITMAP FASTCALL IntCreateDIBitmap(PDC Dc, INT width, INT height, UINT planes, UINT bpp, ULONG compression, DWORD init, LPBYTE bits, ULONG cjMaxBits, PBITMAPINFO data, DWORD coloruse)
Definition: dibobj.c:1530
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
static HBITMAP hBitmap
Definition: timezone.c:26
DWORD bpp
Definition: surface.c:185
#define APIENTRY
Definition: api.h:79
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
static void cleanup(void)
Definition: main.c:1335
#define BI_RLE4
Definition: precomp.h:57
#define BI_RGB
Definition: precomp.h:56
#define RGB(r, g, b)
Definition: precomp.h:71
ULONG RGBQUAD
Definition: precomp.h:59
return ret
Definition: mutex.c:146
#define UlongToPtr(u)
Definition: config.h:106
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
Definition: exintrin.c:102
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
Definition: exintrin.c:143
#define abs(i)
Definition: fconv.c:206
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
NTSYSAPI NTSTATUS NTAPI ZwQuerySystemInformation(IN SYSTEM_INFORMATION_CLASS SystemInfoClass, OUT PVOID SystemInfoBuffer, IN ULONG SystemInfoBufferSize, OUT PULONG BytesReturned OPTIONAL)
@ SystemBasicInformation
Definition: ntddk_ex.h:11
unsigned int Mask
Definition: fpcontrol.c:82
#define GDI_OBJECT_TYPE_PALETTE
Definition: gdi.h:49
Status
Definition: gdiplustypes.h:25
GLint GLint GLsizei GLsizei GLsizei depth
Definition: gl.h:1546
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLint GLint GLsizei width
Definition: gl.h:1546
GLuint res
Definition: glext.h:9613
GLsizeiptr size
Definition: glext.h:5919
GLintptr offset
Definition: glext.h:5920
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
Definition: glext.h:10929
GLuint64EXT * result
Definition: glext.h:11304
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919
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
_Must_inspect_result_ _In_ USAGE _In_ USHORT _In_ USAGE Usage
Definition: hidpi.h:384
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
#define ROP4_FROM_INDEX(index)
Definition: inteng.h:42
#define ROP4_MASK
Definition: inteng.h:55
BOOL APIENTRY IntEngStretchBlt(SURFOBJ *DestObj, SURFOBJ *SourceObj, SURFOBJ *Mask, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, COLORADJUSTMENT *pca, RECTL *DestRect, RECTL *SourceRect, POINTL *pMaskOrigin, BRUSHOBJ *Brush, POINTL *BrushOrigin, ULONG Mode)
#define WIN32_ROP3_TO_ENG_ROP4(dwRop4)
Definition: intgdi.h:4
if(dx< 0)
Definition: linetemp.h:194
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define BI_BITFIELDS
Definition: mmreg.h:507
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
BITMAP bmp
Definition: alphablend.c:62
HDC hdc
Definition: main.c:9
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:88
static const BYTE masks[8]
Definition: dib.c:2760
#define min(a, b)
Definition: monoChain.cc:55
unsigned int UINT
Definition: ndis.h:50
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER SectionOffset
Definition: mmfuncs.h:407
#define _In_reads_(s)
Definition: no_sal2.h:168
#define _Inout_
Definition: no_sal2.h:162
#define _Success_(c)
Definition: no_sal2.h:84
#define _Out_writes_bytes_opt_(s)
Definition: no_sal2.h:228
#define _In_
Definition: no_sal2.h:158
#define PAGE_READWRITE
Definition: nt_native.h:1307
#define FASTCALL
Definition: nt_native.h:50
#define NtCurrentProcess()
Definition: nt_native.h:1660
@ ViewShare
Definition: nt_native.h:1281
unsigned long FLONG
Definition: ntbasedef.h:378
_In_ HBITMAP hbm
Definition: ntgdi.h:2776
__kernel_entry W32KAPI HBITMAP APIENTRY NtGdiCreateCompatibleBitmap(_In_ HDC hdc, _In_ INT cx, _In_ INT cy)
_In_ HBITMAP _In_ UINT _In_ UINT _Inout_ LPBITMAPINFO _In_ UINT _In_ UINT _In_ UINT cjMaxInfo
Definition: ntgdi.h:2783
_In_ HBITMAP _In_ UINT _In_ UINT _Inout_ LPBITMAPINFO _In_ UINT _In_ UINT cjMaxBits
Definition: ntgdi.h:2782
__kernel_entry W32KAPI HDC APIENTRY NtGdiCreateCompatibleDC(_In_opt_ HDC hdc)
_In_ DWORD _In_ DWORD dwOffset
Definition: ntgdi.h:2033
__kernel_entry W32KAPI BOOL APIENTRY NtGdiBitBlt(_In_ HDC hdcDst, _In_ INT x, _In_ INT y, _In_ INT cx, _In_ INT cy, _In_opt_ HDC hdcSrc, _In_ INT xSrc, _In_ INT ySrc, _In_ DWORD rop4, _In_ DWORD crBackColor, _In_ FLONG fl)
#define W32KAPI
Definition: ntgdi.h:9
__kernel_entry W32KAPI BOOL APIENTRY NtGdiStretchBlt(_In_ HDC hdcDst, _In_ INT xDst, _In_ INT yDst, _In_ INT cxDst, _In_ INT cyDst, _In_opt_ HDC hdcSrc, _In_ INT xSrc, _In_ INT ySrc, _In_ INT cxSrc, _In_ INT cySrc, _In_ DWORD dwRop, _In_ DWORD dwBackColor)
_In_ HBITMAP _In_ UINT _In_ UINT cScans
Definition: ntgdi.h:2778
__kernel_entry W32KAPI HBITMAP APIENTRY NtGdiSelectBitmap(_In_ HDC hdc, _In_ HBITMAP hbm)
_In_ HBITMAP _In_ UINT _In_ UINT _Inout_ LPBITMAPINFO pbmi
Definition: ntgdi.h:2780
__kernel_entry W32KAPI HANDLE APIENTRY NtGdiGetDCObject(_In_ HDC hdc, _In_ INT itype)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiDeleteObjectApp(_In_ HANDLE hobj)
_In_ HBITMAP _In_ UINT _In_ UINT _Inout_ LPBITMAPINFO _In_ UINT iUsage
Definition: ntgdi.h:2781
_In_ HBITMAP _In_ UINT iStartScan
Definition: ntgdi.h:2777
#define CONST
Definition: pedump.c:81
WORD * PWORD
Definition: pedump.c:67
BYTE * PBYTE
Definition: pedump.c:66
DWORD * PDWORD
Definition: pedump.c:68
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
_Out_opt_ int * cx
Definition: commctrl.h:585
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:181
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:82
#define _SEH2_END
Definition: pseh2_64.h:171
#define _SEH2_TRY
Definition: pseh2_64.h:71
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
static void Exit(void)
Definition: sock.c:1330
#define __kernel_entry
Definition: specstrings.h:355
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
DWORD bV4GreenMask
Definition: wingdi.h:1950
DWORD bV4RedMask
Definition: wingdi.h:1949
DWORD bV4BlueMask
Definition: wingdi.h:1951
Definition: polytest.cpp:41
long bottom
Definition: polytest.cpp:53
long right
Definition: polytest.cpp:53
long top
Definition: polytest.cpp:53
long left
Definition: polytest.cpp:53
BITMAPCOREHEADER bmciHeader
Definition: wingdi.h:1899
RGBTRIPLE bmciColors[1]
Definition: wingdi.h:1900
Definition: bl.h:1331
XLATEOBJ xlo
Definition: xlateobj.h:21
BASEOBJECT BaseObject
Definition: palette.h:36
ULONG NumColors
Definition: palette.h:41
PALETTEENTRY * IndexedColors
Definition: palette.h:42
FLONG flFlags
Definition: palette.h:40
LONG y
Definition: windef.h:124
LONG x
Definition: windef.h:123
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
SURFOBJ SurfObj
Definition: surface.h:8
HANDLE hSecure
Definition: surface.h:32
struct _PALETTE *const ppal
Definition: surface.h:11
USHORT fjBitmap
Definition: winddi.h:1217
SIZEL sizlBitmap
Definition: winddi.h:1209
PVOID pvBits
Definition: winddi.h:1211
ULONG iBitmapFormat
Definition: winddi.h:1215
Definition: parser.c:56
USHORT biBitCount
Definition: precomp.h:46
ULONG biCompression
Definition: precomp.h:47
BITMAPINFOHEADER bmiHeader
Definition: wingdi.h:1922
RGBQUAD bmiColors[1]
Definition: wingdi.h:1923
Definition: windef.h:99
LONG right
Definition: windef.h:102
LONG bottom
Definition: windef.h:103
LONG top
Definition: windef.h:101
LONG left
Definition: windef.h:100
UCHAR rgbBlue
Definition: bootanim.c:103
UCHAR rgbRed
Definition: bootanim.c:105
UCHAR rgbGreen
Definition: bootanim.c:104
BYTE rgbtGreen
Definition: wingdi.h:1885
BYTE rgbtBlue
Definition: wingdi.h:1884
BYTE rgbtRed
Definition: wingdi.h:1886
#define max(a, b)
Definition: svc.c:63
#define WIDTH_BYTES_ALIGN32(cx, bpp)
Definition: swimpl.c:16
unsigned char * LPBYTE
Definition: typedefs.h:53
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
PVOID HANDLE
Definition: typedefs.h:73
ULONG_PTR SIZE_T
Definition: typedefs.h:80
int32_t INT
Definition: typedefs.h:58
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
char * PCHAR
Definition: typedefs.h:51
_In_ HFONT _Out_ PUINT _Out_ PUINT Width
Definition: font.h:89
_In_ HFONT _Out_ PUINT Height
Definition: font.h:88
static int __cdecl compr(const void *a, const void *b)
Definition: bidi.c:641
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690
HDC hdcMem
Definition: welcome.c:104
VOID DIB_1BPP_HLine(SURFOBJ *, LONG, LONG, LONG, ULONG)
Definition: dib1bpp.c:38
BOOL APIENTRY IntEngBitBlt(SURFOBJ *psoTrg, SURFOBJ *psoSrc, SURFOBJ *psoMask, CLIPOBJ *pco, XLATEOBJ *pxlo, RECTL *prclTrg, POINTL *pptlSrc, POINTL *pptlMask, BRUSHOBJ *pbo, POINTL *pptlBrush, ROP4 Rop4)
Definition: bitblt.c:656
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
Definition: error.c:31
ULONG FASTCALL BitmapFormat(ULONG cBits, ULONG iCompression)
Definition: surface.c:39
#define SURFACE_ShareUnlockSurface(pBMObj)
Definition: surface.h:102
FORCEINLINE VOID SURFACE_vSetPalette(_Inout_ PSURFACE psurf, _In_ PPALETTE ppal)
Definition: surface.h:136
@ API_BITMAP
Definition: surface.h:76
#define SURFACE_ShareLockSurface(hBMObj)
Definition: surface.h:91
#define BitsPerFormat(Format)
Definition: surface.h:109
#define DIB_PAL_BRUSHHACK
Definition: dib.h:36
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
Definition: gdiobj.c:1165
PPALETTE NTAPI PALETTE_AllocPalWithHandle(_In_ ULONG iMode, _In_ ULONG cColors, _In_opt_ const PALETTEENTRY *pEntries, _In_ FLONG flRed, _In_ FLONG flGreen, _In_ FLONG flBlue)
Definition: palette.c:209
PPALETTE NTAPI PALETTE_AllocPalette(_In_ ULONG iMode, _In_ ULONG cColors, _In_opt_ const PALETTEENTRY *pEntries, _In_ FLONG flRed, _In_ FLONG flGreen, _In_ FLONG flBlue)
Definition: palette.c:135
PALETTE * gppalDefault
Definition: palette.c:20
#define PALETTE_UnlockPalette(pPalette)
Definition: palette.h:56
FORCEINLINE VOID PALETTE_vSetRGBColorForIndex(PPALETTE ppal, ULONG ulIndex, COLORREF crColor)
Definition: palette.h:152
@ PAL_BRUSHHACK
Definition: palette.h:23
#define PALETTE_ShareLockPalette(hpal)
Definition: palette.h:57
#define PALETTE_ShareUnlockPalette(ppal)
Definition: palette.h:59
FORCEINLINE ULONG PALETTE_ulGetRGBColorFromIndex(PPALETTE ppal, ULONG ulIndex)
Definition: palette.h:142
VOID FASTCALL RECTL_vMakeWellOrdered(_Inout_ RECTL *prcl)
Definition: rect.c:81
FORCEINLINE VOID RECTL_vSetRect(_Out_ RECTL *prcl, _In_ LONG left, _In_ LONG top, _In_ LONG right, _In_ LONG bottom)
Definition: rect.h:5
FORCEINLINE VOID RECTL_vOffsetRect(_Inout_ RECTL *prcl, _In_ INT cx, _In_ INT cy)
Definition: rect.h:31
#define TAG_DIB
Definition: tags.h:17
ENGAPI BOOL APIENTRY EngDeleteSurface(_In_ _Post_ptr_invalid_ HSURF hsurf)
Definition: surface.c:567
_In_ FLONG fl
Definition: winddi.h:1279
#define BMF_1BPP
Definition: winddi.h:355
#define PAL_BITFIELDS
Definition: winddi.h:1562
_In_ HANDLE hcmXform
Definition: winddi.h:3687
ENGAPI SURFOBJ *APIENTRY EngLockSurface(_In_ HSURF hsurf)
Definition: surface.c:607
#define BMF_DONTCACHE
Definition: winddi.h:1182
_In_ ULONG _In_ ULONG rgb
Definition: winddi.h:3521
ENGAPI VOID APIENTRY EngFreeUserMem(_Pre_notnull_ __drv_freesMem(UserMem) PVOID pv)
#define BMF_TOPDOWN
Definition: winddi.h:1180
#define BMF_USERMEM
Definition: winddi.h:1183
typedef HSURF(APIENTRY FN_DrvEnableSurface)(_In_ DHPDEV dhpdev)
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:22
ENGAPI HANDLE APIENTRY EngSecureMem(_In_reads_bytes_(cjLength) PVOID Address, _In_ ULONG cjLength)
#define PAL_INDEXED
Definition: winddi.h:1561
#define BMF_NOZEROINIT
Definition: winddi.h:1181
ENGAPI VOID APIENTRY EngUnsecureMem(_In_ HANDLE hSecure)
ENGAPI VOID APIENTRY EngUnlockSurface(_In_ _Post_ptr_invalid_ SURFOBJ *pso)
Definition: surface.c:628
DWORD COLORREF
Definition: windef.h:94
#define ERROR_NO_SYSTEM_RESOURCES
Definition: winerror.h:1276
_In_ const BITMAPINFO _In_ UINT _In_opt_ HANDLE hSection
Definition: wingdi.h:3685
struct _BITMAPCOREINFO * PBITMAPCOREINFO
#define DIB_RGB_COLORS
Definition: wingdi.h:367
#define DIB_PAL_COLORS
Definition: wingdi.h:366
#define SRCCOPY
Definition: wingdi.h:333
struct BITMAPV4HEADER * PBITMAPV4HEADER
#define CBM_INIT
Definition: wingdi.h:365
#define BI_RLE8
Definition: wingdi.h:35
static int init
Definition: wintirpc.c:33
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
VOID NTAPI EXLATEOBJ_vCleanup(_Inout_ PEXLATEOBJ pexlo)
Definition: xlateobj.c:649
unsigned char BYTE
Definition: xxhash.c:193