shiny/driver/windriver: use StretchBlt when AlphaBlend is not available
Fixes golang/go#15668
Change-Id: I482f3f068cad79351f45c91e77faa1ec5f3b6060
Reviewed-on: https://go-review.googlesource.com/23110
Reviewed-by: Nigel Tao <nigeltao@golang.org>
diff --git a/shiny/driver/windriver/syscall_windows.go b/shiny/driver/windriver/syscall_windows.go
index 083470a..65a20ec 100644
--- a/shiny/driver/windriver/syscall_windows.go
+++ b/shiny/driver/windriver/syscall_windows.go
@@ -117,6 +117,9 @@
_AC_SRC_ALPHA = 0x01
_SRCCOPY = 0x00cc0020
+
+ _SHADEBLENDCAPS = 120
+ _SB_NONE = 0
)
const (
@@ -161,3 +164,4 @@
//sys _SetGraphicsMode(dc syscall.Handle, mode int32) (oldmode int32, err error) = gdi32.SetGraphicsMode
//sys _SetWorldTransform(dc syscall.Handle, x *_XFORM) (err error) = gdi32.SetWorldTransform
//sys _StretchBlt(dcdest syscall.Handle, xdest int32, ydest int32, wdest int32, hdest int32, dcsrc syscall.Handle, xsrc int32, ysrc int32, wsrc int32, hsrc int32, rop uint32) (err error) = gdi32.StretchBlt
+//sys _GetDeviceCaps(dc syscall.Handle, index int32) (ret int32) = gdi32.GetDeviceCaps
diff --git a/shiny/driver/windriver/windraw.go b/shiny/driver/windriver/windraw.go
index 30eeedc..363b733 100644
--- a/shiny/driver/windriver/windraw.go
+++ b/shiny/driver/windriver/windraw.go
@@ -61,6 +61,13 @@
}
}()
+ if _GetDeviceCaps(dc, _SHADEBLENDCAPS) == _SB_NONE {
+ // This output device does not support blending capabilities,
+ // so the subsequent output is incorrect, but is the best we
+ // can do on systems that do not support AlphaBlend.
+ op = draw.Src
+ }
+
switch op {
case draw.Src:
return _StretchBlt(dc, int32(dr.Min.X), int32(dr.Min.Y), int32(dr.Dx()), int32(dr.Dy()),
diff --git a/shiny/driver/windriver/zsyscall_windows.go b/shiny/driver/windriver/zsyscall_windows.go
index 2a2d155..18047b1 100644
--- a/shiny/driver/windriver/zsyscall_windows.go
+++ b/shiny/driver/windriver/zsyscall_windows.go
@@ -30,6 +30,7 @@
procSetGraphicsMode = modgdi32.NewProc("SetGraphicsMode")
procSetWorldTransform = modgdi32.NewProc("SetWorldTransform")
procStretchBlt = modgdi32.NewProc("StretchBlt")
+ procGetDeviceCaps = modgdi32.NewProc("GetDeviceCaps")
)
func _AlphaBlend(dcdest syscall.Handle, xoriginDest int32, yoriginDest int32, wDest int32, hDest int32, dcsrc syscall.Handle, xoriginSrc int32, yoriginSrc int32, wsrc int32, hsrc int32, ftn uintptr) (err error) {
@@ -205,3 +206,9 @@
}
return
}
+
+func _GetDeviceCaps(dc syscall.Handle, index int32) (ret int32) {
+ r0, _, _ := syscall.Syscall(procGetDeviceCaps.Addr(), 2, uintptr(dc), uintptr(index), 0)
+ ret = int32(r0)
+ return
+}