ReactOS 0.4.16-dev-1948-gd260c1d
dib.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define DIB_PAL_BRUSHHACK   3
 

Functions

INT FASTCALL DIB_BitmapInfoSize (const BITMAPINFO *info, WORD coloruse)
 
HBITMAP APIENTRY DIB_CreateDIBSection (PDC dc, CONST BITMAPINFO *bmi, UINT usage, LPVOID *bits, HANDLE section, DWORD offset, DWORD ovr_pitch)
 
int FASTCALL DIB_GetBitmapInfo (const BITMAPINFOHEADER *header, LONG *width, LONG *height, WORD *planes, WORD *bpp, DWORD *compr, DWORD *size)
 
INT APIENTRY DIB_GetDIBImageBytes (INT width, INT height, INT depth)
 
HPALETTE FASTCALL DIB_MapPaletteColors (PPALETTE ppal, CONST BITMAPINFO *lpbmi)
 
HPALETTE FASTCALL BuildDIBPalette (CONST BITMAPINFO *bmi)
 
BITMAPINFO *FASTCALL DIB_ConvertBitmapInfo (CONST BITMAPINFO *bmi, DWORD Usage)
 
VOID FASTCALL DIB_FreeConvertedBitmapInfo (BITMAPINFO *converted, BITMAPINFO *orig, DWORD Usage)
 
INT APIENTRY GreGetDIBitsInternal (HDC hDC, HBITMAP hBitmap, UINT StartScan, UINT ScanLines, LPBYTE Bits, LPBITMAPINFO Info, UINT Usage, UINT MaxBits, UINT MaxInfo)
 
HBITMAP NTAPI GreCreateDIBitmapFromPackedDIB (_In_reads_(cjPackedDIB) PVOID pvPackedDIB, _In_ UINT cjPackedDIB, _In_ ULONG uUsage)
 

Macro Definition Documentation

◆ DIB_PAL_BRUSHHACK

#define DIB_PAL_BRUSHHACK   3

Definition at line 36 of file dib.h.

Function Documentation

◆ BuildDIBPalette()

HPALETTE FASTCALL BuildDIBPalette ( CONST BITMAPINFO bmi)

◆ DIB_BitmapInfoSize()

INT FASTCALL DIB_BitmapInfoSize ( const BITMAPINFO info,
WORD  coloruse 
)

Definition at line 2155 of file dibobj.c.

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}
#define DIB_PAL_INDICES
ULONG RGBQUAD
Definition: precomp.h:59
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned long DWORD
Definition: ntddk_ex.h:95
GLsizeiptr size
Definition: glext.h:5919
if(dx< 0)
Definition: linetemp.h:194
#define BI_BITFIELDS
Definition: mmreg.h:507
static const BYTE masks[8]
Definition: dib.c:2760
#define max(a, b)
Definition: svc.c:63
#define DIB_RGB_COLORS
Definition: wingdi.h:367

Referenced by _Success_(), GreCreateDIBitmapFromPackedDIB(), and NtGdiCreateDIBSection().

◆ DIB_ConvertBitmapInfo()

BITMAPINFO *FASTCALL DIB_ConvertBitmapInfo ( CONST BITMAPINFO bmi,
DWORD  Usage 
)

Definition at line 2228 of file dibobj.c.

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}
INT APIENTRY DIB_GetDIBImageBytes(INT width, INT height, INT depth)
Definition: dibobj.c:2143
#define NULL
Definition: types.h:112
#define BI_RGB
Definition: precomp.h:56
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
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
unsigned int UINT
Definition: ndis.h:50
_In_ HBITMAP _In_ UINT _In_ UINT _Inout_ LPBITMAPINFO pbmi
Definition: ntgdi.h:2780
#define CONST
Definition: pedump.c:81
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
UCHAR rgbBlue
Definition: bootanim.c:103
UCHAR rgbRed
Definition: bootanim.c:105
UCHAR rgbGreen
Definition: bootanim.c:104
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define TAG_DIB
Definition: tags.h:17
#define DIB_PAL_COLORS
Definition: wingdi.h:366

