< prev index next >
src/java.desktop/windows/native/libawt/windows/awt_Win32GraphicsDevice.cpp
Print this page
*** 47,56 ****
--- 47,62 ----
#include "sun_awt_Win32GraphicsDevice.h"
#include "java_awt_image_DataBuffer.h"
#include "dither.h"
#include "img_util_md.h"
#include "Devices.h"
+ #include <d2d1.h>
+ #pragma comment(lib, "d2d1")
+
+ #ifndef MDT_Effective_DPI
+ #define MDT_Effective_DPI 0
+ #endif
uns_ordered_dither_array img_oda_alpha;
jclass AwtWin32GraphicsDevice::indexCMClass;
jclass AwtWin32GraphicsDevice::wToolkitClass;
*** 72,81 ****
--- 78,89 ----
AwtWin32GraphicsDevice::AwtWin32GraphicsDevice(int screen,
HMONITOR mhnd, Devices *arr)
{
this->screen = screen;
this->devicesArray = arr;
+ this->scaleX = 1;
+ this->scaleY = 1;
javaDevice = NULL;
colorData = new ImgColorData;
colorData->grayscale = GS_NOTGRAY;
palette = NULL;
cData = NULL;
*** 615,624 ****
--- 623,724 ----
{
javaDevice = env->NewWeakGlobalRef(objPtr);
}
/**
+ * Sets horizontal and vertical scale factors
+ */
+ void AwtWin32GraphicsDevice::SetScale(float sx, float sy)
+ {
+ scaleX = sx;
+ scaleY = sy;
+ }
+
+ int AwtWin32GraphicsDevice::ScaleUpX(int x)
+ {
+ return (int)ceil(x * scaleX);
+ }
+
+ int AwtWin32GraphicsDevice::ScaleUpY(int y)
+ {
+ return (int)ceil(y * scaleY);
+ }
+
+ int AwtWin32GraphicsDevice::ScaleDownX(int x)
+ {
+ return (int)ceil(x / scaleX);
+ }
+
+ int AwtWin32GraphicsDevice::ScaleDownY(int y)
+ {
+ return (int)ceil(y / scaleY);
+ }
+
+ void AwtWin32GraphicsDevice::InitDesktopScales()
+ {
+ unsigned x = 0;
+ unsigned y = 0;
+ float dpiX = -1.0f;
+ float dpiY = -1.0f;
+
+ // for debug purposes
+ char *uiScale = getenv("J2D_WIN_UISCALE");
+ float scale = -1.0f;
+
+ if (uiScale != NULL) {
+ scale = (float)strtod(uiScale, NULL);
+ if (errno != ERANGE && scale > 0) {
+ SetScale(scale, scale);
+ return;
+ }
+ }
+
+ typedef HRESULT(WINAPI GetDpiForMonitorFunc)(HMONITOR, int, UINT*, UINT*);
+ static HMODULE hLibSHCoreDll = NULL;
+ static GetDpiForMonitorFunc *lpGetDpiForMonitor = NULL;
+
+ if (hLibSHCoreDll == NULL) {
+ hLibSHCoreDll = JDK_LoadSystemLibrary("shcore.dll");
+ if (hLibSHCoreDll != NULL) {
+ lpGetDpiForMonitor = (GetDpiForMonitorFunc*)GetProcAddress(
+ hLibSHCoreDll, "GetDpiForMonitor");
+ }
+ }
+
+ if (lpGetDpiForMonitor != NULL) {
+ HRESULT hResult = lpGetDpiForMonitor(GetMonitor(),
+ MDT_Effective_DPI, &x, &y);
+ if (hResult == S_OK) {
+ dpiX = static_cast<float>(x);
+ dpiY = static_cast<float>(y);
+ }
+ } else {
+ ID2D1Factory* m_pDirect2dFactory;
+ HRESULT res = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED,
+ &m_pDirect2dFactory);
+ if (res == S_OK) {
+ m_pDirect2dFactory->GetDesktopDpi(&dpiX, &dpiY);
+ m_pDirect2dFactory->Release();
+ }
+ }
+
+ if (dpiX > 0 && dpiY > 0) {
+ SetScale(dpiX / 96, dpiY / 96);
+ }
+ }
+
+ float AwtWin32GraphicsDevice::GetScaleX()
+ {
+ return scaleX;
+ }
+
+ float AwtWin32GraphicsDevice::GetScaleY()
+ {
+ return scaleY;
+ }
+
+ /**
* Disables offscreen acceleration for this device. This
* sets a flag in the java object that is used to determine
* whether offscreen surfaces can be created on the device.
*/
void AwtWin32GraphicsDevice::DisableOffscreenAcceleration()
*** 1302,1306 ****
--- 1402,1468 ----
(JNIEnv *env, jobject thisPtr, jint screen)
{
Devices::InstanceAccess devices;
devices->GetDevice(screen)->SetJavaDevice(env, thisPtr);
}
+
+ /*
+ * Class: sun_awt_Win32GraphicsDevice
+ * Method: setNativeScale
+ * Signature: (I,F,F)V
+ */
+ JNIEXPORT void JNICALL
+ Java_sun_awt_Win32GraphicsDevice_setNativeScale
+ (JNIEnv *env, jobject thisPtr, jint screen, jfloat scaleX, jfloat scaleY)
+ {
+ Devices::InstanceAccess devices;
+ AwtWin32GraphicsDevice *device = devices->GetDevice(screen);
+
+ if (device != NULL ) {
+ device->SetScale(scaleX, scaleY);
+ }
+ }
+
+ /*
+ * Class: sun_awt_Win32GraphicsDevice
+ * Method: getNativeScaleX
+ * Signature: (I)F
+ */
+ JNIEXPORT jfloat JNICALL
+ Java_sun_awt_Win32GraphicsDevice_getNativeScaleX
+ (JNIEnv *env, jobject thisPtr, jint screen)
+ {
+ Devices::InstanceAccess devices;
+ AwtWin32GraphicsDevice *device = devices->GetDevice(screen);
+ return (device == NULL) ? 1 : device->GetScaleX();
+ }
+
+ /*
+ * Class: sun_awt_Win32GraphicsDevice
+ * Method: getNativeScaleY
+ * Signature: (I)F
+ */
+ JNIEXPORT jfloat JNICALL
+ Java_sun_awt_Win32GraphicsDevice_getNativeScaleY
+ (JNIEnv *env, jobject thisPtr, jint screen)
+ {
+ Devices::InstanceAccess devices;
+ AwtWin32GraphicsDevice *device = devices->GetDevice(screen);
+ return (device == NULL) ? 1 : device->GetScaleY();
+ }
+
+ /*
+ * Class: sun_awt_Win32GraphicsDevice
+ * Method: initNativeScale
+ * Signature: (I)V;
+ */
+ JNIEXPORT void JNICALL
+ Java_sun_awt_Win32GraphicsDevice_initNativeScale
+ (JNIEnv *env, jobject thisPtr, jint screen)
+ {
+ Devices::InstanceAccess devices;
+ AwtWin32GraphicsDevice *device = devices->GetDevice(screen);
+
+ if (device != NULL) {
+ device->InitDesktopScales();
+ }
+ }
\ No newline at end of file
< prev index next >