178 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// 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)))
 | 
						|
	}
 | 
						|
}
 |