From 5f78c87b073dab181559cbe5c2cdee40aec17774 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Fri, 11 Feb 2022 23:29:40 -0800 Subject: [PATCH] Updated windows enhanced user consent to be DPI aware --- microscript/ILibDuktape_Polyfills.c | 2 +- modules/win-userconsent.js | 294 ++++++++++++++++++++++++---- 2 files changed, 260 insertions(+), 36 deletions(-) diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index afd5d82..0b65cbd 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2367,7 +2367,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('win-authenticode-opus', Buffer.from('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', 'base64'), '2022-02-08T13:23:45.000-08:00');"); // Windows Message Pump, refer to modules/win-message-pump.js - duk_peval_string_noresult(ctx, "addCompressedModule('win-userconsent', Buffer.from('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', 'base64'), '2022-01-19T20:11:35.000-08:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('win-userconsent', Buffer.from('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', 'base64'), '2022-02-11T23:26:51.000-08:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('win-message-pump', Buffer.from('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', 'base64'), '2022-02-11T16:57:04.000-08:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('win-console', Buffer.from('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', 'base64'));"); char *_windialog = ILibMemory_Allocate(38857, 0, NULL, NULL); diff --git a/modules/win-userconsent.js b/modules/win-userconsent.js index 86d236b..fb69b90 100644 --- a/modules/win-userconsent.js +++ b/modules/win-userconsent.js @@ -19,6 +19,22 @@ const HALFTONE = 4; const SmoothingModeAntiAlias = 5; const InterpolationModeBicubic = 8; +const x_icon = 'iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAAXNSR0IArs4c6QAABKlJREFUeF7t3U1S20AQBeAZmaIw5A7ANpfxKmyS4yUbZeXLsMXhDrYpB6SUBBK2kDT66X7zqDRbTNzuT29mNJYU7+yHqgOeqhorxhkI2UFgIAZC1gGyciwhBkLWAbJyLCEGQtYBsnIsIQZC1gGyciwhBkLWAbJyLCEGQtYBsnIsIQZC1gGyciwhBuLc82KxSi4uvvvr6x/+/v7A1JP869fz5z+PP/3T4dfZy2GNrg2ekHyxWOVZlro8P3fL5drf3t6xoBQYLw+b1D/tV875Q56c3aFRoCAnGNWhR4JyjOHzvKwu9wkcBQbSikGC0oZRlYZGgYCUc0Y1THUNypGSUs4Zm8c02W9XVTKaJSJR1EEGYURKyhAMdFJUQUZhgFH6hqmuECOSogbSO2eE1pLKw9cUDFRSVEBmYSgnpcTYbFK/33fOGaHjRTMp4iAFRpZlqS/OM+b+CCdFAkM7KaIgk+aMEJoQypgJPFSSJooYSInxkqXOCSSj2ZGZKK8YmzSZMUyhJnoxkL9XX9Jku/3m3etZrvjPRBTJYarzMy2vfif77Z3EZxYDef3gj6nvOcGaXfBIlDmrqcG1jqwp9O+KgZR7P0QonxGj6KEoyDvKvGVl6CgK7RJjhimdnWpxkNhJqVdTu+1KbT67XK79jc7XBiogFUq5aafZmMb4/ZmTUY0KaiBolOL9qi+XunZtg0Nh6AWKyYCAnKAor74y513xTZ8ahvBqqsteNSH1GS1g9VWc/ah9GBCGyiqr84z26PtqtaM4NORM+T0QAwoCW31NaXrX3wDmjOZbq6W8Lynqqy8JFHAyYJN6W28g5wpzUCJhwIes4x5BtlmmoETEiApCOadExogO8o6ivPc1JCkEGBQgJ0nR3GbpQyHBoAE5OaNHoxBhUIFEQSHDoAM5nlOS3W41ZOif/BpCDF6Qh4fygoTJzR7yhwYS7pLGpTq970qIAt86CW6paG7Tt705GQoFCOSCBFv2hoeoehJ/u40s6rY8SVKiJiR6MprHDAFKNBDIBQnDQnr6qsgoUUDgq6mxMBFR4CC02+4kwxcUhG7OCCUnQlJgILRzBhkKBASRjLy4LovsVoiQddvv1UEgc8Zyuc68d3PuGww2DzR8qYJALmZ4u1SnaCjb/SlB5JYXqIFAktG4bqp+T80vuZSTogKCmDO67hGBpFIRRRwkJkY1AkDSqYQiCsKAcYqifDWLAooYCOQ8Y2QDGGsKTfRiINS3RWtv7zPeFq364IDLy7W/uZn8KEDN1Zf0c0/EElJE8VM8WkNwSSyNoXLViciTgKqBduScERqfJVdfGhgqIOXXshJPBBLGkFx9aWGogVQo9eNgQ4du8/fKdy7NSYomhipIPaeMfUKQUjKa5vWSeLcf/IABbQx1kNEoM1dTY4M4ZpsFgQEBGbz6AiWjLSmhex5RGDCQ4JwSCWPI3hcSAwrSiRIZo2/1hcaAg3xAIcFoS8p/8TD+6oPbf1fRvfwQ3ToZu8qx13/sgIGQHRUGYiBkHSArxxJiIGQdICvHEmIgZB0gK8cSYiBkHSArxxJiIGQdICvHEmIgZB0gK8cSYiBkHSArxxJiIGQdICvnH1Bw7aEQPNppAAAAAElFTkSuQmCC'; + +const MONITOR_DEFAULTTOPRIMARY = 0x00000001; +const SS_CENTERIMAGE = 0x00000200; +const WM_LBUTTONDOWN = 0x0201; +const WM_NCLBUTTONDOWN = 0x00A1; +const HT_CAPTION = 2; +const SS_NOTIFY = 0x00000100; +const WM_WINDOWPOSCHANGING = 70; +const WM_NCCALCSIZE = 0x0083; +const ptrsize = require('_GenericMarshal').PointerSize; +const SWP_NOZORDER = 0x0004; +const IDC_ARROW = 32512; +const WM_MOUSEMOVE = 0x0200; + + const WM_SETFONT = 0x0030; const WM_CTLCOLORSTATIC = 0x0138; const WM_CREATE = 0x0001; @@ -122,6 +138,7 @@ var promise = require('promise'); var GM = require('_GenericMarshal'); var MessagePump = require('win-message-pump'); +var sh = require('monitor-info')._shcore; var SHM = GM.CreateNativeProxy('Shlwapi.dll'); SHM.CreateMethod('SHCreateMemStream'); var gdip = GM.CreateNativeProxy('Gdiplus.dll'); @@ -143,6 +160,12 @@ gdip.CreateMethod('GdipSetSmoothingMode'); gdip.CreateMethod('GdiplusStartup'); gdip.CreateMethod('GdiplusShutdown'); + +function SCALE(val, dpi) +{ + var factor = val / 96; + return (dpi * factor); +} function RGB(r, g, b) { return (r | (g << 8) | (b << 16)); @@ -182,6 +205,17 @@ function pump_onMessage(msg) { switch (msg.message) { + case WM_MOUSEMOVE: + var x = msg.lparam & 0xFFFF; + var y = msg.lparam >> 16; + if (x >= 0 && x <= SCALE(580, this.dpi) && y >= 0 && y <= (this.dpi / 3)) + { + this._addAsyncMethodCall(this._user32.LoadCursorA.async, [0, IDC_ARROW]).then(function (cs) + { + this.pump._addAsyncMethodCall(this.pump._user32.SetCursor.async, [cs]); + }).parentPromise.pump = this; + } + break; case WM_COMMAND: switch(msg.wparam) { @@ -205,6 +239,7 @@ function pump_onMessage(msg) this.promise.resolve(this.autoAccept); this.close(); break; + case 0xFFE0: // X case 0xFFF3: // Deny if (this.timeout != null) { clearTimeout(this.timeout); this.timeout = null; } this.promise.reject('DENIED'); @@ -214,6 +249,10 @@ function pump_onMessage(msg) break; case WM_CTLCOLORSTATIC: console.info1('WM_CTLCOLORSTATIC => ' + msg.lparam, msg.wparam); + if (msg.lparam == this._faketitle) + { + break; + } var hdcStatic = msg.wparam; this._gdi32.SetTextColor(hdcStatic, this.options.foreground); this._gdi32.SetBkColor(hdcStatic, this.options.background); @@ -225,6 +264,74 @@ function pump_onMessage(msg) case WM_ERASEBKGND: console.info1('WM_ERASEBKGND'); break; + case WM_LBUTTONDOWN: + var x = msg.lparam & 0xFFFF; + var y = msg.lparam >> 16; + if (x >= 0 && x <= SCALE(580, this.dpi) && y >= 0 && y <= (this.dpi / 3)) + { + this._addAsyncMethodCall(this._user32.ReleaseCapture.async, []).then(function () + { + this.pump._addAsyncMethodCall(this.pump._user32.SendMessageW.async, [this.pump._HANDLE, WM_NCLBUTTONDOWN, HT_CAPTION, 0]); + }).parentPromise.pump = this; + } + break; + case WM_WINDOWPOSCHANGING: + if (this._HANDLE) + { + if (sh != null) + { + var hmon = require('monitor-info')._user32.MonitorFromWindow(this._HANDLE, MONITOR_DEFAULTTOPRIMARY); + var xdpi = require('_GenericMarshal').CreateVariable(4); + var ydpi = require('_GenericMarshal').CreateVariable(4); + sh.GetDpiForMonitor(hmon, 0, xdpi, ydpi); + + var x = msg.lparam_raw.Deref(ptrsize == 4 ? 8 : 16, 4).toBuffer().readInt32LE(); + var y = msg.lparam_raw.Deref(ptrsize == 4 ? 12 : 20, 4).toBuffer().readInt32LE(); + + this.dpi = xdpi.toBuffer().readUInt32LE(); + msg.lparam_raw.Deref(ptrsize == 4 ? 16 : 24, 4).toBuffer().writeInt32LE(SCALE(580, this.dpi)); + msg.lparam_raw.Deref(ptrsize == 4 ? 20 : 28, 4).toBuffer().writeInt32LE(SCALE(295, this.dpi)); + + var ret = GM.CreatePointer(); + ret.increment(0, true); + return (ret); + } + } + break; + case WM_NCCALCSIZE: + if (msg.wparam != 0) + { + var buff = msg.lparam_raw.Deref(0, 16).toBuffer(); + var dpi = (buff.readInt32LE(8) - buff.readInt32LE(0)) / 580 * 96; + + console.info1('[' + (buff.readInt32LE(8) - buff.readInt32LE(0)) + ' x ' + (buff.readInt32LE(12) - buff.readInt32LE(4)) + ']', dpi); + this.font = this._gdi32.CreateFontW(SCALE(20, dpi), 0, 0, 0, FW_DONTCARE, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, GM.CreateVariable(this.options.font, { wide: true })); + this.buttonfont = this._gdi32.CreateFontW(SCALE(15, dpi), 0, 0, 0, FW_DONTCARE, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, GM.CreateVariable(this.options.font, { wide: true })); + + this._addAsyncMethodCall(this._user32.BeginDeferWindowPos.async, [8]).then(function (HDWP) + { + this.pump._user32.DeferWindowPos(HDWP, this.pump._faketitle, 0, 0, 0, SCALE(580, dpi), dpi / 3, SWP_NOZORDER); + HDWP = this.pump._user32.DeferWindowPos(HDWP, this.pump._fakeclose, 0, SCALE(580, dpi) - ((dpi / 3) * 0.75) - ((dpi / 3) * 0.125), (dpi / 3) * 0.125, (dpi / 3) * 0.75, (dpi / 3) * 0.75, SWP_NOZORDER); + HDWP = this.pump._user32.DeferWindowPos(HDWP, this.pump._allowbutton, 0, SCALE(345, dpi), SCALE(215 + 32, dpi), SCALE(100, dpi), SCALE(30, dpi), SWP_NOZORDER); + HDWP = this.pump._user32.DeferWindowPos(HDWP, this.pump._denybutton, 0, SCALE(455, dpi), SCALE(215 + 32, dpi), SCALE(100, dpi), SCALE(30, dpi), SWP_NOZORDER); + HDWP = this.pump._user32.DeferWindowPos(HDWP, this.pump._checkbox, 0, SCALE(210, dpi), SCALE(150 + 32, dpi), SCALE(335, dpi), SCALE(60, dpi), SWP_NOZORDER); + HDWP = this.pump._user32.DeferWindowPos(HDWP, this.pump._avatar, 0, SCALE(10, dpi), SCALE(10 + 32, dpi), SCALE(192, dpi), SCALE(192, dpi), SWP_NOZORDER); + HDWP = this.pump._user32.DeferWindowPos(HDWP, this.pump._username, 0, SCALE(10, dpi), SCALE(215 + 32, dpi), SCALE(335, dpi), SCALE(30, dpi), SWP_NOZORDER); + HDWP = this.pump._user32.DeferWindowPos(HDWP, this.pump._caption, 0, SCALE(210, dpi), SCALE(10 + 32, dpi), SCALE(350, dpi), SCALE(150, dpi), SWP_NOZORDER); + + this.pump._addAsyncMethodCall(this.pump._user32.InvalidateRect.async, [this.pump._HANDLE, 0, 0]); + this.pump._addAsyncMethodCall(this.pump._user32.EndDeferWindowPos.async, [HDWP]).then(function () + { + this.pump._addAsyncMethodCall(this.pump._user32.SendMessageW.async, [this.pump._faketitle, WM_SETFONT, this.pump.buttonfont, 1]); + this.pump._addAsyncMethodCall(this.pump._user32.SendMessageW.async, [this.pump._allowbutton, WM_SETFONT, this.pump.buttonfont, 1]); + this.pump._addAsyncMethodCall(this.pump._user32.SendMessageW.async, [this.pump._denybutton, WM_SETFONT, this.pump.buttonfont, 1]); + this.pump._addAsyncMethodCall(this.pump._user32.SendMessageW.async, [this.pump._username, WM_SETFONT, this.pump.buttonfont, 1]); + this.pump._addAsyncMethodCall(this.pump._user32.SendMessageW.async, [this.pump._caption, WM_SETFONT, this.pump.font, 1]); + this.pump._addAsyncMethodCall(this.pump._user32.SendMessageW.async, [this.pump._checkbox, WM_SETFONT, this.pump.buttonfont, 1]); + }).parentPromise.pump = this.pump; + }).parentPromise.pump = this; + } + break; default: //console.log(msg.message); break; @@ -233,68 +340,121 @@ function pump_onMessage(msg) function pump_onHwnd(h) { this._HANDLE = h; + this._icon = getScaledImage(x_icon, SCALE(32, this.dpi) * 0.75, SCALE(32, this.dpi) * 0.75); + this._addAsyncMethodCall(this._user32.LoadCursorA.async, [0, IDC_ARROW]).then(function (cs) + { + this.pump._addAsyncMethodCall(this.pump._user32.SetCursor.async, [cs]); + }).parentPromise.pump = this; + + this._addCreateWindowEx(0, GM.CreateVariable('STATIC', { wide: true }), GM.CreateVariable(' ' + this.translations.Title, { wide: true }), WS_TABSTOP | WS_VISIBLE | WS_CHILD | SS_LEFT | SS_CENTERIMAGE, + SCALE(0, this.dpi), // x position + SCALE(0, this.dpi), // y position + SCALE(580, this.dpi), // Button width + SCALE(32, this.dpi), // Button height + h, // Parent window + 0xFFE1, // Child ID + 0, + 0).then(function (h) + { + this.pump._faketitle = h.Val; + this.pump._addAsyncMethodCall(this.pump._user32.SendMessageW.async, [h, WM_SETFONT, this.pump.buttonfont, 1]); + }).parentPromise.pump = this; + this._addCreateWindowEx(0, GM.CreateVariable('STATIC', { wide: true }), GM.CreateVariable('X', { wide: true }), WS_TABSTOP | WS_VISIBLE | WS_CHILD | SS_BITMAP | SS_REALSIZECONTROL | SS_NOTIFY, + SCALE(580, this.dpi) - (SCALE(32, this.dpi) * 0.75) - (SCALE(32, this.dpi) * 0.125), // x position + SCALE(32, this.dpi) * 0.125, // y position + SCALE(32, this.dpi) * 0.75, // Button width + SCALE(32, this.dpi) * 0.75, // Button height + h, // Parent window + 0xFFE0, // Child ID + 0, + 0).then(function (c) + { + this.pump._fakeclose = c; + //this.pump._addAsyncMethodCall(this.pump._user32.SendMessageW.async, [c, BM_SETIMAGE, IMAGE_BITMAP, this.pump._icon.Deref()]); + this.pump._addAsyncMethodCall(this.pump._user32.SendMessageW.async, [c, STM_SETIMAGE, IMAGE_BITMAP, this.pump._icon.Deref()]); + }).parentPromise.pump = this; + + this._addCreateWindowEx(0, GM.CreateVariable('BUTTON', { wide: true }), GM.CreateVariable(this.translations.Allow, { wide: true }), WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, - 345, // x position - 215, // y position - 100, // Button width - 30, // Button height + SCALE(345, this.dpi), // x position + SCALE(215 + 32, this.dpi), // y position + SCALE(100, this.dpi), // Button width + SCALE(30, this.dpi), // Button height h, // Parent window 0xFFF2, // Child ID 0, - 0); + 0).then(function (c) + { + this.pump._allowbutton = c; + this.pump._addAsyncMethodCall(this.pump._user32.SendMessageW.async, [c, WM_SETFONT, this.pump.buttonfont, 1]); + }).parentPromise.pump = this; this._addCreateWindowEx(0, GM.CreateVariable('BUTTON', { wide: true }), GM.CreateVariable(this.translations.Deny, { wide: true }), WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, - 455, // x position - 215, // y position - 100, // Button width - 30, // Button height + SCALE(455, this.dpi), // x position + SCALE(215 + 32, this.dpi), // y position + SCALE(100, this.dpi), // Button width + SCALE(30, this.dpi), // Button height h, // Parent window 0xFFF3, // Child ID 0, - 0); + 0).then(function (c) + { + this.pump._denybutton = c; + this.pump._addAsyncMethodCall(this.pump._user32.SendMessageW.async, [c, WM_SETFONT, this.pump.buttonfont, 1]); + }).parentPromise.pump = this; this._addCreateWindowEx(0, GM.CreateVariable('BUTTON', { wide: true }), GM.CreateVariable(this.translations.Auto, { wide: true }), WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_CHECKBOX | BS_MULTILINE, - 210, // x position - 150, // y position - 335, // Button width - 60, // Button height + SCALE(210, this.dpi), // x position + SCALE(150 + 32, this.dpi), // y position + SCALE(335, this.dpi), // Button width + SCALE(60, this.dpi), // Button height h, // Parent window 0xFFF0, // Child ID 0, - 0); + 0).then(function (c) + { + this.pump._checkbox = c; + this.pump._addAsyncMethodCall(this.pump._user32.SendMessageW.async, [c, WM_SETFONT, this.pump.buttonfont, 1]); + }).parentPromise.pump = this; this._addCreateWindowEx(0, GM.CreateVariable('STATIC', { wide: true }), GM.CreateVariable('NONE', { wide: true }), WS_TABSTOP | WS_VISIBLE | WS_CHILD | SS_BLACKRECT | SS_BITMAP | SS_REALSIZECONTROL, - 10, // x position - 10, // y position - 192, // Button width - 192, // Button height + SCALE(10, this.dpi), // x position + SCALE(10 + 32, this.dpi), // y position + SCALE(192, this.dpi), // Button width + SCALE(192, this.dpi), // Button height h, // Parent window 0xFFF1, // Child ID 0, 0).then(function (h) { + this.pump._avatar = h; if (this.pump.options.bitmap != null) { this.pump._addAsyncMethodCall(this.pump._user32.SendMessageW.async, [h, STM_SETIMAGE, IMAGE_BITMAP, this.pump.options.bitmap.Deref()]); } }).parentPromise.pump = this; this._addCreateWindowEx(0, GM.CreateVariable('STATIC', { wide: true }), GM.CreateVariable(this.username, { wide: true }), WS_TABSTOP | WS_VISIBLE | WS_CHILD | SS_LEFT, - 10, // x position - 215, // y position - 335, // Button width - 30, // Button height + SCALE(10, this.dpi), // x position + SCALE(215 + 32, this.dpi), // y position + SCALE(335, this.dpi), // Button width + SCALE(30, this.dpi), // Button height h, // Parent window 0xFFF2, // Child ID 0, - 0); + 0).then(function (c) + { + this.pump._username = c; + this.pump._addAsyncMethodCall(this.pump._user32.SendMessageW.async, [c, WM_SETFONT, this.pump.buttonfont, 1]); + }).parentPromise.pump = this; this._addCreateWindowEx(0, GM.CreateVariable('STATIC', { wide: true }), GM.CreateVariable(this.translations.Caption, { wide: true }), WS_TABSTOP | WS_VISIBLE | WS_CHILD | SS_LEFT, - 210, // x position - 10, // y position - 350, // Button width - 150, // Button height + SCALE(210, this.dpi), // x position + SCALE(10 + 32, this.dpi), // y position + SCALE(350, this.dpi), // Button width + SCALE(150, this.dpi), // Button height h, // Parent window 0xFFF3, // Child ID 0, 0).then(function (h) { + this.pump._caption = h; this.pump._addAsyncMethodCall(this.pump._user32.SendMessageW.async, [h, WM_SETFONT, this.pump.font, 1]); }).parentPromise.pump = this; } @@ -311,42 +471,58 @@ function createLocal(title, caption, username, options) Caption: caption }; } + + if (!options.translations.Title) { options.translations.Title = title; } if (!options.font) { options.font = 'Arial'; } if (!options.background) { options.background = RGB(0, 54, 105); } if (!options.foreground) { options.foreground = RGB(200, 200, 200); } + var ret = new promise(promise.defaultInit); ret.opt = { window: { - winstyles: MessagePump.WindowStyles.WS_VISIBLE | MessagePump.WindowStyles.WS_BORDER | MessagePump.WindowStyles.WS_CAPTION | MessagePump.WindowStyles.WS_SYSMENU, - x: 300, y: 300, left: 0, right: 300, width: 580, height: 295, title: title, background: options.background + winstyles: MessagePump.WindowStyles.WS_VISIBLE | MessagePump.WindowStyles.WS_BORDER | MessagePump.WindowStyles.WS_POPUP, + x: 300, y: 300, left: 0, right: 300, width: 580, height: 295, title: title, background: options.background, dpi: 96 }, }; + if (sh != null) + { + var primary = require('monitor-info')._user32.MonitorFromWindow(0, MONITOR_DEFAULTTOPRIMARY); + var xdpi = require('_GenericMarshal').CreateVariable(4); + var ydpi = require('_GenericMarshal').CreateVariable(4); + sh.GetDpiForMonitor(primary, 0, xdpi, ydpi); + ret.opt.window.dpi = xdpi.toBuffer().readUInt32LE(); + + console.info1('DPI of Primary Display is: ' + ret.opt.window.dpi); + ret.opt.window.width = SCALE(580, ret.opt.window.dpi); + ret.opt.window.height = SCALE(295, ret.opt.window.dpi); + } var rect = GM.CreateVariable(16); var startupinput = require('_GenericMarshal').CreateVariable(24); ret.gdipToken = require('_GenericMarshal').CreatePointer(); ret.pump = new MessagePump(ret.opt); - if (ret.pump._user32.SystemParametersInfoA(SPI_GETWORKAREA, 0, rect, 0).Val != 0) { var r = { x: rect.toBuffer().readInt32LE(0), y: rect.toBuffer().readInt32LE(4), w: rect.toBuffer().readInt32LE(8), h: rect.toBuffer().readInt32LE(12) }; r.w = r.w - r.x; r.h = r.h - r.y; console.info1('Primary Display: ' + JSON.stringify(r)); - console.info1(' => x: ' + CENTER(580, r.x, r.w) + ', y: ' + CENTER(305, r.y, r.h)); - ret.opt.window.x = CENTER(580, r.x, r.w); - ret.opt.window.y = CENTER(305, r.y, r.h); + console.info1(' => x: ' + CENTER(ret.opt.window.width, r.x, r.w) + ', y: ' + CENTER(ret.opt.window.height, r.y, r.h)); + ret.opt.window.x = CENTER(ret.opt.window.width, r.x, r.w); + ret.opt.window.y = CENTER(ret.opt.window.height, r.y, r.h); } + ret.pump.dpi = ret.opt.window.dpi; ret.pump.autoAccept = false; ret.pump.promise = ret; ret.pump.brush = ret.pump._gdi32.CreateSolidBrush(options.background); ret.pump.translations = options.translations; ret.pump.username = username; ret.pump.options = options; - ret.pump.font = ret.pump._gdi32.CreateFontW(20, 0, 0, 0, FW_DONTCARE, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, GM.CreateVariable(options.font, { wide: true })); + ret.pump.font = ret.pump._gdi32.CreateFontW(SCALE(20, ret.pump.dpi), 0, 0, 0, FW_DONTCARE, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, GM.CreateVariable(options.font, { wide: true })); + ret.pump.buttonfont = ret.pump._gdi32.CreateFontW(SCALE(15, ret.pump.dpi), 0, 0, 0, FW_DONTCARE, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, GM.CreateVariable(options.font, { wide: true })); if (options.b64Image) { @@ -503,7 +679,55 @@ function _child() } }); } +function getScaledImage(b64, width, height) +{ + var startupinput = require('_GenericMarshal').CreateVariable(24); + var gdipToken = require('_GenericMarshal').CreatePointer(); + startupinput.toBuffer().writeUInt32LE(1); + gdip.GdiplusStartup(gdipToken, startupinput, 0); + + var raw = Buffer.from(b64, 'base64'); + var nbuff = require('_GenericMarshal').CreateVariable(raw.length); + raw.copy(nbuff.toBuffer()); + var istream = SHM.SHCreateMemStream(nbuff, raw.length); + + var pimage = require('_GenericMarshal').CreatePointer(); + var hbitmap = require('_GenericMarshal').CreatePointer(); + var status = gdip.GdipCreateBitmapFromStream(istream, pimage); + status = gdip.GdipCreateHBITMAPFromBitmap(pimage.Deref(), hbitmap, RGB(0, 54, 105)); + if (status.Val == 0) + { + var format = GM.CreateVariable(4); + console.info1('PixelFormatStatus: ' + gdip.GdipGetImagePixelFormat(pimage.Deref(), format).Val); + console.info1('PixelFormat: ' + format.toBuffer().readInt32LE()); + var nb = GM.CreatePointer(); + + console.info1('FromScan0: ' + gdip.GdipCreateBitmapFromScan0(width, height, 0, format.toBuffer().readInt32LE(), 0, nb).Val); + + var REAL_h = GM.CreateVariable(4); + var REAL_w = GM.CreateVariable(4); + console.info1('GetRes_W: ' + gdip.GdipGetImageHorizontalResolution(pimage.Deref(), REAL_w).Val); + console.info1('GetRes_H: ' + gdip.GdipGetImageVerticalResolution(pimage.Deref(), REAL_h).Val); + console.info1('Source DPI: ' + REAL_w.toBuffer().readFloatLE() + ' X ' + REAL_h.toBuffer().readFloatLE()); + console.info1('SetRes: ' + gdip.GdipBitmapSetResolution(nb.Deref(), REAL_w.toBuffer().readFloatLE(), REAL_h.toBuffer().readFloatLE()).Val); + + var graphics = GM.CreatePointer(); + console.info1('GdipGetImageGraphicsContext: ' + gdip.GdipGetImageGraphicsContext(nb.Deref(), graphics).Val); + console.info1('GdipSetSmoothingMode: ' + gdip.GdipSetSmoothingMode(graphics.Deref(), SmoothingModeAntiAlias).Val); + console.info1('InterpolationModeBicubic: ' + gdip.GdipSetInterpolationMode(graphics.Deref(), InterpolationModeBicubic).Val); + console.info1('DrawImage: ' + gdip.GdipDrawImageRectI(graphics.Deref(), pimage.Deref(), 0, 0, width, height).Val); + + var scaledhbitmap = GM.CreatePointer(); + //console.info1('GetScaledHBITMAP: ' + gdip.GdipCreateHBITMAPFromBitmap(nb.Deref(), scaledhbitmap, options.background).Val); + console.info1('GetScaledHBITMAP: ' + gdip.GdipCreateHBITMAPFromBitmap(nb.Deref(), scaledhbitmap, gdip_RGB(0, 54, 105)).Val); + console.info1('ImageDispose: ' + gdip.GdipDisposeImage(pimage.Deref()).Val); + scaledhbitmap._token = gdipToken; + return (scaledhbitmap); + } + + return (null); +} module.exports = { create: create, _child: _child