Sorry, the last sentences are wrong, so I will correct them. What I found when I read uniscribe-factor is that a bitmap is created with the device context given by with-memory-dc. However, if you simply use that dc, the bitmap has a black background.
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 > 2019/05/28 14:36、KUSUMOTO Norio <kusum...@na.rim.or.jp> のメール: > > 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 _______________________________________________ Factor-talk mailing list Factor-talk@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/factor-talk