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
+}