1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 #include "pch.h"
30
31 #include "icons.h"
32 #include "../ui/icons.h"
33
34 #include <stdlib.h>
35 #include <string.h>
36
37 #include "util.h"
38
39 #include <Windows.h>
40 #include <Shellapi.h>
41
42
43 using namespace winrt;
44 using namespace Microsoft::
UI::Xaml;
45 using namespace Microsoft::
UI::Xaml::Controls;
46 using namespace Windows::
UI::Xaml::Interop;
47 using namespace winrt::Windows::Foundation;
48 using namespace winrt::Microsoft::
UI::Xaml::Controls::Primitives;
49 using namespace winrt::Microsoft::
UI::Xaml::Media::Imaging;
50
51
52 static UiIcon* sys_folder_icon16;
53 static UiIcon* sys_file_icon16;
54
55 static UiIcon* sys_folder_icon32;
56 static UiIcon* sys_file_icon32;
57
58 std::unordered_map<std::string, Symbol> ui_symbol_icons = {
59 {
"Accept", Symbol::Accept },
60 {
"Account", Symbol::Account },
61 {
"Add", Symbol::Add },
62 {
"AddFriend", Symbol::AddFriend },
63 {
"Admin", Symbol::Admin },
64 {
"AlignCenter", Symbol::AlignCenter },
65 {
"AlignLeft", Symbol::AlignLeft },
66 {
"AlignRight", Symbol::AlignRight },
67 {
"AllApps", Symbol::AllApps },
68 {
"Attach", Symbol::Attach },
69 {
"AttachCamera", Symbol::AttachCamera },
70 {
"Audio", Symbol::Audio },
71 {
"Back", Symbol::Back },
72 {
"BackToWindow", Symbol::BackToWindow },
73 {
"BlockContact", Symbol::BlockContact },
74 {
"Bold", Symbol::Bold },
75 {
"Bookmarks", Symbol::Bookmarks },
76 {
"BrowsePhotos", Symbol::BrowsePhotos },
77 {
"Bullets", Symbol::Bullets },
78 {
"Calculator", Symbol::Calculator },
79 {
"Calendar", Symbol::Calendar },
80 {
"CalendarDay", Symbol::CalendarDay },
81 {
"CalendarReply", Symbol::CalendarReply },
82 {
"CalendarWeek", Symbol::CalendarWeek },
83 {
"Camera", Symbol::Camera },
84 {
"Cancel", Symbol::Cancel },
85 {
"Caption", Symbol::Caption },
86 {
"CellPhone", Symbol::CellPhone },
87 {
"Character", Symbol::Character },
88 {
"Clear", Symbol::Clear },
89 {
"ClearSelection", Symbol::ClearSelection },
90 {
"Clock", Symbol::Clock },
91 {
"ClosedCaption", Symbol::ClosedCaption },
92 {
"ClosePane", Symbol::ClosePane },
93 {
"Comment", Symbol::Comment },
94 {
"Contact", Symbol::Contact },
95 {
"Contact2", Symbol::Contact2 },
96 {
"ContactInfo", Symbol::ContactInfo },
97 {
"ContactPresence", Symbol::ContactPresence },
98 {
"Copy", Symbol::Copy },
99 {
"Crop", Symbol::Crop },
100 {
"Cut", Symbol::Cut },
101 {
"Delete", Symbol::Delete },
102 {
"Directions", Symbol::Directions },
103 {
"DisableUpdates", Symbol::DisableUpdates },
104 {
"DisconnectDrive", Symbol::DisconnectDrive },
105 {
"Dislike", Symbol::Dislike },
106 {
"DockBottom", Symbol::DockBottom },
107 {
"DockLeft", Symbol::DockLeft },
108 {
"DockRight", Symbol::DockRight },
109 {
"Document", Symbol::Document },
110 {
"Download", Symbol::Download },
111 {
"Edit", Symbol::Edit },
112 {
"Emoji", Symbol::Emoji },
113 {
"Emoji2", Symbol::Emoji2 },
114 {
"Favorite", Symbol::Favorite },
115 {
"Filter", Symbol::Filter },
116 {
"Find", Symbol::Find },
117 {
"Flag", Symbol::Flag },
118 {
"Folder", Symbol::Folder },
119 {
"Font", Symbol::Font },
120 {
"FontColor", Symbol::FontColor },
121 {
"FontDecrease", Symbol::FontDecrease },
122 {
"FontIncrease", Symbol::FontIncrease },
123 {
"FontSize", Symbol::FontSize },
124 {
"Forward", Symbol::Forward },
125 {
"FourBars", Symbol::FourBars },
126 {
"FullScreen", Symbol::FullScreen },
127 {
"GlobalNavigationButton", Symbol::GlobalNavigationButton },
128 {
"Globe", Symbol::Globe },
129 {
"Go", Symbol::Go },
130 {
"GoToStart", Symbol::GoToStart },
131 {
"GoToToday", Symbol::GoToToday },
132 {
"HangUp", Symbol::HangUp },
133 {
"Help", Symbol::Help },
134 {
"HideBcc", Symbol::HideBcc },
135 {
"Highlight", Symbol::Highlight },
136 {
"Home", Symbol::Home },
137 {
"Import", Symbol::Import },
138 {
"ImportAll", Symbol::ImportAll },
139 {
"Important", Symbol::Important },
140 {
"Italic", Symbol::Italic },
141 {
"Keyboard", Symbol::Keyboard },
142 {
"LeaveChat", Symbol::LeaveChat },
143 {
"Library", Symbol::Library },
144 {
"Like", Symbol::Like },
145 {
"LikeDislike", Symbol::LikeDislike },
146 {
"Link", Symbol::Link },
147 {
"List", Symbol::List },
148 {
"Mail", Symbol::Mail },
149 {
"MailFilled", Symbol::MailFilled },
150 {
"MailForward", Symbol::MailForward },
151 {
"MailReply", Symbol::MailReply },
152 {
"MailReplyAll", Symbol::MailReplyAll },
153 {
"Manage", Symbol::Manage },
154 {
"Map", Symbol::Map },
155 {
"MapDrive", Symbol::MapDrive },
156 {
"MapPin", Symbol::MapPin },
157 {
"Memo", Symbol::Memo },
158 {
"Message", Symbol::Message },
159 {
"Microphone", Symbol::Microphone },
160 {
"More", Symbol::More },
161 {
"MoveToFolder", Symbol::MoveToFolder },
162 {
"MusicInfo", Symbol::MusicInfo },
163 {
"Mute", Symbol::Mute },
164 {
"NewFolder", Symbol::NewFolder },
165 {
"NewWindow", Symbol::NewWindow },
166 {
"Next", Symbol::Next },
167 {
"OneBar", Symbol::OneBar },
168 {
"OpenFile", Symbol::OpenFile },
169 {
"OpenLocal", Symbol::OpenLocal },
170 {
"OpenPane", Symbol::OpenPane },
171 {
"OpenWith", Symbol::OpenWith },
172 {
"Orientation", Symbol::Orientation },
173 {
"OtherUser", Symbol::OtherUser },
174 {
"OutlineStar", Symbol::OutlineStar },
175 {
"Page", Symbol::Page },
176 {
"Page2", Symbol::Page2 },
177 {
"Paste", Symbol::Paste },
178 {
"Pause", Symbol::Pause },
179 {
"People", Symbol::People },
180 {
"Permissions", Symbol::Permissions },
181 {
"Phone", Symbol::Phone },
182 {
"PhoneBook", Symbol::PhoneBook },
183 {
"Pictures", Symbol::Pictures },
184 {
"Pin", Symbol::Pin },
185 {
"Placeholder", Symbol::Placeholder },
186 {
"Play", Symbol::Play },
187 {
"PostUpdate", Symbol::PostUpdate },
188 {
"Preview", Symbol::Preview },
189 {
"PreviewLink", Symbol::PreviewLink },
190 {
"Previous", Symbol::Previous },
191 {
"Print", Symbol::Print },
192 {
"Priority", Symbol::Priority },
193 {
"ProtectedDocument", Symbol::ProtectedDocument },
194 {
"Read", Symbol::Read },
195 {
"Redo", Symbol::Redo },
196 {
"Refresh", Symbol::Refresh },
197 {
"Remote", Symbol::Remote },
198 {
"Remove", Symbol::Remove },
199 {
"Rename", Symbol::Rename },
200 {
"Repair", Symbol::Repair },
201 {
"RepeatAll", Symbol::RepeatAll },
202 {
"RepeatOne", Symbol::RepeatOne },
203 {
"ReportHacked", Symbol::ReportHacked },
204 {
"ReShare", Symbol::ReShare },
205 {
"Rotate", Symbol::Rotate },
206 {
"RotateCamera", Symbol::RotateCamera },
207 {
"Save", Symbol::Save },
208 {
"SaveLocal", Symbol::SaveLocal },
209 {
"Scan", Symbol::Scan },
210 {
"SelectAll", Symbol::SelectAll },
211 {
"Send", Symbol::Send },
212 {
"SetLockScreen", Symbol::SetLockScreen },
213 {
"SetTile", Symbol::SetTile },
214 {
"Setting", Symbol::Setting },
215 {
"Share", Symbol::Share },
216 {
"Shop", Symbol::Shop },
217 {
"ShowBcc", Symbol::ShowBcc },
218 {
"ShowResults", Symbol::ShowResults },
219 {
"Shuffle", Symbol::Shuffle },
220 {
"SlideShow", Symbol::SlideShow },
221 {
"SolidStar", Symbol::SolidStar },
222 {
"Sort", Symbol::Sort },
223 {
"Stop", Symbol::Stop },
224 {
"StopSlideShow", Symbol::StopSlideShow },
225 {
"Street", Symbol::Street },
226 {
"Switch", Symbol::Switch },
227 {
"SwitchApps", Symbol::SwitchApps },
228 {
"Sync", Symbol::Sync },
229 {
"SyncFolder", Symbol::SyncFolder },
230 {
"Tag", Symbol::Tag },
231 {
"Target", Symbol::Target },
232 {
"ThreeBars", Symbol::ThreeBars },
233 {
"TouchPointer", Symbol::TouchPointer },
234 {
"Trim", Symbol::Trim },
235 {
"TwoBars", Symbol::TwoBars },
236 {
"TwoPage", Symbol::TwoPage },
237 {
"Underline", Symbol::Underline },
238 {
"Undo", Symbol::Undo },
239 {
"UnFavorite", Symbol::UnFavorite },
240 {
"UnPin", Symbol::UnPin },
241 {
"UnSyncFolder", Symbol::UnSyncFolder },
242 {
"Up", Symbol::Up },
243 {
"Upload", Symbol::Upload },
244 {
"Video", Symbol::Video },
245 {
"VideoChat", Symbol::VideoChat },
246 {
"View", Symbol::View },
247 {
"ViewAll", Symbol::ViewAll },
248 {
"Volume", Symbol::Volume },
249 {
"WebCam", Symbol::WebCam },
250 {
"World", Symbol::World },
251 {
"XboxOneConsole", Symbol::XboxOneConsole },
252 {
"ZeroBars", Symbol::ZeroBars },
253 {
"Zoom", Symbol::Zoom },
254 {
"ZoomIn", Symbol::ZoomIn },
255 {
"ZoomOut", Symbol::ZoomOut }
256 };
257
258 winrt::Microsoft::
UI::Xaml::Controls::IconElement ui_get_icon(
const char* name) {
259 if (ui_symbol_icons.find(name) == ui_symbol_icons.end()) {
260 SymbolIcon no_icon = { nullptr };
261 return no_icon;
262 }
263
264 Symbol symbol = ui_symbol_icons[name];
265 SymbolIcon icon = SymbolIcon(symbol);
266 return icon;
267 }
268
269
270
271 UiSymbolIcon::UiSymbolIcon(winrt::Microsoft::
UI::Xaml::Controls::Symbol sym) {
272 symbol = sym;
273 }
274
275 UiSymbolIcon::~UiSymbolIcon() {
276
277 }
278
279 winrt::Microsoft::
UI::Xaml::Controls::IconElement UiSymbolIcon::getIcon() {
280 return SymbolIcon(symbol);
281 }
282
283
284 UiImageIcon::UiImageIcon(
const char* uristr) {
285 wchar_t* wuri = str2wstr(uristr, nullptr);
286 Windows::Foundation::Uri uri{ wuri };
287 this->uri = uri;
288 free(wuri);
289 }
290
291 UiImageIcon::~UiImageIcon() {
292
293 }
294
295 winrt::Microsoft::
UI::Xaml::Controls::IconElement UiImageIcon::getIcon() {
296 BitmapIcon icon = BitmapIcon();
297 icon.UriSource(uri);
298 ImageIcon img = ImageIcon();
299 img.Source();
300 return icon;
301 }
302
303
304 UiBitmapIcon::UiBitmapIcon(winrt::Microsoft::
UI::Xaml::Media::Imaging::BitmapSource bitmap) {
305 this->bitmap = bitmap;
306 }
307
308 UiBitmapIcon::~UiBitmapIcon() {
309
310 }
311
312 winrt::Microsoft::
UI::Xaml::Controls::IconElement UiBitmapIcon::getIcon() {
313 ImageIcon icon = ImageIcon();
314 icon.Source(bitmap);
315 return icon;
316 }
317
318 UIEXPORT UiIcon* ui_icon(
const char* name,
size_t size) {
319 Symbol symbol = ui_symbol_icons[name];
320 UiSymbolIcon* icon = new UiSymbolIcon(symbol);
321 return icon;
322 }
323
324
325 UIEXPORT UiIcon* ui_imageicon(
const char* file) {
326 return new UiImageIcon(file);
327 }
328
329 UIEXPORT void ui_icon_free(UiIcon* icon) {
330 delete icon;
331 }
332
333
334 struct __declspec(uuid(
"905a0fef-bc53-11df-8c49-001e4fc686da")) IBufferByteAccess : ::IUnknown
335 {
336 virtual
HRESULT __stdcall Buffer(
uint8_t** value) =
0;
337 };
338
339
340
341 winrt::Microsoft::
UI::Xaml::Media::Imaging::WriteableBitmap ui_dllicon2bitmap(
const char* dll,
int iconindex, bool large) {
342 WriteableBitmap wbitmap = { nullptr };
343
344
345 HICON hicon_small;
346 HICON hicon_large;
347 if (ExtractIconExA(dll, iconindex, &hicon_large, &hicon_small,
1) >
0) {
348 HICON hicon = large ? hicon_large : hicon_small;
349
350
351 ICONINFO info;
352 info.hbmColor = nullptr;
353 info.hbmMask = nullptr;
354 if (GetIconInfo(hicon, &info)) {
355 BITMAP bitmap;
356 if (GetObjectW(info.hbmColor,
sizeof(
BITMAP), &bitmap) !=
0) {
357 size_t bitmap_size = bitmap.bmWidthBytes * bitmap.bmHeight;
358 char *bitmap_data = (
char*)malloc(bitmap_size);
359
360
361 if (GetBitmapBits(info.hbmColor, bitmap_size, bitmap_data) !=
0) {
362 WriteableBitmap wb = WriteableBitmap(bitmap.bmWidth, bitmap.bmHeight);
363 void *wb_data = wb.PixelBuffer().data();
364 memcpy(wb_data, bitmap_data, bitmap_size);
365 wbitmap = wb;
366 }
367 free(bitmap_data);
368 }
369 if (info.hbmMask) {
370 DeleteObject(info.hbmMask);
371 }
372 if (info.hbmColor) {
373 DeleteObject(info.hbmColor);
374 }
375 }
376
377 DestroyIcon(hicon_small);
378 DestroyIcon(hicon_large);
379 }
380
381 return wbitmap;
382 }
383
384 UiIcon* ui_dllicon(
const char* dll,
int iconindex, bool large) {
385 WriteableBitmap wbitmap = ui_dllicon2bitmap(dll, iconindex, large);
386 return new UiBitmapIcon(wbitmap);
387 }
388
389 UIEXPORT UiIcon* ui_foldericon(
size_t size) {
390 bool large = true;
391 UiIcon** sys_folder_icon = &sys_folder_icon32;
392 if (size <=
24) {
393 large = false;
394 sys_folder_icon = &sys_folder_icon16;
395 }
396
397 if (*sys_folder_icon) {
398 return *sys_folder_icon;
399 }
400
401 UiIcon* icon = ui_dllicon(
"shell32.dll",
3, large);
402 *sys_folder_icon = icon;
403 return icon;
404 }
405
406 UIEXPORT UiIcon* ui_fileicon(
size_t size) {
407 bool large = true;
408 UiIcon** sys_folder_icon = &sys_file_icon32;
409 if (size <=
24) {
410 large = false;
411 sys_folder_icon = &sys_file_icon16;
412 }
413
414 if (*sys_folder_icon) {
415 return *sys_folder_icon;
416 }
417
418 UiIcon* icon = ui_dllicon(
"shell32.dll",
0, large);
419 *sys_folder_icon = icon;
420 return icon;
421 }
422