modules/graphics/src/main/native-glass/win/GlassScreen.cpp
Print this page
*** 46,57 ****
RECT rcWork;
RECT fxMonitor;
RECT fxWork;
jboolean primaryScreen;
jint colorDepth;
! jfloat uiScale;
! jfloat renderScale;
jint dpiX;
jint dpiY;
jint anchoredInPass;
jobject gScreen;
};
--- 46,57 ----
RECT rcWork;
RECT fxMonitor;
RECT fxWork;
jboolean primaryScreen;
jint colorDepth;
! jfloat uiScaleX;
! jfloat uiScaleY;
jint dpiX;
jint dpiY;
jint anchoredInPass;
jobject gScreen;
};
*** 188,198 ****
ASSERT(hDC);
mis->primaryScreen = ((mix.dwFlags & MONITORINFOF_PRIMARY) != 0) ? JNI_TRUE : JNI_FALSE;
mis->colorDepth = ::GetDeviceCaps(hDC, BITSPIXEL) * ::GetDeviceCaps(hDC, PLANES);
UINT resx, resy;
! UINT uires;
if (pGetDPIForMonitor) {
// If we can use the GetDPIForMonitor function, then its Effective
// value will tell us how much we should scale ourselves based on
// all system settings, and its Raw value will tell us exactly how
// many pixels per inch there are. The Effective value can be
--- 188,198 ----
ASSERT(hDC);
mis->primaryScreen = ((mix.dwFlags & MONITORINFOF_PRIMARY) != 0) ? JNI_TRUE : JNI_FALSE;
mis->colorDepth = ::GetDeviceCaps(hDC, BITSPIXEL) * ::GetDeviceCaps(hDC, PLANES);
UINT resx, resy;
! UINT uiresx, uiresy;
if (pGetDPIForMonitor) {
// If we can use the GetDPIForMonitor function, then its Effective
// value will tell us how much we should scale ourselves based on
// all system settings, and its Raw value will tell us exactly how
// many pixels per inch there are. The Effective value can be
*** 210,236 ****
#endif /* DEBUG_DPI */
if (res != S_OK) {
resx = ::GetDeviceCaps(hDC, LOGPIXELSX);
resy = ::GetDeviceCaps(hDC, LOGPIXELSY);
}
! uires = resx;
res = (*pGetDPIForMonitor)(hMonitor, MDT_Raw_DPI, &resx, &resy);
#ifdef DEBUG_DPI
fprintf(stderr, "raw DPI X,Y = [0x%08x] %d, %d\n", res, resx, resy);
#endif /* DEBUG_DPI */
} else {
resx = ::GetDeviceCaps(hDC, LOGPIXELSX);
resy = ::GetDeviceCaps(hDC, LOGPIXELSY);
#ifdef DEBUG_DPI
fprintf(stderr, "logpixelsX,Y = %d, %d\n", resx, resy);
#endif /* DEBUG_DPI */
! uires = resx;
}
mis->dpiX = resx;
mis->dpiY = resy;
! mis->uiScale = GlassApplication::GetUIScale(uires);
! mis->renderScale = GlassApplication::getRenderScale(mis->uiScale);
::DeleteDC(hDC);
}
jclass GetScreenCls(JNIEnv *env)
--- 210,238 ----
#endif /* DEBUG_DPI */
if (res != S_OK) {
resx = ::GetDeviceCaps(hDC, LOGPIXELSX);
resy = ::GetDeviceCaps(hDC, LOGPIXELSY);
}
! uiresx = resx;
! uiresy = resy;
res = (*pGetDPIForMonitor)(hMonitor, MDT_Raw_DPI, &resx, &resy);
#ifdef DEBUG_DPI
fprintf(stderr, "raw DPI X,Y = [0x%08x] %d, %d\n", res, resx, resy);
#endif /* DEBUG_DPI */
} else {
resx = ::GetDeviceCaps(hDC, LOGPIXELSX);
resy = ::GetDeviceCaps(hDC, LOGPIXELSY);
#ifdef DEBUG_DPI
fprintf(stderr, "logpixelsX,Y = %d, %d\n", resx, resy);
#endif /* DEBUG_DPI */
! uiresx = resx;
! uiresy = resy;
}
mis->dpiX = resx;
mis->dpiY = resy;
! mis->uiScaleX = uiresx / 96.0f;
! mis->uiScaleY = uiresy / 96.0f;
::DeleteDC(hDC);
}
jclass GetScreenCls(JNIEnv *env)
*** 277,287 ****
jobject CreateJavaMonitorFromMIS(JNIEnv *env, MonitorInfoStruct *pMIS)
{
jclass screenCls = GetScreenCls(env);
if (javaIDs.Screen.init == NULL) {
! javaIDs.Screen.init = env->GetMethodID(screenCls, "<init>", "(JIIIIIIIIIIIFF)V");
ASSERT(javaIDs.Screen.init);
if (CheckAndClearException(env)) return NULL;
}
jobject gScn = env->NewObject(screenCls, javaIDs.Screen.init,
--- 279,289 ----
jobject CreateJavaMonitorFromMIS(JNIEnv *env, MonitorInfoStruct *pMIS)
{
jclass screenCls = GetScreenCls(env);
if (javaIDs.Screen.init == NULL) {
! javaIDs.Screen.init = env->GetMethodID(screenCls, "<init>", "(JIIIIIIIIIIIIIIIFFFF)V");
ASSERT(javaIDs.Screen.init);
if (CheckAndClearException(env)) return NULL;
}
jobject gScn = env->NewObject(screenCls, javaIDs.Screen.init,
*** 291,310 ****
pMIS->fxMonitor.left,
pMIS->fxMonitor.top,
pMIS->fxMonitor.right - pMIS->fxMonitor.left,
pMIS->fxMonitor.bottom - pMIS->fxMonitor.top,
pMIS->fxWork.left,
pMIS->fxWork.top,
pMIS->fxWork.right - pMIS->fxWork.left,
pMIS->fxWork.bottom - pMIS->fxWork.top,
pMIS->dpiX,
pMIS->dpiY,
! pMIS->uiScale,
! pMIS->renderScale);
if (CheckAndClearException(env)) return NULL;
pMIS->gScreen = env->NewGlobalRef(gScn);
return gScn;
}
--- 293,319 ----
pMIS->fxMonitor.left,
pMIS->fxMonitor.top,
pMIS->fxMonitor.right - pMIS->fxMonitor.left,
pMIS->fxMonitor.bottom - pMIS->fxMonitor.top,
+ pMIS->rcMonitor.left,
+ pMIS->rcMonitor.top,
+ pMIS->rcMonitor.right - pMIS->rcMonitor.left,
+ pMIS->rcMonitor.bottom - pMIS->rcMonitor.top,
+
pMIS->fxWork.left,
pMIS->fxWork.top,
pMIS->fxWork.right - pMIS->fxWork.left,
pMIS->fxWork.bottom - pMIS->fxWork.top,
pMIS->dpiX,
pMIS->dpiY,
! pMIS->uiScaleX,
! pMIS->uiScaleY,
! pMIS->uiScaleX,
! pMIS->uiScaleY);
if (CheckAndClearException(env)) return NULL;
pMIS->gScreen = env->NewGlobalRef(gScn);
return gScn;
}
*** 388,407 ****
jint monH = pMIS->rcMonitor.bottom - monY;
jint wrkL = pMIS->rcWork .left - monX;
jint wrkT = pMIS->rcWork .top - monY;
jint wrkR = pMIS->rcWork .right - monX;
jint wrkB = pMIS->rcWork .bottom - monY;
! jfloat scale = pMIS->uiScale;
! if (scale > 1.0f) {
! pMIS->dpiX = (jint) floorf((pMIS->dpiX / scale) + 0.5f);
! pMIS->dpiY = (jint) floorf((pMIS->dpiY / scale) + 0.5f);
! monW = (jint) floorf((monW / scale) + 0.5f);
! monH = (jint) floorf((monH / scale) + 0.5f);
! wrkL = (jint) floorf((wrkL / scale) + 0.5f);
! wrkT = (jint) floorf((wrkT / scale) + 0.5f);
! wrkR = (jint) floorf((wrkR / scale) + 0.5f);
! wrkB = (jint) floorf((wrkB / scale) + 0.5f);
}
if (xBefore) fxX -= monW;
if (yBefore) fxY -= monH;
pMIS->fxMonitor.left = fxX;
--- 397,419 ----
jint monH = pMIS->rcMonitor.bottom - monY;
jint wrkL = pMIS->rcWork .left - monX;
jint wrkT = pMIS->rcWork .top - monY;
jint wrkR = pMIS->rcWork .right - monX;
jint wrkB = pMIS->rcWork .bottom - monY;
! jfloat scalex = pMIS->uiScaleX;
! jfloat scaley = pMIS->uiScaleY;
! if (scalex > 1.0f) {
! pMIS->dpiX = (jint) floorf((pMIS->dpiX / scalex) + 0.5f);
! monW = (jint) floorf((monW / scalex) + 0.5f);
! wrkL = (jint) floorf((wrkL / scalex) + 0.5f);
! wrkR = (jint) floorf((wrkR / scalex) + 0.5f);
! }
! if (scaley > 1.0f) {
! pMIS->dpiY = (jint) floorf((pMIS->dpiY / scaley) + 0.5f);
! monH = (jint) floorf((monH / scaley) + 0.5f);
! wrkT = (jint) floorf((wrkT / scaley) + 0.5f);
! wrkB = (jint) floorf((wrkB / scaley) + 0.5f);
}
if (xBefore) fxX -= monW;
if (yBefore) fxY -= monH;
pMIS->fxMonitor.left = fxX;
*** 437,457 ****
jboolean before, jint pass)
{
int x = before ? pAnchor->fxMonitor.left : pAnchor->fxMonitor.right;
int yoff = originOffsetFromRanges(pAnchor->rcMonitor.top, pAnchor->rcMonitor.bottom,
pMon->rcMonitor.top, pMon->rcMonitor.bottom,
! pAnchor->uiScale, pMon->uiScale);
int y = pAnchor->fxMonitor.top + yoff;
anchorTo(pMon, x, before, y, false, pass);
}
void anchorV(MonitorInfoStruct *pAnchor, MonitorInfoStruct *pMon,
jboolean before, jint pass)
{
int xoff = originOffsetFromRanges(pAnchor->rcMonitor.left, pAnchor->rcMonitor.right,
pMon->rcMonitor.left, pMon->rcMonitor.right,
! pAnchor->uiScale, pMon->uiScale);
int x = pAnchor->fxMonitor.left + xoff;
int y = before ? pAnchor->fxMonitor.top : pAnchor->fxMonitor.bottom;
anchorTo(pMon, x, false, y, before, pass);
}
--- 449,469 ----
jboolean before, jint pass)
{
int x = before ? pAnchor->fxMonitor.left : pAnchor->fxMonitor.right;
int yoff = originOffsetFromRanges(pAnchor->rcMonitor.top, pAnchor->rcMonitor.bottom,
pMon->rcMonitor.top, pMon->rcMonitor.bottom,
! pAnchor->uiScaleY, pMon->uiScaleY);
int y = pAnchor->fxMonitor.top + yoff;
anchorTo(pMon, x, before, y, false, pass);
}
void anchorV(MonitorInfoStruct *pAnchor, MonitorInfoStruct *pMon,
jboolean before, jint pass)
{
int xoff = originOffsetFromRanges(pAnchor->rcMonitor.left, pAnchor->rcMonitor.right,
pMon->rcMonitor.left, pMon->rcMonitor.right,
! pAnchor->uiScaleX, pMon->uiScaleX);
int x = pAnchor->fxMonitor.left + xoff;
int y = before ? pAnchor->fxMonitor.top : pAnchor->fxMonitor.bottom;
anchorTo(pMon, x, false, y, before, pass);
}