// Copyright 2010 The win 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 win import ( "golang.org/x/sys/windows" "syscall" "unsafe" ) type GpStatus int32 const ( Ok GpStatus = 0 GenericError GpStatus = 1 InvalidParameter GpStatus = 2 OutOfMemory GpStatus = 3 ObjectBusy GpStatus = 4 InsufficientBuffer GpStatus = 5 NotImplemented GpStatus = 6 Win32Error GpStatus = 7 WrongState GpStatus = 8 Aborted GpStatus = 9 FileNotFound GpStatus = 10 ValueOverflow GpStatus = 11 AccessDenied GpStatus = 12 UnknownImageFormat GpStatus = 13 FontFamilyNotFound GpStatus = 14 FontStyleNotFound GpStatus = 15 NotTrueTypeFont GpStatus = 16 UnsupportedGdiplusVersion GpStatus = 17 GdiplusNotInitialized GpStatus = 18 PropertyNotFound GpStatus = 19 PropertyNotSupported GpStatus = 20 ProfileNotFound GpStatus = 21 ) func (s GpStatus) String() 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" } type GdiplusStartupInput struct { GdiplusVersion uint32 DebugEventCallback uintptr SuppressBackgroundThread BOOL SuppressExternalCodecs BOOL } type GdiplusStartupOutput struct { NotificationHook uintptr NotificationUnhook uintptr } type GpImage struct{} type GpBitmap GpImage type ARGB uint32 var ( // Library libgdiplus *windows.LazyDLL // Functions gdipCreateBitmapFromFile *windows.LazyProc gdipCreateBitmapFromHBITMAP *windows.LazyProc gdipCreateHBITMAPFromBitmap *windows.LazyProc gdipDisposeImage *windows.LazyProc gdiplusShutdown *windows.LazyProc gdiplusStartup *windows.LazyProc ) var ( token uintptr ) func init() { // Library libgdiplus = windows.NewLazySystemDLL("gdiplus.dll") // Functions gdipCreateBitmapFromFile = libgdiplus.NewProc("GdipCreateBitmapFromFile") gdipCreateBitmapFromHBITMAP = libgdiplus.NewProc("GdipCreateBitmapFromHBITMAP") gdipCreateHBITMAPFromBitmap = libgdiplus.NewProc("GdipCreateHBITMAPFromBitmap") gdipDisposeImage = libgdiplus.NewProc("GdipDisposeImage") gdiplusShutdown = libgdiplus.NewProc("GdiplusShutdown") gdiplusStartup = libgdiplus.NewProc("GdiplusStartup") } func GdipCreateBitmapFromFile(filename *uint16, bitmap **GpBitmap) GpStatus { ret, _, _ := syscall.Syscall(gdipCreateBitmapFromFile.Addr(), 2, uintptr(unsafe.Pointer(filename)), uintptr(unsafe.Pointer(bitmap)), 0) return GpStatus(ret) } func GdipCreateBitmapFromHBITMAP(hbm HBITMAP, hpal HPALETTE, bitmap **GpBitmap) GpStatus { ret, _, _ := syscall.Syscall(gdipCreateBitmapFromHBITMAP.Addr(), 3, uintptr(hbm), uintptr(hpal), uintptr(unsafe.Pointer(bitmap))) return GpStatus(ret) } func GdipCreateHBITMAPFromBitmap(bitmap *GpBitmap, hbmReturn *HBITMAP, background ARGB) GpStatus { ret, _, _ := syscall.Syscall(gdipCreateHBITMAPFromBitmap.Addr(), 3, uintptr(unsafe.Pointer(bitmap)), uintptr(unsafe.Pointer(hbmReturn)), uintptr(background)) return GpStatus(ret) } func GdipDisposeImage(image *GpImage) GpStatus { ret, _, _ := syscall.Syscall(gdipDisposeImage.Addr(), 1, uintptr(unsafe.Pointer(image)), 0, 0) return GpStatus(ret) } func GdiplusShutdown() { syscall.Syscall(gdiplusShutdown.Addr(), 1, token, 0, 0) } func GdiplusStartup(input *GdiplusStartupInput, output *GdiplusStartupOutput) GpStatus { ret, _, _ := syscall.Syscall(gdiplusStartup.Addr(), 3, uintptr(unsafe.Pointer(&token)), uintptr(unsafe.Pointer(input)), uintptr(unsafe.Pointer(output))) return GpStatus(ret) } /*GdipSaveImageToFile(image *GpImage, filename *uint16, clsidEncoder *CLSID, encoderParams *EncoderParameters) GpStatus { ret, _, _ := syscall.Syscall6(gdipSaveImageToFile.Addr(), 4, uintptr(unsafe.Pointer(image)), uintptr(unsafe.Pointer(filename)), uintptr(unsafe.Pointer(clsidEncoder)), uintptr(unsafe.Pointer(encoderParams)), 0, 0) return GpStatus(ret) }*/