ReactOS
0.4.17-dev-1321-g5c122a9
pngsup.cpp
Go to the documentation of this file.
1
/*
2
* PROJECT: ReactOS uxtheme.dll
3
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4
* PURPOSE: Support for PNG images in visual styles
5
* COPYRIGHT: Copyright 2023 Ethan Rodensky <splitwirez@gmail.com>
6
*/
7
8
#include "
uxthemep.h
"
9
10
#include <
ole2.h
>
11
#include <objidl.h>
12
#include <
gdiplus.h
>
13
#include <
gdipluscolor.h
>
14
#include <
winreg.h
>
15
#include <shlwapi.h>
16
17
BOOL
18
MSSTYLES_TryLoadPng
(
19
_In_
HINSTANCE
hTheme,
20
_In_
LPCWSTR
szFile,
21
_In_
LPCWSTR
type
,
22
_Out_
HBITMAP
*phBitmap)
23
{
24
BOOL
ret
=
FALSE
;
25
26
HRSRC hRes =
FindResourceW
(hTheme, szFile,
type
);
27
if
(!hRes)
28
return
FALSE
;
29
30
HGLOBAL
hAlloc =
LoadResource
(hTheme, hRes);
31
if
(!hAlloc)
32
return
FALSE
;
33
34
DWORD
dwSize
=
SizeofResource
(hTheme, hRes);
35
LPVOID
pData
=
LockResource
(hAlloc);
36
if
((!
pData
) || (
dwSize
<= 0))
37
{
38
FreeResource
(hAlloc);
39
return
FALSE
;
40
}
41
42
IStream
*
stream
=
SHCreateMemStream
((
BYTE
*)
pData
,
dwSize
);
43
if
(
stream
)
44
{
45
Gdiplus::Bitmap* gdipBitmap = Gdiplus::Bitmap::FromStream(
stream
,
FALSE
);
46
stream
->Release();
47
if
(gdipBitmap)
48
{
49
ret
= gdipBitmap->GetHBITMAP(Gdiplus::Color(0, 0, 0, 0), phBitmap) == Gdiplus::Ok;
50
delete
gdipBitmap;
51
}
52
}
53
54
UnlockResource
(
pData
);
55
FreeResource
(hAlloc);
56
return
ret
;
57
}
58
59
BOOL
60
prepare_png_alpha
(
61
_In_
HBITMAP
png,
62
_Out_
BOOL
* hasAlpha)
63
{
64
DIBSECTION
dib;
65
int
n
;
66
BYTE
*
p
;
67
68
*hasAlpha =
FALSE
;
69
70
if
(!png ||
GetObjectW
( png,
sizeof
(dib), &dib ) !=
sizeof
(dib))
71
return
FALSE
;
72
73
if
(dib.
dsBm
.
bmBitsPixel
!= 32)
74
/* nothing to do */
75
return
TRUE
;
76
77
p
= (
BYTE
*)dib.
dsBm
.
bmBits
;
78
n
= dib.
dsBmih
.
biHeight
* dib.
dsBmih
.
biWidth
;
79
while
(
n
-- > 0)
80
{
81
int
a
=
p
[3] + 1;
82
if
(
a
< 256)
83
{
84
p
[0] =
MulDiv
(
p
[0], 256,
a
);
85
p
[1] =
MulDiv
(
p
[1], 256,
a
);
86
p
[2] =
MulDiv
(
p
[2], 256,
a
);
87
88
*hasAlpha =
TRUE
;
89
}
90
p
+= 4;
91
}
92
93
return
TRUE
;
94
}
while
while(Cursor< End)
Definition:
desccheck.cpp:2282
TRUE
#define TRUE
Definition:
types.h:120
FALSE
#define FALSE
Definition:
types.h:117
FreeResource
BOOL WINAPI FreeResource(HGLOBAL handle)
Definition:
res.c:559
FindResourceW
HRSRC WINAPI FindResourceW(HINSTANCE hModule, LPCWSTR name, LPCWSTR type)
Definition:
res.c:176
SizeofResource
DWORD WINAPI SizeofResource(HINSTANCE hModule, HRSRC hRsrc)
Definition:
res.c:568
LockResource
LPVOID WINAPI LockResource(HGLOBAL handle)
Definition:
res.c:550
LoadResource
HGLOBAL WINAPI LoadResource(HINSTANCE hModule, HRSRC hRsrc)
Definition:
res.c:532
SHCreateMemStream
IStream *WINAPI SHCreateMemStream(const BYTE *data, UINT data_len)
Definition:
main.c:873
ret
return ret
Definition:
mutex.c:147
BOOL
unsigned int BOOL
Definition:
ntddk_ex.h:94
DWORD
unsigned long DWORD
Definition:
ntddk_ex.h:95
gdiplus.h
gdipluscolor.h
type
GLuint GLuint GLsizei GLenum type
Definition:
gl.h:1545
n
GLdouble n
Definition:
glext.h:7729
p
GLfloat GLfloat p
Definition:
glext.h:8902
a
GLboolean GLboolean GLboolean GLboolean a
Definition:
glext.h:6204
IStream
Definition:
objidlbase.idl:367
void
Definition:
nsiface.idl:2307
dwSize
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition:
env.c:56
HBITMAP
static HBITMAP
Definition:
button.c:44
MulDiv
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
Definition:
muldiv.c:25
_Out_
#define _Out_
Definition:
no_sal2.h:160
_In_
#define _In_
Definition:
no_sal2.h:158
ole2.h
MSSTYLES_TryLoadPng
BOOL MSSTYLES_TryLoadPng(_In_ HINSTANCE hTheme, _In_ LPCWSTR szFile, _In_ LPCWSTR type, _Out_ HBITMAP *phBitmap)
Definition:
pngsup.cpp:18
prepare_png_alpha
BOOL prepare_png_alpha(_In_ HBITMAP png, _Out_ BOOL *hasAlpha)
Definition:
pngsup.cpp:60
stream
Definition:
parse.h:23
tagBITMAPINFOHEADER::biWidth
LONG biWidth
Definition:
precomp.h:33
tagBITMAPINFOHEADER::biHeight
LONG biHeight
Definition:
precomp.h:34
tagBITMAP::bmBits
LPVOID bmBits
Definition:
wingdi.h:1873
tagBITMAP::bmBitsPixel
WORD bmBitsPixel
Definition:
wingdi.h:1872
tagDIBSECTION
Definition:
wingdi.h:2114
tagDIBSECTION::dsBm
BITMAP dsBm
Definition:
wingdi.h:2115
tagDIBSECTION::dsBmih
BITMAPINFOHEADER dsBmih
Definition:
wingdi.h:2116
pData
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition:
twain.h:1830
LPCWSTR
const uint16_t * LPCWSTR
Definition:
typedefs.h:57
uxthemep.h
UnlockResource
#define UnlockResource(handle)
Definition:
winbase.h:3099
GetObjectW
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
winreg.h
BYTE
unsigned char BYTE
Definition:
xxhash.c:193
dll
win32
uxtheme
pngsup.cpp
Generated on Tue Nov 10 2026 06:07:57 for ReactOS by
1.9.6