You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
3.0 KiB
117 lines
3.0 KiB
// License: Apache 2.0. See LICENSE file in root directory.
|
|
// Copyright(c) 2017 Intel Corporation. All Rights Reserved.
|
|
|
|
#include "ux-alignment.h"
|
|
#include <imgui.h>
|
|
#include <imgui_impl_glfw.h>
|
|
#include <vector>
|
|
#include <memory>
|
|
|
|
#ifdef _WIN32
|
|
#undef APIENTRY
|
|
#define GLFW_EXPOSE_NATIVE_WIN32
|
|
#define GLFW_EXPOSE_NATIVE_WGL
|
|
#include <GLFW/glfw3native.h>
|
|
|
|
#include <Windows.h>
|
|
#endif
|
|
|
|
#define MAGIC 250
|
|
|
|
bool is_gui_aligned(GLFWwindow *win)
|
|
{
|
|
#ifdef _WIN32
|
|
try
|
|
{
|
|
auto hwn = glfwGetWin32Window(win);
|
|
if (hwn == nullptr)
|
|
return true;
|
|
|
|
auto flags = ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove |
|
|
ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar |
|
|
ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoBringToFrontOnFocus;
|
|
|
|
ImGui::SetNextWindowPos({ 0, 0 });
|
|
|
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0));
|
|
ImGui::Begin("is_gui_aligned", nullptr, flags);
|
|
|
|
auto DrawList = ImGui::GetWindowDrawList();
|
|
if (DrawList == nullptr)
|
|
return true;
|
|
|
|
DrawList->AddRectFilled({ 0,0 }, { 1,1 }, ImColor(MAGIC / 255.f, 0.f, 0.f, 1.f));
|
|
|
|
ImGui::End();
|
|
ImGui::PopStyleVar();
|
|
|
|
ImGui::Render();
|
|
|
|
glfwSwapBuffers(win);
|
|
|
|
ImGui_ImplGlfw_NewFrame(1.f);
|
|
|
|
SetFocus(hwn);
|
|
|
|
int width = 1;
|
|
int height = 1;
|
|
|
|
HDC hdc = GetDC(hwn);
|
|
if (hdc == nullptr)
|
|
return true;
|
|
|
|
std::shared_ptr<HDC> shared_hdc(&hdc, [&](HDC* hdc) {ReleaseDC(hwn, *hdc); DeleteDC(*hdc);});
|
|
|
|
HDC hCaptureDC = CreateCompatibleDC(hdc);
|
|
if (hCaptureDC == nullptr)
|
|
return true;
|
|
|
|
std::shared_ptr<HDC> shared_capture_hdc(&hCaptureDC, [&](HDC* hdc) {ReleaseDC(hwn, *hdc); DeleteDC(*hdc);});
|
|
|
|
HBITMAP hCaptureBitmap = CreateCompatibleBitmap(hdc, width, height);
|
|
if (hCaptureBitmap == nullptr)
|
|
return true;
|
|
|
|
std::shared_ptr<HBITMAP> shared_bmp(&hCaptureBitmap, [&](HBITMAP* bmp) {DeleteObject(bmp);});
|
|
|
|
auto original = SelectObject(hCaptureDC, hCaptureBitmap);
|
|
if (original == nullptr)
|
|
return true;
|
|
|
|
if (!BitBlt(hCaptureDC, 0, 0, width, height, hdc, 0, 0, SRCCOPY | CAPTUREBLT))
|
|
return true;
|
|
|
|
BITMAPINFO bmi = { 0 };
|
|
bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
|
|
bmi.bmiHeader.biWidth = width;
|
|
bmi.bmiHeader.biHeight = height;
|
|
bmi.bmiHeader.biPlanes = 1;
|
|
bmi.bmiHeader.biBitCount = 32;
|
|
bmi.bmiHeader.biCompression = BI_RGB;
|
|
|
|
std::vector<RGBQUAD> pPixels(width * height);
|
|
|
|
auto res = GetDIBits(
|
|
hCaptureDC,
|
|
hCaptureBitmap,
|
|
0,
|
|
height,
|
|
pPixels.data(),
|
|
&bmi,
|
|
DIB_RGB_COLORS
|
|
);
|
|
|
|
if (res <= 0 || res == ERROR_INVALID_PARAMETER)
|
|
return true;
|
|
|
|
auto ret = pPixels[0].rgbRed == MAGIC;
|
|
return ret;
|
|
}
|
|
catch (...)
|
|
{
|
|
return true;
|
|
}
|
|
#else
|
|
return true;
|
|
#endif
|
|
} |