123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- // Copyright 2010-2012 The W32 Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- // +build windows
- package w32
- import (
- "errors"
- "fmt"
- "syscall"
- "unsafe"
- )
- const (
- Ok = 0
- GenericError = 1
- InvalidParameter = 2
- OutOfMemory = 3
- ObjectBusy = 4
- InsufficientBuffer = 5
- NotImplemented = 6
- Win32Error = 7
- WrongState = 8
- Aborted = 9
- FileNotFound = 10
- ValueOverflow = 11
- AccessDenied = 12
- UnknownImageFormat = 13
- FontFamilyNotFound = 14
- FontStyleNotFound = 15
- NotTrueTypeFont = 16
- UnsupportedGdiplusVersion = 17
- GdiplusNotInitialized = 18
- PropertyNotFound = 19
- PropertyNotSupported = 20
- ProfileNotFound = 21
- )
- func GetGpStatus(s int32) string {
- switch s {
- case Ok:
- return "Ok"
- case GenericError:
- return "GenericError"
- case InvalidParameter:
- return "InvalidParameter"
- case OutOfMemory:
- return "OutOfMemory"
- case ObjectBusy:
- return "ObjectBusy"
- case InsufficientBuffer:
- return "InsufficientBuffer"
- case NotImplemented:
- return "NotImplemented"
- case Win32Error:
- return "Win32Error"
- case WrongState:
- return "WrongState"
- case Aborted:
- return "Aborted"
- case FileNotFound:
- return "FileNotFound"
- case ValueOverflow:
- return "ValueOverflow"
- case AccessDenied:
- return "AccessDenied"
- case UnknownImageFormat:
- return "UnknownImageFormat"
- case FontFamilyNotFound:
- return "FontFamilyNotFound"
- case FontStyleNotFound:
- return "FontStyleNotFound"
- case NotTrueTypeFont:
- return "NotTrueTypeFont"
- case UnsupportedGdiplusVersion:
- return "UnsupportedGdiplusVersion"
- case GdiplusNotInitialized:
- return "GdiplusNotInitialized"
- case PropertyNotFound:
- return "PropertyNotFound"
- case PropertyNotSupported:
- return "PropertyNotSupported"
- case ProfileNotFound:
- return "ProfileNotFound"
- }
- return "Unknown Status Value"
- }
- var (
- token uintptr
- modgdiplus = syscall.NewLazyDLL("gdiplus.dll")
- procGdipCreateBitmapFromFile = modgdiplus.NewProc("GdipCreateBitmapFromFile")
- procGdipCreateBitmapFromHBITMAP = modgdiplus.NewProc("GdipCreateBitmapFromHBITMAP")
- procGdipCreateHBITMAPFromBitmap = modgdiplus.NewProc("GdipCreateHBITMAPFromBitmap")
- procGdipCreateBitmapFromResource = modgdiplus.NewProc("GdipCreateBitmapFromResource")
- procGdipCreateBitmapFromStream = modgdiplus.NewProc("GdipCreateBitmapFromStream")
- procGdipDisposeImage = modgdiplus.NewProc("GdipDisposeImage")
- procGdiplusShutdown = modgdiplus.NewProc("GdiplusShutdown")
- procGdiplusStartup = modgdiplus.NewProc("GdiplusStartup")
- )
- func GdipCreateBitmapFromFile(filename string) (*uintptr, error) {
- var bitmap *uintptr
- ret, _, _ := procGdipCreateBitmapFromFile.Call(
- uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(filename))),
- uintptr(unsafe.Pointer(&bitmap)))
- if ret != Ok {
- return nil, errors.New(fmt.Sprintf("GdipCreateBitmapFromFile failed with status '%s' for file '%s'", GetGpStatus(int32(ret)), filename))
- }
- return bitmap, nil
- }
- func GdipCreateBitmapFromResource(instance HINSTANCE, resId *uint16) (*uintptr, error) {
- var bitmap *uintptr
- ret, _, _ := procGdipCreateBitmapFromResource.Call(
- uintptr(instance),
- uintptr(unsafe.Pointer(resId)),
- uintptr(unsafe.Pointer(&bitmap)))
- if ret != Ok {
- return nil, errors.New(fmt.Sprintf("GdiCreateBitmapFromResource failed with status '%s'", GetGpStatus(int32(ret))))
- }
- return bitmap, nil
- }
- func GdipCreateBitmapFromStream(stream *IStream) (*uintptr, error) {
- var bitmap *uintptr
- ret, _, _ := procGdipCreateBitmapFromStream.Call(
- uintptr(unsafe.Pointer(stream)),
- uintptr(unsafe.Pointer(&bitmap)))
- if ret != Ok {
- return nil, errors.New(fmt.Sprintf("GdipCreateBitmapFromStream failed with status '%s'", GetGpStatus(int32(ret))))
- }
- return bitmap, nil
- }
- func GdipCreateHBITMAPFromBitmap(bitmap *uintptr, background uint32) (HBITMAP, error) {
- var hbitmap HBITMAP
- ret, _, _ := procGdipCreateHBITMAPFromBitmap.Call(
- uintptr(unsafe.Pointer(bitmap)),
- uintptr(unsafe.Pointer(&hbitmap)),
- uintptr(background))
- if ret != Ok {
- return 0, errors.New(fmt.Sprintf("GdipCreateHBITMAPFromBitmap failed with status '%s'", GetGpStatus(int32(ret))))
- }
- return hbitmap, nil
- }
- func GdipDisposeImage(image *uintptr) {
- procGdipDisposeImage.Call(uintptr(unsafe.Pointer(image)))
- }
- func GdiplusShutdown() {
- procGdiplusShutdown.Call(token)
- }
- func GdiplusStartup(input *GdiplusStartupInput, output *GdiplusStartupOutput) {
- ret, _, _ := procGdiplusStartup.Call(
- uintptr(unsafe.Pointer(&token)),
- uintptr(unsafe.Pointer(input)),
- uintptr(unsafe.Pointer(output)))
- if ret != Ok {
- panic("GdiplusStartup failed with status " + GetGpStatus(int32(ret)))
- }
- }
|