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

Reply via email to