mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-02 15:30:37 +08:00

* fix: fix go test errors * Add flags to mac test * Run on all branches * Update PR workflow Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
113 lines
2.7 KiB
Go
113 lines
2.7 KiB
Go
//go:build windows
|
|
|
|
/*
|
|
* Copyright (C) 2019 The Winc Authors. All Rights Reserved.
|
|
* Copyright (C) 2010-2013 Allen Dang. All Rights Reserved.
|
|
*/
|
|
|
|
package winc
|
|
|
|
import (
|
|
"errors"
|
|
"unsafe"
|
|
|
|
"github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/winc/w32"
|
|
)
|
|
|
|
type Bitmap struct {
|
|
handle w32.HBITMAP
|
|
width, height int
|
|
}
|
|
|
|
func assembleBitmapFromHBITMAP(hbitmap w32.HBITMAP) (*Bitmap, error) {
|
|
var dib w32.DIBSECTION
|
|
if w32.GetObject(w32.HGDIOBJ(hbitmap), unsafe.Sizeof(dib), unsafe.Pointer(&dib)) == 0 {
|
|
return nil, errors.New("GetObject for HBITMAP failed")
|
|
}
|
|
|
|
return &Bitmap{
|
|
handle: hbitmap,
|
|
width: int(dib.DsBmih.BiWidth),
|
|
height: int(dib.DsBmih.BiHeight),
|
|
}, nil
|
|
}
|
|
|
|
func NewBitmapFromFile(filepath string, background Color) (*Bitmap, error) {
|
|
var gpBitmap *uintptr
|
|
var err error
|
|
|
|
gpBitmap, err = w32.GdipCreateBitmapFromFile(filepath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer w32.GdipDisposeImage(gpBitmap)
|
|
|
|
var hbitmap w32.HBITMAP
|
|
// Reverse RGB to BGR to satisfy gdiplus color schema.
|
|
hbitmap, err = w32.GdipCreateHBITMAPFromBitmap(gpBitmap, uint32(RGB(background.B(), background.G(), background.R())))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return assembleBitmapFromHBITMAP(hbitmap)
|
|
}
|
|
|
|
func NewBitmapFromResource(instance w32.HINSTANCE, resName *uint16, resType *uint16, background Color) (*Bitmap, error) {
|
|
var gpBitmap *uintptr
|
|
var err error
|
|
var hRes w32.HRSRC
|
|
|
|
hRes, err = w32.FindResource(w32.HMODULE(instance), resName, resType)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
resSize := w32.SizeofResource(w32.HMODULE(instance), hRes)
|
|
pResData := w32.LockResource(w32.LoadResource(w32.HMODULE(instance), hRes))
|
|
resBuffer := w32.GlobalAlloc(w32.GMEM_MOVEABLE, resSize)
|
|
pResBuffer := w32.GlobalLock(resBuffer)
|
|
w32.MoveMemory(pResBuffer, pResData, resSize)
|
|
|
|
stream := w32.CreateStreamOnHGlobal(resBuffer, false)
|
|
|
|
gpBitmap, err = w32.GdipCreateBitmapFromStream(stream)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer stream.Release()
|
|
defer w32.GlobalUnlock(resBuffer)
|
|
defer w32.GlobalFree(resBuffer)
|
|
defer w32.GdipDisposeImage(gpBitmap)
|
|
|
|
var hbitmap w32.HBITMAP
|
|
// Reverse gform.RGB to BGR to satisfy gdiplus color schema.
|
|
hbitmap, err = w32.GdipCreateHBITMAPFromBitmap(gpBitmap, uint32(RGB(background.B(), background.G(), background.R())))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return assembleBitmapFromHBITMAP(hbitmap)
|
|
}
|
|
|
|
func (bm *Bitmap) Dispose() {
|
|
if bm.handle != 0 {
|
|
w32.DeleteObject(w32.HGDIOBJ(bm.handle))
|
|
bm.handle = 0
|
|
}
|
|
}
|
|
|
|
func (bm *Bitmap) GetHBITMAP() w32.HBITMAP {
|
|
return bm.handle
|
|
}
|
|
|
|
func (bm *Bitmap) Size() (int, int) {
|
|
return bm.width, bm.height
|
|
}
|
|
|
|
func (bm *Bitmap) Height() int {
|
|
return bm.height
|
|
}
|
|
|
|
func (bm *Bitmap) Width() int {
|
|
return bm.width
|
|
}
|