+ /* Initialize display modes */
+ ZeroMemory(&devmode, sizeof(devmode));
+ devmode.dmSize = (WORD)sizeof(devmode);
+ while (EnumDisplaySettingsExW(This->pDisplayDevice, i, &devmode, EDS_RAWMODE))
+ {
+ dwSize = devmode.dmSize + devmode.dmDriverExtra;
+ PDEVMODEW pDevMode = LocalAlloc(LMEM_FIXED, dwSize);
+ PDEVMODEW * DevModesNew = NULL;
+
+ if (pDevMode)
+ {
+ CopyMemory(pDevMode,
+ &devmode,
+ dwSize);
+
+ dwSize = (This->nDevModes + 1) * sizeof(pDevMode);
+ DevModesNew = LocalAlloc(LMEM_FIXED, dwSize);
+ if (DevModesNew)
+ {
+ if (This->DevModes)
+ {
+ CopyMemory(DevModesNew,
+ This->DevModes,
+ This->nDevModes * sizeof(pDevMode));
+
+ LocalFree(This->DevModes);
+ }
+
+ This->DevModes = DevModesNew;
+ This->DevModes[This->nDevModes++] = pDevMode;
+ }
+ else
+ {
+ DPRINT1("LocalAlloc failed to allocate %d bytes\n", dwSize);
+ return E_OUTOFMEMORY;
+ }
+ }
+ else
+ {
+ DPRINT1("LocalAlloc failed to allocate %d bytes\n", dwSize);
+ return E_OUTOFMEMORY;
+ }
+
+ devmode.dmDriverExtra = 0;
+ i++;
+ }
+
+ /* FIXME: Detect duplicated modes and mark them.
+ * Enumeration functions should check these marks
+ * and skip corresponding array entries. */
+
+ /* Get current display mode */
+ ZeroMemory(&devmode, sizeof(devmode));
+ devmode.dmSize = (WORD)sizeof(devmode);
+ if (EnumDisplaySettingsExW(This->pDisplayDevice, ENUM_CURRENT_SETTINGS, &devmode, 0))
+ {
+ for (i = 0; i < This->nDevModes; i++)
+ {
+ PDEVMODEW CurMode = This->DevModes[i];
+
+ if (!CurMode)
+ continue;
+
+ if (((CurMode->dmFields & DM_PELSWIDTH) && devmode.dmPelsWidth == CurMode->dmPelsWidth) &&
+ ((CurMode->dmFields & DM_PELSHEIGHT) && devmode.dmPelsHeight == CurMode->dmPelsHeight) &&
+ ((CurMode->dmFields & DM_BITSPERPEL) && devmode.dmBitsPerPel == CurMode->dmBitsPerPel) &&
+ ((CurMode->dmFields & DM_DISPLAYFREQUENCY) && devmode.dmDisplayFrequency == CurMode->dmDisplayFrequency))
+ {
+ This->lpOrigDevMode = This->lpCurDevMode = CurMode;
+ break;
+ }
+ }
+ }
+