Referenced by GreGetDIBitsInternal(), IntSynthesizeBitmap(), and UserLoadImage().

◆ DIB_CreateDIBSection()

HBITMAP APIENTRY DIB_CreateDIBSection ( PDC  dc,
CONST BITMAPINFO bmi,
UINT  usage,
LPVOID bits,
HANDLE  section,
DWORD  offset,
DWORD  ovr_pitch 
)

Definition at line 1902 of file dibobj.c.

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}
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
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
HDC dc
Definition: cylfrac.c:34
PPALETTE NTAPI CreateDIBPalette(_In_ const BITMAPINFO *pbmi, _In_ PDC pdc, _In_ ULONG iUsage)
Definition: dibobj.c:41
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#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 UlongToPtr(u)
Definition: config.h:106
#define abs(i)
Definition: fconv.c:206
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
Status
Definition: gdiplustypes.h:25
GLuint res
Definition: glext.h:9613
GLintptr offset
Definition: glext.h:5920
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
Definition: glext.h:10929
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919
BITMAP bmp
Definition: alphablend.c:62
static HBITMAP
Definition: button.c:44
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER SectionOffset
Definition: mmfuncs.h:407
#define PAGE_READWRITE
Definition: nt_native.h:1307
#define NtCurrentProcess()
Definition: nt_native.h:1660
@ ViewShare
Definition: nt_native.h:1281
#define DPRINT
Definition: sndvol32.h:73
Definition: bl.h:1331
Definition: parser.c:56
#define WIDTH_BYTES_ALIGN32(cx, bpp)
Definition: swimpl.c:16
PVOID HANDLE
Definition: typedefs.h:73
ULONG_PTR SIZE_T
Definition: typedefs.h:80
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
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
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
Definition: gdiobj.c:1165
#define PALETTE_ShareUnlockPalette(ppal)
Definition: palette.h:59
#define BMF_DONTCACHE
Definition: winddi.h:1182
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
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:22
#define BMF_NOZEROINIT
Definition: winddi.h:1181
#define ERROR_NO_SYSTEM_RESOURCES
Definition: winerror.h:1276
#define BI_RLE8
Definition: wingdi.h:35

Referenced by GreGetDIBitsInternal(), IntCreateCompatibleBitmap(), and NtGdiCreateDIBSection().

◆ DIB_FreeConvertedBitmapInfo()

VOID FASTCALL DIB_FreeConvertedBitmapInfo ( BITMAPINFO converted,
BITMAPINFO orig,
DWORD  Usage 
)

Definition at line 2292 of file dibobj.c.

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}
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
BITMAPCOREHEADER bmciHeader
Definition: wingdi.h:1899
RGBTRIPLE bmciColors[1]
Definition: wingdi.h:1900
BYTE rgbtGreen
Definition: wingdi.h:1885
BYTE rgbtBlue
Definition: wingdi.h:1884
BYTE rgbtRed
Definition: wingdi.h:1886

Referenced by GreGetDIBitsInternal(), IntSynthesizeBitmap(), and UserLoadImage().

◆ DIB_GetBitmapInfo()

int FASTCALL DIB_GetBitmapInfo ( const BITMAPINFOHEADER header,
LONG width,
LONG height,
WORD planes,
WORD bpp,
DWORD compr,
DWORD size 
)

Definition at line 2108 of file dibobj.c.

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}
DWORD bpp
Definition: surface.c:185
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLint GLint GLsizei width
Definition: gl.h:1546
static int __cdecl compr(const void *a, const void *b)
Definition: bidi.c:641

Referenced by GreGetDIBitsInternal().

◆ DIB_GetDIBImageBytes()

INT APIENTRY DIB_GetDIBImageBytes ( INT  width,
INT  height,
INT  depth 
)

Definition at line 2143 of file dibobj.c.

2144{
2145 return WIDTH_BYTES_ALIGN32(width, depth) * (height < 0 ? -height : height);
2146}
GLint GLint GLsizei GLsizei GLsizei depth
Definition: gl.h:1546

