ui/winui/icons.cpp

branch
newapi
changeset 216
391c2c723029
parent 215
1bd5534c395d
child 217
b9798109c7d2
equal deleted inserted replaced
215:1bd5534c395d 216:391c2c723029
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 }

mercurial