303 lines
7.2 KiB
Go
303 lines
7.2 KiB
Go
// Copyright 2011 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"
|
|
)
|
|
|
|
// for second parameter of WglSwapLayerBuffers
|
|
const (
|
|
WGL_SWAP_MAIN_PLANE = (1 << 0)
|
|
WGL_SWAP_OVERLAY1 = (1 << 1)
|
|
WGL_SWAP_OVERLAY2 = (1 << 2)
|
|
WGL_SWAP_OVERLAY3 = (1 << 3)
|
|
WGL_SWAP_OVERLAY4 = (1 << 4)
|
|
WGL_SWAP_OVERLAY5 = (1 << 5)
|
|
WGL_SWAP_OVERLAY6 = (1 << 6)
|
|
WGL_SWAP_OVERLAY7 = (1 << 7)
|
|
WGL_SWAP_OVERLAY8 = (1 << 8)
|
|
WGL_SWAP_OVERLAY9 = (1 << 9)
|
|
WGL_SWAP_OVERLAY10 = (1 << 10)
|
|
WGL_SWAP_OVERLAY11 = (1 << 11)
|
|
WGL_SWAP_OVERLAY12 = (1 << 12)
|
|
WGL_SWAP_OVERLAY13 = (1 << 13)
|
|
WGL_SWAP_OVERLAY14 = (1 << 14)
|
|
WGL_SWAP_OVERLAY15 = (1 << 15)
|
|
WGL_SWAP_UNDERLAY1 = (1 << 16)
|
|
WGL_SWAP_UNDERLAY2 = (1 << 17)
|
|
WGL_SWAP_UNDERLAY3 = (1 << 18)
|
|
WGL_SWAP_UNDERLAY4 = (1 << 19)
|
|
WGL_SWAP_UNDERLAY5 = (1 << 20)
|
|
WGL_SWAP_UNDERLAY6 = (1 << 21)
|
|
WGL_SWAP_UNDERLAY7 = (1 << 22)
|
|
WGL_SWAP_UNDERLAY8 = (1 << 23)
|
|
WGL_SWAP_UNDERLAY9 = (1 << 24)
|
|
WGL_SWAP_UNDERLAY10 = (1 << 25)
|
|
WGL_SWAP_UNDERLAY11 = (1 << 26)
|
|
WGL_SWAP_UNDERLAY12 = (1 << 27)
|
|
WGL_SWAP_UNDERLAY13 = (1 << 28)
|
|
WGL_SWAP_UNDERLAY14 = (1 << 29)
|
|
WGL_SWAP_UNDERLAY15 = (1 << 30)
|
|
)
|
|
|
|
type (
|
|
HGLRC HANDLE
|
|
)
|
|
|
|
type LAYERPLANEDESCRIPTOR struct {
|
|
NSize uint16
|
|
NVersion uint16
|
|
DwFlags uint32
|
|
IPixelType uint8
|
|
CColorBits uint8
|
|
CRedBits uint8
|
|
CRedShift uint8
|
|
CGreenBits uint8
|
|
CGreenShift uint8
|
|
CBlueBits uint8
|
|
CBlueShift uint8
|
|
CAlphaBits uint8
|
|
CAlphaShift uint8
|
|
CAccumBits uint8
|
|
CAccumRedBits uint8
|
|
CAccumGreenBits uint8
|
|
CAccumBlueBits uint8
|
|
CAccumAlphaBits uint8
|
|
CDepthBits uint8
|
|
CStencilBits uint8
|
|
CAuxBuffers uint8
|
|
ILayerType uint8
|
|
BReserved uint8
|
|
CrTransparent COLORREF
|
|
}
|
|
|
|
type POINTFLOAT struct {
|
|
X, Y float32
|
|
}
|
|
|
|
type GLYPHMETRICSFLOAT struct {
|
|
GmfBlackBoxX float32
|
|
GmfBlackBoxY float32
|
|
GmfptGlyphOrigin POINTFLOAT
|
|
GmfCellIncX float32
|
|
GmfCellIncY float32
|
|
}
|
|
|
|
var (
|
|
// Library
|
|
lib *windows.LazyDLL
|
|
|
|
// Functions
|
|
wglCopyContext *windows.LazyProc
|
|
wglCreateContext *windows.LazyProc
|
|
wglCreateLayerContext *windows.LazyProc
|
|
wglDeleteContext *windows.LazyProc
|
|
wglDescribeLayerPlane *windows.LazyProc
|
|
wglGetCurrentContext *windows.LazyProc
|
|
wglGetCurrentDC *windows.LazyProc
|
|
wglGetLayerPaletteEntries *windows.LazyProc
|
|
wglGetProcAddress *windows.LazyProc
|
|
wglMakeCurrent *windows.LazyProc
|
|
wglRealizeLayerPalette *windows.LazyProc
|
|
wglSetLayerPaletteEntries *windows.LazyProc
|
|
wglShareLists *windows.LazyProc
|
|
wglSwapLayerBuffers *windows.LazyProc
|
|
wglUseFontBitmaps *windows.LazyProc
|
|
wglUseFontOutlines *windows.LazyProc
|
|
)
|
|
|
|
func init() {
|
|
// Library
|
|
lib = windows.NewLazySystemDLL("opengl32.dll")
|
|
|
|
// Functions
|
|
wglCopyContext = lib.NewProc("wglCopyContext")
|
|
wglCreateContext = lib.NewProc("wglCreateContext")
|
|
wglCreateLayerContext = lib.NewProc("wglCreateLayerContext")
|
|
wglDeleteContext = lib.NewProc("wglDeleteContext")
|
|
wglDescribeLayerPlane = lib.NewProc("wglDescribeLayerPlane")
|
|
wglGetCurrentContext = lib.NewProc("wglGetCurrentContext")
|
|
wglGetCurrentDC = lib.NewProc("wglGetCurrentDC")
|
|
wglGetLayerPaletteEntries = lib.NewProc("wglGetLayerPaletteEntries")
|
|
wglGetProcAddress = lib.NewProc("wglGetProcAddress")
|
|
wglMakeCurrent = lib.NewProc("wglMakeCurrent")
|
|
wglRealizeLayerPalette = lib.NewProc("wglRealizeLayerPalette")
|
|
wglSetLayerPaletteEntries = lib.NewProc("wglSetLayerPaletteEntries")
|
|
wglShareLists = lib.NewProc("wglShareLists")
|
|
wglSwapLayerBuffers = lib.NewProc("wglSwapLayerBuffers")
|
|
wglUseFontBitmaps = lib.NewProc("wglUseFontBitmapsW")
|
|
wglUseFontOutlines = lib.NewProc("wglUseFontOutlinesW")
|
|
}
|
|
|
|
func WglCopyContext(hglrcSrc, hglrcDst HGLRC, mask uint) bool {
|
|
ret, _, _ := syscall.Syscall(wglCopyContext.Addr(), 3,
|
|
uintptr(hglrcSrc),
|
|
uintptr(hglrcDst),
|
|
uintptr(mask))
|
|
|
|
return ret != 0
|
|
}
|
|
|
|
func WglCreateContext(hdc HDC) HGLRC {
|
|
ret, _, _ := syscall.Syscall(wglCreateContext.Addr(), 1,
|
|
uintptr(hdc),
|
|
0,
|
|
0)
|
|
|
|
return HGLRC(ret)
|
|
}
|
|
|
|
func WglCreateLayerContext(hdc HDC, iLayerPlane int) HGLRC {
|
|
ret, _, _ := syscall.Syscall(wglCreateLayerContext.Addr(), 2,
|
|
uintptr(hdc),
|
|
uintptr(iLayerPlane),
|
|
0)
|
|
|
|
return HGLRC(ret)
|
|
}
|
|
|
|
func WglDeleteContext(hglrc HGLRC) bool {
|
|
ret, _, _ := syscall.Syscall(wglDeleteContext.Addr(), 1,
|
|
uintptr(hglrc),
|
|
0,
|
|
0)
|
|
|
|
return ret != 0
|
|
}
|
|
|
|
func WglDescribeLayerPlane(hdc HDC, iPixelFormat, iLayerPlane int, nBytes uint8, plpd *LAYERPLANEDESCRIPTOR) bool {
|
|
ret, _, _ := syscall.Syscall6(wglDescribeLayerPlane.Addr(), 5,
|
|
uintptr(hdc),
|
|
uintptr(iPixelFormat),
|
|
uintptr(iLayerPlane),
|
|
uintptr(nBytes),
|
|
uintptr(unsafe.Pointer(plpd)),
|
|
0)
|
|
|
|
return ret != 0
|
|
}
|
|
|
|
func WglGetCurrentContext() HGLRC {
|
|
ret, _, _ := syscall.Syscall(wglGetCurrentContext.Addr(), 0,
|
|
0,
|
|
0,
|
|
0)
|
|
|
|
return HGLRC(ret)
|
|
}
|
|
|
|
func WglGetCurrentDC() HDC {
|
|
ret, _, _ := syscall.Syscall(wglGetCurrentDC.Addr(), 0,
|
|
0,
|
|
0,
|
|
0)
|
|
|
|
return HDC(ret)
|
|
}
|
|
|
|
func WglGetLayerPaletteEntries(hdc HDC, iLayerPlane, iStart, cEntries int, pcr *COLORREF) int {
|
|
ret, _, _ := syscall.Syscall6(wglGetLayerPaletteEntries.Addr(), 5,
|
|
uintptr(hdc),
|
|
uintptr(iLayerPlane),
|
|
uintptr(iStart),
|
|
uintptr(cEntries),
|
|
uintptr(unsafe.Pointer(pcr)),
|
|
0)
|
|
|
|
return int(ret)
|
|
}
|
|
|
|
func WglGetProcAddress(lpszProc *byte) uintptr {
|
|
ret, _, _ := syscall.Syscall(wglGetProcAddress.Addr(), 1,
|
|
uintptr(unsafe.Pointer(lpszProc)),
|
|
0,
|
|
0)
|
|
|
|
return uintptr(ret)
|
|
}
|
|
|
|
func WglMakeCurrent(hdc HDC, hglrc HGLRC) bool {
|
|
ret, _, _ := syscall.Syscall(wglMakeCurrent.Addr(), 2,
|
|
uintptr(hdc),
|
|
uintptr(hglrc),
|
|
0)
|
|
|
|
return ret != 0
|
|
}
|
|
|
|
func WglRealizeLayerPalette(hdc HDC, iLayerPlane int, bRealize bool) bool {
|
|
ret, _, _ := syscall.Syscall(wglRealizeLayerPalette.Addr(), 3,
|
|
uintptr(hdc),
|
|
uintptr(iLayerPlane),
|
|
uintptr(BoolToBOOL(bRealize)))
|
|
|
|
return ret != 0
|
|
}
|
|
|
|
func WglSetLayerPaletteEntries(hdc HDC, iLayerPlane, iStart, cEntries int, pcr *COLORREF) int {
|
|
ret, _, _ := syscall.Syscall6(wglSetLayerPaletteEntries.Addr(), 5,
|
|
uintptr(hdc),
|
|
uintptr(iLayerPlane),
|
|
uintptr(iStart),
|
|
uintptr(cEntries),
|
|
uintptr(unsafe.Pointer(pcr)),
|
|
0)
|
|
|
|
return int(ret)
|
|
}
|
|
|
|
func WglShareLists(hglrc1, hglrc2 HGLRC) bool {
|
|
ret, _, _ := syscall.Syscall(wglShareLists.Addr(), 2,
|
|
uintptr(hglrc1),
|
|
uintptr(hglrc2),
|
|
0)
|
|
|
|
return ret != 0
|
|
}
|
|
|
|
func WglSwapLayerBuffers(hdc HDC, fuPlanes uint) bool {
|
|
ret, _, _ := syscall.Syscall(wglSwapLayerBuffers.Addr(), 2,
|
|
uintptr(hdc),
|
|
uintptr(fuPlanes),
|
|
0)
|
|
|
|
return ret != 0
|
|
}
|
|
|
|
func WglUseFontBitmaps(hdc HDC, first, count, listbase uint32) bool {
|
|
ret, _, _ := syscall.Syscall6(wglUseFontBitmaps.Addr(), 4,
|
|
uintptr(hdc),
|
|
uintptr(first),
|
|
uintptr(count),
|
|
uintptr(listbase),
|
|
0,
|
|
0)
|
|
|
|
return ret != 0
|
|
}
|
|
|
|
func WglUseFontOutlines(hdc HDC, first, count, listbase uint32, deviation, extrusion float32, format int, pgmf *GLYPHMETRICSFLOAT) bool {
|
|
ret, _, _ := syscall.Syscall12(wglUseFontBitmaps.Addr(), 8,
|
|
uintptr(hdc),
|
|
uintptr(first),
|
|
uintptr(count),
|
|
uintptr(listbase),
|
|
uintptr(deviation),
|
|
uintptr(extrusion),
|
|
uintptr(format),
|
|
uintptr(unsafe.Pointer(pgmf)),
|
|
0,
|
|
0,
|
|
0,
|
|
0)
|
|
|
|
return ret != 0
|
|
}
|