Referenced by DIB_ConvertBitmapInfo(), GreGetDIBitsInternal(), and IntSetDIBits().

◆ DIB_MapPaletteColors()

HPALETTE FASTCALL DIB_MapPaletteColors ( PPALETTE  ppal,
CONST BITMAPINFO lpbmi 
)

Definition at line 2184 of file dibobj.c.

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}
HGDIOBJ hHmgr(VOID)
Definition: baseobj.hpp:95
#define min(a, b)
Definition: monoChain.cc:55
BYTE * PBYTE
Definition: pedump.c:66
unsigned short USHORT
Definition: pedump.c:61
BASEOBJECT BaseObject
Definition: palette.h:36
PALETTEENTRY * IndexedColors
Definition: palette.h:42
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
#define PALETTE_UnlockPalette(pPalette)
Definition: palette.h:56
#define PAL_INDEXED
Definition: winddi.h:1561

◆ GreCreateDIBitmapFromPackedDIB()

HBITMAP NTAPI GreCreateDIBitmapFromPackedDIB ( _In_reads_(cjPackedDIB) PVOID  pvPackedDIB,
_In_ UINT  cjPackedDIB,
_In_ ULONG  uUsage 
)

Definition at line 1784 of file dibobj.c.

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}
#define CBM_CREATDIB
INT FASTCALL DIB_BitmapInfoSize(const BITMAPINFO *info, WORD coloruse)
Definition: dibobj.c:2155
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
_In_ HBITMAP hbm
Definition: ntgdi.h:2776
#define CBM_INIT
Definition: wingdi.h:365

Referenced by NtGdiCreateDIBBrush().

◆ GreGetDIBitsInternal()

INT APIENTRY GreGetDIBitsInternal ( HDC  hDC,
HBITMAP  hBitmap,
UINT  StartScan,
UINT  ScanLines,
LPBYTE  Bits,
LPBITMAPINFO  Info,
UINT  Usage,
UINT  MaxBits,
UINT  MaxInfo 
)

Definition at line 707 of file dibobj.c.

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}
static HDC hDC
Definition: 3dtext.c:33
BOOL APIENTRY IntEngCopyBits(SURFOBJ *psoTrg, SURFOBJ *psoSrc, CLIPOBJ *pco, XLATEOBJ *pxlo, RECTL *prclTrg, POINTL *pptlSrc)
Definition: bitblt_new.c:678
FORCEINLINE VOID DC_UnlockDc(PDC pdc)
Definition: dc.h:238
@ DCTYPE_INFO
Definition: dc.h:43
FORCEINLINE PDC DC_LockDc(HDC hdc)
Definition: dc.h:220
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
HBITMAP APIENTRY DIB_CreateDIBSection(PDC dc, CONST BITMAPINFO *bmi, UINT usage, LPVOID *bits, HANDLE section, DWORD offset, DWORD ovr_pitch)
Definition: dibobj.c:1902
static HBITMAP hBitmap
Definition: timezone.c:26
return ret
Definition: mutex.c:146
unsigned int BOOL
Definition: ntddk_ex.h:94
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
DWORD * PDWORD
Definition: pedump.c:68
long LONG
Definition: pedump.c:60
Definition: polytest.cpp:41
XLATEOBJ xlo
Definition: xlateobj.h:21
ULONG NumColors
Definition: palette.h:41
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
ULONG iBitmapFormat
Definition: winddi.h:1215
Definition: windef.h:99
unsigned char * LPBYTE
Definition: typedefs.h:53
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690
#define BitsPerFormat(Format)
Definition: surface.h:109
#define PALETTE_ShareLockPalette(hpal)
Definition: palette.h:57
FORCEINLINE VOID RECTL_vSetRect(_Out_ RECTL *prcl, _In_ LONG left, _In_ LONG top, _In_ LONG right, _In_ LONG bottom)
Definition: rect.h:5
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

Referenced by _Success_(), and IntSynthesizeDib().