38bool IsGradientFill(
Color_t fillColorIndex)
306 Int_t px = 0, py = 0;
308 pad->XYtoAbsPixel(pad->GetX1(), pad->GetY1(), px, py);
310 py =
gPad->GetWh() - py;
315 glViewport(GLint(px * scale), GLint(py * scale),
316 GLsizei(
gPad->GetWw() * pad->GetAbsWNDC() * scale),
317 GLsizei(
gPad->GetWh() * pad->GetAbsHNDC() * scale));
319 glMatrixMode(GL_PROJECTION);
321 glOrtho(pad->GetX1(), pad->GetX2(), pad->GetY1(), pad->GetY2(), -10., 10.);
323 glMatrixMode(GL_MODELVIEW);
325 glTranslated(0., 0., -1.);
327 ::Error(
"TGLPadPainter::SelectDrawable",
328 "function was called not from TPad or TCanvas code\n");
329 throw std::runtime_error(
"");
345 glDisable(GL_DEPTH_TEST);
346 glDisable(GL_CULL_FACE);
347 glDisable(GL_LIGHTING);
350 glViewport(0, 0, GLsizei(
gPad->GetWw()), GLsizei(
gPad->GetWh()));
352 glDepthMask(GL_TRUE);
353 glClearColor(1.,1.,1.,1.);
354 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
355 glDepthMask(GL_FALSE);
357 glMatrixMode(GL_PROJECTION);
360 glOrtho(
gPad->GetX1(),
gPad->GetX2(),
gPad->GetY1(),
gPad->GetY2(), -10., 10.);
362 glMatrixMode(GL_MODELVIEW);
364 glTranslated(0., 0., -1.);
377 glMatrixMode(GL_PROJECTION);
380 glOrtho(
gPad->GetX1(),
gPad->GetX2(),
gPad->GetY1(),
gPad->GetY2(), -10., 10.);
382 glMatrixMode(GL_MODELVIEW);
417 gPad->XtoAbsPixel(
x2),
gPad->YtoAbsPixel(y2));
434 glPointSize((GLfloat)pointSize);
436 glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
460 glVertex2d(
gPad->GetX1() + u1 * xRange,
gPad->GetY1() + v1 * yRange);
461 glVertex2d(
gPad->GetX1() + u2 * xRange,
gPad->GetY1() + v2 * yRange);
472 if (IsGradientFill(
gVirtualX->GetFillColor())) {
482 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
483 glRectd(
x1, y1,
x2, y2);
484 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
488 glRectd(
x1, y1,
x2, y2);
497 assert(
x != 0 &&
"DrawFillArea, parameter 'x' is null");
498 assert(
y != 0 &&
"DrawFillArea, parameter 'y' is null");
504 ::Error(
"TGLPadPainter::DrawFillArea",
505 "invalid number of points in a polygon");
509 if (IsGradientFill(
gVirtualX->GetFillColor()))
536 for (
Int_t i = 0; i <
n; ++i) {
538 fVs[i * 3 + 1] =
y[i];
545 gluNextContour(t, (GLenum)GLU_UNKNOWN);
547 for (
Int_t i = 0; i <
n; ++i)
548 gluTessVertex(t, &
fVs[i * 3], &
fVs[i * 3]);
563 glBegin(GL_LINE_STRIP);
565 for (
Int_t i = 0; i <
n; ++i)
566 glVertex2d(
x[i],
y[i]);
569 glVertex2d(
x[0],
y[0]);
578 glPointSize((GLfloat)pointSize);
580 glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
583 for (
Int_t i = 0; i <
n; ++i)
584 glVertex2d(
x[i],
y[i]);
600 glBegin(GL_LINE_STRIP);
602 for (
Int_t i = 0; i <
n; ++i)
603 glVertex2f(
x[i],
y[i]);
606 glVertex2f(
x[0],
y[0]);
625 glBegin(GL_LINE_STRIP);
627 for (
Int_t i = 0; i <
n; ++i)
628 glVertex2d(
x1 + u[i] * xRange, y1 +
v[i] * yRange);
636template<
class ValueType>
637void ConvertMarkerPoints(
Int_t n,
const ValueType *
x,
const ValueType *
y, std::vector<TPoint> & dst);
648 ConvertMarkerPoints(
n,
x,
y,
fPoly);
659 ConvertMarkerPoints(
n,
x,
y,
fPoly);
673 glOrtho(0,
gPad->GetAbsWNDC() *
gPad->GetWw(), 0,
gPad->GetAbsHNDC() *
gPad->GetWh(), -10., 10.);
675 glMatrixMode(GL_MODELVIEW);
681 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
687 switch (markerStyle) {
725 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
727 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
730 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
732 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
803 glMatrixMode(GL_MODELVIEW);
815 glOrtho(0,
gPad->GetAbsWNDC() *
gPad->GetWw(), 0,
gPad->GetAbsHNDC() *
gPad->GetWh(), -10., 10.);
817 glMatrixMode(GL_MODELVIEW);
830 fontIndex = 20 + shift * 10;
832 fontIndex += shift * 10;
845 glMatrixMode(GL_MODELVIEW);
917 glMatrixMode(GL_PROJECTION);
928 glMatrixMode(GL_PROJECTION);
939 glMatrixMode(GL_MODELVIEW);
950 glMatrixMode(GL_MODELVIEW);
959 glGetIntegerv(GL_VIEWPORT,
fVp);
981 std::vector<unsigned> buff(canvas->
GetWw() * canvas->
GetWh());
982 glPixelStorei(GL_PACK_ALIGNMENT, 1);
983 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
986 glReadPixels(0, 0, canvas->
GetWw(), canvas->
GetWh(), GL_RGBA, GL_UNSIGNED_BYTE, (
char *)&buff[0]);
990 ::Error(
"TGLPadPainter::SaveImage",
"TImage creation failed");
994 image->DrawRectangle(0, 0, canvas->
GetWw(), canvas->
GetWh());
995 UInt_t *argb = image->GetArgbArray();
998 ::Error(
"TGLPadPainter::SaveImage",
"null argb array in TImage object");
1005 for (
Int_t i = 0; i < nLines; ++i) {
1006 Int_t base = (nLines - 1 - i) * nPixels;
1007 for (
Int_t j = 0; j < nPixels; ++j, ++base) {
1010 const UInt_t pix = buff[base];
1011 const UInt_t bgra = ((pix & 0xff) << 16) | (pix & 0xff00) |
1012 ((pix & 0xff0000) >> 16) | (pix & 0xff000000);
1015 argb[i * nPixels + j] = bgra;
1032 ::Error(
"TGLPadPainter::DrawPixels",
"pixel data is null");
1036 if (std::numeric_limits<UInt_t>::digits >= 32) {
1045 ::Error(
"TGLPadPainter::DrawPixels",
"invalid width");
1051 ::Error(
"TGLPadPainter::DrawPixels",
"invalid height");
1060 const Double_t rasterX =
Double_t(dstX) / (pad->GetAbsWNDC() * pad->GetWw()) *
1061 (pad->GetX2() - pad->GetX1()) + pad->GetX1();
1063 const Double_t yRange = pad->GetY2() - pad->GetY1();
1064 const Double_t rasterY = yRange -
Double_t(dstY + height) / (pad->GetAbsHNDC() * pad->GetWh()) * yRange +
1067 GLdouble oldPos[4] = {};
1069 glGetDoublev(GL_CURRENT_RASTER_POSITION, oldPos);
1071 glRasterPos2d(rasterX, rasterY);
1073 std::vector<unsigned char> upsideDownImage(4 *
width * height);
1074 const unsigned char *srcLine = pixelData + 4 *
width * (height - 1);
1075 unsigned char *dstLine = &upsideDownImage[0];
1076 for (
UInt_t i = 0; i < height; ++i, srcLine -= 4 *
width, dstLine += 4 *
width)
1077 std::copy(srcLine, srcLine + 4 *
width, dstLine);
1079 if (enableBlending) {
1081 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1084 glDrawPixels(
width, height,
GL_BGRA, GL_UNSIGNED_BYTE, &upsideDownImage[0]);
1087 glDisable(GL_BLEND);
1090 glRasterPos2d(oldPos[0], oldPos[1]);
1092 ::Error(
"TGLPadPainter::DrawPixels",
"no pad found to draw");
1104 assert(
n > 2 &&
"DrawPolygonWithGradient, invalid number of points");
1105 assert(
x != 0 &&
"DrawPolygonWithGradient, parameter 'x' is null");
1106 assert(
y != 0 &&
"DrawPolygonWithGradient, parameter 'y' is null");
1109 "DrawPolygonWithGradient, the current fill color is not a gradient fill");
1122 glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
1124 glStencilFunc(GL_NEVER, 1, 0xFF);
1125 glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP);
1127 glStencilMask(0xFF);
1128 glClear(GL_STENCIL_BUFFER_BIT);
1133 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
1134 glStencilMask(0x00);
1136 glStencilFunc(GL_EQUAL, 0, 0xFF);
1138 glStencilFunc(GL_EQUAL, 1, 0xFF);
1149 assert(lGrad != 0 &&
"DrawPolygonWithGradient, unknown gradient type");
1159 assert(grad != 0 &&
"DrawGradient, parameter 'grad' is null");
1160 assert(nPoints > 2 &&
"DrawGradient, invalid number of points");
1161 assert(xs != 0 &&
"DrawGradient, parameter 'xs' is null");
1162 assert(ys != 0 &&
"DrawGradient, parameter 'ys' is null");
1165 ::Warning(
"TGLPadPainter::DrawGradient",
1166 "extended radial gradient is not supported");
1177 radius *=
TMath::Max(bbox.fWidth, bbox.fHeight);
1178 center.fX = bbox.fWidth * center.fX + bbox.fXMin;
1179 center.fY = bbox.fHeight * center.fY + bbox.fYMin;
1181 const auto w =
gPad->GetX2() -
gPad->GetX1();
1182 const auto h =
gPad->GetY2() -
gPad->GetY1();
1189 const auto pixelW =
gPad->GetAbsWNDC() *
gPad->GetWw();
1190 const auto pixelH =
gPad->GetAbsHNDC() *
gPad->GetWh();
1195 glMatrixMode(GL_PROJECTION);
1198 glOrtho(0., pixelW, 0., pixelH, -10., 10.);
1201 center.fX =
gPad->XtoPixel(center.fX);
1202 center.fY = pixelH -
gPad->YtoPixel(center.fY);
1208 const Double_t yMin = pixelH -
gPad->YtoPixel(bbox.fYMin);
1209 const Double_t yMax = pixelH -
gPad->YtoPixel(bbox.fYMax);
1216 maxR =
TMath::Sqrt(maxDistX * maxDistX + maxDistY * maxDistY);
1221 const Bool_t solidFillAfter = maxR > radius;
1224 const UInt_t nSlices = 500;
1229 const auto nCircles = nColors + 1 + solidFillAfter;
1235 std::vector<Double_t> circles(nSlices * nCircles * 2);
1239 for (
UInt_t i = 0; i < nColors; ++i) {
1240 const auto circle = &circles[i * nSlices * 2];
1242 const auto r = radius * locations[i];
1243 for (
UInt_t j = 0,
e = nSlices * 2 - 2; j <
e; j += 2) {
1244 circle[j] = center.fX +
r *
TMath::Cos(angle * j);
1245 circle[j + 1] = center.fY +
r *
TMath::Sin(angle * j);
1248 circle[(nSlices - 1) * 2] = circle[0];
1249 circle[(nSlices - 1) * 2 + 1] = circle[1];
1254 const auto circle = &circles[nColors * nSlices * 2];
1255 for (
UInt_t j = 0,
e = nSlices * 2 - 2; j <
e; j += 2) {
1256 circle[j] = center.fX + radius *
TMath::Cos(angle * j);
1257 circle[j + 1] = center.fY + radius *
TMath::Sin(angle * j);
1260 circle[(nSlices - 1) * 2] = circle[0];
1261 circle[(nSlices - 1) * 2 + 1] = circle[1];
1264 if (solidFillAfter) {
1266 const auto circle = &circles[(nCircles - 1) * nSlices * 2];
1267 for (
UInt_t j = 0,
e = nSlices * 2 - 2; j <
e; j += 2) {
1268 circle[j] = center.fX + maxR *
TMath::Cos(angle * j);
1269 circle[j + 1] = center.fY + maxR *
TMath::Sin(angle * j);
1272 circle[(nSlices - 1) * 2] = circle[0];
1273 circle[(nSlices - 1) * 2 + 1] = circle[1];
1288 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1291 glBegin(GL_TRIANGLE_FAN);
1293 glVertex2d(center.fX, center.fY);
1295 for (
UInt_t i = 0,
e = nSlices * 2; i <
e; i += 2)
1296 glVertex2dv(&circles[i]);
1301 for (
UInt_t i = 0; i < nColors - 1; ++i) {
1302 const Double_t *
const inner = &circles[i * nSlices * 2];
1303 const auto innerRGBA = rgba + i * 4;
1304 const auto outerRGBA = rgba + (i + 1) * 4;
1305 const Double_t *
const outer = &circles[(i + 1) * nSlices * 2];
1312 glBegin(GL_QUAD_STRIP);
1313 const Double_t *
const inner = &circles[nSlices * (nColors - 1) * 2];
1314 const auto solidRGBA = rgba + (nColors - 1) * 4;
1315 const Double_t *
const outer = &circles[nSlices * nColors * 2];
1320 if (solidFillAfter) {
1321 glBegin(GL_QUAD_STRIP);
1322 const Double_t *
const inner = &circles[nSlices * nColors * 2];
1323 const auto solidRGBA = rgba + (nColors - 1) * 4;
1324 const Double_t *
const outer = &circles[nSlices * (nColors + 1) * 2];
1338 assert(grad != 0 &&
"DrawGradient, parameter 'grad' is null");
1339 assert(
n > 2 &&
"DrawGradient, invalid number of points");
1340 assert(
x != 0 &&
"DrawGradient, parameter 'x' is null");
1341 assert(
y != 0 &&
"DrawGradient, parameter 'y' is null");
1357 glMatrixMode(GL_PROJECTION);
1362 glOrtho(0., pixelW, 0., pixelH, -10., 10.);
1365 glMatrixMode(GL_MODELVIEW);
1377 start.
fX = start.
fX * w;
1378 start.
fY = start.
fY *
h;
1379 end.
fX = end.
fX * w;
1380 end.
fY = end.
fY *
h;
1382 start.
fX = start.
fX * bbox.fWidth + bbox.fXMin;
1383 start.
fY = start.
fY * bbox.fHeight + bbox.fYMin;
1384 end.
fX = end.
fX * bbox.fWidth + bbox.fXMin;
1385 end.
fY = end.
fY * bbox.fHeight + bbox.fYMin;
1392 start.
fX =
gPad->XtoPixel(start.
fX);
1393 start.
fY = pixelH -
gPad->YtoPixel(start.
fY);
1395 end.
fY = pixelH -
gPad->YtoPixel(end.
fY);
1398 const Double_t yMin = pixelH -
gPad->YtoPixel(bbox.fYMin);
1399 const Double_t yMax = pixelH -
gPad->YtoPixel(bbox.fYMax);
1409 (end.
fY - start.
fY) * (end.
fY - start.
fY));
1416 gradBoxes[0] = start.
fY -
h;
1418 gradBoxes[i] = startEndLength * colorPositions[i - 1] + start.
fY;
1425 if (end.
fX > start.
fX)
1428 glTranslated(start.
fX, start.
fY, 0.);
1429 glRotated(angle, 0., 0., 1.);
1430 glTranslated(-start.
fX, -start.
fY, 0.);
1434 const unsigned nEdges = gradBoxes.size();
1440 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1444 rgba + (nColors - 1) * 4, rgba + (nColors - 1) * 4);
1446 for (
unsigned i = 1; i < nEdges - 2; ++i)
1448 xRight, rgba + (i - 1) * 4, rgba + i * 4);
1458 assert(
n > 2 &&
"DrawTesselation, invalid number of points");
1459 assert(
x != 0 &&
"DrawTesselation, parameter 'x' is null");
1460 assert(
y != 0 &&
"DrawTesselation, parameter 'y' is null");
1465 for (
Int_t i = 0; i <
n; ++i) {
1467 fVs[i * 3 + 1] =
y[i];
1468 fVs[i * 3 + 2] = 0.;
1475 gluNextContour(t, (GLenum)GLU_UNKNOWN);
1477 for (
Int_t i = 0; i <
n; ++i)
1478 gluTessVertex(t, &
fVs[i * 3], &
fVs[i * 3]);
1487template<
class ValueType>
1488void ConvertMarkerPoints(
Int_t n,
const ValueType *
x,
const ValueType *
y, std::vector<TPoint> & dst)
1493 for (
Int_t i = 0; i <
n; ++i) {
1494 dst[i].fX =
gPad->XtoPixel(
x[i]);
1495 dst[i].fY = padH -
gPad->YtoPixel(
y[i]);
static const double x2[5]
static const double x1[5]
include TDocParser_001 C image html pict1_TDocParser_001 png width
void Error(const char *location, const char *msgfmt,...)
void Warning(const char *location, const char *msgfmt,...)
const Double_t lineWidthTS
char * Form(const char *fmt,...)
Double_t GetMaxLineWidth() const
Double_t GetMaxPointSize() const
void DrawOpenThreeTriangles(UInt_t n, const TPoint *xy) const
void DrawFullCrossX(UInt_t n, const TPoint *xy) const
void DrawFullDotSmall(UInt_t n, const TPoint *xy) const
void DrawOpenSquareDiagonal(UInt_t n, const TPoint *xy) const
void DrawOpenDoubleDiamond(UInt_t n, const TPoint *xy) const
void DrawFullFourTrianglesX(UInt_t n, const TPoint *xy) const
void DrawFullDotLarge(UInt_t n, const TPoint *xy) const
void DrawFullThreeTriangles(UInt_t n, const TPoint *xy) const
void DrawCircle(UInt_t n, const TPoint *xy) const
void DrawFullFourTrianglesPlus(UInt_t n, const TPoint *xy) const
void DrawOpenCross(UInt_t n, const TPoint *xy) const
void DrawFullCross(UInt_t n, const TPoint *xy) const
void DrawFullTrianlgeDown(UInt_t n, const TPoint *xy) const
void DrawOpenStar(UInt_t n, const TPoint *xy) const
Full star pentagone.
void DrawX(UInt_t n, const TPoint *xy) const
void DrawPlus(UInt_t n, const TPoint *xy) const
void DrawFullTrianlgeUp(UInt_t n, const TPoint *xy) const
void DrawFullSquare(UInt_t n, const TPoint *xy) const
void DrawOpenFourTrianglesPlus(UInt_t n, const TPoint *xy) const
void DrawStar(UInt_t n, const TPoint *xy) const
void DrawFullDoubleDiamond(UInt_t n, const TPoint *xy) const
void DrawOpenCrossX(UInt_t n, const TPoint *xy) const
void DrawDot(UInt_t n, const TPoint *xy) const
Simple 1-pixel dots.
void DrawOctagonCross(UInt_t n, const TPoint *xy) const
void DrawFourSquaresX(UInt_t n, const TPoint *xy) const
void DrawFourSquaresPlus(UInt_t n, const TPoint *xy) const
void DrawFullDotMedium(UInt_t n, const TPoint *xy) const
void DrawDiamond(UInt_t n, const TPoint *xy) const
void DrawFullStar(UInt_t n, const TPoint *xy) const
Full star pentagone.
void DrawOpenTrianlgeDown(UInt_t n, const TPoint *xy) const
void DrawFullDiamond(UInt_t n, const TPoint *xy) const
void DrawOpenFourTrianglesX(UInt_t n, const TPoint *xy) const
void DrawOpenDiamondCross(UInt_t n, const TPoint *xy) const
TColorGradient extends basic TColor.
const Double_t * GetColors() const
Get colors.
SizeType_t GetNumberOfSteps() const
Get number of steps.
ECoordinateMode GetCoordinateMode() const
Get coordinate mode.
const Double_t * GetColorPositions() const
Get color positions.
void RegisterFont(Int_t size, Int_t file, TGLFont::EMode mode, TGLFont &out)
Provide font with given size, file and FTGL class.
static Int_t GetExtendedFontStartIndex()
static const char * GetFontNameFromId(Int_t)
Get font name from TAttAxis font id.
static TObjArray * GetFontFileArray()
Get id to file name map.
void Render(const char *txt, Double_t x, Double_t y, Double_t angle, Double_t mgn) const
virtual void PostRender() const
Reset GL state after FTFont rendering.
virtual void PreRender(Bool_t autoLight=kTRUE, Bool_t lightOn=kFALSE) const
Set-up GL state before FTFont rendering.
"Delegating" part of TGLPadPainter.
Float_t GetTextMagnitude() const
Delegate to gVirtualX.
Color_t GetFillColor() const
Delegate to gVirtualX.
Color_t GetLineColor() const
Delegate to gVirtualX.
Font_t GetTextFont() const
Delegate to gVirtualX.
Style_t GetLineStyle() const
Delegate to gVirtualX.
void SetTextSize(Float_t tsize)
Delegate to gVirtualX.
void DrawTextNDC(Double_t x, Double_t y, const char *text, ETextMode mode)
Draw text in NDC.
void SetTextSizePixels(Int_t npixels)
Delegate to gVirtualX.
void DrawGradient(const TLinearGradient *gradient, Int_t n, const Double_t *x, const Double_t *y)
Rgl::Pad::Tesselator fTess
void DrawLineNDC(Double_t u1, Double_t v1, Double_t u2, Double_t v2)
Draw line segment in NDC coordinates.
void DrawBox(Double_t x1, Double_t y1, Double_t x2, Double_t y2, EBoxMode mode)
Draw filled or hollow box.
std::vector< TPoint > fPoly
void DrawTextHelper(Double_t x, Double_t y, const Char_t *text, ETextMode mode)
void SetLineColor(Color_t lcolor)
Delegate to gVirtualX.
Int_t CreateDrawable(UInt_t w, UInt_t h)
Not required at the moment.
void DrawPolyLineNDC(Int_t n, const Double_t *u, const Double_t *v)
Poly line in NDC.
void DrawPolyLine(Int_t n, const Double_t *x, const Double_t *y)
Draw poly-line in user coordinates.
void DrawPolygonWithGradient(Int_t n, const Double_t *x, const Double_t *y)
At the moment I assume both linear and radial gradients will work the same way - using a stencil buff...
void DrawLine(Double_t x1, Double_t y1, Double_t x2, Double_t y2)
Draw line segment.
void SetFillColor(Color_t fcolor)
Delegate to gVirtualX.
void SetTextFont(Font_t tfont)
Delegate to gVirtualX.
void SetTextAlign(Short_t align)
Delegate to gVirtualX.
Rgl::Pad::GLLimits fLimits
Float_t GetTextSize() const
Delegate to gVirtualX.
void DrawPixels(const unsigned char *pixelData, UInt_t width, UInt_t height, Int_t dstX, Int_t dstY, Bool_t enableBlending)
Rgl::Pad::PolygonStippleSet fSSet
Rgl::Pad::MarkerPainter fMarker
void SetLineStyle(Style_t lstyle)
Delegate to gVirtualX.
void DrawPolyMarker()
Poly-marker.
void SaveViewport()
Extract and save the current viewport.
Width_t GetLineWidth() const
Delegate to gVirtualX.
void LockPainter()
Locked state of painter means, that GL context can be invalid, so no GL calls can be executed.
void SetFillStyle(Style_t fstyle)
Delegate to gVirtualX.
void ClearDrawable()
Not required at the moment.
Short_t GetTextAlign() const
Delegate to gVirtualX.
Bool_t IsTransparent() const
Delegate to gVirtualX.
void SaveImage(TVirtualPad *pad, const char *fileName, Int_t type) const
Using TImage save frame-buffer contents as a picture.
void SetOpacity(Int_t percent)
Delegate to gVirtualX.
Style_t GetFillStyle() const
Delegate to gVirtualX.
void RestoreProjectionMatrix() const
Restore the projection matrix.
void SetLineWidth(Width_t lwidth)
Delegate to gVirtualX.
void SetTextColor(Color_t tcolor)
Delegate to gVirtualX.
Float_t GetTextAngle() const
Delegate to gVirtualX.
void DrawFillArea(Int_t n, const Double_t *x, const Double_t *y)
Draw tesselated polygon (probably, outline only).
void DrawText(Double_t x, Double_t y, const char *text, ETextMode mode)
Draw text.
void CopyDrawable(Int_t device, Int_t px, Int_t py)
Not required at the moment.
void DrawTesselation(Int_t n, const Double_t *x, const Double_t *y)
void SelectDrawable(Int_t device)
For gVirtualX this means select pixmap (or window) and all subsequent drawings will go into this pixm...
void InitPainter()
Init gl-pad painter:
Color_t GetTextColor() const
Delegate to gVirtualX.
void DestroyDrawable(Int_t device)
Not required at the moment.
void InvalidateCS()
When TPad::Range for gPad is called, projection must be changed in OpenGL.
void RestoreModelviewMatrix() const
Restore the modelview matrix.
std::vector< Double_t > fVs
void SaveProjectionMatrix() const
Save the projection matrix.
void SetTextAngle(Float_t tangle)
Delegate to gVirtualX.
void SaveModelviewMatrix() const
Save the modelview matrix.
void RestoreViewport()
Restore the saved viewport.
static void InitializeIfNeeded()
Initialize globals that require other libraries to be initialized.
static Float_t GetScreenScalingFactor()
Returns scaling factor between screen points and GL viewport pixels.
static TImage * Create()
Create an image.
Define a linear color gradient.
const Point & GetEnd() const
Get end.
const Point & GetStart() const
Get start.
The most important graphics class in the ROOT system.
Define a radial color gradient.
Double_t GetRadius() const
Get radius.
const Point & GetCenter() const
Get center.
EGradientType GetGradientType() const
Get gradient type.
TVirtualPad is an abstract base class for the Pad and Canvas classes.
virtual UInt_t GetWh() const =0
virtual UInt_t GetWw() const =0
virtual TCanvas * GetCanvas() const =0
BoundingRect< ValueType > FindBoundingRect(Int_t nPoints, const ValueType *xs, const ValueType *ys)
void ExtractRGBA(Color_t colorIndex, Float_t *rgba)
void DrawQuadStripWithRadialGradientFill(unsigned nPoints, const Double_t *inner, const Double_t *innerRGBA, const Double_t *outer, const Double_t *outerRGBA)
TODO: is it possible to use GLdouble to avoid problems with Double_t/GLdouble if they are not the sam...
void DrawBoxWithGradientFill(Double_t y1, Double_t y2, Double_t x1, Double_t x2, const Double_t *rgba1, const Double_t *rgba2)
Short_t Max(Short_t a, Short_t b)
Double_t Sqrt(Double_t x)
constexpr Double_t RadToDeg()
Conversion from radian to degree:
constexpr Double_t TwoPi()