|
1 /* |
|
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
|
3 * |
|
4 * Copyright 2017 Olaf Wintermann. All rights reserved. |
|
5 * |
|
6 * Redistribution and use in source and binary forms, with or without |
|
7 * modification, are permitted provided that the following conditions are met: |
|
8 * |
|
9 * 1. Redistributions of source code must retain the above copyright |
|
10 * notice, this list of conditions and the following disclaimer. |
|
11 * |
|
12 * 2. Redistributions in binary form must reproduce the above copyright |
|
13 * notice, this list of conditions and the following disclaimer in the |
|
14 * documentation and/or other materials provided with the distribution. |
|
15 * |
|
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
|
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|
26 * POSSIBILITY OF SUCH DAMAGE. |
|
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 //using namespace Windows::Storage::Streams; |
|
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 // symbol icon implementation |
|
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 // image icon implementation |
|
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 // bitmap icon implementation |
|
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 // get the icon from the dll |
|
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 // convert icon to (gdi) bitmap |
|
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 // get the pixel data |
|
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 } |