Example #1
0
//--------------------------------------------------------------------------
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;
}
Example #2
0
//--------------------------------------------------------------------------
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;
}
Example #3
0
//--------------------------------------------------------------------------
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());
}