//-------------------------------------------------------------------------- bool WindowsMouse::_CreateCursor(VeCursor::Data* pkCur, const VeSurfacePtr& spSurface, VeInt32 i32HotX, VeInt32 i32HotY) noexcept { VE_ASSERT(spSurface && pkCur); const VeSizeT pad = (sizeof(VeSizeT) * 8); HICON hicon; HDC hdc; BITMAPV4HEADER bmh; LPVOID pixels; LPVOID maskbits; size_t maskbitslen; ICONINFO ii; VeInt32 w = spSurface->GetWidth(); VeInt32 h = spSurface->GetHeight(); VeZeroMemory(&bmh, sizeof(bmh)); bmh.bV4Size = sizeof(bmh); bmh.bV4Width = w; bmh.bV4Height = -h; bmh.bV4Planes = 1; bmh.bV4BitCount = 32; bmh.bV4V4Compression = BI_BITFIELDS; bmh.bV4AlphaMask = 0xFF000000; bmh.bV4RedMask = 0x00FF0000; bmh.bV4GreenMask = 0x0000FF00; bmh.bV4BlueMask = 0x000000FF; maskbitslen = ((w + (pad - (w % pad))) / 8) * h; maskbits = VeStackAlloc(VeUInt8, maskbitslen); VeMemorySet(maskbits, 0xFF, maskbitslen); hdc = GetDC(nullptr); VeZeroMemory(&ii, sizeof(ii)); ii.fIcon = FALSE; ii.xHotspot = (DWORD)i32HotX; ii.yHotspot = (DWORD)i32HotY; ii.hbmColor = CreateDIBSection(hdc, (BITMAPINFO*)&bmh, DIB_RGB_COLORS, &pixels, nullptr, 0); ii.hbmMask = CreateBitmap(w, h, 1, 1, maskbits); ReleaseDC(nullptr, hdc); VeStackFree(maskbits); VE_ASSERT(spSurface->GetFormat()->m_u32Format == VE_PIXELFORMAT_ARGB8888); VE_ASSERT(spSurface->GetPitch() == w * 4); VeMemoryCopy(pixels, spSurface->GetBuffer(), h * spSurface->GetPitch()); hicon = CreateIconIndirect(&ii); DeleteObject(ii.hbmColor); DeleteObject(ii.hbmMask); pkCur->m_pvDriverdata = hicon; if (!hicon) { return false; } return true; }
//-------------------------------------------------------------------------- bool VeFilePath::CreatePath(const VeChar8* pcPath) noexcept { VeSizeT stLen = VeStrlen(pcPath); VeChar8 acBuffer[VE_MAX_PATH_LEN]; VeMemoryCopy(acBuffer, pcPath, stLen + 1); VeChar8* pcTemp = acBuffer; if ((*pcTemp) == '/') ++pcTemp; VeChar8* pcEnd = acBuffer + stLen; bool bAllowCreate(false); while (pcTemp < pcEnd) { while (true) { if ((*pcTemp) == '\0') { break; } if ((*pcTemp) == '/' || (*pcTemp) == '\\') { (*pcTemp) = 0; break; } else { ++pcTemp; } } if (VE_SUCCEEDED(VeAccess(acBuffer, 2))) { bAllowCreate = true; if (pcTemp < pcEnd) { (*pcTemp) = '/'; ++pcTemp; } } else if (VE_SUCCEEDED(VeAccess(acBuffer, 0))) { bAllowCreate = false; if (pcTemp < pcEnd) { (*pcTemp) = '/'; ++pcTemp; } } else if (bAllowCreate) { if (VE_SUCCEEDED(VeMkDir(acBuffer))) { if (pcTemp < pcEnd) { (*pcTemp) = '/'; ++pcTemp; } } else { return false; } } else { return false; } } return true; }
//-------------------------------------------------------------------------- void WindowsVideoDevice::InitModes() noexcept { VeInt32 pass; DWORD i, j, count; DISPLAY_DEVICEA device; device.cb = sizeof(device); for (pass = 0; pass < 2; ++pass) { for (i = 0;; ++i) { CHAR DeviceName[32]; if (!EnumDisplayDevicesA(nullptr, i, &device, 0)) { break; } if (!(device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) { continue; } if (pass == 0) { if (!(device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)) { continue; } } else { if (device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) { continue; } } VeMemoryCopy(DeviceName, device.DeviceName, sizeof(DeviceName)); VeDebugOutputCore("Device: %s\n", DeviceName); count = 0; for (j = 0;; ++j) { if (!EnumDisplayDevicesA(DeviceName, j, &device, 0)) { break; } if (!(device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) { continue; } if (pass == 0) { if (!(device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)) { continue; } } else { if (device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) { continue; } } count += AddDisplay(device.DeviceName); } if (count == 0) { AddDisplay(DeviceName); } } } VE_ASSERT(m_kDisplayList.size()); }