ReactOS 0.4.15-dev-6679-g945ee4b
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
528 pchFileTitle = PathFindFileNameW(node->FileName);
529 if (pchFileTitle && *pchFileTitle)
530 {
531 StringCbPrintfW(szTitleBuf, sizeof(szTitleBuf),
532 L"%ls%ls%ls", szResStr, L" - ", pchFileTitle);
533 SetWindowTextW(hwnd, szTitleBuf);
534 }
535 else
536 {
537 SetWindowTextW(hwnd, szResStr);
538 }
539
541
542 /* Redraw the display window */
544}
545
546static SHIMGVW_FILENODE*
548{
549 HANDLE hFindHandle;
550 WCHAR *extension;
551 WCHAR szSearchPath[MAX_PATH];
552 WCHAR szSearchMask[MAX_PATH];
553 WCHAR szFileTypes[MAX_PATH];
554 WIN32_FIND_DATAW findData;
555 SHIMGVW_FILENODE *currentNode = NULL;
557 SHIMGVW_FILENODE *conductor = NULL;
558 ImageCodecInfo *codecInfo;
559 UINT num;
560 UINT size;
561 UINT j;
562
563 StringCbCopyW(szSearchPath, sizeof(szSearchPath), szFirstFile);
564 PathRemoveFileSpecW(szSearchPath);
565
567 codecInfo = malloc(size);
568 if (!codecInfo)
569 {
570 DPRINT1("malloc() failed in pLoadFileList()\n");
571 return NULL;
572 }
573
574 GdipGetImageDecoders(num, size, codecInfo);
575
576 root = malloc(sizeof(SHIMGVW_FILENODE));
577 if (!root)
578 {
579 DPRINT1("malloc() failed in pLoadFileList()\n");
580 free(codecInfo);
581 return NULL;
582 }
583
584 conductor = root;
585
586 for (j = 0; j < num; ++j)
587 {
588 StringCbCopyW(szFileTypes, sizeof(szFileTypes), codecInfo[j].FilenameExtension);
589
590 extension = wcstok(szFileTypes, L";");
591 while (extension != NULL)
592 {
593 PathCombineW(szSearchMask, szSearchPath, extension);
594
595 hFindHandle = FindFirstFileW(szSearchMask, &findData);
596 if (hFindHandle != INVALID_HANDLE_VALUE)
597 {
598 do
599 {
600 PathCombineW(conductor->FileName, szSearchPath, findData.cFileName);
601
602 // compare the name of the requested file with the one currently found.
603 // if the name matches, the current node is returned by the function.
604 if (wcscmp(szFirstFile, conductor->FileName) == 0)
605 {
606 currentNode = conductor;
607 }
608
609 conductor->Next = malloc(sizeof(SHIMGVW_FILENODE));
610
611 // if malloc fails, make circular what we have and return it
612 if (!conductor->Next)
613 {
614 DPRINT1("malloc() failed in pLoadFileList()\n");
615
616 conductor->Next = root;
617 root->Prev = conductor;
618
619 FindClose(hFindHandle);
620 free(codecInfo);
621 return conductor;
622 }
623
624 conductor->Next->Prev = conductor;
625 conductor = conductor->Next;
626 }
627 while (FindNextFileW(hFindHandle, &findData) != 0);
628
629 FindClose(hFindHandle);
630 }
631
632 extension = wcstok(NULL, L";");
633 }
634 }
635
636 // we now have a node too much in the list. In case the requested file was not found,
637 // we use this node to store the name of it, otherwise we free it.
638 if (currentNode == NULL)
639 {
640 StringCchCopyW(conductor->FileName, MAX_PATH, szFirstFile);
641 currentNode = conductor;
642 }
643 else
644 {
645 conductor = conductor->Prev;
646 free(conductor->Next);
647 }
648
649 // link the last node with the first one to make the list circular
650 conductor->Next = root;
651 root->Prev = conductor;
652 conductor = currentNode;
653
654 free(codecInfo);
655
656 return conductor;
657}
658
659static VOID
661{
662 SHIMGVW_FILENODE *conductor;
663
664 if (!root)
665 return;
666
667 root->Prev->Next = NULL;
668 root->Prev = NULL;
669
670 while (root)
671 {
672 conductor = root;
673 root = conductor->Next;
674 free(conductor);
675 }
676}
677
678static VOID
680{
683}
684
686{
687 static const CHAR pattern[] =
688 "\x28\x00\x00\x00\x10\x00\x00\x00\x10\x00\x00\x00\x01\x00\x04\x00\x00\x00"
689 "\x00\x00\x80\x00\x00\x00\x23\x2E\x00\x00\x23\x2E\x00\x00\x10\x00\x00\x00"
690 "\x00\x00\x00\x00\x99\x99\x99\x00\xCC\xCC\xCC\x00\x00\x00\x00\x00\x00\x00"
691 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
692 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
693 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11\x11\x11"
694 "\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00"
695 "\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00"
696 "\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11"
697 "\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00"
698 "\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11"
699 "\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11"
700 "\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11";
701
703}
704
705static VOID
707{
708 GpGraphics *graphics;
709 UINT ImageWidth, ImageHeight;
710 INT ZoomedWidth, ZoomedHeight, x, y;
711 PAINTSTRUCT ps;
712 RECT rect, margin;
713 HDC hdc;
714 HBRUSH white;
715 HGDIOBJ hbrOld;
716 UINT uFlags;
717 WCHAR szText[128];
718 HGDIOBJ hFontOld;
719
720 hdc = BeginPaint(hwnd, &ps);
721 if (!hdc)
722 {
723 DPRINT1("BeginPaint() failed\n");
724 return;
725 }
726
727 GdipCreateFromHDC(hdc, &graphics);
728 if (!graphics)
729 {
730 DPRINT1("GdipCreateFromHDC() failed\n");
731 return;
732 }
733
736
737 if (image == NULL)
738 {
739 FillRect(hdc, &rect, white);
740
741 LoadStringW(hInstance, IDS_NOPREVIEW, szText, _countof(szText));
742
743 SetTextColor(hdc, RGB(0, 0, 0));
745
749 SelectObject(hdc, hFontOld);
750 }
751 else
752 {
753 GdipGetImageWidth(image, &ImageWidth);
754 GdipGetImageHeight(image, &ImageHeight);
755
756 ZoomedWidth = (ImageWidth * ZoomPercents) / 100;
757 ZoomedHeight = (ImageHeight * ZoomPercents) / 100;
758
759 x = (rect.right - ZoomedWidth) / 2;
760 y = (rect.bottom - ZoomedHeight) / 2;
761
762 // Fill top part
763 margin = rect;
764 margin.bottom = y - 1;
765 FillRect(hdc, &margin, white);
766 // Fill bottom part
767 margin.top = y + ZoomedHeight + 1;
768 margin.bottom = rect.bottom;
769 FillRect(hdc, &margin, white);
770 // Fill left part
771 margin.top = y - 1;
772 margin.bottom = y + ZoomedHeight + 1;
773 margin.right = x - 1;
774 FillRect(hdc, &margin, white);
775 // Fill right part
776 margin.left = x + ZoomedWidth + 1;
777 margin.right = rect.right;
778 FillRect(hdc, &margin, white);
779
780 DPRINT("x = %d, y = %d, ImageWidth = %u, ImageHeight = %u\n");
781 DPRINT("rect.right = %ld, rect.bottom = %ld\n", rect.right, rect.bottom);
782 DPRINT("ZoomPercents = %d, ZoomedWidth = %d, ZoomedHeight = %d\n",
783 ZoomPercents, ZoomedWidth, ZoomedWidth);
784
785 if (ZoomPercents % 100 == 0)
786 {
789 }
790 else
791 {
794 }
795
796 uFlags = 0;
798
800 {
801 HBRUSH hbr = CreateCheckerBoardBrush(hdc);
802 hbrOld = SelectObject(hdc, hbr);
803 Rectangle(hdc, x - 1, y - 1, x + ZoomedWidth + 1, y + ZoomedHeight + 1);
804 SelectObject(hdc, hbrOld);
805 DeleteObject(hbr);
806 }
807 else
808 {
810 Rectangle(hdc, x - 1, y - 1, x + ZoomedWidth + 1, y + ZoomedHeight + 1);
811 SelectObject(hdc, hbrOld);
812 }
813
814 GdipDrawImageRectI(graphics, image, x, y, ZoomedWidth, ZoomedHeight);
815 }
816 GdipDeleteGraphics(graphics);
817 EndPaint(hwnd, &ps);
818}
819
820static BOOL
822{
823 HKEY hKey;
825 LONG nError;
826
827 nError = RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\ReactOS\\shimgvw", 0, KEY_READ, &hKey);
828 if (nError)
829 return FALSE;
830
831 dwSize = sizeof(shiSettings);
832 nError = RegQueryValueExW(hKey, L"Settings", NULL, NULL, (LPBYTE)&shiSettings, &dwSize);
834
835 return !nError;
836}
837
838static VOID
840{
842 HKEY hKey;
843
845 wp.length = sizeof(WINDOWPLACEMENT);
847
853
854 if (RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software\\ReactOS\\shimgvw"), 0, NULL,
856 {
857 RegSetValueEx(hKey, _T("Settings"), 0, REG_BINARY, (LPBYTE)&shiSettings, sizeof(SHIMGVW_SETTINGS));
859 }
860}
861
862static BOOL
864{
867 0, 0, 0, 0, hwnd,
868 0, hInstance, NULL);
869 if (hToolBar != NULL)
870 {
871 HIMAGELIST hImageList;
872
875
877 sizeof(Buttons[0]), 0);
878
880 if (hImageList == NULL) return FALSE;
881
882 for (UINT n = 0; n < _countof(BtnConfig); n++)
883 {
886 }
887
889 0, (LPARAM)hImageList));
890
892
893 return TRUE;
894 }
895
896 return FALSE;
897}
898
900{
901 DWORD dwDelay;
902
905
906 if (Anime_Step(&dwDelay))
907 {
908 SetTimer(hwnd, ANIME_TIMER_ID, dwDelay, NULL);
909 }
910}
911
914{
915 switch (Message)
916 {
917 case WM_PAINT:
918 {
920 return 0L;
921 }
922 case WM_TIMER:
923 {
924 if (wParam == ANIME_TIMER_ID)
925 {
927 return 0;
928 }
929 break;
930 }
931 }
933}
934
935static VOID
937{
941
943
946 0, 0, 0, 0, hwnd, NULL, hInstance, NULL);
947
950
952}
953
954static VOID
956{
957 if (zDelta != 0)
958 {
959 ZoomInOrOut(zDelta > 0);
960 }
961}
962
963static VOID
965{
966 RECT rc;
967
969
971
972 MoveWindow(hDispWnd, 0, 0, cx, cy - (rc.bottom - rc.top), TRUE);
973
974 /* is it maximized or restored? */
976 {
977 /* reset zoom */
978 ResetZoom();
979 }
980}
981
982static LRESULT
984{
985 DPRINT1("ImageView_Delete: unimplemented.\n");
986 return 0;
987}
988
989static LRESULT
991{
992 int nChars = GetFullPathNameW(currentFile->FileName, 0, NULL, NULL);
993 LPWSTR pszPathName;
995
996 if (!nChars)
997 {
998 DPRINT1("ImageView_Modify: failed to get full path name.\n");
999 return 1;
1000 }
1001
1002 pszPathName = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, nChars * sizeof(WCHAR));
1003 if (pszPathName == NULL)
1004 {
1005 DPRINT1("HeapAlloc() failed in ImageView_Modify()\n");
1006 return 1;
1007 }
1008
1009 GetFullPathNameW(currentFile->FileName, nChars, pszPathName, NULL);
1010
1011 sei.cbSize = sizeof(sei);
1012 sei.fMask = 0;
1013 sei.hwnd = NULL;
1014 sei.lpVerb = L"edit";
1015 sei.lpFile = pszPathName;
1016 sei.lpParameters = NULL;
1017 sei.lpDirectory = NULL;
1018 sei.nShow = SW_SHOWNORMAL;
1019 sei.hInstApp = NULL;
1020
1021 if (!ShellExecuteExW(&sei))
1022 {
1023 DPRINT1("ImageView_Modify: ShellExecuteExW() failed with code %08X\n", (int)GetLastError());
1024 }
1025
1026 HeapFree(GetProcessHeap(), 0, pszPathName);
1027
1028 return 0;
1029}
1030
1033{
1034 switch (Message)
1035 {
1036 case WM_CREATE:
1037 {
1039 return 0L;
1040 }
1041
1042 case WM_COMMAND:
1043 {
1044 switch (LOWORD(wParam))
1045 {
1046 case IDC_PREV_PIC:
1049 break;
1050
1051 case IDC_NEXT_PIC:
1054 break;
1055
1056 case IDC_BEST_FIT:
1057 DPRINT1("IDC_BEST_FIT unimplemented\n");
1058 break;
1059
1060 case IDC_REAL_SIZE:
1061 UpdateZoom(100);
1062 return 0;
1063
1064 case IDC_SLIDE_SHOW:
1065 DPRINT1("IDC_SLIDE_SHOW unimplemented\n");
1066 break;
1067
1068 case IDC_ZOOM_IN:
1070 break;
1071
1072 case IDC_ZOOM_OUT:
1074 break;
1075
1076 case IDC_SAVEAS:
1078 break;
1079
1080 case IDC_PRINT:
1082 break;
1083
1084 case IDC_ROT_CLOCKW:
1085 if (image)
1086 {
1089 }
1090 break;
1091
1092 case IDC_ROT_COUNCW:
1093 if (image)
1094 {
1097 }
1098 break;
1099
1100 case IDC_DELETE:
1101 return ImageView_Delete(hwnd);
1102
1103 case IDC_MODIFY:
1104 return ImageView_Modify(hwnd);
1105 }
1106 }
1107 break;
1108
1109 case WM_MOUSEWHEEL:
1113 break;
1114
1115 case WM_NOTIFY:
1116 {
1117 LPNMHDR pnmhdr = (LPNMHDR)lParam;
1118
1119 switch (pnmhdr->code)
1120 {
1121 case TTN_GETDISPINFO:
1122 {
1123 LPTOOLTIPTEXTW lpttt;
1124
1125 lpttt = (LPTOOLTIPTEXTW)lParam;
1126 lpttt->hinst = hInstance;
1127
1128 lpttt->lpszText = MAKEINTRESOURCEW(BtnConfig[lpttt->hdr.idFrom - IDC_TOOL_BASE].ids);
1129 return 0;
1130 }
1131 }
1132 break;
1133 }
1134 case WM_SIZING:
1135 {
1136 LPRECT pRect = (LPRECT)lParam;
1137 if (pRect->right-pRect->left < 350)
1138 pRect->right = pRect->left + 350;
1139
1140 if (pRect->bottom-pRect->top < 290)
1141 pRect->bottom = pRect->top + 290;
1142 return TRUE;
1143 }
1144 case WM_SIZE:
1145 {
1147 return 0;
1148 }
1149 case WM_DESTROY:
1150 {
1153 PostQuitMessage(0);
1154 break;
1155 }
1156 }
1157
1159}
1160
1163{
1164 struct GdiplusStartupInput gdiplusStartupInput;
1165 ULONG_PTR gdiplusToken;
1166 WNDCLASSW WndClass = {0};
1167 WCHAR szBuf[512];
1168 WCHAR szInitialFile[MAX_PATH];
1169 HWND hMainWnd;
1170 MSG msg;
1171 HACCEL hKbdAccel;
1172 HRESULT hComRes;
1173 INITCOMMONCONTROLSEX Icc = { .dwSize = sizeof(Icc), .dwICC = ICC_WIN95_CLASSES };
1174
1176
1178 if (hComRes != S_OK && hComRes != S_FALSE)
1179 {
1180 DPRINT1("Warning, CoInitializeEx failed with code=%08X\n", (int)hComRes);
1181 }
1182
1184 {
1186 shiSettings.Left = 0;
1187 shiSettings.Top = 0;
1188 shiSettings.Right = 520;
1189 shiSettings.Bottom = 400;
1190 }
1191
1192 // Initialize GDI+
1193 gdiplusStartupInput.GdiplusVersion = 1;
1194 gdiplusStartupInput.DebugEventCallback = NULL;
1195 gdiplusStartupInput.SuppressBackgroundThread = FALSE;
1196 gdiplusStartupInput.SuppressExternalCodecs = FALSE;
1197
1198 GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
1199 pLoadImage(szFileName);
1200
1201 // Create the window
1202 WndClass.lpszClassName = L"shimgvw_window";
1203 WndClass.lpfnWndProc = ImageView_WndProc;
1204 WndClass.hInstance = hInstance;
1205 WndClass.style = CS_HREDRAW | CS_VREDRAW;
1207 WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
1208 WndClass.hbrBackground = NULL; /* less flicker */
1209
1210 if (!RegisterClassW(&WndClass)) return -1;
1211
1212 LoadStringW(hInstance, IDS_APPTITLE, szBuf, _countof(szBuf));
1213 hMainWnd = CreateWindowExW(0, L"shimgvw_window", szBuf,
1216 0, 0, NULL, NULL, hInstance, NULL);
1217
1218 // make sure the path has no quotes on it
1219 StringCbCopyW(szInitialFile, sizeof(szInitialFile), szFileName);
1220 PathUnquoteSpacesW(szInitialFile);
1221
1222 currentFile = pBuildFileList(szInitialFile);
1223 if (currentFile)
1224 {
1226 }
1227
1228 /* Create accelerator table for keystrokes */
1230
1231 // Show it
1234
1235 // Message Loop
1236 for (;;)
1237 {
1238 if (GetMessageW(&msg, NULL, 0, 0) <= 0)
1239 break;
1240
1241 if (!TranslateAcceleratorW(hMainWnd, hKbdAccel, &msg))
1242 {
1245 }
1246 }
1247
1248 /* Destroy accelerator table */
1249 DestroyAcceleratorTable(hKbdAccel);
1250
1252
1253 if (image)
1254 {
1256 image = NULL;
1257 }
1258
1260
1261 GdiplusShutdown(gdiplusToken);
1262
1263 /* Release COM resources */
1264 if (SUCCEEDED(hComRes))
1266
1267 return -1;
1268}
1269
1272{
1274}
1275
1278{
1280}
1281
1284{
1285 WCHAR szFile[MAX_PATH];
1286
1287 if (MultiByteToWideChar(CP_ACP, 0, path, -1, szFile, _countof(szFile)))
1288 {
1290 }
1291}
1292
1295{
1296 DPRINT("ImageView_PrintTo() not implemented\n");
1297}
1298
1301{
1302 DPRINT("ImageView_PrintToA() not implemented\n");
1303}
1304
1307{
1308 DPRINT("ImageView_PrintToW() not implemented\n");
1309}
1310
1315{
1316 switch (dwReason)
1317 {
1318 case DLL_PROCESS_ATTACH:
1319 case DLL_THREAD_ATTACH:
1320 hInstance = hinstDLL;
1321 break;
1322 }
1323
1324 return TRUE;
1325}
#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:3353
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4118
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:4801
#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:16
#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:1306
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:936
static LRESULT ImageView_Modify(HWND hwnd)
Definition: shimgvw.c:990
static VOID ImageView_SaveSettings(HWND hwnd)
Definition: shimgvw.c:839
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:1032
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:964
HINSTANCE hInstance
Definition: shimgvw.c:38
BOOL WINAPI DllMain(IN HINSTANCE hinstDLL, IN DWORD dwReason, IN LPVOID lpvReserved)
Definition: shimgvw.c:1312
static void Anime_SetFrameIndex(UINT nFrameIndex)
Definition: shimgvw.c:196
static BOOL ImageView_CreateToolBar(HWND hwnd)
Definition: shimgvw.c:863
static VOID ImageView_DrawImage(HWND hwnd)
Definition: shimgvw.c:706
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:821
static SHIMGVW_FILENODE * pBuildFileList(LPWSTR szFirstFile)
Definition: shimgvw.c:547
static LRESULT ImageView_Delete(HWND hwnd)
Definition: shimgvw.c:983
SHIMGVW_FILENODE * currentFile
Definition: shimgvw.c:40
LONG WINAPI ImageView_CreateWindow(HWND hwnd, LPCWSTR szFileName)
Definition: shimgvw.c:1162
LRESULT CALLBACK ImageView_DispWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
Definition: shimgvw.c:913
#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:679
VOID WINAPI ImageView_Fullscreen(HWND hwnd, HINSTANCE hInst, LPCWSTR path, int nShow)
Definition: shimgvw.c:1277
static VOID ImageView_OnMouseWheel(HWND hwnd, INT x, INT y, INT zDelta, UINT fwKeys)
Definition: shimgvw.c:955
VOID WINAPI ImageView_FullscreenA(HWND hwnd, HINSTANCE hInst, LPCSTR path, int nShow)
Definition: shimgvw.c:1283
static void UpdateZoom(UINT NewZoom)
Definition: shimgvw.c:245
static void ImageView_OnTimer(HWND hwnd)
Definition: shimgvw.c:899
VOID WINAPI ImageView_PrintToA(HWND hwnd, HINSTANCE hInst, LPCSTR path, int nShow)
Definition: shimgvw.c:1300
VOID WINAPI ImageView_FullscreenW(HWND hwnd, HINSTANCE hInst, LPCWSTR path, int nShow)
Definition: shimgvw.c:1271
static HBRUSH CreateCheckerBoardBrush(HDC hdc)
Definition: shimgvw.c:685
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:1294
#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:660
#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:2368
#define SHARD_PATHW
Definition: shlobj.h:1107
#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:1700
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_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
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 *)
HANDLE WINAPI LoadImageW(_In_opt_ HINSTANCE hInst, _In_ LPCWSTR name, _In_ UINT type, _In_ int cx, _In_ int cy, _In_ UINT fuLoad)
Definition: cursoricon.c:2172
#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
#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
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE hInstance, _In_ LPCWSTR lpIconName)
Definition: cursoricon.c:2044
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