Hello all, I've been researching for a while about Windows Factor's inability to correctly render texts on transparent backgrounds. I haven't solved the problem yet, but I've just come to an idea. I'd be happy to hear your opinions on that.
For example, labels for button widgets are tentatively drawn with gray background text because they cannot draw labels with a transparent background. I disabled this behavior and tried to make transparent drawing work correctly, but only on a black background. I kept trying to figure out what was behind the black background, but I couldn't find the widget. That's why I came up with the idea that Uniscribe works to make the background transparent, but where the characters are written is black. At first it seemed like a silly idea, but I wrote the code to confirm it. USING: accessors alien.c-types alien.data colors images.viewer io io.encodings.string io.encodings.utf16n io.styles kernel literals math sequences ui ui.commands ui.gadgets ui.gadgets.borders ui.gadgets.panes ui.gadgets.tracks ui.gestures windows.gdi32 windows.offscreen windows.ole32 windows.types windows.usp10 locals fonts windows.fonts windows.errors ; IN: hello-uniscribe ! NOTE: The following declaration is required in gdi32.factor ! ! FUNCTION: int SetBkMode ( HDC hdc, int iBkMode ) TUPLE: hello-gadget < track ; : <hello-gadget> ( -- gadget ) horizontal hello-gadget new-track [ { { font-size 24 } } [ "Hello" print "Grüß dich" print "здравствуйте" print "こんにちは" print "안녕하세요" print "שָׁלוֹם " print ] with-style ] make-pane { 10 10 } <border> f track-add ; :: com-screen-shot ( gadget -- ) [ :> dc gadget dim>> dc [ ] make-bitmap-image image-window ] with-memory-dc ; CONSTANT: ssa-dwFlags flags{ SSA_GLYPHS SSA_FALLBACK SSA_TAB } :: (com-screen-shot-with-text) ( dim bkMode uOptions -- ) [ :> dc dim dc [ dc sans-serif-font cache-font SelectObject win32-error=0/f dc T{ rgba f 0.0 0.0 1.0 0.0 } color>RGB SetBkColor drop dc T{ rgba f 1.0 1.0 1.0 1.0 } color>RGB SetTextColor drop dc bkMode SetBkMode drop dc "Hello!" [ utf16n encode ] ! pString [ length ] bi ! cString dup 1.5 * 16 + >integer ! cGlyphs -- MSDN says this is "recommended size" -1 ! iCharset -- Unicode ssa-dwFlags 0 ! iReqWidth f ! psControl f ! psState f ! piDx f ! pTabdef f ! pbInClass f void* <ref> ! pssa [ ScriptStringAnalyse ] keep [ check-ole32-error ] [ |ScriptStringFree void* deref ] bi* 0 ! iX 0 ! iY uOptions { 0 0 } dim <RECT> 0 ! iMinSel 0 ! iMaxSel FALSE ! fDisabled ScriptStringOut check-ole32-error ] make-bitmap-image image-window ] with-memory-dc ; : com-screen-shot-with-text-opaque ( gadget -- ) dim>> OPAQUE ETO_OPAQUE (com-screen-shot-with-text) ; : com-screen-shot-with-text-transparent-1 ( gadget -- ) dim>> OPAQUE 0 (com-screen-shot-with-text) ; : com-screen-shot-with-text-transparent-2 ( gadget -- ) dim>> TRANSPARENT ETO_OPAQUE (com-screen-shot-with-text) ; : com-screen-shot-with-text-transparent-3 ( gadget -- ) dim>> TRANSPARENT 0 (com-screen-shot-with-text) ; hello-gadget "gestures" f { { T{ key-down { sym "1" } } com-screen-shot } { T{ key-down { sym "2" } } com-screen-shot-with-text-opaque } { T{ key-down { sym "3" } } com-screen-shot-with-text-transparent-1 } { T{ key-down { sym "4" } } com-screen-shot-with-text-transparent-2 } { T{ key-down { sym "5" } } com-screen-shot-with-text-transparent-3 } } define-command-map MAIN-WINDOW: hello-uniscribe { { title "გამარჯობა, uniscribe" } } <hello-gadget> >>gadgets ; My understanding from reading Uniscribe.factor is that it renders characters in the device context given by with-memory-dc. However, if you create a bitmap from that dc, its background is black, regardless of the drawing on the current window. My guess is that you won't be able to create an image of a string with a transparent background unless you transfer the original window bitmap to the device context created by with-memory-dc. -- KUSUMOTO Norio _______________________________________________ Factor-talk mailing list Factor-talk@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/factor-talk