30 using size_type = std::vector<TPoint>::size_type;
33 void ConvertPoints(
TVirtualPad *pad,
unsigned nPoints,
const T *xs,
const T *ys,
34 std::vector<TPoint> &dst);
36 void MergePointsX(std::vector<TPoint> &points,
unsigned nMerged,
SCoord_t yMin,
40 size_type MergePointsInplaceY(std::vector<TPoint> &dst, size_type nMerged,
SCoord_t xMin,
44 void ConvertPointsAndMergePassX(
TVirtualPad *pad,
unsigned nPoints,
const T *x,
const T *y,
45 std::vector<TPoint> &dst);
47 void ConvertPointsAndMergeInplacePassY(std::vector<TPoint> &dst);
53 void DrawPolyLineAux(
TVirtualPad *pad,
unsigned nPoints,
const T *xs,
const T *ys);
56 void DrawPolyMarkerAux(
TVirtualPad *pad,
unsigned nPoints,
const T *xs,
const T *ys);
413 ::Error(
"TPadPainter::DrawFillArea",
"invalid number of points %d", nPoints);
417 DrawFillAreaAux(
gPad, nPoints, xs, ys);
427 ::Error(
"TPadPainter::DrawFillArea",
"invalid number of points %d", nPoints);
431 DrawFillAreaAux(
gPad, nPoints, xs, ys);
442 ::Error(
"TPadPainter::DrawPolyLine",
"invalid number of points");
446 DrawPolyLineAux(
gPad, n, xs, ys);
458 ::Error(
"TPadPainter::DrawPolyLine",
"invalid number of points");
462 DrawPolyLineAux(
gPad, n, xs, ys);
474 ::Error(
"TPadPainter::DrawPolyLineNDC",
"invalid number of points %d", n);
478 std::vector<TPoint>
xy(n);
480 for (
Int_t i = 0; i <
n; ++i) {
495 ::Error(
"TPadPainter::DrawPolyMarker",
"invalid number of points %d", n);
499 DrawPolyMarkerAux(
gPad, n, x, y);
509 ::Error(
"TPadPainter::DrawPolyMarker",
"invalid number of points %d", n);
513 DrawPolyMarkerAux(
gPad, n, x, y);
571 const std::unique_ptr<unsigned char[]>
574 if (pixelData.get()) {
578 if (
unsigned char *argb = (
unsigned char *)image->
GetArgbArray()) {
580 if (
sizeof(
UInt_t) == 4) {
583 std::copy(pixelData.get(), pixelData.get() + 4 * w *
h, argb);
587 const unsigned shift = std::numeric_limits<unsigned char>::digits;
589 unsigned *dstPixel = (
unsigned *)argb, *end = dstPixel + w * h;
590 const unsigned char *srcPixel = pixelData.get();
591 for (;dstPixel != end; ++dstPixel, srcPixel += 4) {
593 *dstPixel = srcPixel[0] & (srcPixel[1] << shift) &
594 (srcPixel[2] << 2 * shift) &
595 (srcPixel[3] << 3 * shift);
640 void ConvertPoints(
TVirtualPad *pad,
unsigned nPoints,
const T *x,
const T *y,
641 std::vector<TPoint> &dst)
648 for (
unsigned i = 0; i < nPoints; ++i) {
656 inline void MergePointsX(std::vector<TPoint> &points,
unsigned nMerged,
SCoord_t yMin,
659 const auto firstPointX = points.back().fX;
660 const auto firstPointY = points.back().fY;
663 points.push_back(
TPoint(firstPointX, yLast));
664 }
else if (nMerged == 3) {
665 yMin == firstPointY ? points.push_back(
TPoint(firstPointX, yMax)) :
666 points.push_back(
TPoint(firstPointX, yMin));
667 points.push_back(
TPoint(firstPointX, yLast));
669 points.push_back(
TPoint(firstPointX, yMin));
670 points.push_back(
TPoint(firstPointX, yMax));
671 points.push_back(
TPoint(firstPointX, yLast));
678 inline size_type MergePointsInplaceY(std::vector<TPoint> &dst, size_type nMerged,
SCoord_t xMin,
681 const TPoint &firstPoint = dst[first];
684 dst[first + 1].fX = xLast;
685 dst[first + 1].fY = firstPoint.
fY;
686 }
else if (nMerged == 3) {
687 dst[first + 1].fX = xMin == firstPoint.
fX ? xMax : xMin;
688 dst[first + 1].fY = firstPoint.
fY;
689 dst[first + 2].fX = xLast;
690 dst[first + 2].fY = firstPoint.
fY;
692 dst[first + 1].fX = xMin;
693 dst[first + 1].fY = firstPoint.
fY;
694 dst[first + 2].fX = xMax;
695 dst[first + 2].fY = firstPoint.
fY;
696 dst[first + 3].fX = xLast;
697 dst[first + 3].fY = firstPoint.
fY;
710 void ConvertPointsAndMergePassX(
TVirtualPad *pad,
unsigned nPoints,
const T *x,
const T *y,
711 std::vector<TPoint> &dst)
715 SCoord_t yMin = 0, yMax = 0, yLast = 0;
716 unsigned nMerged = 0;
719 for (
unsigned i = 0; i < nPoints;) {
723 yMin = currentPoint.
fY;
726 dst.push_back(currentPoint);
730 for (
unsigned j = i + 1; j < nPoints; ++j) {
733 if (newX == currentPoint.
fX) {
740 MergePointsX(dst, nMerged, yMin, yMax, yLast);
746 if (!merged && nMerged > 1)
747 MergePointsX(dst, nMerged, yMin, yMax, yLast);
756 void ConvertPointsAndMergeInplacePassY(std::vector<TPoint> &dst)
759 for (size_type j = 1, nPoints = dst.size(); i < nPoints;) {
761 const TPoint ¤tPoint = dst[i];
768 size_type nMerged = 1;
770 for (; j < nPoints; ++j) {
771 const TPoint &nextPoint = dst[j];
773 if (nextPoint.
fY == currentPoint.
fY) {
774 xLast = nextPoint.
fX;
780 nMerged = MergePointsInplaceY(dst, nMerged, xMin, xMax, xLast, i);
786 if (!merged && nMerged > 1)
787 nMerged = MergePointsInplaceY(dst, nMerged, xMin, xMax, xLast, i);
807 void ConvertPointsAndMerge(
TVirtualPad *pad,
unsigned threshold,
unsigned nPoints,
const T *x,
808 const T *y, std::vector<TPoint> &dst)
818 dst.reserve(threshold);
820 ConvertPointsAndMergePassX(pad, nPoints, x, y, dst);
822 if (dst.size() < threshold)
825 ConvertPointsAndMergeInplacePassY(dst);
833 std::vector<TPoint>
xy;
838 if (threshold <= 0) {
840 ::Error(
"DrawFillAreaAux",
"invalid pad's geometry");
844 if (nPoints < threshold)
845 ConvertPoints(
gPad, nPoints, xs, ys, xy);
847 ConvertPointsAndMerge(
gPad, threshold, nPoints, xs, ys, xy);
851 xy.push_back(xy.front());
854 gVirtualX->DrawFillArea(xy.size(), &xy[0]);
860 void DrawPolyLineAux(
TVirtualPad *pad,
unsigned nPoints,
const T *xs,
const T *ys)
862 std::vector<TPoint>
xy;
867 if (threshold <= 0) {
868 ::Error(
"DrawPolyLineAux",
"invalid pad's geometry");
872 if (nPoints < (
unsigned)threshold)
873 ConvertPoints(pad, nPoints, xs, ys, xy);
875 ConvertPointsAndMerge(pad, threshold, nPoints, xs, ys, xy);
878 gVirtualX->DrawPolyLine(xy.size(), &xy[0]);
885 void DrawPolyMarkerAux(
TVirtualPad *pad,
unsigned nPoints,
const T *xs,
const T *ys)
887 std::vector<TPoint>
xy(nPoints);
889 for (
unsigned i = 0; i < nPoints; ++i) {
894 gVirtualX->DrawPolyMarker(nPoints, &xy[0]);
void DrawPolyMarker(Int_t n, const Double_t *x, const Double_t *y)
Paint polymarker.
void CopyDrawable(Int_t id, Int_t px, Int_t py)
Copy a gVirtualX pixmap.
Float_t GetTextMagnitude() const
Delegate to gVirtualX.
void DrawPolyLineNDC(Int_t n, const Double_t *u, const Double_t *v)
Paint polyline in normalized coordinates.
virtual void WriteImage(const char *, EImageFileTypes=TImage::kUnknown)
Float_t GetTextAngle() const
Delegate to gVirtualX.
virtual Int_t XtoPixel(Double_t x) const =0
void SetFillStyle(Style_t fstyle)
Delegate to gVirtualX.
virtual UInt_t * GetArgbArray()
virtual Double_t GetAbsWNDC() const =0
virtual Int_t YtoPixel(Double_t y) const =0
void SetLineStyle(Style_t lstyle)
Delegate to gVirtualX.
Short_t Min(Short_t a, Short_t b)
void SelectDrawable(Int_t device)
Select the window in which the graphics will go.
virtual UInt_t GetWh() const =0
Color_t GetTextColor() const
Delegate to gVirtualX.
void SetTextColor(Color_t tcolor)
Delegate to gVirtualX.
void Flush()
Flush canvas buffers.
void SetTextSizePixels(Int_t npixels)
Delegate to gVirtualX.
Style_t GetLineStyle() const
Delegate to gVirtualX.
virtual Double_t GetAbsHNDC() const =0
static const double x2[5]
void DrawFillArea(Int_t n, const Double_t *x, const Double_t *y)
Paint filled area.
virtual void DrawRectangle(UInt_t, UInt_t, UInt_t, UInt_t, const char *="#000000", UInt_t=1)
Float_t GetTextSize() const
Delegate to gVirtualX.
void DrawText(Double_t x, Double_t y, const char *text, ETextMode mode)
Paint text.
UInt_t GetWw() const
Get Ww.
TVirtualPad is an abstract base class for the Pad and Canvas classes.
void ClearDrawable()
Clear the current gVirtualX window.
void Error(const char *location, const char *msgfmt,...)
void SaveImage(TVirtualPad *pad, const char *fileName, Int_t type) const
Save the image displayed in the canvas pointed by "pad" into a binary file.
void SetFillColor(Color_t fcolor)
Delegate to gVirtualX.
void SetTextAlign(Short_t align)
Delegate to gVirtualX.
void DrawBox(Double_t x1, Double_t y1, Double_t x2, Double_t y2, EBoxMode mode)
Paint a simple box.
void SetLineWidth(Width_t lwidth)
Delegate to gVirtualX.
void DrawPixels(const unsigned char *pixelData, UInt_t width, UInt_t height, Int_t dstX, Int_t dstY, Bool_t enableAlphaBlending)
Noop, for non-gl pad TASImage calls gVirtualX->CopyArea.
void DrawLineNDC(Double_t u1, Double_t v1, Double_t u2, Double_t v2)
Paint a simple line in normalized coordinates.
void SetOpacity(Int_t percent)
Delegate to gVirtualX.
virtual UInt_t GetWw() const =0
void DestroyDrawable()
Close the current gVirtualX pixmap.
static const double x1[5]
void SetTextAngle(Float_t tangle)
Delegate to gVirtualX.
void SetTextSize(Float_t tsize)
Delegate to gVirtualX.
virtual void FromPad(TVirtualPad *, Int_t=0, Int_t=0, UInt_t=0, UInt_t=0)
Int_t CreateDrawable(UInt_t w, UInt_t h)
Create a gVirtualX Pixmap.
void SetLineColor(Color_t lcolor)
Delegate to gVirtualX.
Color_t GetFillColor() const
Delegate to gVirtualX.
Color_t GetLineColor() const
Delegate to gVirtualX.
void DrawTextNDC(Double_t u, Double_t v, const char *text, ETextMode mode)
Paint text in normalized coordinates.
void DrawLine(Double_t x1, Double_t y1, Double_t x2, Double_t y2)
Paint a simple line.
void DrawPolyLine(Int_t n, const Double_t *x, const Double_t *y)
Paint Polyline.
Int_t GetCanvasID() const
Get canvas identifier.
Short_t Max(Short_t a, Short_t b)
Width_t GetLineWidth() const
Delegate to gVirtualX.
Implement TVirtualPadPainter which abstracts painting operations.
Short_t GetTextAlign() const
Delegate to gVirtualX.
Font_t GetTextFont() const
Delegate to gVirtualX.
Style_t GetFillStyle() const
Delegate to gVirtualX.
void SetTextFont(Font_t tfont)
Delegate to gVirtualX.
UInt_t GetWh() const
Get Wh.
Bool_t IsTransparent() const
Delegate to gVirtualX.
const char Int_t const char * image
virtual TCanvas * GetCanvas() const =0