You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
177 lines
4.8 KiB
177 lines
4.8 KiB
// 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))) |
|
} |
|
}
|
|
|