ReactOS 0.4.17-dev-1268-g5608ce5
bitmap.c
Go to the documentation of this file.
1#include <precomp.h>
2
3#include <pseh/pseh2.h>
4
5#define NDEBUG
6#include <debug.h>
7
8/* Copied from win32ss/gdi/eng/surface.c */
11BitmapFormat(ULONG cBits, ULONG iCompression)
12{
13 switch (iCompression)
14 {
15 case BI_RGB:
16 /* Fall through */
17 case BI_BITFIELDS:
18 if (cBits <= 1) return BMF_1BPP;
19 if (cBits <= 4) return BMF_4BPP;
20 if (cBits <= 8) return BMF_8BPP;
21 if (cBits <= 16) return BMF_16BPP;
22 if (cBits <= 24) return BMF_24BPP;
23 if (cBits <= 32) return BMF_32BPP;
24 return 0;
25
26 case BI_RLE4:
27 return BMF_4RLE;
28
29 case BI_RLE8:
30 return BMF_8RLE;
31
32 default:
33 return 0;
34 }
35}
36
37/* Copied from win32ss/gdi/eng/surface.c */
40{
41 0, /* 0: unused */
42 1, /* 1: BMF_1BPP */
43 4, /* 2: BMF_4BPP */
44 8, /* 3: BMF_8BPP */
45 16, /* 4: BMF_16BPP */
46 24, /* 5: BMF_24BPP */
47 32, /* 6: BMF_32BPP */
48 4, /* 7: BMF_4RLE */
49 8, /* 8: BMF_8RLE */
50 0, /* 9: BMF_JPEG */
51 0, /* 10: BMF_PNG */
52};
53
54// From Yuan, ScanLineSize = (Width * bitcount + 31)/32
55#define WIDTH_BYTES_ALIGN32(cx, bpp) ((((cx) * (bpp) + 31) & ~31) >> 3)
56
57/*
58 * DIB_BitmapInfoSize
59 *
60 * Return the size of the bitmap info structure including color table.
61 * 11/16/1999 (RJJ) lifted from wine
62 */
63
64INT
66 const BITMAPINFO * info,
67 WORD coloruse,
68 BOOL max)
69{
70 unsigned int colors, size, masks = 0;
71
72 if (info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
73 {
74 const BITMAPCOREHEADER *core = (const BITMAPCOREHEADER *) info;
75 size = sizeof(BITMAPCOREHEADER);
76 if (core->bcBitCount == 0)
77 {
78 return size;
79 }
80 if (core->bcBitCount <= 8)
81 {
82 colors = 1 << core->bcBitCount;
83 if (coloruse == DIB_RGB_COLORS)
84 size += colors * sizeof(RGBTRIPLE);
85 else
86 size += colors * sizeof(WORD);
87 }
88 return size;
89 }
90 else /* assume BITMAPINFOHEADER */
91 {
92 if (info->bmiHeader.biBitCount == 0)
93 {
94 return info->bmiHeader.biSize;
95 }
96 colors = max ? (1 << info->bmiHeader.biBitCount) : info->bmiHeader.biClrUsed;
97 if (colors > 256)
98 colors = 256;
99 if (!colors && (info->bmiHeader.biBitCount <= 8))
100 colors = 1 << info->bmiHeader.biBitCount;
101 if (info->bmiHeader.biCompression == BI_BITFIELDS)
102 masks = 3;
103 size = max(info->bmiHeader.biSize, sizeof(BITMAPINFOHEADER) + masks * sizeof(DWORD));
104 return size + colors * ((coloruse == DIB_RGB_COLORS) ? sizeof(RGBQUAD) : sizeof(WORD));
105 }
106}
107
108/*
109 * Return the full scan size for a bitmap.
110 *
111 * Based on Wine, Utils.c and Windows Graphics Prog pg 595, SDK amvideo.h.
112 */
113UINT
117 UINT ScanLines)
118{
119 UINT Ret;
120
121 if (!Info)
122 return 0;
123
124 if (Info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
125 {
127 Ret = WIDTH_BYTES_ALIGN32(Core->bcWidth * Core->bcPlanes,
128 Core->bcBitCount) * ScanLines;
129 }
130 else /* assume BITMAPINFOHEADER */
131 {
132 if ((Info->bmiHeader.biCompression == BI_RGB) || (Info->bmiHeader.biCompression == BI_BITFIELDS))
133 {
135 Info->bmiHeader.biWidth * Info->bmiHeader.biPlanes,
136 Info->bmiHeader.biBitCount) * ScanLines;
137 }
138 else
139 {
140 Ret = Info->bmiHeader.biSizeImage;
141 }
142 }
143 return Ret;
144}
145
146/*
147 * DIB_GetBitmapInfo is complete copy of wine cvs 2/9-2006
148 * from file dib.c from gdi32.dll or orginal version
149 * did not calc the info right for some headers.
150 */
151INT
152WINAPI
155 PLONG width,
157 PWORD planes,
158 PWORD bpp,
159 PLONG compr,
160 PLONG size)
161{
162 if (header->biSize == sizeof(BITMAPCOREHEADER))
163 {
165 *width = core->bcWidth;
166 *height = core->bcHeight;
167 *planes = core->bcPlanes;
168 *bpp = core->bcBitCount;
169 *compr = 0;
170 *size = 0;
171 return 0;
172 }
173
174 if (header->biSize == sizeof(BITMAPINFOHEADER))
175 {
176 *width = header->biWidth;
177 *height = header->biHeight;
178 *planes = header->biPlanes;
179 *bpp = header->biBitCount;
180 *compr = header->biCompression;
181 *size = header->biSizeImage;
182 return 1;
183 }
184
185 if (header->biSize == sizeof(BITMAPV4HEADER))
186 {
188 *width = v4hdr->bV4Width;
189 *height = v4hdr->bV4Height;
190 *planes = v4hdr->bV4Planes;
191 *bpp = v4hdr->bV4BitCount;
192 *compr = v4hdr->bV4V4Compression;
193 *size = v4hdr->bV4SizeImage;
194 return 4;
195 }
196
197 if (header->biSize == sizeof(BITMAPV5HEADER))
198 {
199 BITMAPV5HEADER *v5hdr = (BITMAPV5HEADER *) header;
200 *width = v5hdr->bV5Width;
201 *height = v5hdr->bV5Height;
202 *planes = v5hdr->bV5Planes;
203 *bpp = v5hdr->bV5BitCount;
204 *compr = v5hdr->bV5Compression;
205 *size = v5hdr->bV5SizeImage;
206 return 5;
207 }
208 DPRINT("(%lu): wrong size for header\n", header->biSize);
209 return -1;
210}
211
212/*
213 * @implemented
214 */
215int
216WINAPI
218 BITMAPINFO *lpbmi)
219{
220 UINT Ret;
221
222 if (!lpbmi)
223 return 0;
224
225 if (lpbmi->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
226 {
228 Ret =
230 Core->bcBitCount) * Core->bcHeight;
231 }
232 else /* assume BITMAPINFOHEADER */
233 {
234 if (!(lpbmi->bmiHeader.biCompression) || (lpbmi->bmiHeader.biCompression == BI_BITFIELDS))
235 {
237 lpbmi->bmiHeader.biWidth * lpbmi->bmiHeader.biPlanes,
238 lpbmi->bmiHeader.biBitCount) * abs(lpbmi->bmiHeader.biHeight);
239 }
240 else
241 {
242 Ret = lpbmi->bmiHeader.biSizeImage;
243 }
244 }
245 return Ret;
246}
247
248/*
249 * @implemented
250 */
252WINAPI
254 HDC hDC,
255 CONST BITMAPINFO *BitmapInfo,
256 UINT Usage,
257 VOID **Bits,
260{
261 PBITMAPINFO pConvertedInfo;
262 UINT ConvertedInfoSize;
264 PVOID bmBits = NULL;
265
266 pConvertedInfo = ConvertBitmapInfo(BitmapInfo,
267 Usage,
268 &ConvertedInfoSize,
269 FALSE);
270 if (pConvertedInfo)
271 {
272 // Verify header due to converted may == info.
273 if (pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER))
274 {
275 if (pConvertedInfo->bmiHeader.biCompression == BI_JPEG ||
276 pConvertedInfo->bmiHeader.biCompression == BI_PNG)
277 {
279 return NULL;
280 }
281 }
283 hSection,
284 dwOffset,
285 pConvertedInfo,
286 Usage,
287 ConvertedInfoSize,
288 0, // fl
289 0, // dwColorSpace
290 &bmBits);
291 if (!hBitmap)
292 bmBits = NULL;
293
294 if (BitmapInfo != pConvertedInfo)
295 RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo);
296 }
297
298 if (Bits)
299 *Bits = bmBits;
300
301 return hBitmap;
302}
303
304
305/*
306 * @implemented
307 */
309WINAPI
311 INT Width,
312 INT Height,
313 UINT Planes,
314 UINT BitsPixel,
315 CONST VOID* pUnsafeBits)
316{
317 if (Width && Height)
318 {
319 return NtGdiCreateBitmap(Width, Height, Planes, BitsPixel, (LPBYTE) pUnsafeBits);
320 }
321 else
322 {
323 /* Return 1x1 bitmap */
325 }
326}
327
328/*
329 * @implemented
330 */
332WINAPI
334 const BITMAP *pbm)
335{
337
338 /* Note windows xp/2003 does not check if pbm is NULL or not */
339 if ((pbm->bmWidthBytes != 0) && (!(pbm->bmWidthBytes & 1)))
340
341 {
342 bitmap = CreateBitmap(pbm->bmWidth, pbm->bmHeight, pbm->bmPlanes, pbm->bmBitsPixel,
343 pbm->bmBits);
344 }
345 else
346 {
348 }
349
350 return bitmap;
351}
352
354WINAPI
356 HDC hDC,
357 INT Width,
358 INT Height)
359{
361}
362
364WINAPI
366 HDC hDC,
367 INT Width,
368 INT Height)
369{
370 PDC_ATTR pDc_Attr;
371
373 return NULL;
374
375 if (!Width || !Height)
377
378 if (!(pDc_Attr->ulDirty_ & DC_DIBSECTION))
379 {
381 }
382 else
383 {
384 HBITMAP hBmp = NULL;
385 struct
386 {
388 BITMAPINFOHEADER bmih;
389 RGBQUAD rgbquad[256];
390 } buffer;
391 DIBSECTION* pDIBs = (DIBSECTION*) &buffer;
392 BITMAPINFO* pbmi = (BITMAPINFO*) &buffer.bmih;
393
395
396 if (GetObjectA(hBmp, sizeof(DIBSECTION), pDIBs) != sizeof(DIBSECTION))
397 return NULL;
398
399 if (pDIBs->dsBm.bmBitsPixel <= 8)
400 GetDIBColorTable(hDC, 0, 256, buffer.rgbquad);
401
402 pDIBs->dsBmih.biWidth = Width;
403 pDIBs->dsBmih.biHeight = Height;
404
406 }
407 return NULL;
408}
409
410INT
411WINAPI
413 HDC hDC,
415 UINT uStartScan,
416 UINT cScanLines,
417 LPVOID lpvBits,
418 LPBITMAPINFO lpbmi,
419 UINT uUsage)
420{
422 UINT cjInfoSize;
423
424 if (!hDC || !GdiValidateHandle((HGDIOBJ) hDC) || !lpbmi)
425 {
427 return 0;
428 }
429
430 /* Caller must provide maximum size possible */
431 cjInfoSize = DIB_BitmapInfoSize(lpbmi, uUsage, TRUE);
432
433 if (lpvBits)
434 {
435 if (lpbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER))
436 {
437 if (lpbmi->bmiHeader.biCompression == BI_JPEG
438 || lpbmi->bmiHeader.biCompression == BI_PNG)
439 {
441 return 0;
442 }
443 }
444 cjMaxBits = DIB_BitmapMaxBitsSize(lpbmi, cScanLines);
445 }
446 else
447 {
448 cjMaxBits = 0;
449 }
450
452 hbmp,
453 uStartScan,
454 cScanLines,
455 lpvBits,
456 lpbmi,
457 uUsage,
458 cjMaxBits,
459 cjInfoSize);
460}
461
462/*
463 * @implemented
464 */
466WINAPI
468 HDC hDC,
470 DWORD Init,
471 LPCVOID Bits,
472 const BITMAPINFO *Data,
473 UINT ColorUse)
474{
475 LONG Width, Height, Compression, DibSize;
476 WORD Planes, BitsPerPixel;
477// PDC_ATTR pDc_Attr;
478 UINT cjBmpScanSize = 0;
480 PBITMAPINFO pbmiConverted;
481 UINT cjInfoSize;
482
483 /* Convert the BITMAPINFO if it is a COREINFO */
484 pbmiConverted = ConvertBitmapInfo(Data, ColorUse, &cjInfoSize, FALSE);
485
486 /* Check for CBM_CREATDIB */
487 if (Init & CBM_CREATDIB)
488 {
489 if (cjInfoSize == 0)
490 {
491 goto Exit;
492 }
493 else if (Init & CBM_INIT)
494 {
495 if (Bits == NULL)
496 {
497 goto Exit;
498 }
499 }
500 else
501 {
502 Bits = NULL;
503 }
504
505 /* CBM_CREATDIB needs Data. */
506 if (pbmiConverted == NULL)
507 {
508 DPRINT1("CBM_CREATDIB needs a BITMAPINFO!\n");
509 goto Exit;
510 }
511
512 /* It only works with PAL or RGB */
513 if (ColorUse > DIB_PAL_COLORS)
514 {
515 DPRINT1("Invalid ColorUse: %lu\n", ColorUse);
517 goto Exit;
518 }
519
520 /* Use the header from the data */
521 Header = &Data->bmiHeader;
522 }
523 else
524 {
525 if (Init & CBM_INIT)
526 {
527 if (Bits != NULL)
528 {
529 if (cjInfoSize == 0)
530 {
531 goto Exit;
532 }
533 }
534 else
535 {
536 Init &= ~CBM_INIT;
537 }
538 }
539 }
540
541 /* Header is required */
542 if (!Header)
543 {
544 DPRINT1("Header is NULL\n");
546 goto Exit;
547 }
548
549 /* Get the bitmap format and dimensions */
550 if (DIB_GetBitmapInfo(Header, &Width, &Height, &Planes, &BitsPerPixel, &Compression, &DibSize) == -1)
551 {
552 DPRINT1("DIB_GetBitmapInfo failed!\n");
554 goto Exit;
555 }
556
557 /* Check if the Compr is incompatible */
558 if ((Compression == BI_JPEG) || (Compression == BI_PNG))
559 {
560 DPRINT1("Invalid compression: %lu!\n", Compression);
561 goto Exit;
562 }
563
564 /* Only DIB_RGB_COLORS (0), DIB_PAL_COLORS (1) and 2 are valid. */
565 if (ColorUse > DIB_PAL_COLORS + 1)
566 {
567 DPRINT1("Invalid compression: %lu!\n", Compression);
569 goto Exit;
570 }
571
572 /* If some Bits are given, only DIB_PAL_COLORS and DIB_RGB_COLORS are valid */
573 if (Bits && (ColorUse > DIB_PAL_COLORS))
574 {
575 DPRINT1("Invalid ColorUse: %lu\n", ColorUse);
577 goto Exit;
578 }
579
580 /* Negative width is not allowed */
581 if (Width < 0)
582 {
583 DPRINT1("Negative width: %li\n", Width);
584 goto Exit;
585 }
586
587 /* Top-down DIBs have a negative height. */
588 Height = abs(Height);
589
590// For Icm support.
591// GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
592
593 cjBmpScanSize = GdiGetBitmapBitsSize(pbmiConverted);
594
595 DPRINT("pBMI %p, Size bpp %u, dibsize %d, Conv %u, BSS %u\n",
596 Data, BitsPerPixel, DibSize, cjInfoSize, cjBmpScanSize);
597
598 if (!Width || !Height)
599 {
601 }
602 else
603 {
605 Width,
606 Height,
607 Init,
608 (LPBYTE)Bits,
609 (LPBITMAPINFO)pbmiConverted,
610 ColorUse,
611 cjInfoSize,
612 cjBmpScanSize,
613 0, 0);
614 }
615
616Exit:
617 /* Cleanup converted BITMAPINFO */
618 if ((pbmiConverted != NULL) && (pbmiConverted != Data))
619 {
620 RtlFreeHeap(RtlGetProcessHeap(), 0, pbmiConverted);
621 }
622
623 return hBitmap;
624}
625
626/*
627 * @implemented
628 */
629INT
630WINAPI
632 HDC hDC,
634 UINT uStartScan,
635 UINT cScanLines,
636 CONST VOID *lpvBits,
637 CONST BITMAPINFO *lpbmi,
638 UINT fuColorUse)
639{
640 HDC hDCc, SavehDC, nhDC;
641 DWORD dwWidth, dwHeight;
642 HGDIOBJ hOldBitmap;
643 HPALETTE hPal = NULL;
644 INT LinesCopied = 0;
645 BOOL newDC = FALSE;
646
647 if (fuColorUse != DIB_RGB_COLORS && fuColorUse != DIB_PAL_COLORS)
648 return 0;
649
651 return 0;
652
653 if (lpbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER))
654 {
655 if (lpbmi->bmiHeader.biCompression == BI_JPEG
656 || lpbmi->bmiHeader.biCompression == BI_PNG)
657 {
659 return 0;
660 }
661 }
662
663 if (lpbmi->bmiHeader.biCompression == BI_BITFIELDS)
664 {
665 DWORD *masks = (DWORD *)lpbmi->bmiColors;
666 if (!masks[0] || !masks[1] || !masks[2])
667 {
669 return 0;
670 }
671 }
672
673 hDCc = NtGdiGetDCforBitmap(hBitmap); // hDC can be NULL, so, get it from the bitmap.
674 SavehDC = hDCc;
675 if (!hDCc) // No DC associated with bitmap, Clone or Create one.
676 {
677 nhDC = CreateCompatibleDC(hDC);
678 if (!nhDC)
679 return 0;
680 newDC = TRUE;
681 SavehDC = nhDC;
682 }
683 else if (!SaveDC(hDCc))
684 return 0;
685
686 hOldBitmap = SelectObject(SavehDC, hBitmap);
687
688 if (hOldBitmap)
689 {
690 if (hDC)
691 hPal = SelectPalette(SavehDC, (HPALETTE) GetCurrentObject(hDC, OBJ_PAL), FALSE);
692
693 if (lpbmi->bmiHeader.biSize < sizeof(BITMAPINFOHEADER))
694 {
695 PBITMAPCOREINFO pbci = (PBITMAPCOREINFO) lpbmi;
696 dwWidth = pbci->bmciHeader.bcWidth;
697 dwHeight = pbci->bmciHeader.bcHeight;
698 }
699 else
700 {
701 dwWidth = lpbmi->bmiHeader.biWidth;
702 dwHeight = abs(lpbmi->bmiHeader.biHeight);
703 }
704
705 LinesCopied = SetDIBitsToDevice(SavehDC, 0, 0, dwWidth, dwHeight, 0, 0, uStartScan,
706 cScanLines, (void *) lpvBits, (LPBITMAPINFO) lpbmi, fuColorUse);
707
708 if (hDC)
709 SelectPalette(SavehDC, hPal, FALSE);
710
711 SelectObject(SavehDC, hOldBitmap);
712 }
713
714 if (newDC)
715 DeleteDC(SavehDC);
716 else
717 RestoreDC(SavehDC, -1);
718
719 return LinesCopied;
720}
721
722/*
723 * @implemented
724 *
725 */
726INT
727WINAPI
729 HDC hdc,
730 int XDest,
731 int YDest,
732 DWORD Width,
734 int XSrc,
735 int YSrc,
736 UINT StartScan,
737 UINT ScanLines,
738 CONST VOID *Bits,
739 CONST BITMAPINFO *lpbmi,
740 UINT ColorUse)
741{
742 PDC_ATTR pDc_Attr;
743 PBITMAPINFO pConvertedInfo;
744 UINT ConvertedInfoSize;
745 INT LinesCopied = 0;
746 UINT cjBmpScanSize = 0;
747 BOOL Hit = FALSE;
748 PVOID pvSafeBits = (PVOID) Bits;
749 UINT bmiHeight, ScanLinesOrig = ScanLines, ImageSizeOrig;
750 BOOL top_down;
751 INT src_y = 0;
752 ULONG iFormat, cBitsPixel, cjBits, cjWidth;
753
754 // HACK: Temporay hack for Half-Life
755 #define MaxScanLines 6000
756 #define MaxHeight 2000
757 #define MaxSourceHeight 2000
758 #define IS_ALIGNED(Pointer, Alignment) \
759 (((ULONG_PTR)(void *)(Pointer)) % (Alignment) == 0)
760
761 if (!ScanLines || !lpbmi || !Bits)
762 return 0;
763
764 DPRINT("hdc %p, XDest %d, YDest, %d, Width %d, Height %d\n"
765 " XSrc %d, YSrc %d, StartScan %d, ScanLines %d, ColorUse %d\n"
766 " biHeight %d, biWidth %d\n"
767 " lpbmi %p, SizeImage %d\n"
768 " biCompression %d, biBitCount %d\n",
769 hdc, XDest, YDest, Width, Height,
770 XSrc, YSrc, StartScan, ScanLines, ColorUse,
771 lpbmi->bmiHeader.biHeight, lpbmi->bmiHeader.biWidth,
772 lpbmi, lpbmi->bmiHeader.biSizeImage,
773 lpbmi->bmiHeader.biCompression, lpbmi->bmiHeader.biBitCount);
774
775 if (lpbmi->bmiHeader.biWidth < 0)
776 return 0;
777
778 if (ColorUse && ColorUse != DIB_PAL_COLORS && ColorUse != DIB_PAL_COLORS + 1)
779 return 0;
780
781 pConvertedInfo = ConvertBitmapInfo(lpbmi, ColorUse, &ConvertedInfoSize, FALSE);
782 if (!pConvertedInfo)
783 return 0;
784
785 if (ScanLines > MaxScanLines)
786 {
787 LinesCopied = 0;
788 goto Exit;
789 }
790
791 ImageSizeOrig = pConvertedInfo->bmiHeader.biSizeImage;
792
793 bmiHeight = abs(pConvertedInfo->bmiHeader.biHeight);
794 top_down = (pConvertedInfo->bmiHeader.biHeight < 0);
795 if ((StartScan > bmiHeight) && (ScanLines > bmiHeight))
796 {
797 DPRINT("Returning ScanLines of '%d'\n", ScanLines);
798 LinesCopied = ScanLines;
799 goto Exit;
800 }
801
802 if (pConvertedInfo->bmiHeader.biHeight == 0)
803 {
804 LinesCopied = 0;
805 goto Exit;
806 }
807
808 if (!IS_ALIGNED(Bits, 2) && (ScanLines > Height))
809 {
810 LinesCopied = 0;
811 goto Exit;
812 }
813
814 /* Below code modeled after Wine's nulldrv_SetDIBitsToDevice */
815 if (StartScan <= YSrc + bmiHeight)
816 {
817 if ((pConvertedInfo->bmiHeader.biCompression == BI_RLE8) ||
818 (pConvertedInfo->bmiHeader.biCompression == BI_RLE4))
819 {
820 StartScan = 0;
821 ScanLines = bmiHeight;
822 }
823 else
824 {
825 if (StartScan >= bmiHeight)
826 {
827 LinesCopied = 0;
828 goto Exit;
829 }
830 if (!top_down && ScanLines > bmiHeight - StartScan)
831 {
832 ScanLines = bmiHeight - StartScan;
833 }
834 src_y = StartScan + ScanLines - (YSrc + Height);
835 if (!top_down)
836 {
837 /* get rid of unnecessary lines */
838 if ((src_y < 0 || src_y >= (INT)ScanLines) &&
839 pConvertedInfo->bmiHeader.biCompression != BI_BITFIELDS)
840 {
841 LinesCopied = ScanLines;
842 goto Exit;
843 }
844 if (YDest >= 0)
845 {
846 LinesCopied = ScanLines + StartScan;
847 ScanLines -= src_y;
848 }
849 else
850 {
851 LinesCopied = ScanLines - src_y;
852 }
853 }
854 else if (src_y < 0 || src_y >= (INT)ScanLines)
855 {
856 if (lpbmi->bmiHeader.biHeight < 0 &&
857 StartScan > MaxScanLines)
858 {
859 ScanLines = lpbmi->bmiHeader.biHeight - StartScan;
860 }
861 DPRINT("Returning ScanLines of '%d'\n", ScanLines);
862 LinesCopied = ScanLines;
863 goto Exit;
864 }
865 else
866 {
867 LinesCopied = ScanLines;
868 }
869 }
870 }
871
874 0,
875 hdc,
876 XDest,
877 YDest,
878 Width,
879 Height,
880 XSrc,
881 YSrc,
882 StartScan,
883 ScanLines,
884 Bits,
885 lpbmi,
886 ColorUse);
887
888 // Handle the "Special Case"!
889 {
890 PLDC pldc;
893 {
894 pldc = GdiGetLDC(hdc);
895 if (pldc)
896 {
897 if (pldc->Flags & LDC_STARTPAGE) StartPage(hdc);
898
899 if (pldc->Flags & LDC_SAPCALLBACK) GdiSAPCallback(pldc);
900
901 if (pldc->Flags & LDC_KILL_DOCUMENT)
902 {
903 LinesCopied = 0;
904 goto Exit;
905 }
906 }
907 else
908 {
910 LinesCopied = 0;
911 goto Exit;
912 }
913 }
914 }
915
916 if ((pConvertedInfo->bmiHeader.biCompression == BI_RLE8) ||
917 (pConvertedInfo->bmiHeader.biCompression == BI_RLE4))
918 {
919 /* For compressed data, we must set the whole thing */
920 StartScan = 0;
921 ScanLines = pConvertedInfo->bmiHeader.biHeight;
922 }
923
924 cjBmpScanSize = DIB_BitmapMaxBitsSize((LPBITMAPINFO) lpbmi, ScanLines);
925
926 pvSafeBits = RtlAllocateHeap(GetProcessHeap(), 0, cjBmpScanSize);
927 if (pvSafeBits)
928 {
930 {
931 RtlCopyMemory(pvSafeBits, Bits, cjBmpScanSize);
932 }
934 {
935 Hit = TRUE;
936 }
937 _SEH2_END;
938
939 if (Hit)
940 {
941 // We don't die, we continue on with a allocated safe pointer to kernel
942 // space.....
943
944 if (!IS_ALIGNED(Bits, 2)) // If both Read Exception and mis-aligned
945 {
946 LinesCopied = 0;
947 goto Exit;
948 }
949
950 DPRINT1("SetDIBitsToDevice fail to read BitMapInfo: %p or Bits: %p & Size: %u\n",
951 pConvertedInfo, Bits, cjBmpScanSize);
952 }
953 DPRINT("SetDIBitsToDevice Allocate Bits %u!!!\n", cjBmpScanSize);
954 }
955
957 {
958 DPRINT1("SetDIBitsToDevice called on invalid DC %p (not owned?)\n", hdc);
960 LinesCopied = 0;
961 goto Exit;
962 }
963
964 /* Calculation of ScanLines for NtGdiSetDIBitsToDeviceInternal */
965 if (YDest >= 0)
966 {
967 ScanLines = min(abs(Height), ScanLines);
968 if (YSrc > 0)
969 ScanLines += YSrc;
970 }
971 else
972 {
973 ScanLines = min(ScanLines,
974 abs(pConvertedInfo->bmiHeader.biHeight) - StartScan);
975 }
976
977 if (YDest >= 0 && YSrc > 0 && bmiHeight <= MaxHeight)
978 {
979 ScanLines += YSrc;
980 }
981
982 /* Find Format from lpbmi which is now pConvertedInfo */
983 iFormat = BitmapFormat(pConvertedInfo->bmiHeader.biBitCount,
984 pConvertedInfo->bmiHeader.biCompression);
985
986 /* Get bits per pixel from the format */
987 cBitsPixel = gajBitsPerFormat[iFormat];
988
989 cjWidth = WIDTH_BYTES_ALIGN32(pConvertedInfo->bmiHeader.biWidth, cBitsPixel);
990
991 /* Calculate the correct bitmap size in bytes */
992 if (!NT_SUCCESS(RtlULongMult(cjWidth, max(ScanLines, LinesCopied), &cjBits)))
993 {
994 DPRINT1("Overflow calculating size: cjWidth %lu, ScanLines %lu\n",
995 cjWidth, max(ScanLines, LinesCopied));
996 goto Exit;
997 }
998
999 /* Make sure the buffer is large enough */
1000 if (pConvertedInfo->bmiHeader.biSizeImage < cjBits)
1001 {
1002 DPRINT("Buffer is too small, required: %lu, got %lu\n",
1003 cjBits, pConvertedInfo->bmiHeader.biSizeImage);
1004 if (pConvertedInfo->bmiHeader.biCompression == BI_RGB)
1005 {
1006 pConvertedInfo->bmiHeader.biSizeImage = cjBits;
1007 }
1008 }
1009
1010 if (YDest >= 0)
1011 {
1012 ScanLines = min(abs(Height), ScanLines);
1013 if (YSrc > 0)
1014 {
1015 ScanLines += YSrc;
1016 if (Height + YDest + 1 < ScanLines)
1017 YSrc = 0;
1018 }
1019 }
1020
1021 /*
1022 if ( !pDc_Attr || // DC is Public
1023 ColorUse == DIB_PAL_COLORS ||
1024 ((pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) &&
1025 (pConvertedInfo->bmiHeader.biCompression == BI_JPEG ||
1026 pConvertedInfo->bmiHeader.biCompression == BI_PNG )) )*/
1027 {
1028 LinesCopied = NtGdiSetDIBitsToDeviceInternal(hdc, XDest, YDest,
1029 Width, Height, XSrc, YSrc,
1030 StartScan, ScanLines, (LPBYTE) pvSafeBits,
1031 (LPBITMAPINFO) pConvertedInfo, ColorUse,
1032 cjBmpScanSize, ConvertedInfoSize,
1033 TRUE,
1034 NULL);
1035 }
1036
1037 if (bmiHeight > MaxScanLines)
1038 {
1039 LinesCopied = ScanLines;
1040 }
1041
1042 if (YDest < 0)
1043 {
1044 if (top_down)
1045 LinesCopied = ScanLines;
1046 else
1047 LinesCopied = ScanLines - src_y;
1048 }
1049
1050 if (pConvertedInfo->bmiHeader.biCompression == BI_RLE8 ||
1051 pConvertedInfo->bmiHeader.biCompression == BI_RLE4)
1052 {
1053 LinesCopied = bmiHeight;
1054 }
1055
1056 if (pConvertedInfo->bmiHeader.biHeight < 0 && YDest >= 0)
1057 {
1058 if (Width * ScanLinesOrig > ImageSizeOrig && ImageSizeOrig != 0)
1059 {
1060 LinesCopied = 0;
1061 }
1062 else
1063 {
1064 LinesCopied = ScanLinesOrig;
1065 }
1066 }
1067
1068Exit:
1069 if (Bits != pvSafeBits)
1070 RtlFreeHeap(RtlGetProcessHeap(), 0, pvSafeBits);
1071 if (lpbmi != pConvertedInfo)
1072 RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo);
1073
1074 return LinesCopied;
1075}
1076
1077/*
1078 * @unimplemented
1079 */
1080int
1081WINAPI
1083 HDC hdc,
1084 int XDest,
1085 int YDest,
1086 int nDestWidth,
1087 int nDestHeight,
1088 int XSrc,
1089 int YSrc,
1090 int nSrcWidth,
1091 int nSrcHeight,
1092 CONST VOID *lpBits,
1093 CONST BITMAPINFO *lpBitsInfo,
1094 UINT iUsage,
1095 DWORD dwRop)
1096
1097{
1098 PDC_ATTR pDc_Attr;
1099 PBITMAPINFO pConvertedInfo = NULL;
1100 UINT ConvertedInfoSize = 0;
1101 INT LinesCopied = 0;
1102 UINT cjBmpScanSize = 0;
1103 PVOID pvSafeBits = NULL;
1104 BOOL Hit = FALSE;
1105
1106 DPRINT("StretchDIBits %p : %p : %u\n", lpBits, lpBitsInfo, iUsage);
1107
1108 HANDLE_METADC( int,
1110 0,
1111 hdc,
1112 XDest,
1113 YDest,
1114 nDestWidth,
1115 nDestHeight,
1116 XSrc,
1117 YSrc,
1118 nSrcWidth,
1119 nSrcHeight,
1120 lpBits,
1121 lpBitsInfo,
1122 iUsage,
1123 dwRop );
1124
1125 if ( GdiConvertAndCheckDC(hdc) == NULL ) return 0;
1126
1127 pConvertedInfo = ConvertBitmapInfo(lpBitsInfo, iUsage, &ConvertedInfoSize, FALSE);
1128 if (!pConvertedInfo)
1129 {
1130 return 0;
1131 }
1132
1133 cjBmpScanSize = GdiGetBitmapBitsSize((BITMAPINFO *) pConvertedInfo);
1134
1135 if (lpBits)
1136 {
1137 pvSafeBits = RtlAllocateHeap(GetProcessHeap(), 0, cjBmpScanSize);
1138 if (pvSafeBits)
1139 {
1140 _SEH2_TRY
1141 {
1142 RtlCopyMemory(pvSafeBits, lpBits, cjBmpScanSize);
1143 }
1145 {
1146 Hit = TRUE;
1147 }
1148 _SEH2_END
1149
1150 if (Hit)
1151 {
1152 // We don't die, we continue on with a allocated safe pointer to kernel
1153 // space.....
1154 DPRINT1("StretchDIBits fail to read BitMapInfo: %p or Bits: %p & Size: %u\n",
1155 pConvertedInfo, lpBits, cjBmpScanSize);
1156 }
1157 DPRINT("StretchDIBits Allocate Bits %u!!!\n", cjBmpScanSize);
1158 }
1159 }
1160
1161 if (!GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID) & pDc_Attr))
1162 {
1163 DPRINT1("StretchDIBits called on invalid DC %p (not owned?)\n", hdc);
1165 LinesCopied = 0;
1166 goto Exit;
1167 }
1168 /*
1169 if ( !pDc_Attr ||
1170 iUsage == DIB_PAL_COLORS ||
1171 ((pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) &&
1172 (pConvertedInfo->bmiHeader.biCompression == BI_JPEG ||
1173 pConvertedInfo->bmiHeader.biCompression == BI_PNG )) )*/
1174 {
1175 LinesCopied = NtGdiStretchDIBitsInternal( hdc,
1176 XDest,
1177 YDest,
1178 nDestWidth,
1179 nDestHeight,
1180 XSrc,
1181 YSrc,
1182 nSrcWidth,
1183 nSrcHeight,
1184 pvSafeBits,
1185 pConvertedInfo,
1186 (DWORD) iUsage,
1187 dwRop,
1188 ConvertedInfoSize,
1189 cjBmpScanSize,
1190 NULL );
1191 }
1192Exit:
1193 if (pvSafeBits)
1194 RtlFreeHeap(RtlGetProcessHeap(), 0, pvSafeBits);
1195 if (lpBitsInfo != pConvertedInfo)
1196 RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo);
1197
1198 return LinesCopied;
1199}
1200
1201/*
1202 * @implemented
1203 */
1204DWORD
1205WINAPI
1207{
1209 {
1210 return SC_BB_STOCKOBJ;
1211 }
1212 return 0;
1213}
1214
1215/*
1216 * @implemented
1217 */
1218HBITMAP
1219WINAPI
1221{
1222 if ( dwFlags & ~SC_BB_STOCKOBJ )
1223 {
1224 return NULL;
1225 }
1227}
1228
1229/*
1230 * @implemented
1231 */
1232HBITMAP
1233WINAPI
1235{
1236 if ( dwFlags & ~SC_BB_STOCKOBJ )
1237 {
1238 return NULL;
1239 }
1241}
1242
1243
static HDC hDC
Definition: 3dtext.c:33
#define CBM_CREATDIB
#define DPRINT1
Definition: precomp.h:8
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:616
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:634
HBITMAP hbmp
Definition: Header.h:9
_Check_return_ _In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ PDXGKARG_SYSTEM_DISPLAY_ENABLE_FLAGS _Out_ UINT _Out_ UINT * Height
Definition: dispmprt.h:1445
_Check_return_ _In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ PDXGKARG_SYSTEM_DISPLAY_ENABLE_FLAGS _Out_ UINT * Width
Definition: dispmprt.h:1444
#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
#define GetProcessHeap()
Definition: compat.h:736
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define SetLastError(x)
Definition: compat.h:752
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
#define BI_RLE4
Definition: precomp.h:47
ULONG RGBQUAD
Definition: precomp.h:49
#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
HDC WINAPI GdiConvertAndCheckDC(HDC hdc)
Definition: dc.c:403
BOOL WINAPI GdiValidateHandle(HGDIOBJ)
Definition: misc.c:712
VOID GdiSAPCallback(PLDC pldc)
Definition: misc.c:819
#define HANDLE_METADC(_RetType, _Func, dwError, hdc,...)
Definition: gdi32p.h:615
LPBITMAPINFO WINAPI ConvertBitmapInfo(CONST BITMAPINFO *BitmapInfo, UINT ColorSpec, UINT *BitmapInfoSize, BOOL FollowedByData)
Definition: utils.c:178
VOID WINAPI GdiSetLastError(DWORD dwErrCode)
Definition: misc.c:873
PLDC FASTCALL GdiGetLDC(HDC hDC)
Definition: misc.c:785
#define GDI_OBJECT_TYPE_DC
Definition: gdi.h:46
#define GDI_HANDLE_GET_TYPE(h)
Definition: gdi.h:31
#define GDI_OBJECT_TYPE_BITMAP
Definition: gdi.h:48
#define GDI_HANDLE_IS_STOCKOBJ(h)
Definition: gdi.h:37
@ GDILoObjType_LO_METADC16_TYPE
Definition: gdi_private.h:49
@ GDILoObjType_LO_DC_TYPE
Definition: gdi_private.h:34
PVOID GdiGetHandleUserData(_In_ HGDIOBJ hobj)
Definition: gditools.c:94
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLint GLint GLsizei width
Definition: gl.h:1546
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
unsigned int UINT
Definition: sysinfo.c:13
_Must_inspect_result_ _In_ USAGE _In_ USHORT _In_ USAGE Usage
Definition: hidpi.h:384
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
if(dx< 0)
Definition: linetemp.h:194
CONST void * LPCVOID
Definition: minwindef.h:164
#define BI_BITFIELDS
Definition: mmreg.h:507
HDC hdc
Definition: main.c:9
static HBITMAP
Definition: button.c:44
static HDC
Definition: bitmap.c:43
static const BYTE masks[8]
Definition: dib.c:3008
#define min(a, b)
Definition: monoChain.cc:55
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define FASTCALL
Definition: nt_native.h:50
#define DC_DIBSECTION
Definition: ntgdihdl.h:137
#define LDC_KILL_DOCUMENT
Definition: ntgdihdl.h:158
#define LDC_SAPCALLBACK
Definition: ntgdihdl.h:150
#define LDC_STARTPAGE
Definition: ntgdihdl.h:153
#define SC_BB_STOCKOBJ
Definition: ntgdihdl.h:199
#define DEFAULT_BITMAP
Definition: ntgdityp.h:195
#define OBJ_PAL
Definition: objidl.idl:1018
#define CONST
Definition: pedump.c:81
WORD * PWORD
Definition: pedump.c:67
long LONG
Definition: pedump.c:60
_In_ HBITMAP hbm
Definition: ntgdi.h:2804
__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 cjMaxBits
Definition: ntgdi.h:2810
_In_ DWORD _In_ DWORD dwOffset
Definition: ntgdi.h:2053
__kernel_entry 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_reads_bytes_opt_(cjMaxBits) LPBYTE pjInit, _In_ LPBITMAPINFO pbmi, _In_ DWORD dwUsage, _In_ DWORD dwRop4, _In_ UINT cjMaxInfo, _In_ UINT cjMaxBits, _In_opt_ HANDLE hcmXform)
__kernel_entry W32KAPI HBITMAP APIENTRY NtGdiSetBitmapAttributes(_In_ HBITMAP hbm, _In_ DWORD dwFlags)
__kernel_entry W32KAPI HBITMAP APIENTRY NtGdiCreateDIBSection(_In_ HDC hdc, _In_opt_ HANDLE hSectionApp, _In_ DWORD dwOffset, _In_reads_bytes_opt_(cjHeader) LPBITMAPINFO pbmi, _In_ DWORD iUsage, _In_ UINT cjHeader, _In_ FLONG fl, _In_ ULONG_PTR dwColorSpace, _Outptr_ PVOID *ppvBits)
__kernel_entry W32KAPI INT APIENTRY NtGdiSetDIBitsToDeviceInternal(_In_ HDC hdcDest, _In_ INT xDst, _In_ INT yDst, _In_ DWORD cx, _In_ DWORD cy, _In_ INT xSrc, _In_ INT ySrc, _In_ DWORD iStartScan, _In_ DWORD cNumScan, _In_reads_bytes_(cjMaxBits) LPBYTE pInitBits, _In_reads_bytes_(cjMaxInfo) LPBITMAPINFO pbmi, _In_ DWORD iUsage, _In_ UINT cjMaxBits, _In_ UINT cjMaxInfo, _In_ BOOL bTransformCoordinates, _In_opt_ HANDLE hcmXform)
__kernel_entry W32KAPI HBITMAP APIENTRY NtGdiClearBitmapAttributes(_In_ HBITMAP hbm, _In_ DWORD dwFlags)
__kernel_entry W32KAPI HBITMAP APIENTRY NtGdiCreateBitmap(_In_ INT cx, _In_ INT cy, _In_ UINT cPlanes, _In_ UINT cBPP, _In_opt_ LPBYTE pjInit)
_In_ HBITMAP _In_ UINT _In_ UINT _Inout_ LPBITMAPINFO pbmi
Definition: ntgdi.h:2808
__kernel_entry W32KAPI HANDLE APIENTRY NtGdiGetDCObject(_In_ HDC hdc, _In_ INT itype)
_In_ HBITMAP _In_ UINT _In_ UINT _Inout_ LPBITMAPINFO _In_ UINT iUsage
Definition: ntgdi.h:2809
__kernel_entry W32KAPI HBITMAP APIENTRY NtGdiCreateDIBitmapInternal(_In_ HDC hdc, _In_ INT cx, _In_ INT cy, _In_ DWORD fInit, _In_reads_bytes_opt_(cjMaxBits) LPBYTE pjInit, _In_reads_bytes_opt_(cjMaxInitInfo) LPBITMAPINFO pbmi, _In_ DWORD iUsage, _In_ UINT cjMaxInitInfo, _In_ UINT cjMaxBits, _In_ FLONG f, _In_ HANDLE hcmXform)
__kernel_entry W32KAPI HDC APIENTRY NtGdiGetDCforBitmap(_In_ HBITMAP hsurf)
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:104
#define _SEH2_END
Definition: pseh2_64.h:194
#define _SEH2_TRY
Definition: pseh2_64.h:93
#define DPRINT
Definition: sndvol32.h:73
static void Exit(void)
Definition: sock.c:1330
WORD bV4Planes
Definition: wingdi.h:1941
DWORD bV4SizeImage
Definition: wingdi.h:1944
DWORD bV4V4Compression
Definition: wingdi.h:1943
LONG bV4Height
Definition: wingdi.h:1940
LONG bV4Width
Definition: wingdi.h:1939
WORD bV4BitCount
Definition: wingdi.h:1942
BITMAPCOREHEADER bmciHeader
Definition: wingdi.h:1899
ULONG ulDirty_
Definition: ntgdihdl.h:294
Definition: ntgdihdl.h:263
ULONG Flags
Definition: ntgdihdl.h:265
Definition: uimain.c:89
USHORT biBitCount
Definition: precomp.h:36
ULONG biCompression
Definition: precomp.h:37
BITMAPINFOHEADER bmiHeader
Definition: wingdi.h:1922
LONG bmHeight
Definition: wingdi.h:1869
LONG bmWidth
Definition: wingdi.h:1868
LONG bmWidthBytes
Definition: wingdi.h:1870
LPVOID bmBits
Definition: wingdi.h:1873
WORD bmPlanes
Definition: wingdi.h:1871
WORD bmBitsPixel
Definition: wingdi.h:1872
BITMAP dsBm
Definition: wingdi.h:2115
BITMAPINFOHEADER dsBmih
Definition: wingdi.h:2116
#define max(a, b)
Definition: svc.c:63
unsigned char UCHAR
Definition: typedefs.h:53
unsigned char * LPBYTE
Definition: typedefs.h:53
void * PVOID
Definition: typedefs.h:50
int32_t INT
Definition: typedefs.h:58
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
int32_t * PLONG
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
#define BI_RGB
Definition: uefivid.c:46
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690
static int __cdecl compr(const void *a, const void *b)
Definition: bidi.c:640
UCHAR gajBitsPerFormat[11]
Definition: bitmap.c:39
#define WIDTH_BYTES_ALIGN32(cx, bpp)
Definition: bitmap.c:55
DWORD WINAPI GetBitmapAttributes(HBITMAP hbm)
Definition: bitmap.c:1206
#define MaxScanLines
ULONG FASTCALL BitmapFormat(ULONG cBits, ULONG iCompression)
Definition: bitmap.c:11
UINT FASTCALL DIB_BitmapMaxBitsSize(PBITMAPINFO Info, UINT ScanLines)
Definition: bitmap.c:115
HBITMAP WINAPI SetBitmapAttributes(HBITMAP hbm, DWORD dwFlags)
Definition: bitmap.c:1220
int WINAPI GdiGetBitmapBitsSize(BITMAPINFO *lpbmi)
Definition: bitmap.c:217
HBITMAP WINAPI CreateDIBSection(HDC hDC, CONST BITMAPINFO *BitmapInfo, UINT Usage, VOID **Bits, HANDLE hSection, DWORD dwOffset)
Definition: bitmap.c:253
#define MaxHeight
#define IS_ALIGNED(Pointer, Alignment)
INT FASTCALL DIB_BitmapInfoSize(const BITMAPINFO *info, WORD coloruse, BOOL max)
Definition: bitmap.c:65
HBITMAP WINAPI ClearBitmapAttributes(HBITMAP hbm, DWORD dwFlags)
Definition: bitmap.c:1234
INT WINAPI DIB_GetBitmapInfo(const BITMAPINFOHEADER *header, PLONG width, PLONG height, PWORD planes, PWORD bpp, PLONG compr, PLONG size)
Definition: bitmap.c:153
UINT WINAPI GetDIBColorTable(HDC hDC, UINT iStartIndex, UINT cEntries, RGBQUAD *pColors)
Definition: palette.c:123
#define BMF_16BPP
Definition: winddi.h:358
#define BMF_8BPP
Definition: winddi.h:357
#define BMF_1BPP
Definition: winddi.h:355
#define BMF_24BPP
Definition: winddi.h:359
#define BMF_32BPP
Definition: winddi.h:360
#define BMF_8RLE
Definition: winddi.h:362
#define BMF_4RLE
Definition: winddi.h:361
_In_ SIZEL _In_ ULONG iFormat
Definition: winddi.h:3468
#define BMF_4BPP
Definition: winddi.h:356
#define WINAPI
Definition: msvc.h:6
W32KAPI INT WINAPI NtGdiGetDIBitsInternal(HDC hdc, HBITMAP hbitmap, UINT startscan, UINT lines, void *bits, BITMAPINFO *info, UINT coloruse, UINT max_bits, UINT max_info)
_In_ const BITMAPINFO _In_ UINT _In_opt_ HANDLE hSection
Definition: wingdi.h:3685
struct _BITMAPCOREINFO * PBITMAPCOREINFO
#define DIB_RGB_COLORS
Definition: wingdi.h:367
int WINAPI SetDIBitsToDevice(_In_ HDC, _In_ int, _In_ int, _In_ DWORD, _In_ DWORD, _In_ int, _In_ int, _In_ UINT, _In_ UINT, _In_ CONST VOID *, _In_ CONST BITMAPINFO *, _In_ UINT)
HGDIOBJ WINAPI GetStockObject(_In_ int)
HBITMAP WINAPI CreateBitmap(_In_ INT cx, _In_ INT cy, _In_ UINT cPlanes, _In_ UINT cBitsPerPel, _In_opt_ const VOID *pvBits)
int WINAPI GetObjectA(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
int WINAPI GetDIBits(_In_ HDC hdc, _In_ HBITMAP hbm, _In_ UINT start, _In_ UINT cLines, _Out_opt_ LPVOID lpvBits, _At_((LPBITMAPINFOHEADER) lpbmi, _Inout_) LPBITMAPINFO lpbmi, _In_ UINT usage)
struct tagRGBTRIPLE RGBTRIPLE
struct tagBITMAPCOREHEADER * PBITMAPCOREHEADER
int WINAPI SetDIBits(_In_opt_ HDC, _In_ HBITMAP, _In_ UINT, _In_ UINT, _In_ CONST VOID *, _In_ CONST BITMAPINFO *, _In_ UINT)
struct tagBITMAPCOREHEADER BITMAPCOREHEADER
HBITMAP WINAPI CreateBitmapIndirect(_In_ const BITMAP *pbm)
HPALETTE WINAPI SelectPalette(_In_ HDC, _In_ HPALETTE, _In_ BOOL)
HGDIOBJ WINAPI GetCurrentObject(_In_ HDC, _In_ UINT)
Definition: dc.c:428
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1546
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
#define DIB_PAL_COLORS
Definition: wingdi.h:366
BOOL WINAPI RestoreDC(_In_ HDC, _In_ int)
#define BI_JPEG
Definition: wingdi.h:38
int WINAPI StartPage(_In_ HDC)
HBITMAP WINAPI CreateCompatibleBitmap(_In_ HDC hdc, _In_ INT cx, _In_ INT cy)
#define CBM_INIT
Definition: wingdi.h:365
#define BI_PNG
Definition: wingdi.h:39
#define BI_RLE8
Definition: wingdi.h:35
BOOL WINAPI DeleteDC(_In_ HDC)
HBITMAP WINAPI CreateDIBitmap(_In_ HDC hdc, _In_opt_ const BITMAPINFOHEADER *pbmih, _In_ DWORD fdwInit, _In_opt_ const VOID *pvInit, _In_opt_ const BITMAPINFO *pbmi, _In_ UINT uUsage)
int WINAPI SaveDC(_In_ HDC)
HBITMAP WINAPI CreateDiscardableBitmap(_In_ HDC, _In_ int, _In_ int)
int WINAPI StretchDIBits(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_opt_ const VOID *, _In_ const BITMAPINFO *, _In_ UINT, _In_ DWORD)
ULONG bpp[]
Definition: xlate.c:19