github.com/as/shiny@v0.8.2/driver/windriver/screen.go (about) 1 // Copyright 2015 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // +build windows 6 7 package windriver 8 9 import ( 10 "fmt" 11 "image" 12 "unsafe" 13 14 "github.com/as/shiny/driver/win32" 15 "github.com/as/shiny/screen" 16 ) 17 18 var theScreen = &screenImpl{} 19 20 type screenImpl struct { 21 windows *windowImpl 22 } 23 24 func (*screenImpl) NewBuffer(size image.Point) (screen.Buffer, error) { 25 const ( 26 maxInt32 = 0x7fffffff 27 maxBufLen = maxInt32 28 ) 29 if size.X < 0 || size.X > maxInt32 || size.Y < 0 || size.Y > maxInt32 || int64(size.X)*int64(size.Y)*4 > maxBufLen { 30 return nil, fmt.Errorf("windriver: invalid buffer size %v", size) 31 } 32 33 hbitmap, bitvalues, err := mkbitmap(size) 34 if err != nil { 35 return nil, err 36 } 37 bufLen := 4 * size.X * size.Y 38 array := (*[maxBufLen]byte)(unsafe.Pointer(bitvalues)) 39 buf := (*array)[:bufLen:bufLen] 40 buf2 := make([]byte, bufLen, bufLen) 41 return &bufferImpl{ 42 hbitmap: hbitmap, 43 buf: buf, 44 buf2: buf2, 45 rgba: image.RGBA{ 46 Pix: buf2, 47 Stride: 4 * size.X, 48 Rect: image.Rectangle{Max: size}, 49 }, 50 size: size, 51 }, nil 52 } 53 54 func (*screenImpl) NewTexture(size image.Point) (screen.Texture, error) { 55 return newTexture(size) 56 } 57 58 func (s *screenImpl) NewWindow(opts *screen.NewWindowOptions) (screen.Window, error) { 59 h, err := win32.NewWindow(opts) 60 if err != nil { 61 return nil, err 62 } 63 dc, err := win32.GetDC(h) 64 if err != nil { 65 return nil, err 66 } 67 _, err = win32.SetGraphicsMode(dc, win32.GmAdvanced) 68 if err != nil { 69 return nil, err 70 } 71 72 s.windows = &windowImpl{ 73 dc: dc, 74 hwnd: h, 75 } 76 if err = win32.Resize(h, win32.Pt(opts.Width, opts.Height)); err != nil { 77 return nil, err 78 } 79 win32.Show(h) 80 return s.windows, nil 81 } 82 83 /* 84 // experimental: attempt to overlay on top of existing window 85 func (s *screenImpl) newWindow(opts *screen.NewWindowOptions) (screen.Window, error) { 86 var ( 87 err error 88 ) 89 h := win32.GetConsoleWindow() 90 if !opts.Overlay || h == 0 { 91 // Won't bind to the parent window; create a new one 92 if h, err = win32.NewWindow(opts); err != nil { 93 return nil, err 94 } 95 } 96 dc, err := win32.GetDC(h) 97 if err != nil { 98 return nil, err 99 } 100 _, err = _SetGraphicsMode(dc, _GM_ADVANCED) 101 if err != nil { 102 return nil, err 103 } 104 105 s.windows = &windowImpl{ 106 dc: dc, 107 hwnd: h, 108 } 109 if err = win32.ResizeClientRect(h, opts); err != nil { 110 return nil, err 111 } 112 win32.Show(h) 113 return s.windows, nil 114 } 115 */