ReactOS 0.4.15-dev-5666-gc548b97
shimgvw.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Picture and Fax Viewer
3 * FILE: dll/win32/shimgvw/shimgvw.c
4 * PURPOSE: shimgvw.dll
5 * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
6 * Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
7 */
8
9#define WIN32_NO_STATUS
10#define _INC_WINDOWS
11#define COM_NO_WINDOWS_H
12#define INITGUID
13
14#include <stdarg.h>
15
16#include <windef.h>
17#include <winbase.h>
18#include <winnls.h>
19#include <winreg.h>
20#include <wingdi.h>
21#include <wincon.h>
22#include <windowsx.h>
23#include <objbase.h>
24#include <commctrl.h>
25#include <commdlg.h>
26#include <gdiplus.h>
27#include <tchar.h>
28#include <shlobj.h>
29#include <strsafe.h>
30#include <shlwapi.h>
31#include <shellapi.h>
32
33#define NDEBUG
34#include <debug.h>
35
36#include "shimgvw.h"
37
43
45
46/* zooming */
48
49static const UINT ZoomSteps[] =
50{
51 10, 25, 50, 100, 200, 400, 800, 1600
52};
53
54#define MIN_ZOOM ZoomSteps[0]
55#define MAX_ZOOM ZoomSteps[_countof(ZoomSteps)-1]
56
57/* ToolBar Buttons */
58typedef struct {
59 DWORD idb; /* Index to bitmap */
60 DWORD ids; /* Index to tooltip */
62
63 /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */
64#define DEFINE_BTN_INFO(_name) \
65 { TBICON_##_name, IDC_##_name, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }
66
67#define DEFINE_BTN_SEPARATOR \
68 { 15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0 }
69
70/* ToolBar Buttons */
71static const TBBUTTON Buttons[] =
72{
73 DEFINE_BTN_INFO(PREV_PIC),
74 DEFINE_BTN_INFO(NEXT_PIC),
76 DEFINE_BTN_INFO(BEST_FIT),
77 DEFINE_BTN_INFO(REAL_SIZE),
80 DEFINE_BTN_INFO(ZOOM_IN),
81 DEFINE_BTN_INFO(ZOOM_OUT),
83 DEFINE_BTN_INFO(ROT_CLOCKW),
84 DEFINE_BTN_INFO(ROT_COUNCW),
87 DEFINE_BTN_INFO(PRINT),
88 DEFINE_BTN_INFO(SAVEAS),
91 DEFINE_BTN_INFO(HELP_TOC)
92};
93
94#define DEFINE_BTN_CONFIG(_name) { IDB_##_name, IDS_TOOLTIP_##_name }
95
97{
98 DEFINE_BTN_CONFIG(PREV_PIC),
99 DEFINE_BTN_CONFIG(NEXT_PIC),
100 DEFINE_BTN_CONFIG(BEST_FIT),
101 DEFINE_BTN_CONFIG(REAL_SIZE),
103 DEFINE_BTN_CONFIG(ZOOM_IN),
104 DEFINE_BTN_CONFIG(ZOOM_OUT),
105 DEFINE_BTN_CONFIG(ROT_CLOCKW),
106 DEFINE_BTN_CONFIG(ROT_COUNCW),
108 DEFINE_BTN_CONFIG(PRINT),
109 DEFINE_BTN_CONFIG(SAVEAS),
111 DEFINE_BTN_CONFIG(HELP_TOC)
112};
113
114/* animation */
120
121#define ANIME_TIMER_ID 9999
122
123static void Anime_FreeInfo(void)
124{
125 if (m_pDelayItem)
126 {
129 }
130 m_nFrameIndex = 0;
131 m_nFrameCount = 0;
132 m_nLoopIndex = 0;
133 m_nLoopCount = (UINT)-1;
134}
135
137{
138 GUID *dims;
139 UINT nDimCount = 0;
140 UINT cbItem;
141 UINT result;
142 PropertyItem *pItem;
143
146
147 if (!image)
148 return FALSE;
149
151 if (nDimCount)
152 {
153 dims = (GUID *)calloc(nDimCount, sizeof(GUID));
154 if (dims)
155 {
156 GdipImageGetFrameDimensionsList(image, dims, nDimCount);
159 free(dims);
160 }
161 }
162
163 result = 0;
165 cbItem = result;
166 if (cbItem)
167 {
168 m_pDelayItem = (PropertyItem *)malloc(cbItem);
170 }
171
172 result = 0;
174 cbItem = result;
175 if (cbItem)
176 {
177 pItem = (PropertyItem *)malloc(cbItem);
178 if (pItem)
179 {
180 if (GdipGetPropertyItem(image, PropertyTagLoopCount, cbItem, pItem) == Ok)
181 {
182 m_nLoopCount = *(WORD *)pItem->value;
183 }
184 free(pItem);
185 }
186 }
187
188 if (m_pDelayItem)
189 {
191 }
192
193 return m_pDelayItem != NULL;
194}
195
196static void Anime_SetFrameIndex(UINT nFrameIndex)
197{
198 if (nFrameIndex < m_nFrameCount)
199 {
200 GUID guid = FrameDimensionTime;
201 if (Ok != GdipImageSelectActiveFrame(image, &guid, nFrameIndex))
202 {
203 guid = FrameDimensionPage;
204 GdipImageSelectActiveFrame(image, &guid, nFrameIndex);
205 }
206 }
207 m_nFrameIndex = nFrameIndex;
208}
209
211{
212 if (nFrameIndex < m_nFrameCount && m_pDelayItem)
213 {
214 return ((DWORD *)m_pDelayItem->value)[m_nFrameIndex] * 10;
215 }
216 return 0;
217}
218
220{
221 *pdwDelay = INFINITE;
222 if (m_nLoopCount == (UINT)-1)
223 return FALSE;
224
226 {
230 return TRUE;
231 }
232
234 {
237 m_nFrameIndex = 0;
238 ++m_nLoopIndex;
239 return TRUE;
240 }
241
242 return FALSE;
243}
244
245static void UpdateZoom(UINT NewZoom)
246{
247 BOOL bEnableZoomIn, bEnableZoomOut;
248
249 /* If zoom has not been changed, ignore it */
250 if (ZoomPercents == NewZoom)
251 return;
252
253 ZoomPercents = NewZoom;
254
255 /* Check if a zoom button of the toolbar must be grayed */
256 bEnableZoomIn = bEnableZoomOut = TRUE;
257
258 if (NewZoom >= MAX_ZOOM)
259 {
260 bEnableZoomIn = FALSE;
261 }
262 else if (NewZoom <= MIN_ZOOM)
263 {
264 bEnableZoomOut = FALSE;
265 }
266
267 /* Update the state of the zoom buttons */
270
271 /* Redraw the display window */
273}
274
275static void ZoomInOrOut(BOOL bZoomIn)
276{
277 UINT i, NewZoom;
278
279 if (image == NULL)
280 return;
281
282 if (bZoomIn) /* zoom in */
283 {
284 /* find next step */
285 for (i = 0; i < _countof(ZoomSteps); ++i)
286 {
287 if (ZoomPercents < ZoomSteps[i])
288 break;
289 }
290 if (i == _countof(ZoomSteps))
291 NewZoom = MAX_ZOOM;
292 else
293 NewZoom = ZoomSteps[i];
294 }
295 else /* zoom out */
296 {
297 /* find previous step */
298 for (i = _countof(ZoomSteps); i > 0; )
299 {
300 --i;
301 if (ZoomSteps[i] < ZoomPercents)
302 break;
303 }
304 if (i < 0)
305 NewZoom = MIN_ZOOM;
306 else
307 NewZoom = ZoomSteps[i];
308 }
309
310 /* Update toolbar and refresh screen */
311 UpdateZoom(NewZoom);
312}
313
314static void ResetZoom(void)
315{
316 RECT Rect;
317 UINT ImageWidth, ImageHeight, NewZoom;
318
319 if (image == NULL)
320 return;
321
322 /* get disp window size and image size */
324 GdipGetImageWidth(image, &ImageWidth);
325 GdipGetImageHeight(image, &ImageHeight);
326
327 /* compare two aspect rates. same as
328 (ImageHeight / ImageWidth < Rect.bottom / Rect.right) in real */
329 if (ImageHeight * Rect.right < Rect.bottom * ImageWidth)
330 {
331 if (Rect.right < ImageWidth)
332 {
333 /* it's large, shrink it */
334 NewZoom = (Rect.right * 100) / ImageWidth;
335 }
336 else
337 {
338 /* it's small. show as original size */
339 NewZoom = 100;
340 }
341 }
342 else
343 {
344 if (Rect.bottom < ImageHeight)
345 {
346 /* it's large, shrink it */
347 NewZoom = (Rect.bottom * 100) / ImageHeight;
348 }
349 else
350 {
351 /* it's small. show as original size */
352 NewZoom = 100;
353 }
354 }
355
356 UpdateZoom(NewZoom);
357}
358
359static void pLoadImage(LPCWSTR szOpenFileName)
360{
361 /* check file presence */
362 if (GetFileAttributesW(szOpenFileName) == 0xFFFFFFFF)
363 {
364 DPRINT1("File %s not found!\n", szOpenFileName);
365 return;
366 }
367
368 /* load now */
369 GdipLoadImageFromFile(szOpenFileName, &image);
370 if (!image)
371 {
372 DPRINT1("GdipLoadImageFromFile() failed\n");
373 return;
374 }
376
377 if (szOpenFileName && szOpenFileName[0])
378 SHAddToRecentDocs(SHARD_PATHW, szOpenFileName);
379
380 /* Reset zoom and redraw display */
381 ResetZoom();
382}
383
385{
387 ImageCodecInfo *codecInfo;
388 WCHAR szSaveFileName[MAX_PATH];
389 WCHAR *szFilterMask;
390 GUID rawFormat;
391 UINT num;
392 UINT size;
393 size_t sizeRemain;
394 UINT j;
395 WCHAR *c;
396
397 if (image == NULL)
398 return;
399
401 codecInfo = malloc(size);
402 if (!codecInfo)
403 {
404 DPRINT1("malloc() failed in pSaveImageAs()\n");
405 return;
406 }
407
408 GdipGetImageEncoders(num, size, codecInfo);
409 GdipGetImageRawFormat(image, &rawFormat);
410
411 sizeRemain = 0;
412
413 for (j = 0; j < num; ++j)
414 {
415 // Every pair needs space for the Description, twice the Extensions, 1 char for the space, 2 for the braces and 2 for the NULL terminators.
416 sizeRemain = sizeRemain + (((wcslen(codecInfo[j].FormatDescription) + (wcslen(codecInfo[j].FilenameExtension) * 2) + 5) * sizeof(WCHAR)));
417 }
418
419 /* Add two more chars for the last terminator */
420 sizeRemain = sizeRemain + (sizeof(WCHAR) * 2);
421
422 szFilterMask = malloc(sizeRemain);
423 if (!szFilterMask)
424 {
425 DPRINT1("cannot allocate memory for filter mask in pSaveImageAs()");
426 free(codecInfo);
427 return;
428 }
429
430 ZeroMemory(szSaveFileName, sizeof(szSaveFileName));
431 ZeroMemory(szFilterMask, sizeRemain);
432 ZeroMemory(&sfn, sizeof(sfn));
433 sfn.lStructSize = sizeof(sfn);
436 sfn.lpstrFile = szSaveFileName;
437 sfn.lpstrFilter = szFilterMask;
440
441 c = szFilterMask;
442
443 for (j = 0; j < num; ++j)
444 {
445 StringCbPrintfExW(c, sizeRemain, &c, &sizeRemain, 0, L"%ls (%ls)", codecInfo[j].FormatDescription, codecInfo[j].FilenameExtension);
446
447 /* Skip the NULL character */
448 c++;
449 sizeRemain -= sizeof(*c);
450
451 StringCbPrintfExW(c, sizeRemain, &c, &sizeRemain, 0, L"%ls", codecInfo[j].FilenameExtension);
452
453 /* Skip the NULL character */
454 c++;
455 sizeRemain -= sizeof(*c);
456
457 if (IsEqualGUID(&rawFormat, &codecInfo[j].FormatID) != FALSE)
458 {
459 sfn.nFilterIndex = j + 1;
460 }
461 }
462
463 if (GetSaveFileNameW(&sfn))
464 {
465 if (m_pDelayItem)
466 {
467 /* save animation */
469
470 DPRINT1("FIXME: save animation\n");
471 if (GdipSaveImageToFile(image, szSaveFileName, &codecInfo[sfn.nFilterIndex - 1].Clsid, NULL) != Ok)
472 {
473 DPRINT1("GdipSaveImageToFile() failed\n");
474 }
475
477 }
478 else
479 {
480 /* save non-animation */
481 if (GdipSaveImageToFile(image, szSaveFileName, &codecInfo[sfn.nFilterIndex - 1].Clsid, NULL) != Ok)
482 {
483 DPRINT1("GdipSaveImageToFile() failed\n");
484 }
485 }
486 }
487
488 free(szFilterMask);
489 free(codecInfo);
490}
491
492static VOID
494{
495 /* FIXME */
496}
497
498static VOID
500{
503}
504
505static VOID
507{
508 WCHAR szTitleBuf[800];
509 WCHAR szResStr[512];
510 LPWSTR pchFileTitle;
511
512 if (image)
513 {
515 image = NULL;
516 }
517
518 if (node == NULL)
519 {
521 return;
522 }
523
524 pLoadImage(node->FileName);
525
526 LoadStringW(hInstance, IDS_APPTITLE, szResStr, _countof(szResStr));
527 if (image != NULL)
528 {
529 pchFileTitle = PathFindFileNameW(node->FileName);
530 StringCbPrintfW(szTitleBuf, sizeof(szTitleBuf),
531 L"%ls%ls%ls", szResStr, L" - ", pchFileTitle);
532 SetWindowTextW(hwnd, szTitleBuf);
533 }
534 else
535 {
536 SetWindowTextW(hwnd, szResStr);
537 }
538
540}
541
542static SHIMGVW_FILENODE*
544{
545 HANDLE hFindHandle;
546 WCHAR *extension;
547 WCHAR szSearchPath[MAX_PATH];
548 WCHAR szSearchMask[MAX_PATH];
549 WCHAR szFileTypes[MAX_PATH];
550 WIN32_FIND_DATAW findData;
551 SHIMGVW_FILENODE *currentNode = NULL;
553 SHIMGVW_FILENODE *conductor = NULL;
554 ImageCodecInfo *codecInfo;
555 UINT num;
556 UINT size;
557 UINT j;
558
559 StringCbCopyW(szSearchPath, sizeof(szSearchPath), szFirstFile);
560 PathRemoveFileSpecW(szSearchPath);
561
563 codecInfo = malloc(size);
564 if (!codecInfo)
565 {
566 DPRINT1("malloc() failed in pLoadFileList()\n");
567 return NULL;
568 }
569
570 GdipGetImageDecoders(num, size, codecInfo);
571
572 root = malloc(sizeof(SHIMGVW_FILENODE));
573 if (!root)
574 {
575 DPRINT1("malloc() failed in pLoadFileList()\n");
576 free(codecInfo);
577 return NULL;
578 }
579
580 conductor = root;
581
582 for (j = 0; j < num; ++j)
583 {
584 StringCbCopyW(szFileTypes, sizeof(szFileTypes), codecInfo[j].FilenameExtension);
585
586 extension = wcstok(szFileTypes, L";");
587 while (extension != NULL)
588 {
589 PathCombineW(szSearchMask, szSearchPath, extension);
590
591 hFindHandle = FindFirstFileW(szSearchMask, &findData);
592 if (hFindHandle != INVALID_HANDLE_VALUE)
593 {
594 do
595 {
596 PathCombineW(conductor->FileName, szSearchPath, findData.cFileName);
597
598 // compare the name of the requested file with the one currently found.
599 // if the name matches, the current node is returned by the function.
600 if (wcscmp(szFirstFile, conductor->FileName) == 0)
601 {
602 currentNode = conductor;
603 }
604
605 conductor->Next = malloc(sizeof(SHIMGVW_FILENODE));
606
607 // if malloc fails, make circular what we have and return it
608 if (!conductor->Next)
609 {
610 DPRINT1("malloc() failed in pLoadFileList()\n");
611
612 conductor->Next = root;
613 root->Prev = conductor;
614
615 FindClose(hFindHandle);
616 free(codecInfo);
617 return conductor;
618 }
619
620 conductor->Next->Prev = conductor;
621 conductor = conductor->Next;
622 }
623 while (FindNextFileW(hFindHandle, &findData) != 0);
624
625 FindClose(hFindHandle);
626 }
627
628 extension = wcstok(NULL, L";");
629 }
630 }
631
632 // we now have a node too much in the list. In case the requested file was not found,
633 // we use this node to store the name of it, otherwise we free it.
634 if (currentNode == NULL)
635 {
636 StringCchCopyW(conductor->FileName, MAX_PATH, szFirstFile);
637 currentNode = conductor;
638 }
639 else
640 {
641 conductor = conductor->Prev;
642 free(conductor->Next);
643 }
644
645 // link the last node with the first one to make the list circular
646 conductor->Next = root;
647 root->Prev = conductor;
648 conductor = currentNode;
649
650 free(codecInfo);
651
652 return conductor;
653}
654
655static VOID
657{
658 SHIMGVW_FILENODE *conductor;
659
660 if (!root)
661 return;
662
663 root->Prev->Next = NULL;
664 root->Prev = NULL;
665
666 while (root)
667 {
668 conductor = root;
669 root = conductor->Next;
670 free(conductor);
671 }
672}
673
674static VOID
676{
679}
680
682{
683 static const CHAR pattern[] =
684 "\x28\x00\x00\x00\x10\x00\x00\x00\x10\x00\x00\x00\x01\x00\x04\x00\x00\x00"
685 "\x00\x00\x80\x00\x00\x00\x23\x2E\x00\x00\x23\x2E\x00\x00\x10\x00\x00\x00"
686 "\x00\x00\x00\x00\x99\x99\x99\x00\xCC\xCC\xCC\x00\x00\x00\x00\x00\x00\x00"
687 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
688 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
689 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11\x11\x11"
690 "\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00"
691 "\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00"
692 "\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11"
693 "\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00"
694 "\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11"
695 "\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11"
696 "\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11";
697
699}
700
701static VOID
703{
704 GpGraphics *graphics;
705 UINT ImageWidth, ImageHeight;
706 INT ZoomedWidth, ZoomedHeight, x, y;
707 PAINTSTRUCT ps;
708 RECT rect, margin;
709 HDC hdc;
710 HBRUSH white;
711 HGDIOBJ hbrOld;
712 UINT uFlags;
713 WCHAR szText[128];
714 HGDIOBJ hFontOld;
715
716 hdc = BeginPaint(hwnd, &ps);
717 if (!hdc)
718 {
719 DPRINT1("BeginPaint() failed\n");
720 return;
721 }
722
723 GdipCreateFromHDC(hdc, &graphics);
724 if (!graphics)
725 {
726 DPRINT1("GdipCreateFromHDC() failed\n");
727 return;
728 }
729
732
733 if (image == NULL)
734 {
735 FillRect(hdc, &rect, white);
736
737 LoadStringW(hInstance, IDS_NOPREVIEW, szText, _countof(szText));
738
739 SetTextColor(hdc, RGB(0, 0, 0));
741
745 SelectObject(hdc, hFontOld);
746 }
747 else
748 {
749 GdipGetImageWidth(image, &ImageWidth);
750 GdipGetImageHeight(image, &ImageHeight);
751
752 ZoomedWidth = (ImageWidth * ZoomPercents) / 100;
753 ZoomedHeight = (ImageHeight * ZoomPercents) / 100;
754
755 x = (rect.right - ZoomedWidth) / 2;
756 y = (rect.bottom - ZoomedHeight) / 2;
757
758 // Fill top part
759 margin = rect;
760 margin.bottom = y - 1;
761 FillRect(hdc, &margin, white);
762 // Fill bottom part
763 margin.top = y + ZoomedHeight + 1;
764 margin.bottom = rect.bottom;
765 FillRect(hdc, &margin, white);
766 // Fill left part
767 margin.top = y - 1;
768 margin.bottom = y + ZoomedHeight + 1;
769 margin.right = x - 1;
770 FillRect(hdc, &margin, white);
771 // Fill right part
772 margin.left = x + ZoomedWidth + 1;
773 margin.right = rect.right;
774 FillRect(hdc, &margin, white);
775
776 DPRINT("x = %d, y = %d, ImageWidth = %u, ImageHeight = %u\n");
777 DPRINT("rect.right = %ld, rect.bottom = %ld\n", rect.right, rect.bottom);
778 DPRINT("ZoomPercents = %d, ZoomedWidth = %d, ZoomedHeight = %d\n",
779 ZoomPercents, ZoomedWidth, ZoomedWidth);
780
781 if (ZoomPercents % 100 == 0)
782 {
785 }
786 else
787 {
790 }
791
792 uFlags = 0;
794
796 {
797 HBRUSH hbr = CreateCheckerBoardBrush(hdc);
798 hbrOld = SelectObject(hdc, hbr);
799 Rectangle(hdc, x - 1, y - 1, x + ZoomedWidth + 1, y + ZoomedHeight + 1);
800 SelectObject(hdc, hbrOld);
801 DeleteObject(hbr);
802 }
803 else
804 {
806 Rectangle(hdc, x - 1, y - 1, x + ZoomedWidth + 1, y + ZoomedHeight + 1);
807 SelectObject(hdc, hbrOld);
808 }
809
810 GdipDrawImageRectI(graphics, image, x, y, ZoomedWidth, ZoomedHeight);
811 }
812 GdipDeleteGraphics(graphics);
813 EndPaint(hwnd, &ps);
814}
815
816static BOOL
818{
819 HKEY hKey;
821 LONG nError;
822
823 nError = RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\ReactOS\\shimgvw", 0, KEY_READ, &hKey);
824 if (nError)
825 return FALSE;
826
827 dwSize = sizeof(shiSettings);
828 nError = RegQueryValueExW(hKey, L"Settings", NULL, NULL, (LPBYTE)&shiSettings, &dwSize);
830
831 return !nError;
832}
833
834static VOID
836{
838 HKEY hKey;
839
841 wp.length = sizeof(WINDOWPLACEMENT);
843
849
850 if (RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software\\ReactOS\\shimgvw"), 0, NULL,
852 {
853 RegSetValueEx(hKey, _T("Settings"), 0, REG_BINARY, (LPBYTE)&shiSettings, sizeof(SHIMGVW_SETTINGS));
855 }
856}
857
858static BOOL
860{
863 0, 0, 0, 0, hwnd,
864 0, hInstance, NULL);
865 if (hToolBar != NULL)
866 {
867 HIMAGELIST hImageList;
868
871
873 sizeof(Buttons[0]), 0);
874
876 if (hImageList == NULL) return FALSE;
877
878 for (UINT n = 0; n < _countof(BtnConfig); n++)
879 {
882 }
883
885 0, (LPARAM)hImageList));
886
888
889 return TRUE;
890 }
891
892 return FALSE;
893}
894
896{
897 DWORD dwDelay;
898
901
902 if (Anime_Step(&dwDelay))
903 {
904 SetTimer(hwnd, ANIME_TIMER_ID, dwDelay, NULL);
905 }
906}
907
910{
911 switch (Message)
912 {
913 case WM_PAINT:
914 {
916 return 0L;
917 }
918 case WM_TIMER:
919 {
920 if (wParam == ANIME_TIMER_ID)
921 {
923 return 0;
924 }
925 break;
926 }
927 }
929}
930
931static VOID
933{
937
939
942 0, 0, 0, 0, hwnd, NULL, hInstance, NULL);
943
946
948}
949
950static VOID
952{
953 if (zDelta != 0)
954 {
955 ZoomInOrOut(zDelta > 0);
956 }
957}
958
959static VOID
961{
962 RECT rc;
963
965
967
968 MoveWindow(hDispWnd, 0, 0, cx, cy - (rc.bottom - rc.top), TRUE);
969
970 /* is it maximized or restored? */
972 {
973 /* reset zoom */
974 ResetZoom();
975 }
976}
977
978static LRESULT
980{
981 DPRINT1("ImageView_Delete: unimplemented.\n");
982 return 0;
983}
984
985static LRESULT
987{
988 int nChars = GetFullPathNameW(currentFile->FileName, 0, NULL, NULL);
989 LPWSTR pszPathName;
991
992 if (!nChars)
993 {
994 DPRINT1("ImageView_Modify: failed to get full path name.\n");
995 return 1;
996 }
997
998 pszPathName = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, nChars * sizeof(WCHAR));
999 if (pszPathName == NULL)
1000 {
1001 DPRINT1("HeapAlloc() failed in ImageView_Modify()\n");
1002 return 1;
1003 }
1004
1005 GetFullPathNameW(currentFile->FileName, nChars, pszPathName, NULL);
1006
1007 sei.cbSize = sizeof(sei);
1008 sei.fMask = 0;
1009 sei.hwnd = NULL;
1010 sei.lpVerb = L"edit";
1011 sei.lpFile = pszPathName;
1012 sei.lpParameters = NULL;
1013 sei.lpDirectory = NULL;
1014 sei.nShow = SW_SHOWNORMAL;
1015 sei.hInstApp = NULL;
1016
1017 if (!ShellExecuteExW(&sei))
1018 {
1019 DPRINT1("ImageView_Modify: ShellExecuteExW() failed with code %08X\n", (int)GetLastError());
1020 }
1021
1022 HeapFree(GetProcessHeap(), 0, pszPathName);
1023
1024 return 0;
1025}
1026
1029{
1030 switch (Message)
1031 {
1032 case WM_CREATE:
1033 {
1035 return 0L;
1036 }
1037
1038 case WM_COMMAND:
1039 {
1040 switch (LOWORD(wParam))
1041 {
1042 case IDC_PREV_PIC:
1045 break;
1046
1047 case IDC_NEXT_PIC:
1050 break;
1051
1052 case IDC_BEST_FIT:
1053 DPRINT1("IDC_BEST_FIT unimplemented\n");
1054 break;
1055
1056 case IDC_REAL_SIZE:
1057 UpdateZoom(100);
1058 return 0;
1059
1060 case IDC_SLIDE_SHOW:
1061 DPRINT1("IDC_SLIDE_SHOW unimplemented\n");
1062 break;
1063
1064 case IDC_ZOOM_IN:
1066 break;
1067
1068 case IDC_ZOOM_OUT:
1070 break;
1071
1072 case IDC_SAVEAS:
1074 break;
1075
1076 case IDC_PRINT:
1078 break;
1079
1080 case IDC_ROT_CLOCKW:
1081 if (image)
1082 {
1085 }
1086 break;
1087
1088 case IDC_ROT_COUNCW:
1089 if (image)
1090 {
1093 }
1094 break;
1095
1096 case IDC_DELETE:
1097 return ImageView_Delete(hwnd);
1098
1099 case IDC_MODIFY:
1100 return ImageView_Modify(hwnd);
1101 }
1102 }
1103 break;
1104
1105 case WM_MOUSEWHEEL:
1109 break;
1110
1111 case WM_NOTIFY:
1112 {
1113 LPNMHDR pnmhdr = (LPNMHDR)lParam;
1114
1115 switch (pnmhdr->code)
1116 {
1117 case TTN_GETDISPINFO:
1118 {
1119 LPTOOLTIPTEXTW lpttt;
1120
1121 lpttt = (LPTOOLTIPTEXTW)lParam;
1122 lpttt->hinst = hInstance;
1123
1124 lpttt->lpszText = MAKEINTRESOURCEW(BtnConfig[lpttt->hdr.idFrom - IDC_TOOL_BASE].ids);
1125 return 0;
1126 }
1127 }
1128 break;
1129 }
1130 case WM_SIZING:
1131 {
1132 LPRECT pRect = (LPRECT)lParam;
1133 if (pRect->right-pRect->left < 350)
1134 pRect->right = pRect->left + 350;
1135
1136 if (pRect->bottom-pRect->top < 290)
1137 pRect->bottom = pRect->top + 290;
1138 return TRUE;
1139 }
1140 case WM_SIZE:
1141 {
1143 return 0;
1144 }
1145 case WM_DESTROY:
1146 {
1149 PostQuitMessage(0);
1150 break;
1151 }
1152 }
1153
1155}
1156
1159{
1160 struct GdiplusStartupInput gdiplusStartupInput;
1162 WNDCLASSW WndClass = {0};
1163 WCHAR szBuf[512];
1164 WCHAR szInitialFile[MAX_PATH];
1165 HWND hMainWnd;
1166 MSG msg;
1167 HACCEL hKbdAccel;
1168 HRESULT hComRes;
1169 INITCOMMONCONTROLSEX Icc = { .dwSize = sizeof(Icc), .dwICC = ICC_WIN95_CLASSES };
1170
1172
1174 if (hComRes != S_OK && hComRes != S_FALSE)
1175 {
1176 DPRINT1("Warning, CoInitializeEx failed with code=%08X\n", (int)hComRes);
1177 }
1178
1180 {
1182 shiSettings.Left = 0;
1183 shiSettings.Top = 0;
1184 shiSettings.Right = 520;
1185 shiSettings.Bottom = 400;
1186 }
1187
1188 // Initialize GDI+
1189 gdiplusStartupInput.GdiplusVersion = 1;
1190 gdiplusStartupInput.DebugEventCallback = NULL;
1191 gdiplusStartupInput.SuppressBackgroundThread = FALSE;
1192 gdiplusStartupInput.SuppressExternalCodecs = FALSE;
1193
1194 GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
1195 pLoadImage(szFileName);
1196
1197 // Create the window
1198 WndClass.lpszClassName = L"shimgvw_window";
1199 WndClass.lpfnWndProc = ImageView_WndProc;
1200 WndClass.hInstance = hInstance;
1201 WndClass.style = CS_HREDRAW | CS_VREDRAW;
1203 WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
1204 WndClass.hbrBackground = NULL; /* less flicker */
1205
1206 if (!RegisterClassW(&WndClass)) return -1;
1207
1208 LoadStringW(hInstance, IDS_APPTITLE, szBuf, _countof(szBuf));
1209 hMainWnd = CreateWindowExW(0, L"shimgvw_window", szBuf,
1212 0, 0, NULL, NULL, hInstance, NULL);
1213
1214 // make sure the path has no quotes on it
1215 StringCbCopyW(szInitialFile, sizeof(szInitialFile), szFileName);
1216 PathUnquoteSpacesW(szInitialFile);
1217
1218 currentFile = pBuildFileList(szInitialFile);
1219 if (currentFile)
1220 {
1222 }
1223
1224 /* Create accelerator table for keystrokes */
1226
1227 // Show it
1230
1231 // Message Loop
1232 for (;;)
1233 {
1234 if (GetMessageW(&msg, NULL, 0, 0) <= 0)
1235 break;
1236
1237 if (!TranslateAcceleratorW(hMainWnd, hKbdAccel, &msg))
1238 {
1241 }
1242 }
1243
1244 /* Destroy accelerator table */
1245 DestroyAcceleratorTable(hKbdAccel);
1246
1248
1249 if (image)
1250 {
1252 image = NULL;
1253 }
1254
1256
1258
1259 /* Release COM resources */
1260 if (SUCCEEDED(hComRes))
1262
1263 return -1;
1264}
1265
1268{
1270}
1271
1274{
1276}
1277
1280{
1281 WCHAR szFile[MAX_PATH];
1282
1283 if (MultiByteToWideChar(CP_ACP, 0, path, -1, szFile, _countof(szFile)))
1284 {
1286 }
1287}
1288
1291{
1292 DPRINT("ImageView_PrintTo() not implemented\n");
1293}
1294
1297{
1298 DPRINT("ImageView_PrintToA() not implemented\n");
1299}
1300
1303{
1304 DPRINT("ImageView_PrintToW() not implemented\n");
1305}
1306
1311{
1312 switch (dwReason)
1313 {
1314 case DLL_PROCESS_ATTACH:
1315 case DLL_THREAD_ATTACH:
1316 hInstance = hinstDLL;
1317 break;
1318 }
1319
1320 return TRUE;
1321}
static ULONG_PTR gdiplusToken
Definition: CImage.cpp:79
#define SLIDE_SHOW
static int state
Definition: maze.c:121
#define msg(x)
Definition: auth_time.c:54
#define IDS_APPTITLE
Definition: resource.h:3
#define IDC_SAVEAS
Definition: resource.h:17
#define DPRINT1
Definition: precomp.h:8
DWORD dwReason
Definition: misc.cpp:154
#define RegCloseKey(hKey)
Definition: registry.h:47
struct _root root
WCHAR WndClass[]
Definition: capicon.c:23
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
BOOL WINAPI InitCommonControlsEx(const INITCOMMONCONTROLSEX *lpInitCtrls)
Definition: commctrl.c:893
#define OFN_OVERWRITEPROMPT
Definition: commdlg.h:116
#define OFN_EXPLORER
Definition: commdlg.h:104
#define OFN_HIDEREADONLY
Definition: commdlg.h:107
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3356
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4121
UINT uFlags
Definition: api.c:59
BOOL WINAPI ImageList_Destroy(HIMAGELIST himl)
Definition: imagelist.c:928
INT WINAPI ImageList_AddMasked(HIMAGELIST himl, HBITMAP hBitmap, COLORREF clrMask)
Definition: imagelist.c:563
HIMAGELIST WINAPI ImageList_Create(INT cx, INT cy, UINT flags, INT cInitial, INT cGrow)
Definition: imagelist.c:804
BOOL WINAPI GetSaveFileNameW(LPOPENFILENAMEW ofn)
Definition: filedlg.c:4742
#define GetProcessHeap()
Definition: compat.h:736
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define CP_ACP
Definition: compat.h:109
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CALLBACK
Definition: compat.h:35
#define DLL_THREAD_ATTACH
Definition: compat.h:132
#define MultiByteToWideChar
Definition: compat.h:110
GpStatus WINGDIPAPI GdipCreateFromHDC(HDC hdc, GpGraphics **graphics)
Definition: graphics.c:2395
GpStatus WINGDIPAPI GdipDrawImageRectI(GpGraphics *graphics, GpImage *image, INT x, INT y, INT width, INT height)
Definition: graphics.c:3561
GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *graphics)
Definition: graphics.c:2581
GpStatus WINGDIPAPI GdipSetInterpolationMode(GpGraphics *graphics, InterpolationMode mode)
Definition: graphics.c:6143
GpStatus WINGDIPAPI GdipSetSmoothingMode(GpGraphics *graphics, SmoothingMode mode)
Definition: graphics.c:6289
GpStatus WINGDIPAPI GdipGetImageRawFormat(GpImage *image, GUID *format)
Definition: image.c:2354
GpStatus WINGDIPAPI GdipGetImageEncodersSize(UINT *numEncoders, UINT *size)
Definition: image.c:5045
GpStatus WINGDIPAPI GdipGetImageFlags(GpImage *image, UINT *flags)
Definition: image.c:5314
GpStatus WINGDIPAPI GdipGetImageWidth(GpImage *image, UINT *width)
Definition: image.c:2390
GpStatus WINGDIPAPI GdipGetImageHeight(GpImage *image, UINT *height)
Definition: image.c:2287
GpStatus WINGDIPAPI GdipGetImageDecodersSize(UINT *numDecoders, UINT *size)
Definition: image.c:4994
GpStatus WINGDIPAPI GdipImageGetFrameCount(GpImage *image, GDIPCONST GUID *dimensionID, UINT *count)
Definition: image.c:2913
GpStatus WINGDIPAPI GdipSaveImageToFile(GpImage *image, GDIPCONST WCHAR *filename, GDIPCONST CLSID *clsidEncoder, GDIPCONST EncoderParameters *encoderParams)
Definition: image.c:4476
GpStatus WINGDIPAPI GdipImageGetFrameDimensionsCount(GpImage *image, UINT *count)
Definition: image.c:2933
GpStatus WINGDIPAPI GdipDisposeImage(GpImage *image)
Definition: image.c:2155
GpStatus WINGDIPAPI GdipLoadImageFromFile(GDIPCONST WCHAR *filename, GpImage **image)
Definition: image.c:2976
GpStatus WINGDIPAPI GdipImageSelectActiveFrame(GpImage *image, GDIPCONST GUID *dimensionID, UINT frame)
Definition: image.c:4350
GpStatus WINGDIPAPI GdipImageRotateFlip(GpImage *image, RotateFlipType type)
Definition: image.c:5406
GpStatus WINGDIPAPI GdipGetImageEncoders(UINT numEncoders, UINT size, ImageCodecInfo *encoders)
Definition: image.c:5069
GpStatus WINGDIPAPI GdipGetPropertyItem(GpImage *image, PROPID propid, UINT size, PropertyItem *buffer)
Definition: image.c:2682
GpStatus WINGDIPAPI GdipGetImageDecoders(UINT numDecoders, UINT size, ImageCodecInfo *decoders)
Definition: image.c:5018
GpStatus WINGDIPAPI GdipGetPropertyItemSize(GpImage *image, PROPID propid, UINT *size)
Definition: image.c:2536
GpStatus WINGDIPAPI GdipImageGetFrameDimensionsList(GpImage *image, GUID *dimensionIDs, UINT count)
Definition: image.c:2948
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:652
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:382
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
Definition: path.c:1106
HRESULT WINAPI DECLSPEC_HOTPATCH CoInitializeEx(LPVOID lpReserved, DWORD dwCoInit)
Definition: compobj.c:2002
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
#define IDC_ZOOM_IN
Definition: resource.h:34
#define IDC_SLIDE_SHOW
Definition: resource.h:33
#define IDC_ROT_COUNCW
Definition: resource.h:37
#define IDC_REAL_SIZE
Definition: resource.h:32
#define IDC_MODIFY
Definition: resource.h:41
#define IDC_NEXT_PIC
Definition: resource.h:30
#define IDI_APP_ICON
Definition: resource.h:4
#define IDC_PREV_PIC
Definition: resource.h:29
#define IDC_BEST_FIT
Definition: resource.h:31
#define IDS_NOPREVIEW
Definition: resource.h:62
#define IDR_ACCELERATOR
Definition: resource.h:91
#define IDC_DELETE
Definition: resource.h:38
#define IDC_ZOOM_OUT
Definition: resource.h:35
#define IDC_ROT_CLOCKW
Definition: resource.h:36
#define IDC_TOOL_BASE
Definition: resource.h:27
BOOL WINAPI PathRemoveFileSpecW(LPWSTR lpszPath)
Definition: path.c:629
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
Definition: path.c:394
VOID WINAPI PathUnquoteSpacesW(LPWSTR lpszPath)
Definition: path.c:1034
LPWSTR WINAPI PathCombineW(LPWSTR lpszDest, LPCWSTR lpszDir, LPCWSTR lpszFile)
Definition: path.c:194
static const WCHAR Message[]
Definition: register.c:74
#define RGB(r, g, b)
Definition: precomp.h:62
#define INFINITE
Definition: serial.h:102
HINSTANCE hInst
Definition: dxdiag.c:13
OPENFILENAMEW sfn
Definition: eventvwr.c:101
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
#define IDC_PRINT
Definition: fontview.h:14
#define MODIFY(p, i, v)
Definition: check.c:44
FxAutoRegKey hKey
pKey DeleteObject()
Status WINAPI GdiplusStartup(ULONG_PTR *token, const struct GdiplusStartupInput *input, struct GdiplusStartupOutput *output)
Definition: gdiplus.c:81
@ SmoothingModeNone
Definition: gdiplusenums.h:126
@ SmoothingModeHighQuality
Definition: gdiplusenums.h:125
@ ImageFlagsHasTranslucent
Definition: gdiplusenums.h:336
@ ImageFlagsHasAlpha
Definition: gdiplusenums.h:335
@ InterpolationModeHighQualityBilinear
Definition: gdiplusenums.h:149
@ InterpolationModeNearestNeighbor
Definition: gdiplusenums.h:148
#define PropertyTagFrameDelay
@ Rotate270FlipNone
@ Rotate90FlipNone
#define PropertyTagLoopCount
void WINAPI GdiplusShutdown(ULONG_PTR)
@ Ok
Definition: gdiplustypes.h:26
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLsizeiptr size
Definition: glext.h:5919
GLdouble n
Definition: glext.h:7729
const GLubyte * c
Definition: glext.h:8905
GLubyte * pattern
Definition: glext.h:7787
GLuint GLuint num
Definition: glext.h:9618
GLuint64EXT * result
Definition: glext.h:11304
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define c
Definition: ke_i.h:80
static IN DWORD IN LPVOID lpvReserved
HWND hMainWnd
Definition: magnifier.c:32
const GUID * guid
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
HDC hdc
Definition: main.c:9
static HDC
Definition: imagelist.c:92
unsigned int UINT
Definition: ndis.h:50
#define REG_BINARY
Definition: nt_native.h:1496
#define KEY_READ
Definition: nt_native.h:1023
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1057
#define DELETE
Definition: nt_native.h:57
#define KEY_WRITE
Definition: nt_native.h:1031
INT WINAPI DrawTextW(HDC hdc, LPCWSTR str, INT count, LPRECT rect, UINT flags)
Definition: defwnd.c:17
#define L(x)
Definition: ntvdm.h:50
@ COINIT_APARTMENTTHREADED
Definition: objbase.h:278
@ COINIT_DISABLE_OLE1DDE
Definition: objbase.h:280
#define LOWORD(l)
Definition: pedump.c:82
#define WS_CHILD
Definition: pedump.c:617
#define WS_CAPTION
Definition: pedump.c:624
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
#define WS_VISIBLE
Definition: pedump.c:620
short SHORT
Definition: pedump.c:59
long LONG
Definition: pedump.c:60
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
#define TB_ADDBUTTONS
Definition: commctrl.h:1271
#define TB_SETEXTENDEDSTYLE
Definition: commctrl.h:1190
#define TB_AUTOSIZE
Definition: commctrl.h:1137
#define LPTOOLTIPTEXTW
Definition: commctrl.h:1887
#define TBSTYLE_TOOLTIPS
Definition: commctrl.h:989
#define CCS_BOTTOM
Definition: commctrl.h:2244
#define TB_BUTTONSTRUCTSIZE
Definition: commctrl.h:1134
_Out_opt_ int * cx
Definition: commctrl.h:585
#define TTN_GETDISPINFO
Definition: commctrl.h:1878
#define TB_SETIMAGELIST
Definition: commctrl.h:1150
#define TBSTYLE_EX_HIDECLIPPEDBUTTONS
Definition: commctrl.h:1013
#define TB_ENABLEBUTTON
Definition: commctrl.h:1042
#define TBSTYLE_FLAT
Definition: commctrl.h:992
#define WC_STATIC
Definition: commctrl.h:4682
#define TOOLBARCLASSNAME
Definition: commctrl.h:946
#define ILC_MASK
Definition: commctrl.h:351
#define ICC_WIN95_CLASSES
Definition: commctrl.h:66
#define ILC_COLOR24
Definition: commctrl.h:357
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define WM_NOTIFY
Definition: richedit.h:61
#define calloc
Definition: rosglue.h:14
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_Check_return_ _CRTIMP wchar_t *__cdecl wcstok(_Inout_opt_z_ wchar_t *_Str, _In_z_ const wchar_t *_Delim)
void WINAPI SHAddToRecentDocs(UINT uFlags, LPCVOID pv)
Definition: shellord.c:809
UINT m_nLoopCount
Definition: shimgvw.c:118
BOOL Anime_Step(DWORD *pdwDelay)
Definition: shimgvw.c:219
VOID WINAPI ImageView_PrintToW(HWND hwnd, HINSTANCE hInst, LPCWSTR path, int nShow)
Definition: shimgvw.c:1302
static const TBBUTTON Buttons[]
Definition: shimgvw.c:71
SHIMGVW_SETTINGS shiSettings
Definition: shimgvw.c:39
WNDPROC PrevProc
Definition: shimgvw.c:42
static VOID ImageView_InitControls(HWND hwnd)
Definition: shimgvw.c:932
static LRESULT ImageView_Modify(HWND hwnd)
Definition: shimgvw.c:986
static VOID ImageView_SaveSettings(HWND hwnd)
Definition: shimgvw.c:835
static const UINT ZoomSteps[]
Definition: shimgvw.c:49
HWND hDispWnd
Definition: shimgvw.c:44
LRESULT CALLBACK ImageView_WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
Definition: shimgvw.c:1028
static VOID EnableToolBarButtons(BOOL bEnable)
Definition: shimgvw.c:499
#define MAX_ZOOM
Definition: shimgvw.c:55
UINT ZoomPercents
Definition: shimgvw.c:47
#define MIN_ZOOM
Definition: shimgvw.c:54
static void ZoomInOrOut(BOOL bZoomIn)
Definition: shimgvw.c:275
static VOID ImageView_OnSize(HWND hwnd, UINT state, INT cx, INT cy)
Definition: shimgvw.c:960
HINSTANCE hInstance
Definition: shimgvw.c:38
BOOL WINAPI DllMain(IN HINSTANCE hinstDLL, IN DWORD dwReason, IN LPVOID lpvReserved)
Definition: shimgvw.c:1308
static void Anime_SetFrameIndex(UINT nFrameIndex)
Definition: shimgvw.c:196
static BOOL ImageView_CreateToolBar(HWND hwnd)
Definition: shimgvw.c:859
static VOID ImageView_DrawImage(HWND hwnd)
Definition: shimgvw.c:702
UINT m_nFrameIndex
Definition: shimgvw.c:115
#define DEFINE_BTN_SEPARATOR
Definition: shimgvw.c:67
static void pSaveImageAs(HWND hwnd)
Definition: shimgvw.c:384
static void Anime_FreeInfo(void)
Definition: shimgvw.c:123
static BOOL ImageView_LoadSettings(VOID)
Definition: shimgvw.c:817
static SHIMGVW_FILENODE * pBuildFileList(LPWSTR szFirstFile)
Definition: shimgvw.c:543
static LRESULT ImageView_Delete(HWND hwnd)
Definition: shimgvw.c:979
SHIMGVW_FILENODE * currentFile
Definition: shimgvw.c:40
LONG WINAPI ImageView_CreateWindow(HWND hwnd, LPCWSTR szFileName)
Definition: shimgvw.c:1158
LRESULT CALLBACK ImageView_DispWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
Definition: shimgvw.c:909
#define DEFINE_BTN_CONFIG(_name)
Definition: shimgvw.c:94
PropertyItem * m_pDelayItem
Definition: shimgvw.c:119
static void ResetZoom(void)
Definition: shimgvw.c:314
UINT m_nLoopIndex
Definition: shimgvw.c:117
UINT m_nFrameCount
Definition: shimgvw.c:116
HWND hToolBar
Definition: shimgvw.c:44
DWORD Anime_GetFrameDelay(UINT nFrameIndex)
Definition: shimgvw.c:210
static VOID ImageView_UpdateWindow(HWND hwnd)
Definition: shimgvw.c:675
VOID WINAPI ImageView_Fullscreen(HWND hwnd, HINSTANCE hInst, LPCWSTR path, int nShow)
Definition: shimgvw.c:1273
static VOID ImageView_OnMouseWheel(HWND hwnd, INT x, INT y, INT zDelta, UINT fwKeys)
Definition: shimgvw.c:951
VOID WINAPI ImageView_FullscreenA(HWND hwnd, HINSTANCE hInst, LPCSTR path, int nShow)
Definition: shimgvw.c:1279
static void UpdateZoom(UINT NewZoom)
Definition: shimgvw.c:245
static void ImageView_OnTimer(HWND hwnd)
Definition: shimgvw.c:895
VOID WINAPI ImageView_PrintToA(HWND hwnd, HINSTANCE hInst, LPCSTR path, int nShow)
Definition: shimgvw.c:1296
VOID WINAPI ImageView_FullscreenW(HWND hwnd, HINSTANCE hInst, LPCWSTR path, int nShow)
Definition: shimgvw.c:1267
static HBRUSH CreateCheckerBoardBrush(HDC hdc)
Definition: shimgvw.c:681
static VOID pPrintImage(HWND hwnd)
Definition: shimgvw.c:493
static BOOL Anime_LoadInfo(void)
Definition: shimgvw.c:136
static const TB_BUTTON_CONFIG BtnConfig[]
Definition: shimgvw.c:96
#define DEFINE_BTN_INFO(_name)
Definition: shimgvw.c:64
VOID WINAPI ImageView_PrintTo(HWND hwnd, HINSTANCE hInst, LPCWSTR path, int nShow)
Definition: shimgvw.c:1290
#define ANIME_TIMER_ID
Definition: shimgvw.c:121
static void pLoadImage(LPCWSTR szOpenFileName)
Definition: shimgvw.c:359
static VOID pLoadImageFromNode(SHIMGVW_FILENODE *node, HWND hwnd)
Definition: shimgvw.c:506
static VOID pFreeFileList(SHIMGVW_FILENODE *root)
Definition: shimgvw.c:656
#define TB_IMAGE_HEIGHT
Definition: shimgvw.h:4
#define TB_IMAGE_WIDTH
Definition: shimgvw.h:3
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2335
#define SHARD_PATHW
Definition: shlobj.h:1103
#define DPRINT
Definition: sndvol32.h:71
#define _countof(array)
Definition: sndvol32.h:68
& rect
Definition: startmenu.cpp:1413
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
STRSAFEAPI StringCbPrintfExW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPWSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:623
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:557
BOOL SuppressBackgroundThread
Definition: gdiplusinit.h:36
DebugEventProc DebugEventCallback
Definition: gdiplusinit.h:35
struct SHIMGVW_FILENODE_INTERNAL * Prev
Definition: shimgvw.h:20
WCHAR FileName[MAX_PATH]
Definition: shimgvw.h:19
struct SHIMGVW_FILENODE_INTERNAL * Next
Definition: shimgvw.h:21
BOOL Maximized
Definition: shimgvw.h:10
LPCWSTR lpDirectory
Definition: shellapi.h:331
HINSTANCE hInstApp
Definition: shellapi.h:333
LPCWSTR lpParameters
Definition: shellapi.h:330
RECT rcNormalPosition
Definition: winuser.h:3285
UINT code
Definition: winuser.h:3149
HINSTANCE hInstance
Definition: commdlg.h:362
HWND hwndOwner
Definition: commdlg.h:361
DWORD Flags
Definition: commdlg.h:373
LPWSTR lpstrFile
Definition: commdlg.h:367
DWORD lStructSize
Definition: commdlg.h:360
DWORD nMaxFile
Definition: commdlg.h:368
LPCWSTR lpstrFilter
Definition: commdlg.h:363
DWORD nFilterIndex
Definition: commdlg.h:366
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
#define SetWindowLongPtr
Definition: treelist.c:70
#define GWLP_WNDPROC
Definition: treelist.c:66
#define WM_MOUSEWHEEL
Definition: treelist.c:96
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
unsigned char * LPBYTE
Definition: typedefs.h:53
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
#define HIWORD(l)
Definition: typedefs.h:247
Definition: dlist.c:348
#define _T(x)
Definition: vfdio.h:22
#define LPRECT
Definition: precomp.h:28
#define ZeroMemory
Definition: winbase.h:1670
DWORD WINAPI GetLastError(void)
Definition: except.c:1040
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
_In_ BOOL bEnable
Definition: winddi.h:3426
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
#define WINAPI
Definition: msvc.h:6
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:300
#define GET_X_LPARAM(lp)
Definition: windowsx.h:299
#define S_FALSE
Definition: winerror.h:2357
#define DIB_RGB_COLORS
Definition: wingdi.h:367
HGDIOBJ WINAPI GetStockObject(_In_ int)
#define DEFAULT_GUI_FONT
Definition: wingdi.h:909
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1539
#define TRANSPARENT
Definition: wingdi.h:950
#define WHITE_BRUSH
Definition: wingdi.h:902
#define NULL_BRUSH
Definition: wingdi.h:901
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
BOOL WINAPI Rectangle(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int)
int WINAPI SetBkMode(_In_ HDC, _In_ int)
Definition: dc.c:1056
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:918
HBRUSH WINAPI CreateDIBPatternBrushPt(_In_ const VOID *pvPackedDIB, _In_ UINT uUsage)
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define RegSetValueEx
Definition: winreg.h:533
#define RegCreateKeyEx
Definition: winreg.h:501
#define SW_SHOWNORMAL
Definition: winuser.h:764
#define WM_PAINT
Definition: winuser.h:1610
#define CS_VREDRAW
Definition: winuser.h:653
#define CreateWindowEx
Definition: winuser.h:5745
#define SW_HIDE
Definition: winuser.h:762
#define DT_NOPREFIX
Definition: winuser.h:537
#define IMAGE_BITMAP
Definition: winuser.h:211
HANDLE WINAPI LoadImageW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_ UINT, _In_ int, _In_ int, _In_ UINT)
Definition: cursoricon.c:2172
BOOL WINAPI TranslateMessage(_In_ const MSG *)
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
#define DT_CENTER
Definition: winuser.h:527
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI GetMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
BOOL WINAPI GetWindowPlacement(_In_ HWND, _Inout_ WINDOWPLACEMENT *)
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
#define WM_CREATE
Definition: winuser.h:1598
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
#define WM_SIZE
Definition: winuser.h:1601
#define DT_SINGLELINE
Definition: winuser.h:540
#define WM_COMMAND
Definition: winuser.h:1730
#define CS_HREDRAW
Definition: winuser.h:648
ATOM WINAPI RegisterClassW(_In_ CONST WNDCLASSW *)
#define IDC_ARROW
Definition: winuser.h:682
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)
BOOL WINAPI IsZoomed(_In_ HWND)
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
#define SIZE_MAXIMIZED
Definition: winuser.h:2497
#define WM_TIMER
Definition: winuser.h:1732
HWND WINAPI CreateWindowExW(_In_ DWORD dwExStyle, _In_opt_ LPCWSTR lpClassName, _In_opt_ LPCWSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
BOOL WINAPI UpdateWindow(_In_ HWND)
struct tagNMHDR * LPNMHDR
#define LoadCursor
Definition: winuser.h:5802
#define DT_VCENTER
Definition: winuser.h:543
#define CW_USEDEFAULT
Definition: winuser.h:225
HACCEL WINAPI LoadAcceleratorsW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
#define WM_SIZING
Definition: winuser.h:1797
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2044
#define SIZE_RESTORED
Definition: winuser.h:2495
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
#define WPF_RESTORETOMAXIMIZED
Definition: winuser.h:2522
int WINAPI TranslateAcceleratorW(_In_ HWND, _In_ HACCEL, _In_ LPMSG)
#define LR_DEFAULTCOLOR
Definition: winuser.h:1081
#define SetClassLongPtr
Definition: winuser.h:5838
#define SW_SHOW
Definition: winuser.h:769
#define WM_DESTROY
Definition: winuser.h:1599
#define WS_EX_CLIENTEDGE
Definition: winuser.h:384
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
Definition: winuser.h:2896
BOOL WINAPI DestroyAcceleratorTable(_In_ HACCEL)
#define SW_MAXIMIZE
Definition: winuser.h:766
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
LRESULT WINAPI CallWindowProcW(_In_ WNDPROC, _In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
struct _WINDOWPLACEMENT WINDOWPLACEMENT
BOOL WINAPI MoveWindow(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ BOOL)
#define GCL_STYLE
Definition: winuser.h:665
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
const char * LPCSTR
Definition: xmlstorage.h:183
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
char CHAR
Definition: xmlstorage.h:175