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  */