33 #include <stdlib.h> |
33 #include <stdlib.h> |
34 #include <string.h> |
34 #include <string.h> |
35 |
35 |
36 #include "util.h" |
36 #include "util.h" |
37 |
37 |
|
38 #include <Windows.h> |
|
39 #include <Shellapi.h> |
|
40 |
|
41 |
38 using namespace winrt; |
42 using namespace winrt; |
39 using namespace Microsoft::UI::Xaml; |
43 using namespace Microsoft::UI::Xaml; |
40 using namespace Microsoft::UI::Xaml::Controls; |
44 using namespace Microsoft::UI::Xaml::Controls; |
41 using namespace Windows::UI::Xaml::Interop; |
45 using namespace Windows::UI::Xaml::Interop; |
42 using namespace winrt::Windows::Foundation; |
46 using namespace winrt::Windows::Foundation; |
43 using namespace winrt::Microsoft::UI::Xaml::Controls::Primitives; |
47 using namespace winrt::Microsoft::UI::Xaml::Controls::Primitives; |
44 |
48 using namespace winrt::Microsoft::UI::Xaml::Media::Imaging; |
|
49 //using namespace Windows::Storage::Streams; |
|
50 |
|
51 static UiIcon* sys_folder_icon16; |
|
52 static UiIcon* sys_file_icon16; |
|
53 |
|
54 static UiIcon* sys_folder_icon32; |
|
55 static UiIcon* sys_file_icon32; |
45 |
56 |
46 std::unordered_map<std::string, Symbol> ui_symbol_icons = { |
57 std::unordered_map<std::string, Symbol> ui_symbol_icons = { |
47 {"Accept", Symbol::Accept }, |
58 {"Accept", Symbol::Accept }, |
48 {"Account", Symbol::Account }, |
59 {"Account", Symbol::Account }, |
49 {"Add", Symbol::Add }, |
60 {"Add", Symbol::Add }, |
281 } |
292 } |
282 |
293 |
283 winrt::Microsoft::UI::Xaml::Controls::IconElement UiImageIcon::getIcon() { |
294 winrt::Microsoft::UI::Xaml::Controls::IconElement UiImageIcon::getIcon() { |
284 BitmapIcon icon = BitmapIcon(); |
295 BitmapIcon icon = BitmapIcon(); |
285 icon.UriSource(uri); |
296 icon.UriSource(uri); |
|
297 ImageIcon img = ImageIcon(); |
|
298 img.Source(); |
|
299 return icon; |
|
300 } |
|
301 |
|
302 // bitmap icon implementation |
|
303 UiBitmapIcon::UiBitmapIcon(winrt::Microsoft::UI::Xaml::Media::Imaging::BitmapSource bitmap) { |
|
304 this->bitmap = bitmap; |
|
305 } |
|
306 |
|
307 UiBitmapIcon::~UiBitmapIcon() { |
|
308 |
|
309 } |
|
310 |
|
311 winrt::Microsoft::UI::Xaml::Controls::IconElement UiBitmapIcon::getIcon() { |
|
312 ImageIcon icon = ImageIcon(); |
|
313 icon.Source(bitmap); |
286 return icon; |
314 return icon; |
287 } |
315 } |
288 |
316 |
289 UIEXPORT UiIcon* ui_icon(const char* name, size_t size) { |
317 UIEXPORT UiIcon* ui_icon(const char* name, size_t size) { |
290 Symbol symbol = ui_symbol_icons[name]; |
318 Symbol symbol = ui_symbol_icons[name]; |
298 } |
326 } |
299 |
327 |
300 UIEXPORT void ui_icon_free(UiIcon* icon) { |
328 UIEXPORT void ui_icon_free(UiIcon* icon) { |
301 delete icon; |
329 delete icon; |
302 } |
330 } |
|
331 |
|
332 |
|
333 struct __declspec(uuid("905a0fef-bc53-11df-8c49-001e4fc686da")) IBufferByteAccess : ::IUnknown |
|
334 { |
|
335 virtual HRESULT __stdcall Buffer(uint8_t** value) = 0; |
|
336 }; |
|
337 |
|
338 |
|
339 |
|
340 winrt::Microsoft::UI::Xaml::Media::Imaging::WriteableBitmap ui_dllicon2bitmap(const char* dll, int iconindex, bool large) { |
|
341 WriteableBitmap wbitmap = { nullptr }; |
|
342 |
|
343 // get the icon from the dll |
|
344 HICON hicon_small; |
|
345 HICON hicon_large; |
|
346 if (ExtractIconExA(dll, iconindex, &hicon_large, &hicon_small, 1) > 0) { |
|
347 HICON hicon = large ? hicon_large : hicon_small; |
|
348 |
|
349 // convert icon to (gdi) bitmap |
|
350 ICONINFO info; |
|
351 if (GetIconInfo(hicon, &info)) { |
|
352 BITMAP bitmap; |
|
353 if (GetObjectW(info.hbmColor, sizeof(BITMAP), &bitmap) != 0) { |
|
354 size_t bitmap_size = bitmap.bmWidthBytes * bitmap.bmHeight; |
|
355 char *bitmap_data = (char*)malloc(bitmap_size); |
|
356 |
|
357 // get the pixel data |
|
358 if (GetBitmapBits(info.hbmColor, bitmap_size, bitmap_data) != 0) { |
|
359 WriteableBitmap wb = WriteableBitmap(bitmap.bmWidth, bitmap.bmHeight); |
|
360 void *wb_data = wb.PixelBuffer().data(); |
|
361 memcpy(wb_data, bitmap_data, bitmap_size); |
|
362 wbitmap = wb; |
|
363 } |
|
364 DeleteObject(info.hbmColor); |
|
365 free(bitmap_data); |
|
366 } |
|
367 } |
|
368 DeleteObject(info.hbmMask); |
|
369 |
|
370 DestroyIcon(hicon_small); |
|
371 DestroyIcon(hicon_large); |
|
372 } |
|
373 |
|
374 return wbitmap; |
|
375 } |
|
376 |
|
377 UiIcon* ui_dllicon(const char* dll, int iconindex, bool large) { |
|
378 WriteableBitmap wbitmap = ui_dllicon2bitmap(dll, iconindex, large); |
|
379 return new UiBitmapIcon(wbitmap); |
|
380 } |
|
381 |
|
382 UIEXPORT UiIcon* ui_foldericon(size_t size) { |
|
383 bool large = true; |
|
384 UiIcon** sys_folder_icon = &sys_folder_icon32; |
|
385 if (size <= 24) { |
|
386 large = false; |
|
387 sys_folder_icon = &sys_folder_icon16; |
|
388 } |
|
389 |
|
390 if (*sys_folder_icon) { |
|
391 return *sys_folder_icon; |
|
392 } |
|
393 |
|
394 UiIcon* icon = ui_dllicon("shell32.dll", 3, large); |
|
395 *sys_folder_icon = icon; |
|
396 return icon; |
|
397 } |
|
398 |
|
399 UIEXPORT UiIcon* ui_fileicon(size_t size) { |
|
400 bool large = true; |
|
401 UiIcon** sys_folder_icon = &sys_folder_icon32; |
|
402 if (size <= 24) { |
|
403 large = false; |
|
404 sys_folder_icon = &sys_folder_icon16; |
|
405 } |
|
406 |
|
407 if (*sys_folder_icon) { |
|
408 return *sys_folder_icon; |
|
409 } |
|
410 |
|
411 UiIcon* icon = ui_dllicon("shell32.dll", 0, large); |
|
412 *sys_folder_icon = icon; |
|
413 return icon; |
|
414 } |