30#include "gdk/win32/gdkwin32.h"
68 CDCGuard(
const CDCGuard &);
72 explicit CDCGuard(HDC hDC) : fHDC(hDC)
91 WDCGuard(
const WDCGuard &);
95 WDCGuard(HDC hDC,
Window_t winID) : fHDC(hDC), fWinID(winID)
100 ReleaseDC((HWND)GDK_DRAWABLE_XID((GdkWindow *)fWinID), fHDC);
113 BMPGuard(
const BMPGuard &);
117 explicit BMPGuard(HBITMAP bmp) : fBMP(bmp)
135 WGLGuard(
const WGLGuard &);
139 explicit WGLGuard(HGLRC glrc) : fCtx(glrc)
144 wglDeleteContext(fCtx);
153const PIXELFORMATDESCRIPTOR
173const PIXELFORMATDESCRIPTOR
204 std::deque<TGLContext>::size_type i = 0;
211 ::Warning(
"TGWin32GLManager::~TGLWin32GLManager",
"You forget to destroy gl-context %d\n", i);
231 gROOT->GetListOfSpecials()->AddLast(
this);
256 HDC hDC = GetWindowDC((HWND)GDK_DRAWABLE_XID((GdkWindow *)winID));
259 Error(
"CreateGLContext",
"GetWindowDC failed\n");
263 WDCGuard dcGuard(hDC, winID);
267 HGLRC glCtx = wglCreateContext(hDC);
270 Error(
"CreateGLContext",
"wglCreateContext failed\n");
274 TGLContext newDevice = {winInd, -1, hDC, 0, glCtx};
275 PIXELFORMATDESCRIPTOR testFormat = {};
276 DescribePixelFormat(hDC, pixFormat,
sizeof testFormat, &testFormat);
280 Int_t ind = ctx->fWindowIndex;
281 fPimpl->fNextFreeContext =
fPimpl->fNextFreeContext->fNextFreeContext;
286 WGLGuard wglGuard(glCtx);
287 fPimpl->fGLContexts.push_back(newDevice);
290 return fPimpl->fGLContexts.size() - 1;
293 Error(
"CreateGLContext",
"SetPixelFormat failed\n");
295 Error(
"CreateGLContext",
"ChoosePixelFormat failed\n");
305 HDC dibDC = CreateCompatibleDC(0);
308 Error(
"CreateDIB",
"CreateCompatibleDC failed\n");
312 CDCGuard dcGuard(dibDC);
314 BITMAPINFOHEADER bmpHeader = {
sizeof bmpHeader, (LONG) ctx.
fW, (LONG) ctx.
fH, 1, 32, BI_RGB};
315 void *bmpCnt =
nullptr;
316 HBITMAP hDIB = CreateDIBSection(dibDC, (BITMAPINFO*)&bmpHeader, DIB_RGB_COLORS, &bmpCnt, 0, 0);
319 Error(
"CreateDIB",
"CreateDIBSection failed\n");
323 BMPGuard bmpGuard(hDIB);
365 Error(
"ResizeOffScreenDevice",
"Error trying to create new DIB\n");
387 if (
fPimpl->fGLContexts[pixInd].fPixmapIndex != -1)
388 fPimpl->fGLContexts[pixInd].fDirect = isDirect;
398 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
399 glReadBuffer(GL_BACK);
400 glReadPixels(0, 0, ctx.
fW, ctx.
fH, GL_BGRA_EXT, GL_UNSIGNED_BYTE, ctx.
fDIBData);
408 return fPimpl->fGLContexts[ctxInd].fPixmapIndex;
427 wglSwapLayerBuffers(ctx.
fDC, WGL_SWAP_MAIN_PLANE);
430 HDC hDC = CreateCompatibleDC(0);
433 Error(
"Flush",
"CreateCompatibleDC failed\n");
437 HBITMAP oldDIB = (HBITMAP)SelectObject(hDC, ctx.
fHBitmap);
439 if (!BitBlt(ctx.
fDC, ctx.
fX, ctx.
fY, ctx.
fW, ctx.
fH, hDC, 0, 0, SRCCOPY))
442 SelectObject(hDC, oldDIB);
467 fPimpl->fNextFreeContext = &ctx;
479 viewport[2] = ctx.
fW;
480 viewport[3] = ctx.
fH;
502 return manip->
Select(*camera, *rect, *sceneBox);
533 return fPimpl->fGLContexts[ctxInd].fHighColor;
Handle_t Window_t
Window handle.
ULongptr_t Handle_t
Generic resource handle.
int Int_t
Signed integer 4 bytes (int).
unsigned char UChar_t
Unsigned Character 1 byte (unsigned char).
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int).
bool Bool_t
Boolean (0=false, 1=true) (bool).
const PIXELFORMATDESCRIPTOR doubleBufferDesc
const PIXELFORMATDESCRIPTOR singleScreenDesc
Binding & operator=(OUT(*fun)(void))
externTGLManager *(* gPtr2GLManager)()
Concrete class describing an orientated (free) or axis aligned box of 8 vertices.
Abstract base camera class - concrete classes for orthographic and perspective cameras derive from it...
Viewport (pixel base) 2D rectangle class.
static TGLManager * ProxyObject()
TGLContext * fNextFreeContext
std::deque< TGLContext > fGLContexts
void DeleteGLContext(Int_t devInd) override
Bool_t HighColorFormat(Int_t ctx) override
void ExtractViewport(Int_t devInd, Int_t *vp) override
Bool_t ResizeOffScreenDevice(Int_t devInd, Int_t x, Int_t y, UInt_t w, UInt_t h) override
Create new DIB if needed.
Int_t CreateGLContext(Int_t winInd) override
winInd is TGWin32 index, returned by previous call gGLManager->InitGLWindow returns descripto (index)...
Bool_t CreateDIB(TGLContext &ctx) const
Create DIB section to read GL buffer into.
char * GetPlotInfo(TVirtualGLPainter *plot, Int_t px, Int_t py) override
void PaintSingleObject(TVirtualGLPainter *) override
void PanObject(TVirtualGLPainter *o, Int_t x, Int_t y) override
Bool_t PlotSelected(TVirtualGLPainter *plot, Int_t px, Int_t py) override
Int_t GetVirtualXInd(Int_t devInd) override
Bool_t SelectManip(TVirtualGLManip *manip, const TGLCamera *camera, const TGLRect *rect, const TGLBoundingBox *sceneBox) override
void ReadGLBuffer(Int_t devInd) override
void Flush(Int_t ctxInd) override
Bool_t AttachOffScreenDevice(Int_t ctxInd, Int_t x, Int_t y, UInt_t w, UInt_t h) override
void PrintViewer(TVirtualViewer3D *vv) override
Int_t InitGLWindow(Window_t winID) override
void SelectOffScreenDevice(Int_t devInd) override
~TGWin32GLManager() override
Bool_t MakeCurrent(Int_t devInd) override
void MarkForDirectCopy(Int_t devInd, Bool_t) override
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual Bool_t Select(const TGLCamera &camera, const TGLRect &rect, const TGLBoundingBox &sceneBox)=0
virtual Bool_t PlotSelected(Int_t px, Int_t py)=0
virtual char * GetPlotInfo(Int_t px, Int_t py)=0
virtual void Pan(Int_t px, Int_t py)=0
Abstract 3D shapes viewer.
virtual void PrintObjects()
TGLContext * fNextFreeContext