//-------------------------------------------------------------------------- VeFixedString ToStr(const TCHAR* pcStr) noexcept { VeChar8* pcBuffer = nullptr; VeInt32 i32Size; # ifdef _UNICODE i32Size = WideCharToMultiByte(CP_UTF8, 0, pcStr, -1, 0, 0, 0, FALSE); if (i32Size > 0) { pcBuffer = VeStackAlloc(VeChar8, i32Size + 1); WideCharToMultiByte(CP_UTF8, 0, pcStr, -1, pcBuffer, i32Size, 0, FALSE); } # else i32Size = (VeInt32)VeStrlen(pcStr); if (i32Size > 0) { pcBuffer = VeStackAlloc(VeChar8, i32Size + 1); VeStrcpy(pcBuffer, i32Size + 1, pcStr); } # endif VeFixedString kRes; if (pcBuffer) { kRes = pcBuffer; VeStackFree(pcBuffer); pcBuffer = nullptr; } return kRes; }
//-------------------------------------------------------------------------- VeFixedString ToStrReplaceIegality(const TCHAR* pcStr) noexcept { VeChar8* pcBuffer = nullptr; VeInt32 i32Size; # ifdef _UNICODE i32Size = WideCharToMultiByte(CP_UTF8, 0, pcStr, -1, 0, 0, 0, FALSE); if (i32Size > 0) { pcBuffer = VeStackAlloc(VeChar8, i32Size + 1); WideCharToMultiByte(CP_UTF8, 0, pcStr, -1, pcBuffer, i32Size, 0, FALSE); } # else i32Size = (VeInt32)VeStrlen(pcStr); if (i32Size > 0) { pcBuffer = VeStackAlloc(VeChar8, i32Size + 1); VeStrcpy(pcBuffer, i32Size + 1, pcStr); } # endif VeFixedString kRes; if (pcBuffer) { { VeChar8* pcTemp = pcBuffer; while (*pcTemp) { VeChar8 c = *pcTemp; if (c == ' ' || c == '/' || c == '\\' || c == ':' || c == '#' || c == '.') { *pcTemp = '_'; } ++pcTemp; } } kRes = pcBuffer; VeStackFree(pcBuffer); pcBuffer = nullptr; } return kRes; }
//-------------------------------------------------------------------------- void VeBinaryIStream::GetStringAligned4(VeFixedString& kStr) noexcept { VeSizeT stLength = ReadPackedInt(); if (stLength) { VeChar8* pcBuffer = VeStackAlloc(VeChar8, stLength + 1); VE_ASSERT_EQ(Read(pcBuffer, stLength), stLength); pcBuffer[stLength] = 0; kStr = pcBuffer; VeStackFree(pcBuffer); } else { kStr = ""; } VeSizeT stTemp = (stLength >= 255) ? 4 : 1; stTemp += stLength; stTemp = ((stTemp + 3) & (~3)) - stTemp; if (stTemp) { Skip(stTemp); } }
//-------------------------------------------------------------------------- bool WindowsVideoDevice::_CreateWindowFrom(VeWindow::Data* pkWindow, const void* pvData) noexcept { VE_ASSERT(pkWindow && pvData); HWND hWnd = (HWND)pvData; VeInt32 i32TitleLen = GetWindowTextLengthA(hWnd); if (i32TitleLen > 0) { VeChar8* pcTitle = VeStackAlloc(VeChar8, i32TitleLen + 1); VE_ASSERT(pcTitle); i32TitleLen = GetWindowTextA(hWnd, pcTitle, i32TitleLen); VE_ASSERT(i32TitleLen > 0); pkWindow->m_kTitle = pcTitle; VeStackFree(pcTitle); } if (!SetupWindowData(pkWindow, hWnd, VE_FALSE)) { return false; } return true; }
//-------------------------------------------------------------------------- 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; }