64#include "RConfigure.h"
102# include "Windows4root.h"
106# define X_DISPLAY_MISSING 1
108# include <afterbase.h>
110# define X_DISPLAY_MISSING 1
111# include <afterbase.h>
113# include <afterimage.h>
132static char *
gIconPaths[7] = {
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr};
139#if defined(__GNUC__) && __GNUC__ >= 4 && ((__GNUC_MINOR__ == 2 && __GNUC_PATCHLEVEL__ >= 1) || (__GNUC_MINOR__ >= 3)) && !__INTEL_COMPILER
140#pragma GCC diagnostic ignored "-Wstrict-aliasing"
161#define _alphaBlend(bot, top) {\
162 __argb32__ *T = (__argb32__*)(top);\
163 __argb32__ *B = (__argb32__*)(bot);\
168 B->a = ((B->a*aa)>>8) + T->a;\
169 B->r = (B->r*aa + T->r*T->a)>>8;\
170 B->g = (B->g*aa + T->g*T->a)>>8;\
171 B->b = (B->b*aa + T->b*T->a)>>8;\
247 fImage = create_asimage(
w ?
w : 20,
h ?
h : 20, 0);
260 gSystem->ExpandPathName(fname);
314 if (img.
fImage->alt.vector) {
335 if (
this != &img && img.
IsValid()) {
345 if (img.
fImage->alt.vector) {
378 TString icon_path =
gEnv->GetValue(
"Gui.IconPath",
"");
383 icon_path =
".:" + icon_path +
":" + TROOT::GetIconPath() +
":" + EXTRAICONPATH;
385 icon_path =
".;" + icon_path +
";" + TROOT::GetIconPath() +
";" + EXTRAICONPATH;
393 const char *delim =
":";
395 const char *delim =
";";
397 while (icon_path.
Tokenize(token, from, delim) && cnt < 6) {
398 char *path =
gSystem->ExpandPathName(token.
Data());
413 FILE *fp = fopen(file,
"rb");
414 const char *ret =
"";
416 if (!fp)
return nullptr;
418 if (!fread(&magic, 1, 1, fp)) {
426 if (!fread(&magic, 1, 1, fp)) {
430 if (!fread(&magic, 1, 1, fp)) {
435 ret = (magic == 1) ?
"ico" :
"cur";
440 if (!fread(&magic, 1, 1, fp)) {
447 else if (magic == 0x50)
498 Warning(
"ReadImage",
"Visual not initiated");
515 set_output_threshold(0);
517 static ASImageImportParams iparams;
521 iparams.filter = SCL_DO_ALL;
522 iparams.gamma = SCREEN_GAMMA;
523 iparams.gamma_table = NULL;
525 iparams.format = ASA_ASImage;
527 iparams.subimage = 0;
528 iparams.return_animation_delay = -1;
534 ASImage *image =
nullptr;
545 iparams.subimage = ext.
Atoi();
547 ext = strrchr(fname.
Data(),
'.') + 1;
550 image = file2ASImage_extra(fname.
Data(), &iparams);
562 unsigned char *
bitmap =
nullptr;
568 if (!handler || ((handler->
LoadPlugin() == -1))) {
587 image = bitmap2asimage(
bitmap,
w,
h, 0,
nullptr);
666 Error(
"WriteImage",
"no image in memory. Draw something first");
670 if (!file || !*file) {
671 Error(
"WriteImage",
"no file name specified");
676 if ((s = strrchr(file,
'.'))) {
680 Error(
"WriteImage",
"cannot determine a valid file type");
688 Error(
"WriteImage",
"not a valid file type was specified");
694 ASImageFileTypes atype = (ASImageFileTypes)mytype;
702 static ASImageExportParams parms;
707 parms.xpm.type = atype;
708 parms.xpm.flags = EXPORT_ALPHA;
709 parms.xpm.dither = 4;
710 parms.xpm.opaque_threshold = 127;
711 parms.xpm.max_colors = 512;
714 ASImage2bmp(im, fname.
Data(),
nullptr);
717 ASImage2xcf(im, fname.
Data(),
nullptr);
720 parms.png.type = atype;
721 parms.png.flags = EXPORT_ALPHA;
725 parms.jpeg.type = atype;
726 parms.jpeg.flags = 0;
727 parms.jpeg.quality = aquality;
730 parms.gif.type = atype;
731 parms.gif.flags = EXPORT_ALPHA;
732 parms.gif.dither = 0;
733 parms.gif.opaque_threshold = 0;
737 parms.gif.type = atype;
738 parms.gif.flags = EXPORT_ALPHA | EXPORT_APPEND;
739 parms.gif.dither = 0;
740 parms.gif.opaque_threshold = 0;
741 parms.gif.animate_repeats = 0;
754 parms.gif.flags |= EXPORT_ANIMATION_REPEATS;
755 parms.gif.animate_repeats = 0;
756 }
else if(sufix==
"") {
773 parms.gif.flags |= EXPORT_ANIMATION_REPEATS;
774 parms.gif.animate_repeats = atoi(s);
783 parms.gif.flags |= EXPORT_ANIMATION_REPEATS;
784 parms.gif.animate_repeats = 0;
785 }
else if(sLength>3 && sufix.
CountChar(
'+')==2 &&
TString(sufix(1,sLength-2)).Contains(
"++")) {
791 delay = atoi(sDelay);
792 parms.gif.flags |= EXPORT_ANIMATION_REPEATS;
793 parms.gif.animate_repeats = atoi(sRepeats);
795 Error(
"WriteImage",
"gif suffix %s not yet supported", s);
799 parms.gif.animate_delay = delay;
801 int i1 = fname.
Index(
"gif+");
803 fname = fname(0, i1 + 3);
806 Error(
"WriteImage",
"unexpected gif extension structure %s", fname.
Data());
812 parms.tiff.type = atype;
813 parms.tiff.flags = EXPORT_ALPHA;
814 parms.tiff.rows_per_strip = 0;
815 parms.tiff.compression_type = aquality <= 50 ? TIFF_COMPRESSION_JPEG :
816 TIFF_COMPRESSION_NONE;
817 parms.tiff.jpeg_quality = 100;
818 parms.tiff.opaque_threshold = 0;
821 Error(
"WriteImage",
"file type %s not yet supported", s);
825 if (!ASImage2file(im,
nullptr, fname.
Data(), atype, &parms)) {
826 Error(
"WriteImage",
"error writing file %s", file);
844 if (s ==
"jpg" || s ==
"jpeg")
883 astype = ASIT_Xpm;
break;
885 astype = ASIT_ZCompressedXpm;
break;
887 astype = ASIT_GZCompressedXpm;
break;
889 astype = ASIT_Png;
break;
891 astype = ASIT_Jpeg;
break;
893 astype = ASIT_Xcf;
break;
895 astype = ASIT_Ppm;
break;
897 astype = ASIT_Pnm;
break;
899 astype = ASIT_Bmp;
break;
901 astype = ASIT_Ico;
break;
903 astype = ASIT_Cur;
break;
905 astype = ASIT_Gif;
break;
907 astype = ASIT_Gif;
break;
909 astype = ASIT_Tiff;
break;
911 astype = ASIT_Xbm;
break;
913 astype = ASIT_Targa;
break;
915 astype = ASIT_XMLScript;
break;
917 astype = ASIT_Unknown;
923 case ASIT_ZCompressedXpm:
925 case ASIT_GZCompressedXpm:
968 asquality = 25;
break;
970 asquality = 75;
break;
972 asquality = 50;
break;
974 asquality = 100;
break;
980 if (asquality > 0 && asquality <= 25)
982 if (asquality > 26 && asquality <= 50)
984 if (asquality > 51 && asquality <= 75)
986 if (asquality > 76 && asquality <= 100)
1006 Warning(
"SetImage",
"Visual not initiated");
1023 ASVectorPalette asPalette;
1027 for (col = 0; col < 4; col++)
1028 asPalette.channels[col] =
new UShort_t[asPalette.npoints];
1035 asPalette.points =
new Double_t[asPalette.npoints];
1036 for (
Int_t point = 0; point <
Int_t(asPalette.npoints); point++)
1040 height, &asPalette, ASA_ASImage,
1043 delete [] asPalette.points;
1044 for (col = 0; col < 4; col++)
1045 delete [] asPalette.channels[col];
1089 Error(
"FromPad",
"pad cannot be 0");
1094 Warning(
"FromPad",
"Visual not initiated");
1103 if (
gROOT->IsBatch()) {
1111 if (itmp && itmp->
fImage) {
1120 if (itmp && itmp->
fImage && (itmp !=
this)) {
1122 if (itmp->
fImage->alt.argb32) {
1124 fImage->alt.argb32 = (ARGB32*)safemalloc(sz*
sizeof(ARGB32));
1125 memcpy(
fImage->alt.argb32, itmp->
fImage->alt.argb32, sz*4);
1152 static int x11 = -1;
1153 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
1158 unsigned char *bits =
gVirtualX->GetColorBits(wd, 0, 0,
w,
h);
1163 fImage = bitmap2asimage(bits,
w,
h, 0,
nullptr);
1184 Error(
"Draw",
"no image set");
1212 gPad->Range(-left / (1.0 - left - right),
1213 -bottom / (1.0 - top - bottom),
1214 1 + right / (1.0 - left - right),
1215 1 + top / ( 1.0 - top - bottom));
1216 gPad->RangeAxis(0, 0, 1, 1);
1239 wsrc = wsrc ? wsrc : im->width;
1240 hsrc = hsrc ? hsrc : im->height;
1242 static int x11 = -1;
1243 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
1250 UInt_t ww = wsrc - ow + (ow ? 8 : 0);
1257 char *bits =
new char[ww*hh];
1259 ASImageDecoder *imdec = start_image_decoding(
fgVisual, im, SCL_DO_ALPHA,
1260 xsrc, ysrc, ww, 0,
nullptr);
1262 for (yy = 0; yy < hh; yy++) {
1263 imdec->decode_image_scanline(imdec);
1264 CARD32 *
a = imdec->buffer.alpha;
1266 for (xx = 0; xx < ww; xx++) {
1281 stop_image_decoding(&imdec);
1284 (
const char *)bits, ww, hh);
1302 if (x11 && (!
gPad ||
gPad->GetGLDevice() == -1)) {
1303 asimage2drawable(
fgVisual,
wid, im, (GC)
gc, xsrc, ysrc,
x,
y, wsrc, hsrc, 1);
1305 ASImage *img =
nullptr;
1306 unsigned char *bits = (
unsigned char *)im->alt.argb32;
1308 img = tile_asimage(
fgVisual, im, xsrc, ysrc, wsrc, hsrc,
1309 0, ASA_ARGB32, 0, ASIMAGE_QUALITY_DEFAULT);
1311 bits = (
unsigned char *)img->alt.argb32;
1318 if (
gPad &&
gPad->GetGLDevice() != -1) {
1320 painter->DrawPixels(bits, wsrc, hsrc,
x,
y, !
option.Contains(
"opaque"));
1324 if (!
option.Contains(
"opaque")) {
1335 destroy_asimage(&img);
1361 xsrc, ysrc, wsrc, hsrc, opt);
1380 Error(
"Paint",
"no image set");
1385 Warning(
"Paint",
"Visual not initiated");
1389 Int_t tile_x = 0, tile_y = 0;
1390 CARD32 tile_tint = 0;
1399 if (sscanf(opt.
Data() + opt.
Index(
"t"),
"t%d,%d,%s", &tile_x, &tile_y,
1402 if (parse_argb_color(stint, (CARD32*)&tile_tint) == stint)
1405 Error(
"Paint",
"tile option error");
1413 if (!
fImage->alt.vector) {
1426 to_h = (
Int_t)(to_h * (1.0 -
gPad->GetBottomMargin() -
gPad->GetTopMargin() ) + 0.5);
1427 to_w = (
Int_t)(to_w * (1.0 -
gPad->GetLeftMargin() -
gPad->GetRightMargin() ) + 0.5);
1430 if ((to_w < 25 || to_h < 25) && !expand) {
1431 Error(
"Paint",
"pad too small to display an image");
1443 Int_t pal_Ax = to_w +
gPad->UtoAbsPixel(
gPad->GetLeftMargin()) +
1444 (
gPad->UtoAbsPixel(
gPad->GetRightMargin()) / 10);
1446 Int_t pal_x = to_w +
gPad->UtoPixel(
gPad->GetLeftMargin()) +
1447 (
gPad->UtoPixel(
gPad->GetRightMargin()) / 10);
1452 ASImage *grad_im =
nullptr;
1460 grad.type = GRADIENT_Top2Bottom;
1461 grad.color =
new ARGB32[grad.npoints];
1462 grad.offset =
new double[grad.npoints];
1465 Int_t oldPt = grad.npoints -
pt -1;
1466 grad.offset[
pt] = 1 - pal.
fPoints[oldPt];
1467 grad.color[
pt] = (((ARGB32)(pal.
fColorBlue[oldPt] & 0xff00)) >> 8) |
1469 (((ARGB32)(pal.
fColorRed[oldPt] & 0xff00)) << 8) |
1470 (((ARGB32)(pal.
fColorAlpha[oldPt] & 0xff00)) << 16);
1474 pal_h, SCL_DO_COLOR,
1477 delete [] grad.color;
1478 delete [] grad.offset;
1486 to_w, to_h, tile_tint, ASA_ASImage,
1521 destroy_asimage(&tmpImage);
1536 Error(
"Paint",
"image could not be rendered to display");
1540 int tox = expand ? 0 :
int(
gPad->UtoPixel(1.) *
gPad->GetLeftMargin());
1541 int toy = expand ? 0 :
int(
gPad->VtoPixel(0.) *
gPad->GetTopMargin());
1543 auto ps =
gPad->GetPainter()->GetPS();
1560 axis.
PaintAxis(pal_Xpos,
gPad->PixeltoY(pal_Ay + pal_h - 1),
1561 pal_Xpos,
gPad->PixeltoY(pal_Ay),
1562 min, max, ndiv,
"+LU");
1567 pal_Xpos,
gPad->AbsPixeltoY(pal_Ay + 1),
1568 min, max, ndiv,
"+L");
1575 if (ps->InheritsFrom(
"TImageDump")) {
1579 gPad->XtoAbsPixel(0),
gPad->YtoAbsPixel(1));
1584 dump->
Merge(&tgrad,
"alphablend", pal_Ax, pal_Ay);
1594 pal_Xpos,
gPad->AbsPixeltoY(pal_Ay + 1),
1595 min, max, ndiv,
"+L");
1598 }
else if (ps->InheritsFrom(
"TSVG")) {
1599 paint_as_png =
kTRUE;
1608 x2 =
x1+dx/image->width;
1610 y2 =
y1+dy/image->height;
1613 x2 =
x1+(dx*(1-
gPad->GetRightMargin()-
gPad->GetLeftMargin()))/image->width;
1615 y2 =
y1+(dy*(1-
gPad->GetTopMargin()-
gPad->GetBottomMargin()))/image->height;
1620 ps->SetFillStyle(1001);
1622 ps->CellArrayBegin(image->width, image->height,
x1,
x2,
y1,
y2);
1625 char *buffer =
nullptr;
1627 ASImageExportParams params;
1628 params.png.type = ASIT_Png;
1629 params.png.flags = EXPORT_ALPHA;
1631 if (!params.png.compression)
1632 params.png.compression = -1;
1633 if (ASImage2PNGBuff(image, (CARD8 **)&buffer, &
size, ¶ms)) {
1634 ps->CellArrayPng(buffer,
size);
1638 auto imdec = start_image_decoding(
fgVisual, image, SCL_DO_ALL,
1639 0, 0, image->width, image->height,
nullptr);
1641 for (
Int_t yt = 0; yt < (
Int_t)image->height; yt++) {
1642 imdec->decode_image_scanline(imdec);
1643 for (
Int_t xt = 0; xt < (
Int_t)image->width; xt++)
1644 ps->CellArrayFill(imdec->buffer.red[xt],
1645 imdec->buffer.green[xt],
1646 imdec->buffer.blue[xt]);
1648 stop_image_decoding(&imdec);
1654 Double_t xconv = (
gPad->AbsPixeltoX(pal_Ax + pal_w) -
gPad->AbsPixeltoX(pal_Ax)) / grad_im->width;
1655 Double_t yconv = (
gPad->AbsPixeltoY(pal_Ay - pal_h) -
gPad->AbsPixeltoY(pal_Ay)) / grad_im->height;
1656 x1 =
gPad->AbsPixeltoX(pal_Ax);
1658 y2 =
gPad->AbsPixeltoY(pal_Ay);
1660 ps->CellArrayBegin(grad_im->width, grad_im->height,
1664 char *buffer =
nullptr;
1666 ASImageExportParams params;
1667 params.png.type = ASIT_Png;
1668 params.png.flags = EXPORT_ALPHA;
1670 if (!params.png.compression)
1671 params.png.compression = -1;
1673 if (ASImage2PNGBuff(grad_im, (CARD8 **)&buffer, &
size, ¶ms)) {
1674 ps->CellArrayPng(buffer,
size);
1678 auto imdec = start_image_decoding(
fgVisual, grad_im, SCL_DO_ALL,
1679 0, 0, grad_im->width, grad_im->height,
nullptr);
1681 for (
Int_t yt = 0; yt < (
Int_t)grad_im->height; yt++) {
1682 imdec->decode_image_scanline(imdec);
1683 for (
Int_t xt = 0; xt < (
Int_t)grad_im->width; xt++)
1684 ps->CellArrayFill(imdec->buffer.red[xt],
1685 imdec->buffer.green[xt],
1686 imdec->buffer.blue[xt]);
1688 stop_image_decoding(&imdec);
1701 pal_Xpos,
gPad->AbsPixeltoY(pal_Ay + 1),
1702 min, max, ndiv,
"+L");
1708 destroy_asimage(&grad_im);
1717 Int_t pxl, pyl, pxt, pyt;
1724 if (px1 < px2) {pxl = px1; pxt = px2;}
1725 else {pxl = px2; pxt = px1;}
1726 if (py1 < py2) {pyl = py1; pyt = py2;}
1727 else {pyl = py2; pyt = py1;}
1729 if ((px > pxl && px < pxt) && (py > pyl && py < pyt))
1740 static std::unique_ptr<TBox> ZoomBox;
1745 gPad->ExecuteEvent(event, px, py);
1751 static Int_t px1old, py1old, px2old, py2old;
1752 static Int_t px1, py1, px2, py2, pxl, pyl, pxt, pyt;
1763 if (imgX < 0) px = px - imgX;
1764 if (imgY < 0) py = py - imgY;
1769 if (imgX >= (
int)image->width) px = px - imgX + image->width - 1;
1770 if (imgY >= (
int)image->height) py = py - imgY + image->height - 1;
1775 px1 =
gPad->XtoAbsPixel(
gPad->GetX1());
1776 py1 =
gPad->YtoAbsPixel(
gPad->GetY1());
1777 px2 =
gPad->XtoAbsPixel(
gPad->GetX2());
1778 py2 =
gPad->YtoAbsPixel(
gPad->GetY2());
1779 px1old = px; py1old = py;
1795 ZoomBox->SetX1(
gPad->AbsPixeltoX(pxl));
1796 ZoomBox->SetY1(
gPad->AbsPixeltoY(pyl));
1797 ZoomBox->SetX2(
gPad->AbsPixeltoX(pxt));
1798 ZoomBox->SetY2(
gPad->AbsPixeltoY(pyt));
1800 ZoomBox = std::make_unique<TBox>(pxl, pyl, pxt, pyt);
1801 ZoomBox->SetFillStyle(0);
1802 ZoomBox->Draw(
"l*");
1821 Int_t imgX1 = px1old -
gPad->XtoAbsPixel(0);
1822 Int_t imgY1 = py1old -
gPad->YtoAbsPixel(1);
1823 Int_t imgX2 = px -
gPad->XtoAbsPixel(0);
1824 Int_t imgY2 = py -
gPad->YtoAbsPixel(1);
1826 imgY1 = image->height - 1 - imgY1;
1827 imgY2 = image->height - 1 - imgY2;
1833 Zoom((imgX1 < imgX2) ? imgX1 : imgX2, (imgY1 < imgY2) ? imgY1 : imgY2,
1851 static char info[64];
1857 px -=
gPad->XtoAbsPixel(0);
1858 py -=
gPad->YtoAbsPixel(1);
1861 if (px < 0 || py < 0)
return info;
1865 if (px >= (
int)image->width || py >= (
int)image->height)
1868 py = image->height - 1 - py;
1875 if (
fImage->alt.vector) {
1876 snprintf(info,64,
"x: %d y: %d %.5g",
1879 snprintf(info,64,
"x: %d y: %d", px, py);
1895 Warning(
"SetPalette",
"Visual not initiated");
1900 Warning(
"SetPalette",
"Image not valid");
1910 ASVectorPalette asPalette;
1912 asPalette.channels[0] =
new CARD16 [asPalette.npoints];
1913 asPalette.channels[1] =
new CARD16 [asPalette.npoints];
1914 asPalette.channels[2] =
new CARD16 [asPalette.npoints];
1915 asPalette.channels[3] =
new CARD16 [asPalette.npoints];
1921 asPalette.points =
new double[asPalette.npoints];
1922 for (
Int_t point = 0; point <
Int_t(asPalette.npoints); point++)
1928 delete [] asPalette.points;
1929 for (
Int_t col = 0; col < 4; col++)
1930 delete [] asPalette.channels[col];
1947 Warning(
"Scale",
"Image not initiated");
1952 Warning(
"Scale",
"Visual not initiated");
1960 if (toWidth > 30000)
1962 if (toHeight > 30000)
1965 ASImage *img = scale_asimage(
fgVisual,
fImage, toWidth, toHeight,
1982 Warning(
"Slice",
"Image not initiated");
1987 Warning(
"Slice",
"Visual not initiated");
1995 if (toWidth > 30000)
1997 if (toHeight > 30000)
2001 yStart, yEnd, toWidth, toHeight,
2017 Warning(
"Tile",
"Image not initiated");
2022 Warning(
"Tile",
"Visual not initiated");
2030 if (toWidth > 30000)
2032 if (toHeight > 30000)
2035 ASImage *img = tile_asimage(
fgVisual,
fImage, 0, 0, toWidth, toHeight, 0,
2057 Warning(
"Zoom",
"Image not valid");
2079 Warning(
"UnZoom",
"Image not valid");
2106 Warning(
"Flip",
"Image not valid");
2110 Warning(
"Flip",
"Visual not initiated");
2114 if (
fImage->alt.vector) {
2115 Warning(
"Flip",
"flip does not work for data images");
2119 Int_t rflip = flip/90;
2153 Warning(
"Mirror",
"Image not valid");
2158 Warning(
"Mirror",
"Visual not initiated");
2162 if (
fImage->alt.vector) {
2163 Warning(
"Mirror",
"mirror does not work for data images");
2239 Display *disp = (Display*)
gVirtualX->GetDisplay();
2245 static ASVisual *vis_x =
nullptr;
2247 if (vis &&
cmap && !noX) {
2249 vis_x = create_asvisual_for_id(disp, screen, depth,
2250 XVisualIDFromVisual(vis),
cmap,
nullptr);
2256 static ASVisual *vis_batch =
nullptr;
2261 vis_batch = create_asvisual(
nullptr, 0, 0,
nullptr);
2262 vis_batch->dpy =
nullptr;
2277 Warning(caller,
"Visual not initiated");
2286 if (!
fImage->alt.argb32) {
2290 if (!
fImage->alt.argb32) {
2291 Warning(caller,
"Failed to get argb32 pixel array");
2303 Warning(
"StartPaletteEditor",
"Image not valid");
2306 if (!
fImage->alt.vector) {
2307 Warning(
"StartPaletteEditor",
"palette can be modified only for data images");
2322 Warning(
"GetPixmap",
"Visual not initiated");
2330 static int x11 = -1;
2331 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
2335 img,
nullptr,
kTRUE);
2337 if (!
fImage->alt.argb32) {
2340 ret =
gVirtualX->CreatePixmapFromData((
unsigned char*)
fImage->alt.argb32,
2356 Warning(
"GetMask",
"Visual not initiated");
2363 Warning(
"GetMask",
"No image");
2368 UInt_t ow = img->width%8;
2369 UInt_t ww = img->width - ow + (ow ? 8 : 0);
2371 ASImageDecoder *imdec = start_image_decoding(
fgVisual, img, SCL_DO_ALPHA,
2372 0, 0, ww, 0,
nullptr);
2376 std::vector<char> bits(ww * hh / 8);
2380 imdec->decode_image_scanline(imdec);
2381 CARD32 *
a = imdec->buffer.alpha;
2396 stop_image_decoding(&imdec);
2397 pxmap =
gVirtualX->CreateBitmap(
gVirtualX->GetDefaultRootWindow(), bits.data(), ww, hh);
2407 Warning(
"SetImage",
"Visual not initiated");
2420 static int x11 = -1;
2421 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
2433 fImage = bitmap2asimage(bits,
w,
h, 0,
nullptr);
2438 fImage = bitmap2asimage(bits,
w,
h, 0, mask_bits);
2439 delete [] mask_bits;
2450 Warning(
"GetPixels",
"Wrong Image");
2455 ASImageDecoder *imdec;
2469 if ((
x >= (
int)img->width) || (
y >= (
int)img->height)) {
2473 if ((
int)(
x +
width) > (
int)img->width) {
2477 if ((
int)(
y +
height) > (
int)img->height) {
2481 if ((imdec = start_image_decoding(
nullptr,
fImage, SCL_DO_ALL, 0,
y,
2482 img->width,
height,
nullptr)) ==
nullptr) {
2483 Warning(
"GetPixels",
"Failed to create image decoder");
2492 imdec->decode_image_scanline(imdec);
2495 if ((
r == (
Int_t)imdec->buffer.red[i]) &&
2496 (
g == (
Int_t)imdec->buffer.green[i]) &&
2497 (
b == (
Int_t)imdec->buffer.blue[i])) {
2499 r = (
Int_t)imdec->buffer.red[i];
2500 g = (
Int_t)imdec->buffer.green[i];
2501 b = (
Int_t)imdec->buffer.blue[i];
2508 stop_image_decoding(&imdec);
2520 Warning(
"GetVecArray",
"Bad Image");
2523 if (
fImage->alt.vector) {
2524 return fImage->alt.vector;
2542 Warning(
"GetArray",
"Bad Image");
2548 if (
fImage->alt.vector) {
2553 ASImageDecoder *imdec;
2564 if ((imdec = start_image_decoding(
nullptr, img, SCL_DO_ALL, 0, 0,
2565 img->width, 0,
nullptr)) ==
nullptr) {
2566 Warning(
"GetArray",
"Failed to create image decoder");
2571 CARD32
r = 0,
g = 0,
b = 0;
2575 for (
UInt_t k = 0; k <
h; k++) {
2576 imdec->decode_image_scanline(imdec);
2578 for (
UInt_t i = 0; i <
w; ++i) {
2579 if ((
r == imdec->buffer.red[i]) &&
2580 (
g == imdec->buffer.green[i]) &&
2581 (
b == imdec->buffer.blue[i])) {
2583 r = imdec->buffer.red[i];
2584 g = imdec->buffer.green[i];
2585 b = imdec->buffer.blue[i];
2593 stop_image_decoding(&imdec);
2616 const char *color,
const char *font_name,
2620 ARGB32 text_color = ARGB32_Black;
2621 ASImage *fore_im =
nullptr;
2622 ASImage *text_im =
nullptr;
2633 if (fn.
Last(
'/') == 0)
2634 fn = fn(1, fn.
Length() - 1);
2636 const char *ttpath =
gEnv->GetValue(
"Root.TTFontPath",
2637 TROOT::GetTTFFontDir());
2646 parse_argb_color(color, &text_color);
2659 Warning(
"DrawText",
"cannot create Font Manager");
2668 Warning(
"DrawText",
"cannot find a font %s", font_name);
2680 text_im = draw_text(
text, font, (ASText3DType)
type, 0);
2685 ASImage *tmp = file2ASImage(fore_file, 0xFFFFFFFF, SCREEN_GAMMA, 0, 0);
2687 if ((tmp->width !=
width) || (tmp->height !=
height)) {
2691 destroy_asimage(&tmp);
2698 move_asimage_channel(fore_im, IC_ALPHA, text_im, IC_ALPHA);
2699 destroy_asimage(&text_im);
2707 ASImage *rendered_im;
2708 ASImageLayer layers[2];
2710 init_image_layers(&(layers[0]), 2);
2711 fore_im->back_color = text_color;
2712 layers[0].im = rimg;
2713 layers[0].dst_x = 0;
2714 layers[0].dst_y = 0;
2715 layers[0].clip_width = rimg->width;
2716 layers[0].clip_height = rimg->height;
2717 layers[0].bevel =
nullptr;
2718 layers[1].im = fore_im;
2719 layers[1].dst_x =
x;
2720 layers[1].dst_y =
y;
2721 layers[1].clip_width = fore_im->width;
2722 layers[1].clip_height = fore_im->height;
2724 rendered_im = merge_layers(
fgVisual, &(layers[0]), 2, rimg->width, rimg->height,
2727 destroy_asimage(&fore_im);
2760 Warning(
"Merge",
"Visual not initiated");
2764 ASImage *rendered_im;
2765 ASImageLayer layers[2];
2767 init_image_layers(&(layers[0]), 2);
2769 layers[0].dst_x = 0;
2770 layers[0].dst_y = 0;
2771 layers[0].clip_width =
fImage->width;
2772 layers[0].clip_height =
fImage->height;
2773 layers[0].bevel =
nullptr;
2774 layers[1].im = ((
TASImage*)im)->fImage;
2775 layers[1].dst_x =
x;
2776 layers[1].dst_y =
y;
2777 layers[1].clip_width = im->
GetWidth();
2778 layers[1].clip_height = im->
GetHeight();
2779 layers[1].merge_scanlines = blend_scanlines_name2func(op ? op :
"add");
2797 Warning(
"Blur",
"Visual not initiated");
2802 fImage = create_asimage(100, 100, 0);
2805 Warning(
"Blur",
"Failed to create image");
2812 ASImage *rendered_im = blur_asimage_gauss(
fgVisual,
fImage, hr > 0 ? hr : 3,
2813 vr > 0 ? vr : 3, SCL_DO_ALL,
2826 Warning(
"Clone",
"Image not initiated");
2833 Warning(
"Clone",
"Failed to create image");
2849 if (
fImage->alt.argb32) {
2851 im->
fImage->alt.argb32 = (ARGB32*)safemalloc(sz*
sizeof(ARGB32));
2852 memcpy(im->
fImage->alt.argb32,
fImage->alt.argb32, sz *
sizeof(ARGB32));
2872 Warning(
"Vectorize",
"Visual not initiated");
2877 fImage = create_asimage(100, 100, 0);
2880 Warning(
"Vectorize",
"Failed to create image");
2891 dither = dither > 7 ? 7 : dither;
2893 res = colormap_asimage(
fImage, &
cmap, max_colors, dither, opaque_threshold);
2905 g = INDEX_SHIFT_GREEN(
cmap.entries[res[i]].green);
2906 b = INDEX_SHIFT_BLUE(
cmap.entries[res[i]].blue);
2907 r = INDEX_SHIFT_RED(
cmap.entries[res[i]].red);
2909 v = MAKE_INDEXED_COLOR24(
r,
g,
b);
2920 g = INDEX_SHIFT_GREEN(
cmap.entries[j].green);
2921 b = INDEX_SHIFT_BLUE(
cmap.entries[j].blue);
2922 r = INDEX_SHIFT_RED(
cmap.entries[j].red);
2923 v = MAKE_INDEXED_COLOR24(
r,
g,
b);
2925 v = (
v>>12) & 0x0FFF;
2940 if (res) safefree(res);
2986 Warning(
"HSV",
"Visual not initiated");
2994 Warning(
"HSV",
"Failed to create image");
3006 ASImage *rendered_im =
nullptr;
3010 hue, radius,
H, S, V, ASA_ASImage, 100,
3011 ASIMAGE_QUALITY_TOP);
3014 Warning(
"HSV",
"Failed to create rendered image");
3052 Warning(
"Gradient",
"Visual not initiated");
3056 ASImage *rendered_im =
nullptr;
3057 ASGradient gradient;
3059 int reverse = 0, npoints1 = 0, npoints2 = 0;
3066 if ((
angle > 2 * 180 * 15 / 16) || (
angle < 2 * 180 * 1 / 16)) {
3067 gradient.type = GRADIENT_Left2Right;
3068 }
else if (
angle < 2 * 180 * 3 / 16) {
3069 gradient.type = GRADIENT_TopLeft2BottomRight;
3070 }
else if (
angle < 2 * 180 * 5 / 16) {
3071 gradient.type = GRADIENT_Top2Bottom;
3072 }
else if (
angle < 2 * 180 * 7 / 16) {
3073 gradient.type = GRADIENT_BottomLeft2TopRight; reverse = 1;
3074 }
else if (
angle < 2 * 180 * 9 / 16) {
3075 gradient.type = GRADIENT_Left2Right; reverse = 1;
3076 }
else if (
angle < 2 * 180 * 11 / 16) {
3077 gradient.type = GRADIENT_TopLeft2BottomRight; reverse = 1;
3078 }
else if (
angle < 2 * 180 * 13 / 16) {
3079 gradient.type = GRADIENT_Top2Bottom; reverse = 1;
3081 gradient.type = GRADIENT_BottomLeft2TopRight;
3084 for (p = (
char*)
colors; isspace((
int)*p); p++) { }
3086 for (npoints1 = 0; *p; npoints1++) {
3088 for ( ; *p && !isspace((
int)*p); p++) { }
3090 for ( ; isspace((
int)*p); p++) { }
3093 for (p = (
char*)offsets; isspace((
int)*p); p++) { }
3095 for (npoints2 = 0; *p; npoints2++) {
3097 for ( ; *p && !isspace((
int)*p); p++) { }
3099 for ( ; isspace((
int)*p); p++) { }
3104 if (offsets && (npoints1 > npoints2)) npoints1 = npoints2;
3113 gradient.color =
new ARGB32[npoints1];
3114 gradient.offset =
new double[npoints1];
3116 for (p = (
char*)
colors; isspace((
int)*p); p++) { }
3118 for (npoints1 = 0; *p; ) {
3122 for ( ; *p && !isspace((
int)*p); p++) { }
3124 for ( ; isspace((
int)*p); p++) { }
3126 col = str(pb -
colors, p - pb);
3128 if (parse_argb_color(col.
Data(), gradient.color + npoints1) != col) {
3131 Warning(
"Gradient",
"Failed to parse color [%s] - defaulting to black", pb);
3136 for (p = (
char*)offsets; isspace((
int)*p); p++) { }
3138 for (npoints2 = 0; *p; ) {
3142 for ( ; *p && !isspace((
int)*p); p++) { }
3145 gradient.offset[npoints2] = strtod(pb, &pb);
3147 if (pb == p) npoints2++;
3149 for ( ; isspace((
int)*p); p++) { }
3152 for (npoints2 = 0; npoints2 < npoints1; npoints2++) {
3153 gradient.offset[npoints2] = (
double)npoints2 / (npoints1 - 1);
3156 gradient.npoints = npoints1;
3158 if (npoints2 && (gradient.npoints > npoints2)) {
3159 gradient.npoints = npoints2;
3162 for (i = 0; i < gradient.npoints/2; i++) {
3163 int i2 = gradient.npoints - 1 - i;
3164 ARGB32
c = gradient.color[i];
3165 double o = gradient.offset[i];
3166 gradient.color[i] = gradient.color[i2];
3167 gradient.color[i2] =
c;
3168 gradient.offset[i] = gradient.offset[i2];
3169 gradient.offset[i2] = o;
3171 for (i = 0; i < gradient.npoints; i++) {
3172 gradient.offset[i] = 1.0 - gradient.offset[i];
3178 delete [] gradient.color;
3179 delete [] gradient.offset;
3183 Warning(
"Gradient",
"Failed to create gradient image");
3192 ASImageLayer layers[2];
3194 init_image_layers(&(layers[0]), 2);
3196 layers[0].dst_x = 0;
3197 layers[0].dst_y = 0;
3198 layers[0].clip_width =
fImage->width;
3199 layers[0].clip_height =
fImage->height;
3200 layers[0].bevel =
nullptr;
3201 layers[1].im = rendered_im;
3202 layers[1].dst_x =
x;
3203 layers[1].dst_y =
y;
3204 layers[1].clip_width =
width;
3205 layers[1].clip_height =
height;
3206 layers[1].merge_scanlines = alphablend_scanlines;
3211 Warning(
"Gradient",
"Failed to create merged image");
3215 destroy_asimage(&rendered_im);
3230 cmp = (cmp * 12) / 10;
3232 return (cmp > 255) ? 255 : cmp;
3253 return (background >> 1) & 0x7F7F7F7F;
3264 a = ARGB32_ALPHA8(
foreground) + ARGB32_ALPHA8(background);
3266 r = ARGB32_RED8(
foreground) + ARGB32_RED8(background);
3268 g = ARGB32_GREEN8(
foreground) + ARGB32_GREEN8(background);
3270 b = ARGB32_BLUE8(
foreground) + ARGB32_BLUE8(background);
3273 return MAKE_ARGB32(
a,
r,
g,
b);
3289 const char *hi_color,
const char *lo_color,
UShort_t thick,
3293 Warning(
"Bevel",
"Visual not initiated");
3300 ARGB32
hi=ARGB32_White, lo=ARGB32_White;
3301 parse_argb_color(hi_color, &
hi);
3302 parse_argb_color(lo_color, &lo);
3305 bevel.lo_color =
hi;
3307 bevel.hi_color = lo;
3310 bevel.hi_color =
hi;
3312 bevel.lo_color = lo;
3317 int extra_hilite = 2;
3318 bevel.left_outline = bevel.top_outline = bevel.right_outline = bevel.bottom_outline = thick;
3319 bevel.left_inline = bevel.top_inline = bevel.right_inline = bevel.bottom_inline = extra_hilite + 1;
3321 if (bevel.top_outline > 1) {
3322 bevel.top_inline += bevel.top_outline - 1;
3325 if (bevel.left_outline > 1) {
3326 bevel.left_inline += bevel.left_outline - 1;
3329 if (bevel.right_outline > 1) {
3330 bevel.right_inline += bevel.right_outline - 1;
3333 if (bevel.bottom_outline > 1) {
3334 bevel.bottom_inline += bevel.bottom_outline - 1;
3338 ARGB32 fill = ((
hi>>24) != 0xff) || ((lo>>24) != 0xff) ? bevel.hilo_color : (bevel.hilo_color | 0xff000000);
3344 Warning(
"Bevel",
"Failed to create image");
3356 ASImageLayer layers[2];
3357 init_image_layers(&(layers[0]), 2);
3360 layers[0].dst_x = 0;
3361 layers[0].dst_y = 0;
3362 layers[0].clip_width =
fImage->width;
3363 layers[0].clip_height =
fImage->height;
3364 layers[0].bevel =
nullptr;
3366 UInt_t w =
width - (bevel.left_outline + bevel.right_outline);
3367 UInt_t h =
height - (bevel.top_outline + bevel.bottom_outline);
3368 ASImage *bevel_im = create_asimage(
w,
h, 0);
3371 Warning(
"Bevel",
"Failed to create bevel image");
3375 layers[1].im = bevel_im;
3376 fill_asimage(
fgVisual, bevel_im, 0, 0,
w,
h, fill);
3378 layers[1].dst_x =
x;
3379 layers[1].dst_y =
y;
3380 layers[1].clip_width =
width;
3381 layers[1].clip_height =
height;
3382 layers[1].bevel = &bevel;
3383 layers[1].merge_scanlines = alphablend_scanlines;
3387 destroy_asimage(&bevel_im);
3390 Warning(
"Bevel",
"Failed to image");
3410 Warning(
"Pad",
"Visual not initiated");
3415 fImage = create_asimage(100, 100, 0);
3418 Warning(
"Pad",
"Failed to create image");
3425 ARGB32 color = ARGB32_White;
3426 parse_argb_color(col, &color);
3437 Warning(
"Pad",
"Failed to create output image");
3454 Warning(
"Crop",
"Visual not initiated");
3470 Warning(
"Crop",
"input size larger than image");
3473 ASImageDecoder *imdec = start_image_decoding(
fgVisual,
fImage, SCL_DO_ALL,
3477 Warning(
"Crop",
"Failed to start image decoding");
3485 Warning(
"Crop",
"Failed to create image");
3489 ASImageOutput *imout = start_image_output(
fgVisual, img, ASA_ASImage,
3493 Warning(
"Crop",
"Failed to start image output");
3494 destroy_asimage(&img);
3495 if (imdec)
delete [] imdec;
3504 imdec->decode_image_scanline(imdec);
3505 imout->output_image_scanline(imout, &(imdec->buffer), 1);
3508 stop_image_decoding(&imdec);
3509 stop_image_output(&imout);
3533 Warning(
"Append",
"Visual not initiated");
3551 }
else if (opt ==
"/") {
3572 Warning(
"BeginPaint",
"Visual not initiated");
3587 0, ASA_ARGB32, 0, ASIMAGE_QUALITY_DEFAULT);
3590 Warning(
"BeginPaint",
"Failed to create image");
3604 Warning(
"EndPaint",
"no image");
3608 if (!
fImage->alt.argb32)
return;
3611 0, ASA_ASImage, 0, ASIMAGE_QUALITY_DEFAULT);
3614 Warning(
"EndPaint",
"Failed to create image");
3631 Warning(
"GetArgbArray",
"no image");
3636 if (!img)
return nullptr;
3638 if (!img->alt.argb32) {
3648 return (
UInt_t *)img->alt.argb32;
3659 Warning(
"GetRgbaArray",
"no image");
3664 if (!img)
return nullptr;
3666 if (!img->alt.argb32) {
3683 for (i = 0; i < img->height; i++) {
3684 for (j = 0; j < img->width; j++) {
3686 argb = img->alt.argb32[idx];
3688 rgb = argb & 0x00ffffff;
3689 rgba = (rgb << 8) +
a;
3704 Warning(
"GetScanline",
"no image");
3709 CARD32 *ret =
new CARD32[img->width];
3711 ASImageDecoder *imdec = start_image_decoding(
fgVisual, img, SCL_DO_ALL,
3712 0,
y, img->width, 1,
nullptr);
3716 Warning(
"GetScanline",
"Failed to start image decoding");
3724 imdec->decode_image_scanline(imdec);
3725 memcpy(imdec->buffer.buffer, ret, img->width*
sizeof(CARD32));
3726 stop_image_decoding(&imdec);
3741#if defined(R__GNU) && defined(__i386__) && !defined(__sun)
3742#define _MEMSET_(dst, lng, val) __asm__("movl %0,%%eax \n"\
3743 "movl %1,%%edi \n" \
3744 "movl %2,%%ecx \n" \
3749 :"g" (val), "g" (dst), "g" (lng) \
3750 :"eax","edi","ecx" \
3754 #define _MEMSET_(dst, lng, val) do {\
3755 for( UInt_t j=0; j < lng; j++) *((dst)+j) = val; } while (0)
3759#define FillSpansInternal(npt, ppt, widths, color) do {\
3760 UInt_t yy = ppt[0].fY*fImage->width;\
3761 for (UInt_t i = 0; i < npt; i++) {\
3762 _MEMSET_(&fImage->alt.argb32[Idx(yy + ppt[i].fX)], widths[i], color);\
3763 yy += ((i+1 < npt) && (ppt[i].fY != ppt[i+1].fY) ? fImage->width : 0);\
3774 if (!
InitImage(
"FillRectangleInternal")) {
3778 ARGB32 color = (ARGB32)col;
3792 Bool_t has_alpha = (color & 0xff000000) != 0xff000000;
3800 if (!
fImage->alt.argb32) {
3805 ARGB32 *p0 =
fImage->alt.argb32 + yyy +
x;
3837 Warning(
"FillRectangle",
"Visual not initiated");
3841 ARGB32 color = ARGB32_White;
3844 parse_argb_color(col, &color);
3866 ARGB32 color = (ARGB32)col;
3869 if (!thick) thick = 1;
3877 thick += (
x - half);
3905 ARGB32 color = (ARGB32)col;
3908 if (!thick) thick = 1;
3916 thick += (
y - half);
3939 const char *col,
UInt_t thick)
3941 ARGB32 color = ARGB32_White;
3942 parse_argb_color(col, &color);
3954 int x,
y, xend, yend;
3964 ARGB32 color = (ARGB32)col;
3969 if (!dx && !dy)
return;
3991 i2 = i1 - (dx << 1);
4008 q = (
y2 -
y1) * ydir;
4041 i2 = i1 - (dy << 1);
4058 q = (
x2 -
x1) * xdir;
4096 const char *col,
UInt_t thick)
4099 Warning(
"DrawRectangle",
"Visual not initiated");
4111 if (!
fImage->alt.argb32) {
4115 if (!
fImage->alt.argb32) {
4116 Warning(
"DrawRectangle",
"Failed to get argb32 pixel array");
4120 ARGB32 color = ARGB32_White;
4121 parse_argb_color(col, &color);
4141 ARGB32 color = ARGB32_White;
4152 parse_argb_color(col, &color);
4158 parse_argb_color(col, &color);
4192 ARGB32 color = (ARGB32)col;
4202 thick += (
y - half);
4205 thick = thick <= 0 ? 1 : thick;
4214 x2 =
x2 < tmp ? tmp :
x2;
4226 if (i >= pDash[iDash]) {
4230 if (iDash >= nDash) {
4249 ARGB32 color = (ARGB32)col;
4259 thick += (
x - half);
4262 thick = thick <= 0 ? 1 : thick;
4270 y2 =
y2 < tmp ? tmp :
y2;
4285 if (i >= pDash[iDash]) {
4289 if (iDash >= nDash) {
4308 int x,
y, xend, yend;
4318 char *pDash =
new char[nDash];
4323 for (i = 0; i < (
int)nDash; i++) {
4329 i2 = i1 - (dx << 1);
4347 q = (
y2 -
y1) * ydir;
4352 if ((iDash%2) == 0) {
4364 if (i >= pDash[iDash]) {
4368 if (iDash >= nDash) {
4376 if ((iDash%2) == 0) {
4388 if (i >= pDash[iDash]) {
4392 if (iDash >= nDash) {
4401 for (i = 0; i < (
int)nDash; i++) {
4407 i2 = i1 - (dy << 1);
4425 q = (
x2 -
x1) * xdir;
4430 if ((iDash%2) == 0) {
4444 if (i >= pDash[iDash]) {
4448 if (iDash >= nDash) {
4456 if ((iDash%2) == 0) {
4470 if (i >= pDash[iDash]) {
4474 if (iDash >= nDash) {
4495 double x,
y, xend=0, yend=0, x0, y0;
4503 double *xDash =
new double[nDash];
4504 double *yDash =
new double[nDash];
4509 for (i = 0; i < (
int)nDash; i++) {
4510 xDash[i] = tDash[i] * ac;
4511 yDash[i] = tDash[i] * as;
4515 xDash[i] = xDash[i]/2;
4516 yDash[i] = yDash[i]/2;
4518 xDash[i] = xDash[i]*2;
4519 yDash[i] = yDash[i]*2;
4536 q = (
y2 -
y1) * ydir;
4543 while ((
x < xend) && (
y < yend)) {
4547 if ((iDash%2) == 0) {
4557 if (iDash >= nDash) {
4562 while ((
x < xend) && (
y > yend)) {
4566 if ((iDash%2) == 0) {
4576 if (iDash >= nDash) {
4595 q = (
x2 -
x1) * xdir;
4602 while ((
x < xend) && (
y < yend)) {
4606 if ((iDash%2) == 0) {
4616 if (iDash >= nDash) {
4621 while ((
x > xend) && (
y < yend)) {
4625 if ((iDash%2) == 0) {
4635 if (iDash >= nDash) {
4649 const char *pDash,
const char *col,
UInt_t thick)
4656 if ((nDash < 2) || !pDash || (nDash%2)) {
4657 Warning(
"DrawDashLine",
"Wrong input parameters n=%d %ld", nDash, (
Long_t)
sizeof(pDash)-1);
4661 ARGB32 color = ARGB32_White;
4662 parse_argb_color(col, &color);
4666 }
else if (
y1 ==
y2) {
4680 ARGB32 color = ARGB32_White;
4681 parse_argb_color(col, &color);
4688 for (
UInt_t i = 1; i < nn; i++) {
4709 parse_argb_color(col, &color);
4711 if ((
x < 0) || (
y < 0) || (
x >= (
int)
fImage->width) || (
y >= (
int)
fImage->height)) {
4712 Warning(
"PutPixel",
"Out of range width=%d x=%d, height=%d y=%d",
4729 Warning(
"PolyPoint",
"No points specified");
4736 parse_argb_color(col, &color);
4742 for (i = 0; i < npt; i++) {
4743 ipt[i].
fX += ppt[i].
fX;
4744 ipt[i].
fY += ppt[i].
fY;
4749 for (i = 0; i < npt; i++) {
4750 x = ipt ? ipt[i].
fX : ppt[i].
fX;
4751 y = ipt ? ipt[i].
fY : ppt[i].
fY;
4753 if ((
x < 0) || (
y < 0) || (
x >= (
int)
fImage->width) || (
y >= (
int)
fImage->height)) {
4769 if (!nseg || !seg) {
4770 Warning(
"DrawSegments",
"Invalid data nseg=%d seg=0x%zx", nseg, (
size_t)seg);
4776 for (
UInt_t i = 0; i < nseg; i++) {
4777 pt[0].fX = seg->
fX1;
4778 pt[1].fX = seg->
fX2;
4779 pt[0].fY = seg->
fY1;
4780 pt[1].fY = seg->
fY2;
4797 if (!npt || !ppt || !widths || (stipple && (!
w || !
h))) {
4798 Warning(
"FillSpans",
"Invalid input data npt=%d ppt=0x%zx col=%s widths=0x%zx stipple=0x%zx w=%d h=%d",
4799 npt, (
size_t)ppt, col, (
size_t)widths, (
size_t)stipple,
w,
h);
4804 parse_argb_color(col, &color);
4809 for (
UInt_t i = 0; i < npt; i++) {
4811 for (
UInt_t j = 0; j < widths[i]; j++) {
4812 if ((ppt[i].fX >= (
Int_t)
fImage->width) || (ppt[i].
fX < 0) ||
4823 if (stipple[ii >> 3] & (1 << (ii%8))) {
4840 if (!npt || !ppt || !widths || !tile) {
4841 Warning(
"FillSpans",
"Invalid input data npt=%d ppt=0x%zx widths=0x%zx tile=0x%zx",
4842 npt, (
size_t)ppt, (
size_t)widths, (
size_t)tile);
4854 for (
UInt_t i = 0; i < npt; i++) {
4857 for (
UInt_t j = 0; j < widths[i]; j++) {
4858 if ((ppt[i].fX >= (
Int_t)
fImage->width) || (ppt[i].
fX < 0) ||
4879 if (!npt || !ppt || !widths) {
4880 Warning(
"CropSpans",
"No points specified npt=%d ppt=0x%zx widths=0x%zx", npt, (
size_t)ppt, (
size_t)widths);
4885 int y1 = ppt[npt-1].
fY;
4893 for (
y = 0; (
int)
y < y0;
y++) {
4896 if (idx < sz)
fImage->alt.argb32[idx] = 0;
4901 for (i = 0; i < npt; i++) {
4902 for (
x = 0; (
int)
x < ppt[i].
fX;
x++) {
4904 if (idx < sz)
fImage->alt.argb32[idx] = 0;
4906 for (
x = ppt[i].fX + widths[i] + 1;
x <
fImage->width;
x++) {
4908 if (idx < sz)
fImage->alt.argb32[idx] = 0;
4916 if (idx < sz)
fImage->alt.argb32[idx] = 0;
4950 Warning(
"CopyArea",
"Visual not initiated");
4955 Warning(
"CopyArea",
"no image");
4960 ASImage *out = ((
TASImage*)dst)->GetImage();
4966 xsrc = xsrc < 0 ? 0 : xsrc;
4967 ysrc = ysrc < 0 ? 0 : ysrc;
4969 if ((xsrc >= (
int)
fImage->width) || (ysrc >= (
int)
fImage->height))
return;
4975 if (!
fImage->alt.argb32) {
4978 if (!out->alt.argb32) {
4980 out = ((
TASImage*)dst)->GetImage();
4983 if (
fImage->alt.argb32 && out->alt.argb32) {
4984 for (
y = 0;
y < (
int)
h;
y++) {
4985 for (
x = 0;
x < (
int)
w;
x++) {
4986 idx =
Idx(yy +
x + xsrc);
4987 if ((
x + xdst < 0) || (ydst +
y < 0) ||
4988 (
x + xdst >= (
int)out->width) || (
y + ydst >= (
int)out->height) )
continue;
4990 idx2 =
Idx((ydst +
y)*out->width +
x + xdst);
4994 out->alt.argb32[idx2] = 0;
4997 out->alt.argb32[idx2] &=
fImage->alt.argb32[idx];
5000 out->alt.argb32[idx2] =
fImage->alt.argb32[idx] & (~out->alt.argb32[idx2]);
5003 out->alt.argb32[idx2] &=
~fImage->alt.argb32[idx];
5008 out->alt.argb32[idx2] ^=
fImage->alt.argb32[idx];
5011 out->alt.argb32[idx2] |=
fImage->alt.argb32[idx];
5014 out->alt.argb32[idx2] = (
~fImage->alt.argb32[idx]) & (~out->alt.argb32[idx2]);
5017 out->alt.argb32[idx2] ^=
~fImage->alt.argb32[idx];
5020 out->alt.argb32[idx2] = ~out->alt.argb32[idx2];
5023 out->alt.argb32[idx2] =
fImage->alt.argb32[idx] | (~out->alt.argb32[idx2]);
5026 out->alt.argb32[idx2] =
~fImage->alt.argb32[idx];
5029 out->alt.argb32[idx2] |=
~fImage->alt.argb32[idx];
5032 out->alt.argb32[idx2] = (
~fImage->alt.argb32[idx]) | (~out->alt.argb32[idx2]);
5035 out->alt.argb32[idx2] = 0xFFFFFFFF;
5039 out->alt.argb32[idx2] =
fImage->alt.argb32[idx];
5063 int i, j, ix, iy,
w,
h;
5065 ARGB32 color = 0xFFFFFFFF;
5072 for (i = 0; i < nx; i++) {
5074 for (j = 0; j < ny; j++) {
5075 icol = (ARGB32)ic[i + (nx*j)];
5076 if (icol != color) {
5130 return (ptMin - ptsStart);
5146 int mr = 0, m1r = 0;
5147 int incr1l = 0, incr2l = 0;
5148 int incr1r = 0, incr2r = 0;
5153 int nextleft, nextright;
5156 TPoint *firstPoint =
nullptr;
5157 UInt_t *firstWidth =
nullptr;
5169 if ((npt < 3) || !ppt) {
5170 Warning(
"GetPolygonSpans",
"No points specified npt=%d ppt=0x%zx", npt, (
size_t)ppt);
5179 if ((npt < 3) || (dy < 0))
return kFALSE;
5181 ptsOut = firstPoint =
new TPoint[dy];
5185 nextleft = nextright = imin;
5186 y = ppt[nextleft].
fY;
5191 if (ppt[nextleft].fY ==
y) {
5197 if (nextleft >= (
int)npt) {
5204 ppt[left].fX, ppt[nextleft].fX,
5205 xl, dl, ml, m1l, incr1l, incr2l);
5209 if (ppt[nextright].fY ==
y) {
5215 if (nextright < 0) {
5222 ppt[right].fX, ppt[nextright].fX,
5223 xr, dr, mr, m1r, incr1r, incr2r);
5228 i =
TMath::Min(ppt[nextleft].fY, ppt[nextright].fY) -
y;
5232 delete [] firstWidth;
5233 delete [] firstPoint;
5242 *(
width++) = xr - xl;
5243 (ptsOut++)->fX = xl;
5245 *(
width++) = xl - xr;
5246 (ptsOut++)->fX = xr;
5254 }
while (
y !=
ymax);
5256 *nspans =
UInt_t(ptsOut - firstPoint);
5257 *outPoint = firstPoint;
5258 *outWidth = firstWidth;
5271 TPoint *firstPoint =
nullptr;
5272 UInt_t *firstWidth =
nullptr;
5275 ARGB32 color = ARGB32_White;
5276 parse_argb_color(col, &color);
5279 if (!stipple && ((color & 0xff000000)==0xff000000)) {
5282 FillSpans(nspans, firstPoint, firstWidth, col, stipple,
w,
h);
5286 delete [] firstWidth;
5287 delete [] firstPoint;
5290 if (firstWidth)
delete [] firstWidth;
5291 if (firstPoint)
delete [] firstPoint;
5302 TPoint *firstPoint =
nullptr;
5303 UInt_t *firstWidth =
nullptr;
5308 FillSpans(nspans, firstPoint, firstWidth, tile);
5311 delete [] firstWidth;
5312 delete [] firstPoint;
5315 if (firstWidth)
delete [] firstWidth;
5316 if (firstPoint)
delete [] firstPoint;
5326 TPoint *firstPoint =
nullptr;
5327 UInt_t *firstWidth =
nullptr;
5332 CropSpans(nspans, firstPoint, firstWidth);
5335 delete [] firstWidth;
5336 delete [] firstPoint;
5339 if (firstWidth)
delete [] firstWidth;
5340 if (firstPoint)
delete [] firstPoint;
5356 if ((count < 3) || !ptsIn) {
5357 Warning(
"DrawFillArea",
"No points specified npt=%d ppt=0x%zx", count, (
size_t)ptsIn);
5366 ARGB32 color = ARGB32_White;
5367 parse_argb_color(col, &color);
5385 static const UInt_t gEdgeTableEntryCacheSize = 200;
5386 static EdgeTableEntry gEdgeTableEntryCache[gEdgeTableEntryCacheSize];
5388 if (count < gEdgeTableEntryCacheSize) {
5399 ptsOut = firstPoint;
5421 if (!stipple && ((color & 0xff000000)==0xff000000)) {
5424 FillSpans(nPts, firstPoint, firstWidth, col, stipple,
w,
h);
5426 ptsOut = firstPoint;
5437 if (!stipple && ((color & 0xff000000)==0xff000000)) {
5440 FillSpans(nPts, firstPoint, firstWidth, col, stipple,
w,
h);
5444 if (
del)
delete [] pETEs;
5457 if ((count < 3) || !ptsIn) {
5458 Warning(
"DrawFillArea",
"No points specified npt=%d ppt=0x%zx", count, (
size_t)ptsIn);
5487 ptsOut = firstPoint;
5509 FillSpans(nPts, firstPoint, firstWidth, tile);
5510 ptsOut = firstPoint;
5519 FillSpans(nPts, firstPoint, firstWidth, tile);
5530 ASDrawContext *ctx =
new ASDrawContext;
5532 ctx->canvas_width = im->width;
5533 ctx->canvas_height = im->height;
5534 ctx->canvas = im->alt.argb32;
5535 ctx->scratch_canvas =
nullptr;
5537 ctx->flags = ASDrawCTX_CanvasIsARGB;
5538 asim_set_custom_brush_colored( ctx, brush);
5548 if (ctx->scratch_canvas)
free(ctx->scratch_canvas);
5565 Int_t sz = thick*thick;
5572 matrix =
new CARD32[sz];
5575 for (
int i = 0; i < sz; i++) {
5576 matrix[i] = (CARD32)color;
5580 brush.matrix = matrix;
5581 brush.width = thick;
5582 brush.height = thick;
5583 brush.center_y = brush.center_x = thick/2;
5592 if (xx1 ==
fImage->width) --xx1;
5593 if (yy1 ==
fImage->height) --yy1;
5594 if (xx2 ==
fImage->width) --xx2;
5595 if (yy2 ==
fImage->height) --yy2;
5597 asim_move_to(ctx, xx1, yy1);
5598 asim_line_to(ctx, xx2, yy2);
5612 Bool_t has_alpha = (color & 0xff000000) != 0xff000000;
5614 FT_Bitmap *source = (FT_Bitmap *)
bitmap;
5616 auto ndots = source->width * source->rows;
5621 for (
UInt_t y = 0;
y < source->rows;
y++) {
5623 if ((byy >= (
Int_t)
fImage->height) || (byy < 0))
continue;
5625 for (
UInt_t x = 0;
x < source->width;
x++) {
5627 if ((bxx >= (
Int_t)
fImage->width) || (bxx < 0))
continue;
5629 auto idx =
Idx(bxx + yy);
5630 r += ((
fImage->alt.argb32[idx] & 0xff0000) >> 16);
5631 g += ((
fImage->alt.argb32[idx] & 0x00ff00) >> 8);
5632 b += (
fImage->alt.argb32[idx] & 0x0000ff);
5642 col[0] = (
r << 16) + (
g << 8) +
b;
5644 Int_t col4r = (col[4] & 0xff0000) >> 16;
5645 Int_t col4g = (col[4] & 0x00ff00) >> 8;
5646 Int_t col4b = (col[4] & 0x0000ff);
5651 Int_t colxr = (col4r*
x +
r*xx) >> 2;
5652 Int_t colxg = (col4g*
x +
g*xx) >> 2;
5653 Int_t colxb = (col4b*
x +
b*xx) >> 2;
5654 col[
x] = (colxr << 16) + (colxg << 8) + colxb;
5657 Int_t clipx1 = 0, clipx2 = 0, clipy1 = 0, clipy2 = 0;
5672 for (
UInt_t y = 0;
y < source->rows;
y++) {
5675 for (
UInt_t x = 0;
x < source->width;
x++) {
5679 d = ((
d + 10) * 5) >> 8;
5683 if (noClip || ((bxx < clipx2) && (bxx >= clipx1) &&
5684 (byy >= clipy2) && (byy < clipy1))) {
5685 auto idx =
Idx(bxx + yy);
5686 auto acolor = (ARGB32) col[
d];
5690 fImage->alt.argb32[idx] = acolor;
5733 const wchar_t *wcsTitle =
reinterpret_cast<const wchar_t *
>(
text->GetWcsTitle());
5744 col =
gROOT->GetColor(1);
5747 ARGB32 color = ARGB32_White;
5801 if (align == 1 || align == 2 || align == 3) {
5803 }
else if (align == 4 || align == 5 || align == 6) {
5810 if (align == 3 || align == 6 || align == 9) {
5812 }
else if (align == 2 || align == 5 || align == 8) {
5819 ftal.x = (ftal.x >> 6);
5820 ftal.y = (ftal.y >> 6);
5870 static ASImageExportParams params;
5878 ret = ASImage2xpmRawBuff(img, (CARD8 **)buffer,
size,
nullptr);
5881 ret = ASImage2PNGBuff(img, (CARD8 **)buffer,
size, ¶ms);
5925 static ASImageImportParams params;
5929 params.filter = SCL_DO_ALL;
5930 params.gamma = SCREEN_GAMMA;
5931 params.gamma_table =
nullptr;
5932 params.compression = 0;
5933 params.format = ASA_ASImage;
5934 params.search_path =
nullptr;
5935 params.subimage = 0;
5940 char *ptr = buffer[0];
5941 while (isspace((
int)*ptr)) ++ptr;
5943 fImage = xpm_data2ASImage((
const char**)buffer, ¶ms);
5945 fImage = xpmRawBuff2ASImage((
const char*)*buffer, ¶ms);
5950 fImage = PNGBuff2ASimage((CARD8 *)*buffer, ¶ms);
5960 if (
fName.IsNull()) {
5976 Warning(
"CreateThumbnail",
"No image");
5981 Warning(
"CreateThumbnail",
"Visual not initiated");
5985 static char *buf =
nullptr;
5987 ASImage *img =
nullptr;
6007 ASImage *rendered_im;
6008 ASImageLayer layers[2];
6009 init_image_layers(&(layers[0]), 2);
6011 layers[0].dst_x = 0;
6012 layers[0].dst_y = 0;
6013 layers[0].clip_width = img->width;
6014 layers[0].clip_height = img->height;
6015 layers[0].bevel =
nullptr;
6017 layers[1].dst_x = 0;
6018 layers[1].dst_y = 0;
6019 layers[1].clip_width = img->width;
6020 layers[1].clip_height = img->height;
6021 layers[1].merge_scanlines = blend_scanlines_name2func(
"tint");
6022 rendered_im = merge_layers(
fgVisual, &(layers[0]), 2, img->width, img->height,
6024 destroy_asimage(&img);
6028 ASImage *padimg =
nullptr;
6033 padimg = pad_asimage(
fgVisual, img, 0,
d, sz, sz, 0x00ffffff,
6037 padimg = pad_asimage(
fgVisual, img,
d, 0, sz, sz, 0x00ffffff,
6042 destroy_asimage(&img);
6047 ASImage2xpmRawBuff(padimg, (CARD8 **)ptr, &
size,
nullptr);
6050 destroy_asimage(&padimg);
6063 if (
b.IsReading()) {
6064 Version_t version =
b.ReadVersion(&R__s, &R__c);
6069 if ( version == 1 ) {
6070 Int_t fileVersion =
b.GetVersionOwner();
6071 if (fileVersion > 0 && fileVersion < 50000 ) {
6079 if ( fileVersion < 40200 ) {
6098 if (image_type != 0) {
6100 char *buffer =
new char[
size];
6101 b.ReadFastArray(buffer,
size);
6121 if (
fName.IsNull()) {
6126 image_type =
fImage->alt.vector ? 0 : 1;
6129 if (image_type != 0) {
6130 char *buffer =
nullptr;
6133 b.WriteFastArray(buffer,
size);
6141 b.SetByteCount(R__c,
kTRUE);
6150 if (
fImage->alt.vector) {
6188 int start =
fTitle.Index(
"/*") + 3;
6189 int stop =
fTitle.Index(
"*/") - 1;
6191 if ((start > 0) && (stop - start > 0)) {
6192 fTitle.Replace(start, stop - start, title);
6205 Int_t sz = thick*thick;
6209 ARGB32 color = ARGB32_White;
6210 parse_argb_color(col, &color);
6215 matrix =
new CARD32[sz];
6218 for (
int i = 0; i < sz; i++) {
6219 matrix[i] = (CARD32)color;
6223 brush.matrix = matrix;
6224 brush.width = thick;
6225 brush.height = thick;
6226 brush.center_y = brush.center_x = thick/2;
6229 asim_cube_bezier(ctx,
x1,
y1,
x2,
y2, x3, y3);
6242 const char *col,
Int_t thick)
6247 thick = !thick ? 1 : thick;
6248 Int_t sz = thick*thick;
6252 ARGB32 color = ARGB32_White;
6253 parse_argb_color(col, &color);
6258 matrix =
new CARD32[sz];
6261 for (
int i = 0; i < sz; i++) {
6262 matrix[i] = (CARD32)color;
6266 brush.matrix = matrix;
6267 brush.width = thick > 0 ? thick : 1;
6268 brush.height = thick > 0 ? thick : 1;
6269 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6272 asim_straight_ellips(ctx,
x,
y, rx, ry, thick < 0);
6290 thick = !thick ? 1 : thick;
6291 Int_t sz = thick*thick;
6295 ARGB32 color = ARGB32_White;
6296 parse_argb_color(col, &color);
6302 matrix =
new CARD32[sz];
6305 for (
int i = 0; i < sz; i++) {
6306 matrix[i] = (CARD32)color;
6310 brush.matrix = matrix;
6311 brush.height = brush.width = thick > 0 ? thick : 1;
6312 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6315 asim_circle(ctx,
x,
y,
r, thick < 0);
6329 const char *col,
Int_t thick)
6334 thick = !thick ? 1 : thick;
6335 Int_t sz = thick*thick;
6339 ARGB32 color = ARGB32_White;
6340 parse_argb_color(col, &color);
6345 matrix =
new CARD32[sz];
6348 for (
int i = 0; i < sz; i++) {
6349 matrix[i] = (CARD32)color;
6353 brush.matrix = matrix;
6354 brush.width = thick > 0 ? thick : 1;
6355 brush.height = thick > 0 ? thick : 1;
6356 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6359 asim_ellips(ctx,
x,
y, rx, ry,
angle, thick < 0);
6372 const char *col,
Int_t thick)
6377 thick = !thick ? 1 : thick;
6378 Int_t sz = thick*thick;
6382 ARGB32 color = ARGB32_White;
6383 parse_argb_color(col, &color);
6388 matrix =
new CARD32[sz];
6391 for (
int i = 0; i < sz; i++) {
6392 matrix[i] = (CARD32)color;
6396 brush.matrix = matrix;
6397 brush.width = thick > 0 ? thick : 1;
6398 brush.height = thick > 0 ? thick : 1;
6399 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6402 asim_ellips2(ctx,
x,
y, rx, ry,
angle, thick < 0);
6414 const char * ,
const char * )
6428 Warning(
"Gray",
"Image not initiated");
6433 Warning(
"Gray",
"Visual not initiated");
6440 ASImage *sav =
nullptr;
6457 if (
fImage->alt.argb32) {
6459 0, ASA_ARGB32, 0, ASIMAGE_QUALITY_DEFAULT);
6461 for (i = 0; i <
fImage->height; i++) {
6462 for (j = 0; j <
fImage->width; j++) {
6465 r = ((
fImage->alt.argb32[idx] & 0xff0000) >> 16);
6466 g = ((
fImage->alt.argb32[idx] & 0x00ff00) >> 8);
6467 b = (
fImage->alt.argb32[idx] & 0x0000ff);
6468 l = (57*
r + 181*
g + 18*
b)/256;
6476 ASImageDecoder *imdec = start_image_decoding(
fgVisual,
fImage, SCL_DO_ALL,
6488 Warning(
"ToGray",
"Failed to start image output");
6494 CARD32 *aa = imdec->buffer.alpha;
6495 CARD32 *rr = imdec->buffer.red;
6496 CARD32 *gg = imdec->buffer.green;
6497 CARD32 *bb = imdec->buffer.blue;
6502 for (i = 0; i <
fImage->height; i++) {
6503 imdec->decode_image_scanline(imdec);
6504 result.flags = imdec->buffer.flags;
6505 result.back_color = imdec->buffer.back_color;
6507 for (j = 0; j <
fImage->width; j++) {
6508 l = (57*rr[j] + 181*gg[j]+ 18*bb[j])/256;
6514 imout->output_image_scanline(imout, &
result, 1);
6517 stop_image_decoding(&imdec);
6518 stop_image_output(&imout);
6558 Warning(
"FromWindow",
"Visual not initiated");
6565 static int x11 = -1;
6566 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
6576 fImage = bitmap2asimage(bits,
w,
h, 0,
nullptr);
6590 for (
UInt_t i = 0; i <
h/2; ++i) {
6591 memcpy(xx, buf + 4*
w*i, 4*
w);
6592 memcpy(buf + 4*
w*i, buf + 4*
w*(
h-i-1), 4*
w);
6593 memcpy(buf + 4*
w*(
h-i-1), xx, 4*
w);
6597 fImage = bitmap2asimage(buf,
w,
h, 0,
nullptr);
6621 gPad->Range(-left / (1.0 - left - right),
6622 -bottom / (1.0 - top - bottom),
6623 1 + right / (1.0 - left - right),
6624 1 + top / ( 1.0 - top - bottom));
6625 gPad->RangeAxis(0, 0, 1, 1);
6635 char *buf =
nullptr;
6641 str.ReplaceAll(
"static",
"const");
6645 str.ReplaceAll(
"asxpm", xpm.
Data());
6646 out <<
"\n" << str <<
"\n\n";
6651 out <<
"asimage = TImage::Create();\n";
6652 out <<
" asimage->SetImageBuffer( (char **)" << xpm <<
", TImage::kXpm);\n";
6654 out <<
" asimage->Draw();\n";
6667 static char buf[32];
6668 FILE *fp = fopen(
name,
"rb+");
6671 printf(
"file %s : failed to open\n",
name);
6675 if (!fread(buf, 1, 20, fp)) {
6680 char dpi1 = (
set & 0xffff) >> 8;
6681 char dpi2 =
set & 0xff;
6686 for (i = 0; i < 20; i++) {
6687 if ((buf[i] == 0x4a) && (buf[i+1] == 0x46) && (buf[i+2] == 0x49) &&
6688 (buf[i+3] == 0x46) && (buf[i+4] == 0x00) ) {
6694 if (i == 20 || dpi+4 >= 20) {
6696 printf(
"file %s : wrong JPEG format\n",
name);
6703 buf[dpi + 1] = dpi1;
6704 buf[dpi + 2] = dpi2;
6707 buf[dpi + 3] = dpi1;
6708 buf[dpi + 4] = dpi2;
6711 fwrite(buf, 1, 20, fp);
Handle_t Pixmap_t
Pixmap handle.
const Mask_t kGCClipXOrigin
Handle_t Window_t
Window handle.
@ kGXorReverse
src OR NOT dst
@ kGXnand
NOT src OR NOT dst.
@ kGXandReverse
src AND NOT dst
@ kGXorInverted
NOT src OR dst.
@ kGXandInverted
NOT src AND dst.
@ kGXequiv
NOT src XOR dst.
@ kGXnor
NOT src AND NOT dst.
@ kGXcopyInverted
NOT src.
Handle_t GContext_t
Graphics context handle.
Handle_t Drawable_t
Drawable handle.
const Mask_t kGCClipYOrigin
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
bool Bool_t
Boolean (0=false, 1=true) (bool)
unsigned short UShort_t
Unsigned Short integer 2 bytes (unsigned short)
int Int_t
Signed integer 4 bytes (int)
short Version_t
Class version identifier (short)
unsigned char UChar_t
Unsigned Character 1 byte (unsigned char)
int Ssiz_t
String size (currently int)
unsigned long ULong_t
Unsigned long integer 4 bytes (unsigned long). Size depends on architecture.
long Long_t
Signed long integer 4 bytes (long). Size depends on architecture.
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int)
float Float_t
Float 4 bytes (float)
double Double_t
Double 8 bytes.
constexpr Ssiz_t kNPOS
The equivalent of std::string::npos for the ROOT class TString.
const char Option_t
Option string (const char)
static ARGB32 GetShadow(ARGB32 background)
Calculate shadow color.
static const UInt_t kBrushCacheSize
static CARD32 gBrushCache[kBrushCacheSize *kBrushCacheSize]
static unsigned long kAllPlanes
static ARGB32 GetAverage(ARGB32 foreground, ARGB32 background)
Get average.
static char * gIconPaths[7]
static int GetPolyYBounds(TPoint *pts, int n, int *by, int *ty)
Get poly bounds along Y.
static CARD8 MakeComponentHilite(int cmp)
Make component hilite.
static ARGB32 GetHilite(ARGB32 background)
Calculate highlite color.
static const UInt_t NUMPTSTOBUFFER
static ASFontManager * gFontManager
static void init_icon_paths()
Set icons paths.
#define _MEMSET_(dst, lng, val)
#define FillSpansInternal(npt, ppt, widths, color)
static ASDrawContext * create_draw_context_argb32(ASImage *im, ASDrawTool *brush)
Create draw context.
#define _alphaBlend(bot, top)
static void destroy_asdraw_context32(ASDrawContext *ctx)
Destroy asdraw context32.
struct _EdgeTableEntry EdgeTableEntry
struct _ScanLineListBlock ScanLineListBlock
struct _ScanLineList ScanLineList
#define EVALUATEEDGEEVENODD(pAET, pPrevAET, y)
static int InsertionSort(EdgeTableEntry *AET)
#define BRESINITPGON(dy, x1, x2, xStart, d, m, m1, incr1, incr2)
static void loadAET(EdgeTableEntry *AET, EdgeTableEntry *ETEs)
static void FreeStorage(ScanLineListBlock *pSLLBlock)
static void CreateETandAET(int count, TPoint *pts, EdgeTable *ET, EdgeTableEntry *AET, EdgeTableEntry *pETEs, ScanLineListBlock *pSLLBlock)
#define BRESINCRPGON(d, minval, m, m1, incr1, incr2)
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t mask
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void cmap
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void w
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t del
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void pixel
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize wid
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void on
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void foreground
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char FillPolygon
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char bitmap
Option_t Option_t TPoint TPoint const char x2
Option_t Option_t TPoint TPoint const char x1
Option_t Option_t TPoint TPoint angle
Option_t Option_t TPoint xy
Option_t Option_t TPoint TPoint const char mode
Option_t Option_t TPoint TPoint const char y2
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t FillRectangle
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void pxm
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t height
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void gc
Option_t Option_t TPoint TPoint const char text
Option_t Option_t TPoint TPoint const char y1
R__EXTERN TRandom * gRandom
R__EXTERN TStyle * gStyle
R__EXTERN const char * gProgName
R__EXTERN TSystem * gSystem
TVectorT< Double_t > TVectorD
R__EXTERN TVirtualPS * gVirtualPS
R__EXTERN Int_t(* gThreadXAR)(const char *xact, Int_t nb, void **ar, Int_t *iret)
void CropSpans(UInt_t npt, TPoint *ppt, UInt_t *widths) override
Crop spans.
void Gradient(UInt_t angle=0, const char *colors="#FFFFFF #000000", const char *offsets=nullptr, Int_t x=0, Int_t y=0, UInt_t width=0, UInt_t height=0) override
Render multipoint gradient inside rectangle of size (width, height) at position (x,...
void Blur(Double_t hr=3, Double_t vr=3) override
Perform Gaussian blur of the image (useful for drop shadows).
Bool_t SetJpegDpi(const char *name, UInt_t dpi=72)
Set an image printing resolution in Dots Per Inch units.
void StartPaletteEditor() override
Start palette editor.
void Bevel(Int_t x=0, Int_t y=0, UInt_t width=0, UInt_t height=0, const char *hi="#ffdddddd", const char *lo="#ff555555", UShort_t thick=1, Bool_t pressed=kFALSE) override
Bevel is used to create 3D effect while drawing buttons, or any other image that needs to be framed.
void DrawLineInternal(UInt_t x1, UInt_t y1, UInt_t x2, UInt_t y2, UInt_t col, UInt_t thick)
Internal line drawing.
Int_t fPaintMode
! 1 - fast mode, 0 - low memory slow mode
static Bool_t fgBatch
global flag to signal if batch mode is active ie fgVisual->dpy was set to nullptr
UInt_t GetWidth() const override
Return width of original image not of the displayed image.
Double_t fMinValue
! min value in image
UInt_t GetScaledWidth() const
Return width of the displayed image not of the original image.
void DrawEllips(Int_t x, Int_t y, Int_t rx, Int_t ry, Int_t angle, const char *col="#000000", Int_t thick=1) override
Draw an ellipse.
void Paint(Option_t *option="") override
Paint image.
void DrawHLine(UInt_t y, UInt_t x1, UInt_t x2, UInt_t col, UInt_t thick)
Draw an horizontal line.
void SetPaletteEnabled(Bool_t on=kTRUE) override
Switch on/off the image palette.
Bool_t InitImage(const char *caller)
Static function to initialize the image.
static Bool_t fgInit
global flag to init afterimage only once
const char * GetTitle() const override
Title is used to keep 32x32 xpm image's thumbnail.
void FromGLBuffer(UChar_t *buf, UInt_t w, UInt_t h) override
Creates an image (screenshot) from a RGBA buffer.
void HSV(UInt_t hue=0, UInt_t radius=360, Int_t H=0, Int_t S=0, Int_t V=0, Int_t x=0, Int_t y=0, UInt_t width=0, UInt_t height=0) override
This function will tile original image to specified size with offsets requested, and then it will go ...
void Tile(UInt_t width, UInt_t height) override
Tile the original image.
void WriteImage(const char *file, EImageFileTypes type=TImage::kUnknown) override
Write image to specified file.
Int_t DistancetoPrimitive(Int_t px, Int_t py) override
Is the mouse in the image ?
char * GetObjectInfo(Int_t px, Int_t py) const override
Get image pixel coordinates and the pixel value at the mouse pointer.
const char * TypeFromMagicNumber(const char *file)
Guess the file type from the first byte of file.
void DrawLine(UInt_t x1, UInt_t y1, UInt_t x2, UInt_t y2, const char *col="#000000", UInt_t thick=1) override
Draw a line.
Double_t fMaxValue
! max value in image
void MapQuality(EImageQuality &quality, UInt_t &asquality, Bool_t toas=kTRUE)
Map quality to/from AfterImage quality.
void Zoom(UInt_t offX, UInt_t offY, UInt_t width, UInt_t height) override
The area of an image displayed in a pad is defined by this function.
UInt_t fZoomWidth
! width of zoomed image in image pixels
Bool_t fEditable
! kTRUE image can be resized, moved by resizing/moving gPad
Int_t fZoomUpdate
! kZoom - new zooming required, kZoomOps - other ops in action, kNoZoom - no zooming or ops
Bool_t IsValid() const override
TClass * IsA() const override
void DrawCubeBezier(Int_t x1, Int_t y1, Int_t x2, Int_t y2, Int_t x3, Int_t y3, const char *col="#000000", UInt_t thick=1) override
Draw a cubic bezier line.
void DrawFillArea(UInt_t npt, TPoint *ppt, const char *col="#000000", const char *stipple=nullptr, UInt_t w=16, UInt_t h=16) override
Fill a polygon (any type convex, non-convex).
void DrawVLine(UInt_t x, UInt_t y1, UInt_t y2, UInt_t col, UInt_t thick)
Draw a vertical line.
UInt_t * GetRgbaArray() override
Return a pointer to an array[width x height] of RGBA32 values.
void FillRectangle(const char *col=nullptr, Int_t x=0, Int_t y=0, UInt_t width=0, UInt_t height=0) override
Fill rectangle of size (width, height) at position (x,y) within the existing image with specified col...
void DrawStraightEllips(Int_t x, Int_t y, Int_t rx, Int_t ry, const char *col="#000000", Int_t thick=1) override
Draw a straight ellipse.
Double_t * GetVecArray() override
Return a pointer to internal array[width x height] of double values [0,1].
void DrawCircle(Int_t x, Int_t y, Int_t r, const char *col="#000000", Int_t thick=1) override
Draw a circle.
ASImage * fImage
! pointer to image structure of original image
void Gray(Bool_t on=kTRUE) override
Convert RGB image to Gray image and vice versa.
void DrawText(Int_t x=0, Int_t y=0, const char *text="", Int_t size=12, const char *color=nullptr, const char *font="fixed", EText3DType type=TImage::kPlain, const char *fore_file=nullptr, Float_t angle=0) override
Draw text of size (in pixels for TrueType fonts) at position (x, y) with color specified by hex strin...
UInt_t fZoomHeight
! hight of zoomed image in image pixels
void Pad(const char *color="#00FFFFFF", UInt_t left=0, UInt_t right=0, UInt_t top=0, UInt_t bottom=0) override
Enlarge image, padding it with specified color on each side in accordance with requested geometry.
static THashTable * fgPlugList
! hash table containing loaded plugins
UInt_t * GetArgbArray() override
Return a pointer to internal array[width x height] of ARGB32 values This array is directly accessible...
Bool_t SetImageBuffer(char **buffer, EImageFileTypes type=TImage::kPng) override
Create image from compressed buffer.
Double_t * Vectorize(UInt_t max_colors=256, UInt_t dither=4, Int_t opaque_threshold=1) override
Reduce color-depth of an image and fills vector of "scientific data" [0...1].
Int_t Idx(Int_t idx)
Return a valid index in fImage tables to avoid seg-fault by accessing out of indices out of array's r...
void FillPolygon(UInt_t npt, TPoint *ppt, const char *col="#000000", const char *stipple=nullptr, UInt_t w=16, UInt_t h=16) override
Fill a convex polygon with background color or bitmap.
void SetDefaults()
Set default parameters.
void CopyArea(TImage *dst, Int_t xsrc, Int_t ysrc, UInt_t w, UInt_t h, Int_t xdst=0, Int_t ydst=0, Int_t gfunc=3, EColorChan chan=kAllChan) override
Copy source region to the destination image.
void DrawWideLine(UInt_t x1, UInt_t y1, UInt_t x2, UInt_t y2, UInt_t col, UInt_t thick)
Draw wide line.
Pixmap_t GetMask() override
Returns image mask pixmap (alpha channel).
UInt_t * GetScanline(UInt_t y) override
Return a pointer to scan-line.
void FillSpans(UInt_t npt, TPoint *ppt, UInt_t *widths, const char *col="#000000", const char *stipple=nullptr, UInt_t w=16, UInt_t h=16) override
Fill spans with specified color or/and stipple.
void DrawEllips2(Int_t x, Int_t y, Int_t rx, Int_t ry, Int_t angle, const char *col="#000000", Int_t thick=1) override
Draw an ellipse.
TObject * Clone(const char *newname="") const override
Clone image.
void Draw(Option_t *option="") override
Draw image.
void CropPolygon(UInt_t npt, TPoint *ppt) override
Crop a convex polygon.
static const ASVisual * GetVisual()
Return visual.
void DrawPolyLine(UInt_t nn, TPoint *xy, const char *col="#000000", UInt_t thick=1, TImage::ECoordMode mode=kCoordModeOrigin) override
Draw a polyline.
void PolyPoint(UInt_t npt, TPoint *ppt, const char *col="#000000", TImage::ECoordMode mode=kCoordModeOrigin) override
Draw a poly point.
static void Image2Drawable(ASImage *im, Drawable_t wid, Int_t x, Int_t y, Int_t xsrc=0, Int_t ysrc=0, UInt_t wsrc=0, UInt_t hsrc=0, Option_t *opt="")
Draw asimage on drawable.
void Merge(const TImage *im, const char *op="alphablend", Int_t x=0, Int_t y=0) override
Merge two images.
void DrawCellArray(Int_t x1, Int_t y1, Int_t x2, Int_t y2, Int_t nx, Int_t ny, UInt_t *ic) override
Draw a cell array.
void FillRectangleInternal(UInt_t col, Int_t x, Int_t y, UInt_t width, UInt_t height)
Fill rectangle of size (width, height) at position (x,y) within the existing image with specified col...
~TASImage() override
Image destructor, clean up image and visual.
void FloodFill(Int_t x, Int_t y, const char *col, const char *min_col, const char *max_col=nullptr) override
Flood fill.
TASImage * fScaledImage
! temporary scaled and zoomed image produced from original image
Bool_t IsEditable() const override
void DrawFTGlyph(void *bitmap, UInt_t color, Int_t x, Int_t y, TVirtualPad *clippad=nullptr, Int_t offx=0, Int_t offy=0)
Draw glyph bitmap.
UInt_t fZoomOffX
! X - offset for zooming in image pixels
void ReadImage(const char *file, EImageFileTypes type=TImage::kUnknown) override
Read specified image file.
void GetImageBuffer(char **buffer, int *size, EImageFileTypes type=TImage::kPng) override
Return in-memory buffer compressed according image type.
EImageFileTypes GetFileType(const char *ext)
Return file type depending on specified extension.
void Slice(UInt_t xStart, UInt_t xEnd, UInt_t yStart, UInt_t yEnd, UInt_t toWidth, UInt_t toHeight) override
Another method of enlarging images where corners remain unchanged, but middle part gets tiled.
static UInt_t AlphaBlend(UInt_t bot, UInt_t top)
Return alpha-blended value computed from bottom and top pixel values.
void SetImage(const Double_t *imageData, UInt_t width, UInt_t height, TImagePalette *palette=nullptr) override
Deletes the old image and creates a new image depending on the values of imageData.
void DrawTextTTF(Int_t x, Int_t y, const char *text, Int_t size, UInt_t color, const char *font_name, Float_t angle)
Draw text using TrueType fonts.
void PutPixel(Int_t x, Int_t y, const char *col="#000000") override
Draw a point at the specified position.
void Browse(TBrowser *) override
Browse image.
void DrawDashZTLine(UInt_t x1, UInt_t y1, UInt_t x2, UInt_t y2, UInt_t nDash, const char *pDash, UInt_t col, UInt_t thick)
Draw a dashed line with thick pixel width.
void DrawTextOnPad(TText *text, Int_t x=0, Int_t y=0, TVirtualPad *pad=nullptr, Int_t offx=0, Int_t offy=0) override
Draw text at the pixel position (x,y) checking clip on pad.
void DestroyImage()
Destroy image.
static Bool_t InitVisual()
Static function to initialize the ASVisual.
UInt_t fZoomOffY
! Y - offset for zooming im image pixels
void UnZoom() override
Un-zoom the image to original size.
void Streamer(TBuffer &) override
Streamer for ROOT I/O.
TArrayL * GetPixels(Int_t x=0, Int_t y=0, UInt_t w=0, UInt_t h=0) override
Return 2D array of machine dependent pixel values.
void PaintImage(Drawable_t wid, Int_t x, Int_t y, Int_t xsrc=0, Int_t ysrc=0, UInt_t wsrc=0, UInt_t hsrc=0, Option_t *opt="") override
Draw image on the drawable wid (pixmap, window) at x,y position.
void DestroyScaledImage()
Destroy scaled image.
ASImage * fGrayImage
! gray image
void DrawDashVLine(UInt_t x, UInt_t y1, UInt_t y2, UInt_t nDash, const char *pDash, UInt_t col, UInt_t thick)
Draw a dashed vertical line.
void SetTitle(const char *title="") override
Set a title for an image.
void MapFileTypes(EImageFileTypes &type, UInt_t &astype, Bool_t toas=kTRUE)
Map file type to/from AfterImage types.
void DrawRectangle(UInt_t x, UInt_t y, UInt_t w, UInt_t h, const char *col="#000000", UInt_t thick=1) override
Draw a rectangle.
void Append(const TImage *im, const char *option="+", const char *color="#00000000") override
Append image.
void DrawDashHLine(UInt_t y, UInt_t x1, UInt_t x2, UInt_t nDash, const char *pDash, UInt_t col, UInt_t thick)
Draw a dashed horizontal line.
void DrawDashLine(UInt_t x1, UInt_t y1, UInt_t x2, UInt_t y2, UInt_t nDash, const char *pDash, const char *col="#000000", UInt_t thick=1) override
Draw a dashed line.
void SetPalette(const TImagePalette *palette) override
Set a new palette to an image.
void Scale(UInt_t width, UInt_t height) override
Scale the original image.
TASImage()
Default image constructor.
TASImage & operator=(const TASImage &img)
Image assignment operator.
void Mirror(Bool_t vert=kTRUE) override
Mirror image in place.
void DrawDashZLine(UInt_t x1, UInt_t y1, UInt_t x2, UInt_t y2, UInt_t nDash, const char *pDash, UInt_t col)
Draw a dashed line with one pixel width.
void DrawSegments(UInt_t nseg, Segment_t *seg, const char *col="#000000", UInt_t thick=1) override
Draw segments.
Pixmap_t GetPixmap() override
Returns image pixmap.
void FromWindow(Drawable_t wid, Int_t x=0, Int_t y=0, UInt_t w=0, UInt_t h=0) override
Create an image (screenshot) from specified window.
TArrayD * GetArray(UInt_t w=0, UInt_t h=0, TImagePalette *pal=gWebImagePalette) override
In case of vectorized image return an associated array of doubles otherwise this method creates and r...
void Flip(Int_t flip=180) override
Flip image in place.
Bool_t GetPolygonSpans(UInt_t npt, TPoint *ppt, UInt_t *nspans, TPoint **firstPoint, UInt_t **firstWidth)
The code is based on Xserver/mi/mipolycon.c "Copyright 1987, 1998 The Open Group".
void Crop(Int_t x=0, Int_t y=0, UInt_t width=0, UInt_t height=0) override
Crop an image.
void EndPaint() override
EndPaint does internal RLE compression of image data.
void BeginPaint(Bool_t fast=kTRUE) override
BeginPaint initializes internal array[width x height] of ARGB32 pixel values.
static ASVisual * fgVisual
pointer to visual structure
void GetZoomPosition(UInt_t &x, UInt_t &y, UInt_t &w, UInt_t &h) const
Return the zoom parameters.
void SavePrimitive(std::ostream &out, Option_t *option="") override
Save a primitive as a C++ statement(s) on output stream "out".
UInt_t GetScaledHeight() const
Return height of the displayed image not of the original image.
void ExecuteEvent(Int_t event, Int_t px, Int_t py) override
Execute mouse events.
void FromPad(TVirtualPad *pad, Int_t x=0, Int_t y=0, UInt_t w=0, UInt_t h=0) override
Create an image from the given pad, afterwards this image can be saved in any of the supported image ...
UInt_t GetHeight() const override
Return height of original image not of the displayed image.
void DrawBox(Int_t x1, Int_t y1, Int_t x2, Int_t y2, const char *col="#000000", UInt_t thick=1, Int_t mode=0) override
Draw a box.
Bool_t fIsGray
! kTRUE if image is gray
void CreateThumbnail()
Create image thumbnail.
Array of doubles (64 bits per element).
void AddAt(Double_t c, Int_t i)
Set the double c value at position i in the array.
const Double_t * GetArray() const
Array of longs (32 or 64 bits per element).
void AddAt(Long_t c, Int_t i)
Add long c at position i. Check for out of bounds.
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
virtual void SetPalette(const TImagePalette *palette)
Set a new palette for the image.
Bool_t fConstRatio
keep aspect ratio of image on the screen
EImageQuality GetImageQuality() const
Bool_t GetConstRatio() const
virtual const TImagePalette & GetPalette() const
TImagePalette fPalette
color palette for value -> color conversion
virtual void Streamer(TBuffer &)
UInt_t GetImageCompression() const
Bool_t fPaletteEnabled
! kTRUE - palette is drawn on the image
virtual void SaveImageAttributes(std::ostream &out, const char *name, EImageQuality qualdef=kImgPoor, UInt_t comprdef=0, Bool_t constRatiodef=kTRUE)
Save image attributes as C++ statement(s) on output stream, but not the palette.
virtual void StartPaletteEditor()
Opens a GUI to edit the color palette.
virtual void SetLineColor(Color_t lcolor)
Set the line color.
Using a TBrowser one can browse all ROOT objects.
Buffer base class used for serializing objects.
The color creation and management class.
static ULong_t RGB2Pixel(Int_t r, Int_t g, Int_t b)
Convert r,g,b to graphics system dependent pixel value.
static Int_t GetColor(const char *hexcolor)
Static method returning color number for color specified by hex color string of form: "#rrggbb",...
const char * AsHexString() const
Return color as hexadecimal string.
void Draw(Option_t *option="") override
Draw this frame with its current attributes.
virtual void PaintAxis(Double_t xmin, Double_t ymin, Double_t xmax, Double_t ymax, Double_t &wmin, Double_t &wmax, Int_t &ndiv, Option_t *chopt="", Double_t gridlength=0, Bool_t drawGridOnly=kFALSE)
Control function to draw an axis.
THashTable implements a hash table to store TObject's.
Save canvas as an image (GIF, JPEG, PNG, XPM, TIFF etc.).
A class to define a conversion from pixel values to pixel color.
UShort_t * fColorRed
[fNumPoints] red color at each anchor point
Double_t * fPoints
[fNumPoints] value of each anchor point [0..1]
virtual Int_t FindColor(UShort_t r, UShort_t g, UShort_t b)
Returns an index of the closest color.
UShort_t * fColorGreen
[fNumPoints] green color at each anchor point
UShort_t * fColorBlue
[fNumPoints] blue color at each anchor point
UInt_t fNumPoints
number of anchor points
UShort_t * fColorAlpha
[fNumPoints] alpha at each anchor point
virtual unsigned char * ReadFile(const char *filename, UInt_t &w, UInt_t &h)=0
void Streamer(TBuffer &) override
Stream an object of class TObject.
virtual UInt_t * GetArgbArray()
virtual UInt_t GetWidth() const
static TImage * Create()
Create an image.
TImage & operator=(const TImage &img)
virtual void Merge(const TImage *, const char *="alphablend", Int_t=0, Int_t=0)
virtual void BeginPaint(Bool_t=kTRUE)
virtual UInt_t GetHeight() const
const char * GetName() const override
Returns name of object.
void Streamer(TBuffer &) override
Stream an object of class TObject.
virtual void SetName(const char *name)
Set the name of the TNamed.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Draw(Option_t *option="")
Default Draw method for all objects.
TObject()
TObject constructor.
Longptr_t ExecPlugin(int nargs)
Int_t LoadPlugin()
Load the plugin library for this handler.
void ToLower()
Change string to lower-case.
Int_t Atoi() const
Return integer value of string.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
TSubString Strip(EStripType s=kTrailing, char c=' ') const
Return a substring of self stripped at beginning and/or end.
Ssiz_t First(char c) const
Find first occurrence of a character c.
const char * Data() const
Bool_t IsDigit() const
Returns true if all characters in string are digits (0-9) or white spaces, i.e.
TString & ReplaceAll(const TString &s1, const TString &s2)
Ssiz_t Last(char c) const
Find last occurrence of a character c.
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
Int_t CountChar(Int_t c) const
Return number of times character c occurs in the string.
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Dynamic handle to work with freetype 2 library.
Bool_t SetTextSize(Float_t textsize)
Set current text size.
void SetRotationMatrix(Float_t angle)
Set the rotation matrix used to rotate the font outlines.
const FT_BBox & GetBox() const
void PrepareString(const char *string)
Put the characters in "string" in the "glyphs" array.
FT_BitmapGlyph GetGlyphBitmap(UInt_t n, Bool_t smooth=kFALSE)
Return bitmap for specified glyph.
UInt_t GetNumGlyphs() const
void SetTextFont(Font_t fontnumber)
Set specified font.
void LayoutGlyphs()
Compute the glyphs positions, fgAscent and fgWidth (needed for alignment).
FT_Matrix * GetRotMatrix() const
Base class for several text objects.
Int_t GetNoElements() const
Element * GetMatrixArray()
TVirtualPS is an abstract interface to Postscript, PDF, SVG.
To make it possible to use GL for 2D graphic in a TPad/TCanvas.
small helper class to store/restore gPad context in TPad methods
TVirtualPad is an abstract base class for the Pad and Canvas classes.
virtual Int_t YtoAbsPixel(Double_t y) const =0
virtual Double_t GetX2() const =0
virtual Int_t XtoAbsPixel(Double_t x) const =0
virtual Double_t GetY1() const =0
const char * GetName() const override=0
Returns name of object.
virtual UInt_t GetPadWidth() const =0
virtual Int_t GetPixmapID() const =0
virtual Int_t VtoPixel(Double_t v) const =0
void Paint(Option_t *option="") override=0
This method must be overridden if a class wants to paint itself.
virtual UInt_t GetPadHeight() const =0
virtual Double_t GetY2() const =0
virtual Int_t UtoPixel(Double_t u) const =0
virtual Int_t GetCanvasID() const =0
virtual TCanvas * GetCanvas() const =0
virtual Double_t GetX1() const =0
virtual void SetBorderMode(Short_t bordermode)
Int_t Nint(T x)
Round to nearest integer. Rounds half integers to the nearest even integer.
Short_t Max(Short_t a, Short_t b)
Returns the largest of a and b.
Double_t ATan2(Double_t y, Double_t x)
Returns the principal value of the arc tangent of y/x, expressed in radians.
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Double_t Cos(Double_t)
Returns the cosine of an angle of x radians.
Double_t Sin(Double_t)
Returns the sine of an angle of x radians.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
Graphics context structure.
Pixmap_t fClipMask
bitmap clipping; other calls for rects
Int_t fClipXOrigin
origin for clipping
Mask_t fMask
bit mask specifying which fields are valid
Used for drawing line segments (maps to the X11 XSegments structure)
struct _EdgeTableEntry * next
struct _ScanLineListBlock * next
EdgeTableEntry * edgelist
struct _ScanLineList * next