ReactOS  0.4.14-dev-1296-g56aa513
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 
32 #define NDEBUG
33 #include <debug.h>
34 
35 #include "shimgvw.h"
36 
42 
44 
45 /* zooming */
46 #define MIN_ZOOM 10
47 #define MAX_ZOOM 1600
49 static const UINT ZoomSteps[] =
50 {
51  10, 25, 50, 100, 200, 400, 800, 1600
52 };
53 
54 /* animation */
60 
61 #define ANIME_TIMER_ID 9999
62 
63 static void Anime_FreeInfo(void)
64 {
65  if (m_pDelayItem)
66  {
69  }
70  m_nFrameIndex = 0;
71  m_nFrameCount = 0;
72  m_nLoopIndex = 0;
73  m_nLoopCount = (UINT)-1;
74 }
75 
76 static BOOL Anime_LoadInfo(void)
77 {
78  GUID *dims;
79  UINT nDimCount = 0;
80  UINT cbItem;
81  UINT result;
82  PropertyItem *pItem;
83 
86 
87  if (!image)
88  return FALSE;
89 
91  if (nDimCount)
92  {
93  dims = (GUID *)calloc(nDimCount, sizeof(GUID));
94  if (dims)
95  {
96  GdipImageGetFrameDimensionsList(image, dims, nDimCount);
99  free(dims);
100  }
101  }
102 
103  result = 0;
105  cbItem = result;
106  if (cbItem)
107  {
108  m_pDelayItem = (PropertyItem *)malloc(cbItem);
110  }
111 
112  result = 0;
114  cbItem = result;
115  if (cbItem)
116  {
117  pItem = (PropertyItem *)malloc(cbItem);
118  if (pItem)
119  {
120  if (GdipGetPropertyItem(image, PropertyTagLoopCount, cbItem, pItem) == Ok)
121  {
122  m_nLoopCount = *(WORD *)pItem->value;
123  }
124  free(pItem);
125  }
126  }
127 
128  if (m_pDelayItem)
129  {
131  }
132 
133  return m_pDelayItem != NULL;
134 }
135 
136 static void Anime_SetFrameIndex(UINT nFrameIndex)
137 {
138  if (nFrameIndex < m_nFrameCount)
139  {
140  GUID guid = FrameDimensionTime;
141  if (Ok != GdipImageSelectActiveFrame(image, &guid, nFrameIndex))
142  {
143  guid = FrameDimensionPage;
144  GdipImageSelectActiveFrame(image, &guid, nFrameIndex);
145  }
146  }
147  m_nFrameIndex = nFrameIndex;
148 }
149 
151 {
152  if (nFrameIndex < m_nFrameCount && m_pDelayItem)
153  {
154  return ((DWORD *)m_pDelayItem->value)[m_nFrameIndex] * 10;
155  }
156  return 0;
157 }
158 
160 {
161  *pdwDelay = INFINITE;
162  if (m_nLoopCount == (UINT)-1)
163  return FALSE;
164 
165  if (m_nFrameIndex + 1 < m_nFrameCount)
166  {
167  *pdwDelay = Anime_GetFrameDelay(m_nFrameIndex);
169  ++m_nFrameIndex;
170  return TRUE;
171  }
172 
173  if (m_nLoopCount == 0 || m_nLoopIndex < m_nLoopCount)
174  {
175  *pdwDelay = Anime_GetFrameDelay(m_nFrameIndex);
177  m_nFrameIndex = 0;
178  ++m_nLoopIndex;
179  return TRUE;
180  }
181 
182  return FALSE;
183 }
184 
185 static void ZoomInOrOut(BOOL bZoomIn)
186 {
187  INT i;
188 
189  if (bZoomIn) /* zoom in */
190  {
191  /* find next step */
192  for (i = 0; i < ARRAYSIZE(ZoomSteps); ++i)
193  {
194  if (ZoomPercents < ZoomSteps[i])
195  break;
196  }
197  if (i == ARRAYSIZE(ZoomSteps))
199  else
201 
202  /* update tool bar buttons */
204  if (ZoomPercents >= MAX_ZOOM)
206  else
208  }
209  else /* zoom out */
210  {
211  /* find previous step */
212  for (i = ARRAYSIZE(ZoomSteps); i > 0; )
213  {
214  --i;
215  if (ZoomSteps[i] < ZoomPercents)
216  break;
217  }
218  if (i < 0)
220  else
222 
223  /* update tool bar buttons */
225  if (ZoomPercents <= MIN_ZOOM)
227  else
229  }
230 
231  /* redraw */
233 }
234 
235 static void ResetZoom(void)
236 {
237  RECT Rect;
238  UINT ImageWidth, ImageHeight;
239 
240  /* get disp window size and image size */
242  GdipGetImageWidth(image, &ImageWidth);
243  GdipGetImageHeight(image, &ImageHeight);
244 
245  /* compare two aspect rates. same as
246  (ImageHeight / ImageWidth < Rect.bottom / Rect.right) in real */
247  if (ImageHeight * Rect.right < Rect.bottom * ImageWidth)
248  {
249  if (Rect.right < ImageWidth)
250  {
251  /* it's large, shrink it */
252  ZoomPercents = (Rect.right * 100) / ImageWidth;
253  }
254  else
255  {
256  /* it's small. show as original size */
257  ZoomPercents = 100;
258  }
259  }
260  else
261  {
262  if (Rect.bottom < ImageHeight)
263  {
264  /* it's large, shrink it */
265  ZoomPercents = (Rect.bottom * 100) / ImageHeight;
266  }
267  else
268  {
269  /* it's small. show as original size */
270  ZoomPercents = 100;
271  }
272  }
273 }
274 
275 /* ToolBar Buttons */
276 static const TBBUTTON Buttons [] =
277 { /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */
280  {15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0},
283  {15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0},
286  {15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0},
289 };
290 
291 static void pLoadImage(LPWSTR szOpenFileName)
292 {
293  /* check file presence */
294  if (GetFileAttributesW(szOpenFileName) == 0xFFFFFFFF)
295  {
296  DPRINT1("File %s not found!\n", szOpenFileName);
297  return;
298  }
299 
300  /* load now */
301  GdipLoadImageFromFile(szOpenFileName, &image);
302  if (!image)
303  {
304  DPRINT1("GdipLoadImageFromFile() failed\n");
305  return;
306  }
307  Anime_LoadInfo();
308 
309  if (szOpenFileName && szOpenFileName[0])
310  SHAddToRecentDocs(SHARD_PATHW, szOpenFileName);
311 
312  /* reset zoom */
313  ResetZoom();
314 
315  /* redraw */
317 }
318 
319 static void pSaveImageAs(HWND hwnd)
320 {
322  ImageCodecInfo *codecInfo;
323  WCHAR szSaveFileName[MAX_PATH];
324  WCHAR *szFilterMask;
325  GUID rawFormat;
326  UINT num;
327  UINT size;
328  size_t sizeRemain;
329  UINT j;
330  WCHAR *c;
331 
333  codecInfo = malloc(size);
334  if (!codecInfo)
335  {
336  DPRINT1("malloc() failed in pSaveImageAs()\n");
337  return;
338  }
339 
340  GdipGetImageEncoders(num, size, codecInfo);
341  GdipGetImageRawFormat(image, &rawFormat);
342 
343  sizeRemain = 0;
344 
345  for (j = 0; j < num; ++j)
346  {
347  // 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.
348  sizeRemain = sizeRemain + (((wcslen(codecInfo[j].FormatDescription) + (wcslen(codecInfo[j].FilenameExtension) * 2) + 5) * sizeof(WCHAR)));
349  }
350 
351  /* Add two more chars for the last terminator */
352  sizeRemain = sizeRemain + (sizeof(WCHAR) * 2);
353 
354  szFilterMask = malloc(sizeRemain);
355  if (!szFilterMask)
356  {
357  DPRINT1("cannot allocate memory for filter mask in pSaveImageAs()");
358  free(codecInfo);
359  return;
360  }
361 
362  ZeroMemory(szSaveFileName, sizeof(szSaveFileName));
363  ZeroMemory(szFilterMask, sizeRemain);
364  ZeroMemory(&sfn, sizeof(sfn));
365  sfn.lStructSize = sizeof(sfn);
366  sfn.hwndOwner = hwnd;
368  sfn.lpstrFile = szSaveFileName;
369  sfn.lpstrFilter = szFilterMask;
372 
373  c = szFilterMask;
374 
375  for (j = 0; j < num; ++j)
376  {
377  StringCbPrintfExW(c, sizeRemain, &c, &sizeRemain, 0, L"%ls (%ls)", codecInfo[j].FormatDescription, codecInfo[j].FilenameExtension);
378 
379  /* Skip the NULL character */
380  c++;
381  sizeRemain -= sizeof(*c);
382 
383  StringCbPrintfExW(c, sizeRemain, &c, &sizeRemain, 0, L"%ls", codecInfo[j].FilenameExtension);
384 
385  /* Skip the NULL character */
386  c++;
387  sizeRemain -= sizeof(*c);
388 
389  if (IsEqualGUID(&rawFormat, &codecInfo[j].FormatID) != FALSE)
390  {
391  sfn.nFilterIndex = j + 1;
392  }
393  }
394 
395  if (GetSaveFileNameW(&sfn))
396  {
397  if (m_pDelayItem)
398  {
399  /* save animation */
401 
402  DPRINT1("FIXME: save animation\n");
403  if (GdipSaveImageToFile(image, szSaveFileName, &codecInfo[sfn.nFilterIndex - 1].Clsid, NULL) != Ok)
404  {
405  DPRINT1("GdipSaveImageToFile() failed\n");
406  }
407 
409  }
410  else
411  {
412  /* save non-animation */
413  if (GdipSaveImageToFile(image, szSaveFileName, &codecInfo[sfn.nFilterIndex - 1].Clsid, NULL) != Ok)
414  {
415  DPRINT1("GdipSaveImageToFile() failed\n");
416  }
417  }
418  }
419 
420  free(szFilterMask);
421  free(codecInfo);
422 }
423 
424 static VOID
426 {
427  WCHAR szTitleBuf[800];
428  WCHAR szResStr[512];
429  WCHAR *c;
430 
431  if (node)
432  {
433  c = wcsrchr(node->FileName, '\\');
434  if (c)
435  {
436  c++;
437  }
438 
439  LoadStringW(hInstance, IDS_APPTITLE, szResStr, ARRAYSIZE(szResStr));
440  StringCbPrintfW(szTitleBuf, sizeof(szTitleBuf), L"%ls%ls%ls", szResStr, L" - ", c);
441  SetWindowTextW(hwnd, szTitleBuf);
442 
443  if (image)
444  {
446  }
447 
448  pLoadImage(node->FileName);
449  }
450 }
451 
452 static SHIMGVW_FILENODE*
453 pBuildFileList(LPWSTR szFirstFile)
454 {
455  HANDLE hFindHandle;
456  WCHAR *extension;
457  WCHAR szSearchPath[MAX_PATH];
458  WCHAR szSearchMask[MAX_PATH];
459  WCHAR szFileTypes[MAX_PATH];
460  WIN32_FIND_DATAW findData;
461  SHIMGVW_FILENODE *currentNode = NULL;
463  SHIMGVW_FILENODE *conductor = NULL;
464  ImageCodecInfo *codecInfo;
465  UINT num;
466  UINT size;
467  UINT j;
468 
469  StringCbCopyW(szSearchPath, sizeof(szSearchPath), szFirstFile);
470  PathRemoveFileSpecW(szSearchPath);
471 
473  codecInfo = malloc(size);
474  if (!codecInfo)
475  {
476  DPRINT1("malloc() failed in pLoadFileList()\n");
477  return NULL;
478  }
479 
480  GdipGetImageDecoders(num, size, codecInfo);
481 
482  root = malloc(sizeof(SHIMGVW_FILENODE));
483  if (!root)
484  {
485  DPRINT1("malloc() failed in pLoadFileList()\n");
486  free(codecInfo);
487  return NULL;
488  }
489 
490  conductor = root;
491 
492  for (j = 0; j < num; ++j)
493  {
494  StringCbCopyW(szFileTypes, sizeof(szFileTypes), codecInfo[j].FilenameExtension);
495 
496  extension = wcstok(szFileTypes, L";");
497  while (extension != NULL)
498  {
499  PathCombineW(szSearchMask, szSearchPath, extension);
500 
501  hFindHandle = FindFirstFileW(szSearchMask, &findData);
502  if (hFindHandle != INVALID_HANDLE_VALUE)
503  {
504  do
505  {
506  PathCombineW(conductor->FileName, szSearchPath, findData.cFileName);
507 
508  // compare the name of the requested file with the one currently found.
509  // if the name matches, the current node is returned by the function.
510  if (wcscmp(szFirstFile, conductor->FileName) == 0)
511  {
512  currentNode = conductor;
513  }
514 
515  conductor->Next = malloc(sizeof(SHIMGVW_FILENODE));
516 
517  // if malloc fails, make circular what we have and return it
518  if (!conductor->Next)
519  {
520  DPRINT1("malloc() failed in pLoadFileList()\n");
521 
522  conductor->Next = root;
523  root->Prev = conductor;
524 
525  FindClose(hFindHandle);
526  free(codecInfo);
527  return conductor;
528  }
529 
530  conductor->Next->Prev = conductor;
531  conductor = conductor->Next;
532  }
533  while (FindNextFileW(hFindHandle, &findData) != 0);
534 
535  FindClose(hFindHandle);
536  }
537 
538  extension = wcstok(NULL, L";");
539  }
540  }
541 
542  // we now have a node too much in the list. In case the requested file was not found,
543  // we use this node to store the name of it, otherwise we free it.
544  if (currentNode == NULL)
545  {
546  StringCchCopyW(conductor->FileName, MAX_PATH, szFirstFile);
547  currentNode = conductor;
548  }
549  else
550  {
551  conductor = conductor->Prev;
552  free(conductor->Next);
553  }
554 
555  // link the last node with the first one to make the list circular
556  conductor->Next = root;
557  root->Prev = conductor;
558  conductor = currentNode;
559 
560  free(codecInfo);
561 
562  return conductor;
563 }
564 
565 static VOID
567 {
568  SHIMGVW_FILENODE *conductor;
569 
570  root->Prev->Next = NULL;
571  root->Prev = NULL;
572 
573  while (root)
574  {
575  conductor = root;
576  root = conductor->Next;
577  free(conductor);
578  }
579 }
580 
581 static VOID
583 {
586 }
587 
589 {
590  static const CHAR pattern[] =
591  "\x28\x00\x00\x00\x10\x00\x00\x00\x10\x00\x00\x00\x01\x00\x04\x00\x00\x00"
592  "\x00\x00\x80\x00\x00\x00\x23\x2E\x00\x00\x23\x2E\x00\x00\x10\x00\x00\x00"
593  "\x00\x00\x00\x00\x99\x99\x99\x00\xCC\xCC\xCC\x00\x00\x00\x00\x00\x00\x00"
594  "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
595  "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
596  "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11\x11\x11"
597  "\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00"
598  "\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00"
599  "\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11"
600  "\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00"
601  "\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11"
602  "\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11"
603  "\x00\x00\x00\x00\x11\x11\x11\x11\x00\x00\x00\x00\x11\x11\x11\x11";
604 
606 }
607 
608 static VOID
610 {
611  GpGraphics *graphics;
612  UINT ImageWidth, ImageHeight;
613  INT ZoomedWidth, ZoomedHeight, x, y;
614  PAINTSTRUCT ps;
615  RECT rect, margin;
616  HDC hdc;
617  HBRUSH white;
618  HGDIOBJ hbrOld;
619  UINT uFlags;
620 
621  hdc = BeginPaint(hwnd, &ps);
622  if (!hdc)
623  {
624  DPRINT1("BeginPaint() failed\n");
625  return;
626  }
627 
628  GdipCreateFromHDC(hdc, &graphics);
629  if (!graphics)
630  {
631  DPRINT1("GdipCreateFromHDC() failed\n");
632  return;
633  }
634 
635  GdipGetImageWidth(image, &ImageWidth);
636  GdipGetImageHeight(image, &ImageHeight);
637 
638  if (GetClientRect(hwnd, &rect))
639  {
640  ZoomedWidth = (ImageWidth * ZoomPercents) / 100;
641  ZoomedHeight = (ImageHeight * ZoomPercents) / 100;
642 
643  x = (rect.right - ZoomedWidth) / 2;
644  y = (rect.bottom - ZoomedHeight) / 2;
645 
646  white = GetStockObject(WHITE_BRUSH);
647  // Fill top part
648  margin = rect;
649  margin.bottom = y - 1;
650  FillRect(hdc, &margin, white);
651  // Fill bottom part
652  margin.top = y + ZoomedHeight + 1;
653  margin.bottom = rect.bottom;
654  FillRect(hdc, &margin, white);
655  // Fill left part
656  margin.top = y - 1;
657  margin.bottom = y + ZoomedHeight + 1;
658  margin.right = x - 1;
659  FillRect(hdc, &margin, white);
660  // Fill right part
661  margin.left = x + ZoomedWidth + 1;
662  margin.right = rect.right;
663  FillRect(hdc, &margin, white);
664 
665  DPRINT("x = %d, y = %d, ImageWidth = %u, ImageHeight = %u\n");
666  DPRINT("rect.right = %ld, rect.bottom = %ld\n", rect.right, rect.bottom);
667  DPRINT("ZoomPercents = %d, ZoomedWidth = %d, ZoomedHeight = %d\n",
668  ZoomPercents, ZoomedWidth, ZoomedWidth);
669 
670  if (ZoomPercents % 100 == 0)
671  {
674  }
675  else
676  {
679  }
680 
681  uFlags = 0;
683 
685  {
686  HBRUSH hbr = CreateCheckerBoardBrush(hdc);
687  hbrOld = SelectObject(hdc, hbr);
688  Rectangle(hdc, x - 1, y - 1, x + ZoomedWidth + 1, y + ZoomedHeight + 1);
689  SelectObject(hdc, hbrOld);
690  DeleteObject(hbr);
691  }
692  else
693  {
695  Rectangle(hdc, x - 1, y - 1, x + ZoomedWidth + 1, y + ZoomedHeight + 1);
696  SelectObject(hdc, hbrOld);
697  }
698 
699  GdipDrawImageRectI(graphics, image, x, y, ZoomedWidth, ZoomedHeight);
700  }
701  GdipDeleteGraphics(graphics);
702  EndPaint(hwnd, &ps);
703 }
704 
705 static BOOL
707 {
708  HKEY hKey;
709  DWORD dwSize;
710 
711  if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\ReactOS\\shimgvw"), 0, KEY_READ, &hKey) == ERROR_SUCCESS)
712  {
713  dwSize = sizeof(SHIMGVW_SETTINGS);
714  if (RegQueryValueEx(hKey, _T("Settings"), NULL, NULL, (LPBYTE)&shiSettings, &dwSize) == ERROR_SUCCESS)
715  {
716  RegCloseKey(hKey);
717  return TRUE;
718  }
719 
720  RegCloseKey(hKey);
721  }
722 
723  return FALSE;
724 }
725 
726 static VOID
728 {
729  WINDOWPLACEMENT wp;
730  HKEY hKey;
731 
733  wp.length = sizeof(WINDOWPLACEMENT);
734  GetWindowPlacement(hwnd, &wp);
735 
741 
742  if (RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software\\ReactOS\\shimgvw"), 0, NULL,
744  {
745  RegSetValueEx(hKey, _T("Settings"), 0, REG_BINARY, (LPBYTE)&shiSettings, sizeof(SHIMGVW_SETTINGS));
746  RegCloseKey(hKey);
747  }
748 }
749 
750 static BOOL
752 {
753  INT numButtons = sizeof(Buttons) / sizeof(Buttons[0]);
754 
757  0, 0, 0, 0, hwnd,
758  0, hInstance, NULL);
759  if(hToolBar != NULL)
760  {
761  HIMAGELIST hImageList;
762 
765 
767  sizeof(Buttons[0]), 0);
768 
770 
773 
776 
779 
782 
785 
788 
791 
794 
795  if (hImageList == NULL) return FALSE;
796 
798  0, (LPARAM)hImageList));
799 
801  numButtons, (LPARAM)Buttons);
802 
803  return TRUE;
804  }
805 
806  return FALSE;
807 }
808 
810 {
811  DWORD dwDelay;
812 
815 
816  if (Anime_Step(&dwDelay))
817  {
818  SetTimer(hwnd, ANIME_TIMER_ID, dwDelay, NULL);
819  }
820 }
821 
824 {
825  switch (Message)
826  {
827  case WM_PAINT:
828  {
830  return 0L;
831  }
832  case WM_TIMER:
833  {
834  if (wParam == ANIME_TIMER_ID)
835  {
837  return 0;
838  }
839  break;
840  }
841  }
843 }
844 
845 static VOID
847 {
851 
853 
856  0, 0, 0, 0, hwnd, NULL, hInstance, NULL);
857 
860 
862 }
863 
864 static VOID
866 {
867  if (zDelta != 0)
868  {
869  ZoomInOrOut(zDelta > 0);
870  }
871 }
872 
875 {
876  switch (Message)
877  {
878  case WM_CREATE:
879  {
881  return 0L;
882  }
883 
884  case WM_KEYDOWN:
885  switch (LOWORD(wParam))
886  {
887  case VK_LEFT:
889  break;
890 
891  case VK_RIGHT:
893  break;
894  }
895  break;
896 
897  case WM_COMMAND:
898  {
899  switch (wParam)
900  {
901  case IDC_PREV:
902  {
905  }
906 
907  break;
908  case IDC_NEXT:
909  {
912  }
913 
914  break;
915  case IDC_ZOOMP:
916  {
917  ZoomInOrOut(TRUE);
918  }
919  break;
920  case IDC_ZOOMM:
921  {
923  }
924  break;
925  case IDC_SAVE:
927 
928  break;
929  case IDC_PRINT:
930 
931  break;
932  case IDC_ROT1:
933  {
936  }
937 
938  break;
939  case IDC_ROT2:
940  {
943  }
944 
945  break;
946  }
947  }
948  break;
949 
950  case WM_MOUSEWHEEL:
954  break;
955 
956  case WM_NOTIFY:
957  {
958  LPNMHDR pnmhdr = (LPNMHDR)lParam;
959 
960  switch (pnmhdr->code)
961  {
962  case TTN_GETDISPINFO:
963  {
964  LPTOOLTIPTEXT lpttt;
965  UINT idButton;
966 
967  lpttt = (LPTOOLTIPTEXT)lParam;
968  idButton = (UINT)lpttt->hdr.idFrom;
969  lpttt->hinst = hInstance;
970 
971  switch (idButton)
972  {
973  case IDC_PREV:
974  lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_PREV_PIC);
975  break;
976  case IDC_NEXT:
977  lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_NEXT_PIC);
978  break;
979  case IDC_ZOOMP:
980  lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_ZOOM_IN);
981  break;
982  case IDC_ZOOMM:
983  lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_ZOOM_OUT);
984  break;
985  case IDC_SAVE:
986  lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_SAVEAS);
987  break;
988  case IDC_PRINT:
989  lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_PRINT);
990  break;
991  case IDC_ROT1:
992  lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_ROT_COUNCW);
993  break;
994  case IDC_ROT2:
995  lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_ROT_CLOCKW);
996  break;
997  }
998  return TRUE;
999  }
1000  }
1001  break;
1002  }
1003  case WM_SIZING:
1004  {
1005  LPRECT pRect = (LPRECT)lParam;
1006  if (pRect->right-pRect->left < 350)
1007  pRect->right = pRect->left + 350;
1008 
1009  if (pRect->bottom-pRect->top < 290)
1010  pRect->bottom = pRect->top + 290;
1011  return TRUE;
1012  }
1013  case WM_SIZE:
1014  {
1015  RECT rc;
1017  GetWindowRect(hToolBar, &rc);
1018  MoveWindow(hDispWnd, 1, 1, LOWORD(lParam) - 1, HIWORD(lParam) - (rc.bottom - rc.top) - 1, TRUE);
1019  /* is it maximized or restored? */
1021  {
1022  /* reset zoom */
1023  ResetZoom();
1024  }
1025  return 0L;
1026  }
1027  case WM_DESTROY:
1028  {
1031  PostQuitMessage(0);
1032  break;
1033  }
1034  }
1035 
1036  return DefWindowProc(hwnd, Message, wParam, lParam);
1037 }
1038 
1039 LONG WINAPI
1041 {
1042  struct GdiplusStartupInput gdiplusStartupInput;
1044  WNDCLASS WndClass = {0};
1045  TCHAR szBuf[512];
1046  WCHAR szInitialFile[MAX_PATH];
1047  HWND hMainWnd;
1048  MSG msg;
1049 
1050  if (!ImageView_LoadSettings())
1051  {
1053  shiSettings.Left = 0;
1054  shiSettings.Top = 0;
1055  shiSettings.Right = 520;
1056  shiSettings.Bottom = 400;
1057  }
1058 
1059  // Initialize GDI+
1060  gdiplusStartupInput.GdiplusVersion = 1;
1061  gdiplusStartupInput.DebugEventCallback = NULL;
1062  gdiplusStartupInput.SuppressBackgroundThread = FALSE;
1063  gdiplusStartupInput.SuppressExternalCodecs = FALSE;
1064 
1065  GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
1066  pLoadImage(szFileName);
1067 
1068  // Create the window
1069  WndClass.lpszClassName = _T("shimgvw_window");
1070  WndClass.lpfnWndProc = ImageView_WndProc;
1071  WndClass.hInstance = hInstance;
1072  WndClass.style = CS_HREDRAW | CS_VREDRAW;
1074  WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
1075  WndClass.hbrBackground = NULL; /* less flicker */
1076 
1077  if (!RegisterClass(&WndClass)) return -1;
1078 
1079  LoadString(hInstance, IDS_APPTITLE, szBuf, sizeof(szBuf) / sizeof(TCHAR));
1080  hMainWnd = CreateWindow(_T("shimgvw_window"), szBuf,
1083  0, 0, NULL, NULL, hInstance, NULL);
1084 
1085  // make sure the path has no quotes on it
1086  wcscpy(szInitialFile, szFileName);
1087  PathUnquoteSpacesW(szInitialFile);
1088 
1089  currentFile = pBuildFileList(szInitialFile);
1090  if (currentFile)
1091  {
1093  }
1094 
1095  // Show it
1098 
1099  // Message Loop
1100  while(GetMessage(&msg,NULL,0,0))
1101  {
1104  }
1105 
1107 
1108  if (image)
1110 
1111  Anime_FreeInfo();
1112 
1114  return -1;
1115 }
1116 
1117 VOID WINAPI
1119 {
1121 }
1122 
1123 VOID WINAPI
1125 {
1127 }
1128 
1129 VOID WINAPI
1131 {
1132  WCHAR szFile[MAX_PATH];
1133 
1134  if (MultiByteToWideChar(CP_ACP, 0, (char*)path, strlen((char*)path)+1, szFile, MAX_PATH))
1135  {
1137  }
1138 }
1139 
1140 VOID WINAPI
1142 {
1143  DPRINT("ImageView_PrintTo() not implemented\n");
1144 }
1145 
1146 VOID WINAPI
1148 {
1149  DPRINT("ImageView_PrintToA() not implemented\n");
1150 }
1151 
1152 VOID WINAPI
1154 {
1155  DPRINT("ImageView_PrintToW() not implemented\n");
1156 }
1157 
1158 BOOL WINAPI
1160  IN DWORD dwReason,
1162 {
1163  switch (dwReason)
1164  {
1165  case DLL_PROCESS_ATTACH:
1166  case DLL_THREAD_ATTACH:
1167  hInstance = hinstDLL;
1168  break;
1169  }
1170 
1171  return TRUE;
1172 }
VOID WINAPI ImageView_PrintToW(HWND hwnd, HINSTANCE hInst, LPCWSTR path, int nShow)
Definition: shimgvw.c:1153
HGDIOBJ WINAPI GetStockObject(_In_ int)
#define RegQueryValueEx
Definition: winreg.h:524
#define CallWindowProc
Definition: winuser.h:5710
HINSTANCE hInstance
Definition: commdlg.h:362
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:382
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
#define MAKEINTRESOURCE
Definition: winuser.h:591
SHIMGVW_SETTINGS shiSettings
Definition: shimgvw.c:38
#define IN
Definition: typedefs.h:39
#define TBICON_SAVE
Definition: resource.h:33
DWORD Flags
Definition: commdlg.h:373
GpStatus WINGDIPAPI GdipGetImageEncoders(UINT numEncoders, UINT size, ImageCodecInfo *encoders)
Definition: image.c:5021
BOOL WINAPI TranslateMessage(_In_ const MSG *)
BOOL WINAPI PathRemoveFileSpecW(LPWSTR lpszPath)
Definition: path.c:624
static BOOL ImageView_LoadSettings()
Definition: shimgvw.c:706
#define TB_BUTTONSTRUCTSIZE
Definition: commctrl.h:1130
#define IDS_TOOLTIP_ROT_COUNCW
Definition: resource.h:58
#define TRUE
Definition: types.h:120
#define PropertyTagLoopCount
#define MAKEWPARAM(l, h)
Definition: winuser.h:3984
GpStatus WINGDIPAPI GdipImageGetFrameCount(GpImage *image, GDIPCONST GUID *dimensionID, UINT *count)
Definition: image.c:2865
LPCWSTR lpstrFilter
Definition: commdlg.h:363
#define IDC_ZOOMM
Definition: resource.h:23
static void ResetZoom(void)
Definition: shimgvw.c:235
struct _WINDOWPLACEMENT WINDOWPLACEMENT
#define ERROR_SUCCESS
Definition: deptool.c:10
#define IDB_PRINTICON
Definition: resource.h:15
#define CreateWindow
Definition: winuser.h:5729
WNDPROC PrevProc
Definition: shimgvw.c:41
GpStatus WINGDIPAPI GdipLoadImageFromFile(GDIPCONST WCHAR *filename, GpImage **image)
Definition: image.c:2928
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
#define TBSTYLE_EX_HIDECLIPPEDBUTTONS
Definition: commctrl.h:1009
#define IDS_APPTITLE
Definition: resource.h:3
BOOL WINAPI Rectangle(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int)
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define REG_BINARY
Definition: nt_native.h:1496
#define SIZE_MAXIMIZED
Definition: winuser.h:2482
#define KEY_READ
Definition: nt_native.h:1023
GpStatus WINGDIPAPI GdipGetImageWidth(GpImage *image, UINT *width)
Definition: image.c:2342
#define DLL_THREAD_ATTACH
Definition: compat.h:121
#define SW_HIDE
Definition: winuser.h:762
#define IDS_TOOLTIP_NEXT_PIC
Definition: resource.h:53
#define WM_MOUSEWHEEL
Definition: treelist.c:96
#define CP_ACP
Definition: compat.h:99
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define NULL_BRUSH
Definition: wingdi.h:900
char CHAR
Definition: xmlstorage.h:175
#define free
Definition: debug_ros.c:5
struct _root root
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
GpStatus WINGDIPAPI GdipGetPropertyItemSize(GpImage *image, PROPID propid, UINT *size)
Definition: image.c:2488
#define SIZE_RESTORED
Definition: winuser.h:2480
LPWSTR lpstrFile
Definition: commdlg.h:367
UINT ZoomPercents
Definition: shimgvw.c:48
VOID WINAPI ImageView_FullscreenA(HWND hwnd, HINSTANCE hInst, LPCSTR path, int nShow)
Definition: shimgvw.c:1130
static HDC
Definition: imagelist.c:92
#define IDB_NEXTICON
Definition: resource.h:11
#define CALLBACK
Definition: compat.h:27
BOOL WINAPI UpdateWindow(_In_ HWND)
_Check_return_ _CRTIMP wchar_t *__cdecl wcstok(_Inout_opt_z_ wchar_t *_Str, _In_z_ const wchar_t *_Delim)
LONG top
Definition: windef.h:307
VOID WINAPI ImageView_Fullscreen(HWND hwnd, HINSTANCE hInst, LPCWSTR path, int nShow)
Definition: shimgvw.c:1124
#define GET_X_LPARAM(lp)
Definition: windowsx.h:274
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define VK_LEFT
Definition: winuser.h:2199
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
#define INVALID_HANDLE_VALUE
Definition: compat.h:399
#define ZeroMemory
Definition: winbase.h:1648
#define CS_HREDRAW
Definition: winuser.h:648
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
#define IDC_NEXT
Definition: fontview.h:17
#define WHITE_BRUSH
Definition: wingdi.h:901
#define DLL_PROCESS_ATTACH
Definition: compat.h:120
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)
UINT_PTR WPARAM
Definition: windef.h:207
#define WPF_RESTORETOMAXIMIZED
Definition: winuser.h:2507
GpStatus WINGDIPAPI GdipGetImageFlags(GpImage *image, UINT *flags)
Definition: image.c:5266
#define WS_CHILD
Definition: pedump.c:617
UINT m_nLoopIndex
Definition: shimgvw.c:57
#define MAX_ZOOM
Definition: shimgvw.c:47
LONG left
Definition: windef.h:306
UINT uFlags
Definition: api.c:59
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
struct SHIMGVW_FILENODE_INTERNAL * Next
Definition: shimgvw.h:21
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
#define IDC_ROT2
Definition: resource.h:27
BOOL Anime_Step(DWORD *pdwDelay)
Definition: shimgvw.c:159
GpStatus WINGDIPAPI GdipSaveImageToFile(GpImage *image, GDIPCONST WCHAR *filename, GDIPCONST CLSID *clsidEncoder, GDIPCONST EncoderParameters *encoderParams)
Definition: image.c:4428
LRESULT CALLBACK ImageView_DispWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
Definition: shimgvw.c:823
LONG right
Definition: windef.h:308
#define IDC_SAVE
Definition: resource.h:16
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define ANIME_TIMER_ID
Definition: shimgvw.c:61
VOID WINAPI ImageView_PrintTo(HWND hwnd, HINSTANCE hInst, LPCWSTR path, int nShow)
Definition: shimgvw.c:1141
int32_t INT
Definition: typedefs.h:57
static const UINT ZoomSteps[]
Definition: shimgvw.c:49
#define SetWindowLongPtr
Definition: treelist.c:70
& rect
Definition: startmenu.cpp:1413
WPARAM wParam
Definition: combotst.c:138
static BOOL ImageView_CreateToolBar(HWND hwnd)
Definition: shimgvw.c:751
static IN DWORD IN LPVOID lpvReserved
BOOL WINAPI GetSaveFileNameW(LPOPENFILENAMEW ofn)
Definition: filedlg.c:4630
struct tagNMHDR * LPNMHDR
DWORD lStructSize
Definition: commdlg.h:360
#define IDS_TOOLTIP_PREV_PIC
Definition: resource.h:54
BOOL WINAPI ImageList_Destroy(HIMAGELIST himl)
Definition: imagelist.c:928
uint32_t ULONG_PTR
Definition: typedefs.h:64
#define TBICON_ROT2
Definition: resource.h:36
GpStatus WINGDIPAPI GdipGetImageDecodersSize(UINT *numDecoders, UINT *size)
Definition: image.c:4946
UINT code
Definition: winuser.h:3134
#define IDC_ROT1
Definition: resource.h:26
GpStatus WINGDIPAPI GdipImageRotateFlip(GpImage *image, RotateFlipType type)
Definition: image.c:5358
DWORD dwReason
Definition: misc.cpp:154
#define GCL_STYLE
Definition: winuser.h:665
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
#define BTNS_BUTTON
Definition: commctrl.h:994
BOOL Maximized
Definition: shimgvw.h:10
const GUID * guid
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
HIMAGELIST WINAPI ImageList_Create(INT cx, INT cy, UINT flags, INT cInitial, INT cGrow)
Definition: imagelist.c:804
unsigned char * LPBYTE
Definition: typedefs.h:53
void WINAPI SHAddToRecentDocs(UINT uFlags, LPCVOID pv)
Definition: shellord.c:723
GpStatus WINGDIPAPI GdipGetImageHeight(GpImage *image, UINT *height)
Definition: image.c:2239
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
#define IDS_TOOLTIP_ZOOM_OUT
Definition: resource.h:56
GpStatus WINGDIPAPI GdipSetSmoothingMode(GpGraphics *graphics, SmoothingMode mode)
Definition: graphics.c:6289
#define WC_STATIC
Definition: commctrl.h:4678
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *graphics)
Definition: graphics.c:2581
#define TB_AUTOSIZE
Definition: commctrl.h:1133
#define TB_IMAGE_HEIGHT
Definition: shimgvw.h:4
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:802
short SHORT
Definition: pedump.c:59
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
#define IDB_PREVICON
Definition: resource.h:10
LRESULT CALLBACK ImageView_WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
Definition: shimgvw.c:874
#define TTN_GETDISPINFO
Definition: commctrl.h:1874
#define CreateWindowEx
Definition: winuser.h:5730
#define TB_ENABLEBUTTON
Definition: commctrl.h:1038
#define CW_USEDEFAULT
Definition: winuser.h:225
#define WM_SIZING
Definition: winuser.h:1789
#define TOOLBARCLASSNAME
Definition: commctrl.h:942
DWORD Anime_GetFrameDelay(UINT nFrameIndex)
Definition: shimgvw.c:150
static SHIMGVW_FILENODE * pBuildFileList(LPWSTR szFirstFile)
Definition: shimgvw.c:453
#define PropertyTagFrameDelay
smooth NULL
Definition: ftsmooth.c:416
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:557
LONG WINAPI ImageView_CreateWindow(HWND hwnd, LPWSTR szFileName)
Definition: shimgvw.c:1040
#define WM_KEYDOWN
Definition: winuser.h:1697
LONG_PTR LPARAM
Definition: windef.h:208
#define LPRECT
Definition: precomp.h:28
GpStatus WINGDIPAPI GdipGetImageRawFormat(GpImage *image, GUID *format)
Definition: image.c:2306
void DPRINT(...)
Definition: polytest.cpp:61
GpStatus WINGDIPAPI GdipGetImageDecoders(UINT numDecoders, UINT size, ImageCodecInfo *decoders)
Definition: image.c:4970
_Check_return_ _CRTIMP _CONST_RETURN wchar_t *__cdecl wcsrchr(_In_z_ const wchar_t *_Str, _In_ wchar_t _Ch)
switch(r->id)
Definition: btrfs.c:2904
WCHAR FileName[MAX_PATH]
Definition: shimgvw.h:19
#define SetClassLongPtr
Definition: winuser.h:5823
const char * LPCSTR
Definition: xmlstorage.h:183
static VOID ImageView_UpdateWindow(HWND hwnd)
Definition: shimgvw.c:582
#define SW_SHOW
Definition: winuser.h:769
BOOL WINAPI GetWindowPlacement(_In_ HWND, _Inout_ WINDOWPLACEMENT *)
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
#define DefWindowProc
Definition: ros2win.h:31
static BOOL Anime_LoadInfo(void)
Definition: shimgvw.c:76
#define WM_DESTROY
Definition: winuser.h:1591
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
DWORD nFilterIndex
Definition: commdlg.h:366
#define PostMessage
Definition: winuser.h:5807
DebugEventProc DebugEventCallback
Definition: gdiplusinit.h:35
#define CCS_BOTTOM
Definition: commctrl.h:2240
SHIMGVW_FILENODE * currentFile
Definition: shimgvw.c:39
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1057
#define WS_CAPTION
Definition: pedump.c:624
#define KEY_WRITE
Definition: nt_native.h:1031
#define TB_SETIMAGELIST
Definition: commctrl.h:1146
static void Anime_FreeInfo(void)
Definition: shimgvw.c:63
#define LPTOOLTIPTEXT
Definition: commctrl.h:1886
#define CS_VREDRAW
Definition: winuser.h:653
char TCHAR
Definition: xmlstorage.h:189
#define TBICON_PRINT
Definition: resource.h:34
GpStatus WINGDIPAPI GdipImageSelectActiveFrame(GpImage *image, GDIPCONST GUID *dimensionID, UINT frame)
Definition: image.c:4302
static VOID pLoadImageFromNode(SHIMGVW_FILENODE *node, HWND hwnd)
Definition: shimgvw.c:425
#define IDS_TOOLTIP_ZOOM_IN
Definition: resource.h:55
#define _T(x)
Definition: vfdio.h:22
BOOL SuppressBackgroundThread
Definition: gdiplusinit.h:36
GLsizeiptr size
Definition: glext.h:5919
#define BTNS_SEP
Definition: commctrl.h:995
OPENFILENAMEW sfn
Definition: eventvwr.c:118
GpStatus WINGDIPAPI GdipDrawImageRectI(GpGraphics *graphics, GpImage *image, INT x, INT y, INT width, INT height)
Definition: graphics.c:3561
__wchar_t WCHAR
Definition: xmlstorage.h:180
GpStatus WINGDIPAPI GdipSetInterpolationMode(GpGraphics *graphics, InterpolationMode mode)
Definition: graphics.c:6143
#define WM_SIZE
Definition: winuser.h:1593
GpImage * image
Definition: shimgvw.c:40
#define IDC_PREV
Definition: fontview.h:16
#define ILC_COLOR24
Definition: commctrl.h:353
#define WM_TIMER
Definition: winuser.h:1724
static void ZoomInOrOut(BOOL bZoomIn)
Definition: shimgvw.c:185
#define TBICON_ZOOMM
Definition: resource.h:32
#define RGB(r, g, b)
Definition: wingdi.h:2939
#define MAX_PATH
Definition: compat.h:26
void WINAPI GdiplusShutdown(ULONG_PTR)
#define WINAPI
Definition: msvc.h:6
const GLubyte * c
Definition: glext.h:8905
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
Status WINAPI GdiplusStartup(ULONG_PTR *token, const struct GdiplusStartupInput *input, struct GdiplusStartupOutput *output)
Definition: gdiplus.c:81
unsigned short WORD
Definition: ntddk_ex.h:93
#define BN_CLICKED
Definition: winuser.h:1907
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint num
Definition: glext.h:9618
DWORD nMaxFile
Definition: commdlg.h:368
GpStatus WINGDIPAPI GdipGetPropertyItem(GpImage *image, PROPID propid, UINT size, PropertyItem *buffer)
Definition: image.c:2634
HWND hDispWnd
Definition: shimgvw.c:43
#define TBSTYLE_TOOLTIPS
Definition: commctrl.h:985
VOID WINAPI ImageView_FullscreenW(HWND hwnd, HINSTANCE hInst, LPCWSTR path, int nShow)
Definition: shimgvw.c:1118
#define WM_PAINT
Definition: winuser.h:1602
CHAR Message[80]
Definition: alive.c:5
static ULONG_PTR gdiplusToken
Definition: CImage.cpp:79
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
#define IDC_ZOOMP
Definition: resource.h:22
HWND hMainWnd
Definition: magnifier.c:32
HWND hwndOwner
Definition: commdlg.h:361
#define TBICON_PREV
Definition: resource.h:29
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define TBICON_ROT1
Definition: resource.h:35
#define TBICON_ZOOMP
Definition: resource.h:31
static const WCHAR L[]
Definition: oid.c:1250
HDC hdc
Definition: main.c:9
#define TB_ADDBUTTONS
Definition: commctrl.h:1267
static VOID ImageView_OnMouseWheel(HWND hwnd, INT x, INT y, INT zDelta, UINT fwKeys)
Definition: shimgvw.c:865
static VOID pFreeFileList(SHIMGVW_FILENODE *root)
Definition: shimgvw.c:566
#define ILC_MASK
Definition: commctrl.h:347
#define IDB_ROT1ICON
Definition: resource.h:16
PropertyItem * m_pDelayItem
Definition: shimgvw.c:59
#define OFN_HIDEREADONLY
Definition: commdlg.h:107
GpStatus WINGDIPAPI GdipGetImageEncodersSize(UINT *numEncoders, UINT *size)
Definition: image.c:4997
#define WM_COMMAND
Definition: winuser.h:1722
BOOL WINAPI MoveWindow(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ BOOL)
static void Anime_SetFrameIndex(UINT nFrameIndex)
Definition: shimgvw.c:136
#define IDI_APPICON
Definition: resource.h:166
#define LoadCursor
Definition: winuser.h:5787
GpStatus WINGDIPAPI GdipDisposeImage(GpImage *image)
Definition: image.c:2107
#define GWLP_WNDPROC
Definition: treelist.c:66
#define IDS_TOOLTIP_SAVEAS
Definition: resource.h:60
static VOID ImageView_DrawImage(HWND hwnd)
Definition: shimgvw.c:609
#define IDB_ROT2ICON
Definition: resource.h:17
#define VK_RIGHT
Definition: winuser.h:2201
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
Definition: winuser.h:2881
static HBRUSH CreateCheckerBoardBrush(HDC hdc)
Definition: shimgvw.c:588
#define MIN_ZOOM
Definition: shimgvw.c:46
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define RegOpenKeyEx
Definition: winreg.h:520
HINSTANCE hInst
Definition: dxdiag.c:13
BOOL WINAPI DllMain(IN HINSTANCE hinstDLL, IN DWORD dwReason, IN LPVOID lpvReserved)
Definition: shimgvw.c:1159
static void ImageView_OnTimer(HWND hwnd)
Definition: shimgvw.c:809
struct SHIMGVW_FILENODE_INTERNAL * Prev
Definition: shimgvw.h:20
#define IDB_ZOOMMICON
Definition: resource.h:13
#define OFN_OVERWRITEPROMPT
Definition: commdlg.h:116
UINT m_nLoopCount
Definition: shimgvw.c:58
VOID WINAPI PathUnquoteSpacesW(LPWSTR lpszPath)
Definition: path.c:1029
#define SHARD_PATHW
Definition: shlobj.h:1102
GpStatus WINGDIPAPI GdipCreateFromHDC(HDC hdc, GpGraphics **graphics)
Definition: graphics.c:2395
STRSAFEAPI StringCbPrintfExW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPWSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:623
unsigned int UINT
Definition: ndis.h:50
BOOL WINAPI IsZoomed(_In_ HWND)
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
static void pLoadImage(LPWSTR szOpenFileName)
Definition: shimgvw.c:291
GpStatus WINGDIPAPI GdipImageGetFrameDimensionsCount(GpImage *image, UINT *count)
Definition: image.c:2885
#define IMAGE_BITMAP
Definition: winuser.h:211
#define GetMessage
Definition: winuser.h:5765
HINSTANCE hInstance
Definition: shimgvw.c:37
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define MultiByteToWideChar
Definition: compat.h:100
#define DPRINT1
Definition: precomp.h:8
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:275
RECT rcNormalPosition
Definition: winuser.h:3270
#define msg(x)
Definition: auth_time.c:54
#define IDC_ARROW
Definition: winuser.h:682
#define TBICON_NEXT
Definition: resource.h:30
#define IDB_SAVEICON
Definition: resource.h:14
#define calloc
Definition: rosglue.h:14
#define SendMessage
Definition: winuser.h:5818
#define TB_IMAGE_WIDTH
Definition: shimgvw.h:3
#define TBSTATE_ENABLED
Definition: commctrl.h:970
#define WM_CREATE
Definition: winuser.h:1590
HWND hToolBar
Definition: shimgvw.c:43
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
#define c
Definition: ke_i.h:80
#define HIWORD(l)
Definition: typedefs.h:246
static void pSaveImageAs(HWND hwnd)
Definition: shimgvw.c:319
LONG bottom
Definition: windef.h:309
GpStatus WINGDIPAPI GdipImageGetFrameDimensionsList(GpImage *image, GUID *dimensionIDs, UINT count)
Definition: image.c:2900
#define malloc
Definition: debug_ros.c:4
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
#define LoadImage
Definition: winuser.h:5790
static VOID ImageView_InitControls(HWND hwnd)
Definition: shimgvw.c:846
INT WINAPI ImageList_AddMasked(HIMAGELIST himl, HBITMAP hBitmap, COLORREF clrMask)
Definition: imagelist.c:563
#define RegisterClass
Definition: winuser.h:5811
UINT m_nFrameIndex
Definition: shimgvw.c:55
UINT m_nFrameCount
Definition: shimgvw.c:56
#define LoadIcon
Definition: winuser.h:5788
WCHAR * LPWSTR
Definition: xmlstorage.h:184
LONG_PTR LRESULT
Definition: windef.h:209
#define DIB_RGB_COLORS
Definition: wingdi.h:366
static const TBBUTTON Buttons[]
Definition: shimgvw.c:276
#define IDB_ZOOMPICON
Definition: resource.h:12
static VOID ImageView_SaveSettings(HWND hwnd)
Definition: shimgvw.c:727
#define INFINITE
Definition: serial.h:102
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
#define LR_DEFAULTCOLOR
Definition: winuser.h:1077
LPWSTR WINAPI PathCombineW(LPWSTR lpszDest, LPCWSTR lpszDir, LPCWSTR lpszFile)
Definition: path.c:189
#define WS_VISIBLE
Definition: pedump.c:620
GLuint64EXT * result
Definition: glext.h:11304
#define SW_MAXIMIZE
Definition: winuser.h:766
HBRUSH WINAPI CreateDIBPatternBrushPt(_In_ const VOID *pvPackedDIB, _In_ UINT uUsage)
#define IDC_PRINT
Definition: fontview.h:14
LPARAM lParam
Definition: combotst.c:139
#define IDS_TOOLTIP_ROT_CLOCKW
Definition: resource.h:57
#define LOWORD(l)
Definition: pedump.c:82
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
#define RegSetValueEx
Definition: winreg.h:533
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:54
#define LoadString
Definition: winuser.h:5794
#define RegCreateKeyEx
Definition: winreg.h:501
VOID WINAPI ImageView_PrintToA(HWND hwnd, HINSTANCE hInst, LPCSTR path, int nShow)
Definition: shimgvw.c:1147
#define TBSTYLE_FLAT
Definition: commctrl.h:988
#define TB_SETEXTENDEDSTYLE
Definition: commctrl.h:1186
#define WM_NOTIFY
Definition: richedit.h:61
#define IDS_TOOLTIP_PRINT
Definition: resource.h:59
struct Rect Rect
WCHAR WndClass[]
Definition: capicon.c:23
GLubyte * pattern
Definition: glext.h:7787
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
Definition: dlist.c:348
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502