61# include FT_FREETYPE_H
87#include "RConfigure.h"
95# include "Windows4root.h"
99# define X_DISPLAY_MISSING 1
101# include <afterbase.h>
103# include <win32/config.h>
104# include <win32/afterbase.h>
105# define X_DISPLAY_MISSING 1
107# include <afterimage.h>
132#if defined(__GNUC__) && __GNUC__ >= 4 && ((__GNUC_MINOR__ == 2 && __GNUC_PATCHLEVEL__ >= 1) || (__GNUC_MINOR__ >= 3)) && !__INTEL_COMPILER
133#pragma GCC diagnostic ignored "-Wstrict-aliasing"
154#define _alphaBlend(bot, top) {\
155 __argb32__ *T = (__argb32__*)(top);\
156 __argb32__ *B = (__argb32__*)(bot);\
161 B->a = ((B->a*aa)>>8) + T->a;\
162 B->r = (B->r*aa + T->r*T->a)>>8;\
163 B->g = (B->g*aa + T->g*T->a)>>8;\
164 B->b = (B->b*aa + T->b*T->a)>>8;\
231 fImage = create_asimage(w ? w : 20,
h ?
h : 20, 0);
298 if (img.
fImage->alt.vector) {
301 memcpy(
fImage->alt.vector, img.
fImage->alt.vector, size);
319 if (
this != &img && img.
IsValid()) {
328 if (img.
fImage->alt.vector) {
331 memcpy(
fImage->alt.vector, img.
fImage->alt.vector, size);
378 const char *delim =
":";
380 const char *delim =
";";
382 while (icon_path.
Tokenize(token, from, delim) &&
cnt < 6) {
398 FILE *fp = fopen(
file,
"rb");
399 const char *ret =
"";
403 if (!fread(&magic, 1, 1, fp)) {
411 if (!fread(&magic, 1, 1, fp)) {
415 if (!fread(&magic, 1, 1, fp)) {
420 ret = (magic == 1) ?
"ico" :
"cur";
425 if (!fread(&magic, 1, 1, fp)) {
430 if (magic == 0x21) ret =
"ps";
431 else if (magic == 0x50) ret =
"pdf";
481 Warning(
"Scale",
"Visual not initiated");
485 Bool_t xpm = filename && (filename[0] ==
'/' &&
486 filename[1] ==
'*') && filename[2] ==
' ';
498 set_output_threshold(0);
500 static ASImageImportParams iparams;
504 iparams.filter = SCL_DO_ALL;
505 iparams.gamma = SCREEN_GAMMA;
506 iparams.gamma_table = NULL;
508 iparams.format = ASA_ASImage;
510 iparams.subimage = 0;
511 iparams.return_animation_delay = -1;
515 if (filename) dot = strrchr(filename,
'.');
528 iparams.subimage = ext.
Atoi();
530 ext = strrchr(fname.
Data(),
'.') + 1;
533 image = file2ASImage_extra(fname.
Data(), &iparams);
545 unsigned char *bitmap = 0;
551 if (!handler || ((handler->
LoadPlugin() == -1))) {
570 image = bitmap2asimage(bitmap, w,
h, 0, 0);
650 Error(
"WriteImage",
"no image loaded");
655 Error(
"WriteImage",
"no file name specified");
660 if ((
s = strrchr(
file,
'.'))) {
664 Error(
"WriteImage",
"cannot determine a valid file type");
672 Error(
"WriteImage",
"not a valid file type was specified");
678 ASImageFileTypes atype = (ASImageFileTypes)mytype;
686 static ASImageExportParams parms;
691 parms.xpm.type = atype;
692 parms.xpm.flags = EXPORT_ALPHA;
693 parms.xpm.dither = 4;
694 parms.xpm.opaque_threshold = 127;
695 parms.xpm.max_colors = 512;
698 ASImage2bmp(im, fname.
Data(), 0);
701 ASImage2xcf(im, fname.
Data(), 0);
704 parms.png.type = atype;
705 parms.png.flags = EXPORT_ALPHA;
709 parms.jpeg.type = atype;
710 parms.jpeg.flags = 0;
711 parms.jpeg.quality = aquality;
714 parms.gif.type = atype;
715 parms.gif.flags = EXPORT_ALPHA;
716 parms.gif.dither = 0;
717 parms.gif.opaque_threshold = 0;
721 parms.gif.type = atype;
722 parms.gif.flags = EXPORT_ALPHA | EXPORT_APPEND;
723 parms.gif.dither = 0;
724 parms.gif.opaque_threshold = 0;
725 parms.gif.animate_repeats = 0;
738 parms.gif.flags |= EXPORT_ANIMATION_REPEATS;
739 parms.gif.animate_repeats = 0;
740 }
else if(sufix==
"") {
757 parms.gif.flags |= EXPORT_ANIMATION_REPEATS;
758 parms.gif.animate_repeats = atoi(
s);
767 parms.gif.flags |= EXPORT_ANIMATION_REPEATS;
768 parms.gif.animate_repeats = 0;
769 }
else if(sLength>3 && sufix.
CountChar(
'+')==2 &&
TString(sufix(1,sLength-2)).Contains(
"++")) {
775 delay = atoi(sDelay);
776 parms.gif.flags |= EXPORT_ANIMATION_REPEATS;
777 parms.gif.animate_repeats = atoi(sRepeats);
779 Error(
"WriteImage",
"gif suffix %s not yet supported",
s);
783 parms.gif.animate_delay = delay;
785 int i1 = fname.
Index(
"gif+");
787 fname = fname(0, i1 + 3);
790 Error(
"WriteImage",
"unexpected gif extension structure %s", fname.
Data());
796 parms.tiff.type = atype;
797 parms.tiff.flags = EXPORT_ALPHA;
798 parms.tiff.rows_per_strip = 0;
799 parms.tiff.compression_type = aquality <= 50 ? TIFF_COMPRESSION_JPEG :
800 TIFF_COMPRESSION_NONE;
801 parms.tiff.jpeg_quality = 100;
802 parms.tiff.opaque_threshold = 0;
805 Error(
"WriteImage",
"file type %s not yet supported",
s);
809 if (!ASImage2file(im, 0, fname.
Data(), atype, &parms)) {
810 Error(
"WriteImage",
"error writing file %s",
file);
828 if (
s ==
"jpg" ||
s ==
"jpeg")
844 if (
s.Contains(
"gif+"))
867 astype = ASIT_Xpm;
break;
869 astype = ASIT_ZCompressedXpm;
break;
871 astype = ASIT_GZCompressedXpm;
break;
873 astype = ASIT_Png;
break;
875 astype = ASIT_Jpeg;
break;
877 astype = ASIT_Xcf;
break;
879 astype = ASIT_Ppm;
break;
881 astype = ASIT_Pnm;
break;
883 astype = ASIT_Bmp;
break;
885 astype = ASIT_Ico;
break;
887 astype = ASIT_Cur;
break;
889 astype = ASIT_Gif;
break;
891 astype = ASIT_Gif;
break;
893 astype = ASIT_Tiff;
break;
895 astype = ASIT_Xbm;
break;
897 astype = ASIT_Targa;
break;
899 astype = ASIT_XMLScript;
break;
901 astype = ASIT_Unknown;
907 case ASIT_ZCompressedXpm:
909 case ASIT_GZCompressedXpm:
952 asquality = 25;
break;
954 asquality = 75;
break;
956 asquality = 50;
break;
958 asquality = 100;
break;
964 if (asquality > 0 && asquality <= 25)
966 if (asquality > 26 && asquality <= 50)
968 if (asquality > 51 && asquality <= 75)
970 if (asquality > 76 && asquality <= 100)
990 Warning(
"SetImage",
"Visual not initiated");
1008 ASVectorPalette asPalette;
1012 for (col = 0; col < 4; col++)
1013 asPalette.channels[col] =
new UShort_t[asPalette.npoints];
1020 asPalette.points =
new Double_t[asPalette.npoints];
1021 for (
Int_t point = 0; point <
Int_t(asPalette.npoints); point++)
1025 height, &asPalette, ASA_ASImage,
1028 delete [] asPalette.points;
1029 for (col = 0; col < 4; col++)
1030 delete [] asPalette.channels[col];
1074 Error(
"FromPad",
"pad cannot be 0");
1079 Warning(
"FromPad",
"Visual not initiated");
1089 if (
gROOT->IsBatch()) {
1097 if (itmp && itmp->
fImage) {
1106 if (itmp && itmp->
fImage && (itmp !=
this)) {
1108 if (itmp->
fImage->alt.argb32) {
1110 fImage->alt.argb32 = (ARGB32*)safemalloc(sz*
sizeof(ARGB32));
1111 memcpy(
fImage->alt.argb32, itmp->
fImage->alt.argb32, sz*4);
1138 static int x11 = -1;
1139 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
1144 unsigned char *bits =
gVirtualX->GetColorBits(wd, 0, 0, w,
h);
1149 fImage = bitmap2asimage(bits, w,
h, 0, 0);
1170 Error(
"Draw",
"no image set");
1183 w =
Int_t(w*cx) + 4;
1188 rname =
"new TCanvas(\"" + rname +
Form(
"\", %d, %d);", w,
h);
1198 gPad->Range(-left / (1.0 - left - right),
1199 -bottom / (1.0 - top - bottom),
1200 1 + right / (1.0 - left - right),
1201 1 + top / ( 1.0 - top - bottom));
1202 gPad->RangeAxis(0, 0, 1, 1);
1225 wsrc = wsrc ? wsrc : im->width;
1226 hsrc = hsrc ? hsrc : im->height;
1228 static int x11 = -1;
1229 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
1236 UInt_t ww = wsrc - ow + (ow ? 8 : 0);
1243 char *bits =
new char[ww*hh];
1245 ASImageDecoder *imdec = start_image_decoding(
fgVisual, im, SCL_DO_ALPHA,
1246 xsrc, ysrc, ww, 0, 0);
1248 for (yy = 0; yy < hh; yy++) {
1249 imdec->decode_image_scanline(imdec);
1250 CARD32 *
a = imdec->buffer.alpha;
1252 for (xx = 0; xx < ww; xx++) {
1267 stop_image_decoding(&imdec);
1270 (
const char *)bits, ww, hh);
1288 if (x11 && (!
gPad ||
gPad->GetGLDevice() == -1)) {
1289 asimage2drawable(
fgVisual, wid, im, (GC)gc, xsrc, ysrc,
x,
y, wsrc, hsrc, 1);
1292 unsigned char *bits = (
unsigned char *)im->alt.argb32;
1294 img = tile_asimage(
fgVisual, im, xsrc, ysrc, wsrc, hsrc,
1295 0, ASA_ARGB32, 0, ASIMAGE_QUALITY_DEFAULT);
1297 bits = (
unsigned char *)img->alt.argb32;
1304 if (
gPad &&
gPad->GetGLDevice() != -1) {
1306 painter->DrawPixels(bits, wsrc, hsrc,
x,
y, !option.
Contains(
"opaque"));
1314 gVirtualX->CopyArea(pic, wid, gc, 0, 0, wsrc, hsrc,
x,
y);
1321 destroy_asimage(&img);
1345 xsrc, ysrc, wsrc, hsrc, opt);
1364 Error(
"Paint",
"no image set");
1369 Warning(
"Paint",
"Visual not initiated");
1373 Int_t tile_x = 0, tile_y = 0;
1374 CARD32 tile_tint = 0;
1383 if (sscanf(opt.
Data() + opt.
Index(
"t"),
"t%d,%d,%s", &tile_x, &tile_y,
1386 if (parse_argb_color(stint, (CARD32*)&tile_tint) == stint)
1389 Error(
"Paint",
"tile option error");
1397 if (!
fImage->alt.vector) {
1410 to_h = (
Int_t)(to_h * (1.0 -
gPad->GetBottomMargin() -
gPad->GetTopMargin() ) + 0.5);
1411 to_w = (
Int_t)(to_w * (1.0 -
gPad->GetLeftMargin() -
gPad->GetRightMargin() ) + 0.5);
1414 if ((to_w < 25 || to_h < 25) && !expand) {
1415 Error(
"Paint",
"pad too small to display an image");
1427 Int_t pal_Ax = to_w +
gPad->UtoAbsPixel(
gPad->GetLeftMargin()) +
1428 (
gPad->UtoAbsPixel(
gPad->GetRightMargin()) / 10);
1430 Int_t pal_x = to_w +
gPad->UtoPixel(
gPad->GetLeftMargin()) +
1431 (
gPad->UtoPixel(
gPad->GetRightMargin()) / 10);
1436 ASImage *grad_im = 0;
1444 grad.type = GRADIENT_Top2Bottom;
1445 grad.color =
new ARGB32[grad.npoints];
1446 grad.offset =
new double[grad.npoints];
1449 Int_t oldPt = grad.npoints -
pt -1;
1450 grad.offset[
pt] = 1 - pal.
fPoints[oldPt];
1451 grad.color[
pt] = (((ARGB32)(pal.
fColorBlue[oldPt] & 0xff00)) >> 8) |
1453 (((ARGB32)(pal.
fColorRed[oldPt] & 0xff00)) << 8) |
1454 (((ARGB32)(pal.
fColorAlpha[oldPt] & 0xff00)) << 16);
1458 pal_h, SCL_DO_COLOR,
1461 delete [] grad.color;
1462 delete [] grad.offset;
1470 to_w, to_h, tile_tint, ASA_ASImage,
1497 ASImage *tmpImage = 0;
1508 destroy_asimage(&tmpImage);
1523 Error(
"Paint",
"image could not be rendered to display");
1527 int tox = expand ? 0 : int(
gPad->UtoPixel(1.) *
gPad->GetLeftMargin());
1528 int toy = expand ? 0 : int(
gPad->VtoPixel(0.) *
gPad->GetTopMargin());
1530 if (!
gROOT->IsBatch()) {
1545 axis.
PaintAxis(pal_Xpos,
gPad->PixeltoY(pal_Ay + pal_h - 1),
1546 pal_Xpos,
gPad->PixeltoY(pal_Ay),
1547 min, max, ndiv,
"+LU");
1552 pal_Xpos,
gPad->AbsPixeltoY(pal_Ay + 1),
1553 min, max, ndiv,
"+L");
1563 gPad->XtoAbsPixel(0),
gPad->YtoAbsPixel(1));
1568 dump->
Merge(&tgrad,
"alphablend", pal_Ax, pal_Ay);
1578 pal_Xpos,
gPad->AbsPixeltoY(pal_Ay + 1),
1579 min, max, ndiv,
"+L");
1583 Warning(
"Paint",
"PDF not implemented yet");
1586 Warning(
"Paint",
"SVG not implemented yet");
1594 if ((color = (
TColor*)
colors->FindObject(
"Image_PS")) == 0)
1595 color =
new TColor(
colors->GetEntries(), 1., 1., 1.,
"Image_PS");
1606 x2 =
x1+dx/image->width;
1608 y2 = y1+dy/image->height;
1611 x2 =
x1+(dx*(1-
gPad->GetRightMargin()-
gPad->GetLeftMargin()))/image->width;
1612 y1 =
gPad->GetY2()-dy*
gPad->GetTopMargin();
1613 y2 = y1+(dy*(1-
gPad->GetTopMargin()-
gPad->GetBottomMargin()))/image->height;
1618 ASImageDecoder *imdec = start_image_decoding(
fgVisual, image, SCL_DO_ALL,
1619 0, 0, image->width, image->height, 0);
1621 for (
Int_t yt = 0; yt < (
Int_t)image->height; yt++) {
1622 imdec->decode_image_scanline(imdec);
1623 for (
Int_t xt = 0; xt < (
Int_t)image->width; xt++)
1625 imdec->buffer.green[xt],
1626 imdec->buffer.blue[xt]);
1628 stop_image_decoding(&imdec);
1633 Double_t xconv = (
gPad->AbsPixeltoX(pal_Ax + pal_w) -
gPad->AbsPixeltoX(pal_Ax)) / grad_im->width;
1634 Double_t yconv = (
gPad->AbsPixeltoY(pal_Ay - pal_h) -
gPad->AbsPixeltoY(pal_Ay)) / grad_im->height;
1635 x1 =
gPad->AbsPixeltoX(pal_Ax);
1637 y2 =
gPad->AbsPixeltoY(pal_Ay);
1642 imdec = start_image_decoding(
fgVisual, grad_im, SCL_DO_ALL,
1643 0, 0, grad_im->width, grad_im->height, 0);
1645 for (
Int_t yt = 0; yt < (
Int_t)grad_im->height; yt++) {
1646 imdec->decode_image_scanline(imdec);
1647 for (
Int_t xt = 0; xt < (
Int_t)grad_im->width; xt++)
1649 imdec->buffer.green[xt],
1650 imdec->buffer.blue[xt]);
1653 stop_image_decoding(&imdec);
1664 pal_Xpos,
gPad->AbsPixeltoY(pal_Ay + 1),
1665 min, max, ndiv,
"+L");
1671 destroy_asimage(&grad_im);
1680 Int_t pxl, pyl, pxt, pyt;
1687 if (px1 < px2) {pxl = px1; pxt = px2;}
1688 else {pxl = px2; pxt = px1;}
1689 if (py1 < py2) {pyl = py1; pyt = py2;}
1690 else {pyl = py2; pyt = py1;}
1692 if ((px > pxl && px < pxt) && (py > pyl && py < pyt))
1703 static TBox *ZoomBox;
1708 gPad->ExecuteEvent(event, px, py);
1714 static Int_t px1old, py1old, px2old, py2old;
1715 static Int_t px1, py1, px2, py2, pxl, pyl, pxt, pyt;
1726 if (imgX < 0) px = px - imgX;
1727 if (imgY < 0) py = py - imgY;
1732 if (imgX >= (
int)image->width) px = px - imgX + image->width - 1;
1733 if (imgY >= (
int)image->height) py = py - imgY + image->height - 1;
1738 px1 =
gPad->XtoAbsPixel(
gPad->GetX1());
1739 py1 =
gPad->YtoAbsPixel(
gPad->GetY1());
1740 px2 =
gPad->XtoAbsPixel(
gPad->GetX2());
1741 py2 =
gPad->YtoAbsPixel(
gPad->GetY2());
1742 px1old = px; py1old = py;
1764 ZoomBox =
new TBox(pxl, pyl, pxt, pyt);
1766 ZoomBox->
Draw(
"l*");
1785 Int_t imgX1 = px1old -
gPad->XtoAbsPixel(0);
1786 Int_t imgY1 = py1old -
gPad->YtoAbsPixel(1);
1787 Int_t imgX2 = px -
gPad->XtoAbsPixel(0);
1788 Int_t imgY2 = py -
gPad->YtoAbsPixel(1);
1790 imgY1 = image->height - 1 - imgY1;
1791 imgY2 = image->height - 1 - imgY2;
1797 Zoom((imgX1 < imgX2) ? imgX1 : imgX2, (imgY1 < imgY2) ? imgY1 : imgY2,
1816 static char info[64];
1822 px -=
gPad->XtoAbsPixel(0);
1823 py -=
gPad->YtoAbsPixel(1);
1826 if (px < 0 || py < 0)
return info;
1830 if (px >= (
int)image->width || py >= (
int)image->height)
1833 py = image->height - 1 - py;
1840 if (
fImage->alt.vector) {
1841 snprintf(info,64,
"x: %d y: %d %.5g",
1844 snprintf(info,64,
"x: %d y: %d", px, py);
1860 Warning(
"SetPalette",
"Visual not initiated");
1865 Warning(
"SetPalette",
"Image not valid");
1869 if (
fImage->alt.vector == 0)
1875 ASVectorPalette asPalette;
1877 asPalette.channels[0] =
new CARD16 [asPalette.npoints];
1878 asPalette.channels[1] =
new CARD16 [asPalette.npoints];
1879 asPalette.channels[2] =
new CARD16 [asPalette.npoints];
1880 asPalette.channels[3] =
new CARD16 [asPalette.npoints];
1886 asPalette.points =
new double[asPalette.npoints];
1887 for (
Int_t point = 0; point <
Int_t(asPalette.npoints); point++)
1893 delete [] asPalette.points;
1894 for (
Int_t col = 0; col < 4; col++)
1895 delete [] asPalette.channels[col];
1914 Warning(
"Scale",
"Image not initiated");
1919 Warning(
"Scale",
"Visual not initiated");
1927 if (toWidth > 30000)
1929 if (toHeight > 30000)
1932 ASImage *img = scale_asimage(
fgVisual,
fImage, toWidth, toHeight,
1949 Warning(
"Scale",
"Image not initiated");
1954 Warning(
"Scale",
"Visual not initiated");
1962 if (toWidth > 30000)
1964 if (toHeight > 30000)
1968 yStart, yEnd, toWidth, toHeight,
1984 Warning(
"Tile",
"Image not initiated");
1989 Warning(
"Tile",
"Visual not initiated");
1997 if (toWidth > 30000)
1999 if (toHeight > 30000)
2002 ASImage *img = tile_asimage(
fgVisual,
fImage, 0, 0, toWidth, toHeight, 0,
2024 Warning(
"Zoom",
"Image not valid");
2046 Warning(
"UnZoom",
"Image not valid");
2074 Warning(
"Flip",
"Image not valid");
2078 Warning(
"Flip",
"Visual not initiated");
2082 if (
fImage->alt.vector) {
2083 Warning(
"Flip",
"flip does not work for data images");
2121 Warning(
"Mirror",
"Image not valid");
2126 Warning(
"Mirror",
"Visual not initiated");
2130 if (
fImage->alt.vector) {
2131 Warning(
"Mirror",
"mirror does not work for data images");
2203 if (inbatch && !noX) {
2215 fgVisual = create_asvisual(0, 0, 0, 0);
2222 fgVisual = create_asvisual(0, 0, 0, 0);
2225 disp = (Display*)
gVirtualX->GetDisplay();
2228 Visual *vis = (Visual*)
gVirtualX->GetVisual();
2231 if (vis == 0 || cmap == 0) {
2232 fgVisual = create_asvisual(0, 0, 0, 0);
2234 fgVisual = create_asvisual_for_id(disp, screen, depth,
2235 XVisualIDFromVisual(vis), cmap, 0);
2239 fgVisual = create_asvisual(0, 0, 0, 0);
2252 Warning(
"StartPaletteEditor",
"Image not valid");
2255 if (
fImage->alt.vector == 0) {
2256 Warning(
"StartPaletteEditor",
"palette can be modified only for data images");
2271 Warning(
"GetPixmap",
"Visual not initiated");
2279 static int x11 = -1;
2280 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
2286 if (!
fImage->alt.argb32) {
2289 ret =
gVirtualX->CreatePixmapFromData((
unsigned char*)
fImage->alt.argb32,
2305 Warning(
"GetMask",
"Visual not initiated");
2312 Warning(
"GetMask",
"No image");
2317 UInt_t ow = img->width%8;
2318 UInt_t ww = img->width - ow + (ow ? 8 : 0);
2325 char *bits =
new char[ww*hh];
2327 ASImageDecoder *imdec = start_image_decoding(
fgVisual, img, SCL_DO_ALPHA,
2334 for (
y = 0;
y < hh;
y++) {
2335 imdec->decode_image_scanline(imdec);
2336 CARD32 *
a = imdec->buffer.alpha;
2338 for (
x = 0;
x < ww;
x++) {
2352 stop_image_decoding(&imdec);
2353 pxmap =
gVirtualX->CreateBitmap(
gVirtualX->GetDefaultRootWindow(), (
const char *)bits,
2365 Warning(
"SetImage",
"Visual not initiated");
2379 static int x11 = -1;
2380 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
2385 unsigned char *bits =
gVirtualX->GetColorBits(pxm, 0, 0, w,
h);
2392 fImage = bitmap2asimage(bits, w,
h, 0, 0);
2396 unsigned char *mask_bits =
gVirtualX->GetColorBits(mask, 0, 0, w,
h);
2397 fImage = bitmap2asimage(bits, w,
h, 0, mask_bits);
2398 delete [] mask_bits;
2409 Warning(
"GetPixels",
"Wrong Image");
2414 ASImageDecoder *imdec;
2417 height = !height ? img->height : height;
2428 if ((
x >= (
int)img->width) || (
y >= (
int)img->height)) {
2432 if ((
int)(
x +
width) > (
int)img->width) {
2436 if ((
int)(
y + height) > (
int)img->height) {
2437 height = img->height -
y;
2440 if ((imdec = start_image_decoding(0,
fImage, SCL_DO_ALL, 0,
y,
2441 img->width, height, 0)) == 0) {
2442 Warning(
"GetPixels",
"Failed to create image decoder");
2452 for (
UInt_t k = 0; k < height; k++) {
2453 imdec->decode_image_scanline(imdec);
2456 if ((
r == (
Int_t)imdec->buffer.red[i]) &&
2457 (
g == (
Int_t)imdec->buffer.green[i]) &&
2458 (
b == (
Int_t)imdec->buffer.blue[i])) {
2460 r = (
Int_t)imdec->buffer.red[i];
2461 g = (
Int_t)imdec->buffer.green[i];
2462 b = (
Int_t)imdec->buffer.blue[i];
2469 stop_image_decoding(&imdec);
2481 Warning(
"GetVecArray",
"Bad Image");
2484 if (
fImage->alt.vector) {
2485 return fImage->alt.vector;
2503 Warning(
"GetArray",
"Bad Image");
2509 if (
fImage->alt.vector) {
2514 ASImageDecoder *imdec;
2516 w = w ? w :
fImage->width;
2525 if ((imdec = start_image_decoding(0, img, SCL_DO_ALL, 0, 0,
2526 img->width, 0, 0)) == 0) {
2527 Warning(
"GetArray",
"Failed to create image decoder");
2538 for (
UInt_t k = 0; k <
h; k++) {
2539 imdec->decode_image_scanline(imdec);
2541 for (
UInt_t i = 0; i < w; ++i) {
2542 if ((
r == imdec->buffer.red[i]) &&
2543 (
g == imdec->buffer.green[i]) &&
2544 (
b == imdec->buffer.blue[i])) {
2546 r = imdec->buffer.red[i];
2547 g = imdec->buffer.green[i];
2548 b = imdec->buffer.blue[i];
2556 stop_image_decoding(&imdec);
2579 const char *color,
const char *font_name,
2583 ARGB32 text_color = ARGB32_Black;
2584 ASImage *fore_im = 0;
2585 ASImage *text_im = 0;
2589 Warning(
"DrawText",
"Visual not initiated");
2597 if (fn.
Last(
'/') == 0) fn = fn(1, fn.
Length() - 1);
2610 parse_argb_color(color, &text_color);
2623 Warning(
"DrawText",
"cannot create Font Manager");
2630 font = get_asfont(
gFontManager,
"fixed", 0, size, ASF_GuessWho);
2632 Warning(
"DrawText",
"cannot find a font %s", font_name);
2637 get_text_size(
text, font, (ASText3DType)
type, &
width, &height);
2644 text_im = draw_text(
text, font, (ASText3DType)
type, 0);
2649 ASImage *tmp = file2ASImage(fore_file, 0xFFFFFFFF, SCREEN_GAMMA, 0, 0);
2651 if ((tmp->width !=
width) || (tmp->height != height)) {
2652 fore_im = tile_asimage(
fgVisual, tmp, 0, 0,
width, height, 0,
2655 destroy_asimage(&tmp);
2662 move_asimage_channel(fore_im, IC_ALPHA, text_im, IC_ALPHA);
2663 destroy_asimage(&text_im);
2671 ASImage *rendered_im;
2672 ASImageLayer layers[2];
2674 init_image_layers(&(layers[0]), 2);
2675 fore_im->back_color = text_color;
2676 layers[0].im = rimg;
2677 layers[0].dst_x = 0;
2678 layers[0].dst_y = 0;
2679 layers[0].clip_width = rimg->width;
2680 layers[0].clip_height = rimg->height;
2681 layers[0].bevel = 0;
2682 layers[1].im = fore_im;
2683 layers[1].dst_x =
x;
2684 layers[1].dst_y =
y;
2685 layers[1].clip_width = fore_im->width;
2686 layers[1].clip_height = fore_im->height;
2688 rendered_im = merge_layers(
fgVisual, &(layers[0]), 2, rimg->width, rimg->height,
2691 destroy_asimage(&fore_im);
2724 Warning(
"Merge",
"Visual not initiated");
2728 ASImage *rendered_im;
2729 ASImageLayer layers[2];
2731 init_image_layers(&(layers[0]), 2);
2733 layers[0].dst_x = 0;
2734 layers[0].dst_y = 0;
2735 layers[0].clip_width =
fImage->width;
2736 layers[0].clip_height =
fImage->height;
2737 layers[0].bevel = 0;
2738 layers[1].im = ((
TASImage*)im)->fImage;
2739 layers[1].dst_x =
x;
2740 layers[1].dst_y =
y;
2741 layers[1].clip_width = im->
GetWidth();
2742 layers[1].clip_height = im->
GetHeight();
2743 layers[1].merge_scanlines = blend_scanlines_name2func(op ? op :
"add");
2761 Warning(
"Blur",
"Visual not initiated");
2766 fImage = create_asimage(100, 100, 0);
2769 Warning(
"Blur",
"Failed to create image");
2776 ASImage *rendered_im = blur_asimage_gauss(
fgVisual,
fImage, hr > 0 ? hr : 3,
2777 vr > 0 ? vr : 3, SCL_DO_ALL,
2790 Warning(
"Clone",
"Image not initiated");
2797 Warning(
"Clone",
"Failed to create image");
2813 if (
fImage->alt.argb32) {
2815 im->
fImage->alt.argb32 = (ARGB32*)safemalloc(sz*
sizeof(ARGB32));
2816 memcpy(im->
fImage->alt.argb32,
fImage->alt.argb32, sz *
sizeof(ARGB32));
2836 Warning(
"Vectorize",
"Visual not initiated");
2841 fImage = create_asimage(100, 100, 0);
2844 Warning(
"Vectorize",
"Failed to create image");
2855 dither = dither > 7 ? 7 : dither;
2857 res = colormap_asimage(
fImage, &cmap, max_colors, dither, opaque_threshold);
2869 g = INDEX_SHIFT_GREEN(cmap.entries[res[i]].green);
2870 b = INDEX_SHIFT_BLUE(cmap.entries[res[i]].blue);
2871 r = INDEX_SHIFT_RED(cmap.entries[res[i]].red);
2873 v = MAKE_INDEXED_COLOR24(
r,
g,
b);
2883 for (
UInt_t j = 0; j < cmap.count; j++) {
2884 g = INDEX_SHIFT_GREEN(cmap.entries[j].green);
2885 b = INDEX_SHIFT_BLUE(cmap.entries[j].blue);
2886 r = INDEX_SHIFT_RED(cmap.entries[j].red);
2887 v = MAKE_INDEXED_COLOR24(
r,
g,
b);
2889 v = (
v>>12) & 0x0FFF;
2892 pal->
fColorRed[j] = cmap.entries[j].red << 8;
2894 pal->
fColorBlue[j] = cmap.entries[j].blue << 8;
2898 destroy_colormap(&cmap,
kTRUE);
2901 fImage->alt.vector = vec;
2904 if (res) safefree(res);
2950 Warning(
"HSV",
"Visual not initiated");
2958 Warning(
"HSV",
"Failed to create image");
2968 height = !height ?
fImage->height : height;
2970 ASImage *rendered_im = 0;
2974 hue, radius,
H,
S, V, ASA_ASImage, 100,
2975 ASIMAGE_QUALITY_TOP);
2978 Warning(
"HSV",
"Failed to create rendered image");
3013 Warning(
"Gradient",
"Visual not initiated");
3017 ASImage *rendered_im = 0;
3018 ASGradient gradient;
3020 int reverse = 0, npoints1 = 0, npoints2 = 0;
3027 if ((angle > 2 * 180 * 15 / 16) || (angle < 2 * 180 * 1 / 16)) {
3028 gradient.type = GRADIENT_Left2Right;
3029 }
else if (angle < 2 * 180 * 3 / 16) {
3030 gradient.type = GRADIENT_TopLeft2BottomRight;
3031 }
else if (angle < 2 * 180 * 5 / 16) {
3032 gradient.type = GRADIENT_Top2Bottom;
3033 }
else if (angle < 2 * 180 * 7 / 16) {
3034 gradient.type = GRADIENT_BottomLeft2TopRight; reverse = 1;
3035 }
else if (angle < 2 * 180 * 9 / 16) {
3036 gradient.type = GRADIENT_Left2Right; reverse = 1;
3037 }
else if (angle < 2 * 180 * 11 / 16) {
3038 gradient.type = GRADIENT_TopLeft2BottomRight; reverse = 1;
3039 }
else if (angle < 2 * 180 * 13 / 16) {
3040 gradient.type = GRADIENT_Top2Bottom; reverse = 1;
3042 gradient.type = GRADIENT_BottomLeft2TopRight;
3045 for (p = (
char*)
colors; isspace((
int)*p); p++) { }
3047 for (npoints1 = 0; *p; npoints1++) {
3049 for ( ; *p && !isspace((
int)*p); p++) { }
3051 for ( ; isspace((
int)*p); p++) { }
3054 for (p = (
char*)offsets; isspace((
int)*p); p++) { }
3056 for (npoints2 = 0; *p; npoints2++) {
3058 for ( ; *p && !isspace((
int)*p); p++) { }
3060 for ( ; isspace((
int)*p); p++) { }
3065 if (offsets && (npoints1 > npoints2)) npoints1 = npoints2;
3074 gradient.color =
new ARGB32[npoints1];
3075 gradient.offset =
new double[npoints1];
3077 for (p = (
char*)
colors; isspace((
int)*p); p++) { }
3079 for (npoints1 = 0; *p; ) {
3083 for ( ; *p && !isspace((
int)*p); p++) { }
3085 for ( ; isspace((
int)*p); p++) { }
3087 col = str(pb -
colors, p - pb);
3089 if (parse_argb_color(col.
Data(), gradient.color + npoints1) != col) {
3092 Warning(
"Gradient",
"Failed to parse color [%s] - defaulting to black", pb);
3097 for (p = (
char*)offsets; isspace((
int)*p); p++) { }
3099 for (npoints2 = 0; *p; ) {
3103 for ( ; *p && !isspace((
int)*p); p++) { }
3106 gradient.offset[npoints2] = strtod(pb, &pb);
3108 if (pb == p) npoints2++;
3110 for ( ; isspace((
int)*p); p++) { }
3113 for (npoints2 = 0; npoints2 < npoints1; npoints2++) {
3114 gradient.offset[npoints2] = (double)npoints2 / (npoints1 - 1);
3117 gradient.npoints = npoints1;
3119 if (npoints2 && (gradient.npoints > npoints2)) {
3120 gradient.npoints = npoints2;
3123 for (i = 0; i < gradient.npoints/2; i++) {
3124 int i2 = gradient.npoints - 1 - i;
3125 ARGB32
c = gradient.color[i];
3126 double o = gradient.offset[i];
3127 gradient.color[i] = gradient.color[i2];
3128 gradient.color[i2] =
c;
3129 gradient.offset[i] = gradient.offset[i2];
3130 gradient.offset[i2] = o;
3132 for (i = 0; i < gradient.npoints; i++) {
3133 gradient.offset[i] = 1.0 - gradient.offset[i];
3136 rendered_im = make_gradient(
fgVisual, &gradient,
width, height, SCL_DO_ALL,
3139 delete [] gradient.color;
3140 delete [] gradient.offset;
3144 Warning(
"Gradient",
"Failed to create gradient image");
3153 ASImageLayer layers[2];
3155 init_image_layers(&(layers[0]), 2);
3157 layers[0].dst_x = 0;
3158 layers[0].dst_y = 0;
3159 layers[0].clip_width =
fImage->width;
3160 layers[0].clip_height =
fImage->height;
3161 layers[0].bevel = 0;
3162 layers[1].im = rendered_im;
3163 layers[1].dst_x =
x;
3164 layers[1].dst_y =
y;
3165 layers[1].clip_width =
width;
3166 layers[1].clip_height = height;
3167 layers[1].merge_scanlines = alphablend_scanlines;
3172 Warning(
"Gradient",
"Failed to create merged image");
3176 destroy_asimage(&rendered_im);
3191 cmp = (cmp * 12) / 10;
3193 return (cmp > 255) ? 255 : cmp;
3214 return (background >> 1) & 0x7F7F7F7F;
3225 a = ARGB32_ALPHA8(foreground) + ARGB32_ALPHA8(background);
3227 r = ARGB32_RED8(foreground) + ARGB32_RED8(background);
3229 g = ARGB32_GREEN8(foreground) + ARGB32_GREEN8(background);
3231 b = ARGB32_BLUE8(foreground) + ARGB32_BLUE8(background);
3234 return MAKE_ARGB32(
a,
r,
g,
b);
3250 const char *hi_color,
const char *lo_color,
UShort_t thick,
3254 Warning(
"Bevel",
"Visual not initiated");
3261 ARGB32
hi=ARGB32_White, lo=ARGB32_White;
3262 parse_argb_color(hi_color, &
hi);
3263 parse_argb_color(lo_color, &lo);
3266 bevel.lo_color =
hi;
3268 bevel.hi_color = lo;
3271 bevel.hi_color =
hi;
3273 bevel.lo_color = lo;
3278 int extra_hilite = 2;
3279 bevel.left_outline = bevel.top_outline = bevel.right_outline = bevel.bottom_outline = thick;
3280 bevel.left_inline = bevel.top_inline = bevel.right_inline = bevel.bottom_inline = extra_hilite + 1;
3282 if (bevel.top_outline > 1) {
3283 bevel.top_inline += bevel.top_outline - 1;
3286 if (bevel.left_outline > 1) {
3287 bevel.left_inline += bevel.left_outline - 1;
3290 if (bevel.right_outline > 1) {
3291 bevel.right_inline += bevel.right_outline - 1;
3294 if (bevel.bottom_outline > 1) {
3295 bevel.bottom_inline += bevel.bottom_outline - 1;
3299 ARGB32
fill = ((
hi>>24) != 0xff) || ((lo>>24) != 0xff) ? bevel.hilo_color : (bevel.hilo_color | 0xff000000);
3305 Warning(
"Bevel",
"Failed to create image");
3315 height = !height ?
fImage->height : height;
3317 ASImageLayer layers[2];
3318 init_image_layers(&(layers[0]), 2);
3321 layers[0].dst_x = 0;
3322 layers[0].dst_y = 0;
3323 layers[0].clip_width =
fImage->width;
3324 layers[0].clip_height =
fImage->height;
3325 layers[0].bevel = 0;
3327 UInt_t w =
width - (bevel.left_outline + bevel.right_outline);
3328 UInt_t h = height - (bevel.top_outline + bevel.bottom_outline);
3329 ASImage *bevel_im = create_asimage(w,
h, 0);
3332 Warning(
"Bevel",
"Failed to create bevel image");
3336 layers[1].im = bevel_im;
3339 layers[1].dst_x =
x;
3340 layers[1].dst_y =
y;
3341 layers[1].clip_width =
width;
3342 layers[1].clip_height = height;
3343 layers[1].bevel = &bevel;
3344 layers[1].merge_scanlines = alphablend_scanlines;
3348 destroy_asimage(&bevel_im);
3351 Warning(
"Bevel",
"Failed to image");
3371 Warning(
"Pad",
"Visual not initiated");
3376 fImage = create_asimage(100, 100, 0);
3379 Warning(
"Pad",
"Failed to create image");
3388 ARGB32 color = ARGB32_White;
3389 parse_argb_color(col, &color);
3400 Warning(
"Pad",
"Failed to create output image");
3417 Warning(
"Crop",
"Visual not initiated");
3430 height =
y + height >
fImage->height ?
fImage->height -
y : height;
3433 Warning(
"Crop",
"input size larger than image");
3436 ASImageDecoder *imdec = start_image_decoding(
fgVisual,
fImage, SCL_DO_ALL,
3440 Warning(
"Crop",
"Failed to start image decoding");
3444 ASImage *img = create_asimage(
width, height, 0);
3448 Warning(
"Crop",
"Failed to create image");
3452 ASImageOutput *imout = start_image_output(
fgVisual, img, ASA_ASImage,
3456 Warning(
"Crop",
"Failed to start image output");
3457 destroy_asimage(&img);
3458 if (imdec)
delete [] imdec;
3466 for (
UInt_t i = 0; i < height; i++) {
3467 imdec->decode_image_scanline(imdec);
3468 imout->output_image_scanline(imout, &(imdec->buffer), 1);
3471 stop_image_decoding(&imdec);
3472 stop_image_output(&imout);
3496 Warning(
"Append",
"Visual not initiated");
3514 }
else if (opt ==
"/") {
3516 Merge(im,
"alphablend", 0, height);
3535 Warning(
"BeginPaint",
"Visual not initiated");
3550 0, ASA_ARGB32, 0, ASIMAGE_QUALITY_DEFAULT);
3553 Warning(
"BeginPaint",
"Failed to create image");
3567 Warning(
"EndPaint",
"no image");
3571 if (!
fImage->alt.argb32)
return;
3574 0, ASA_ASImage, 0, ASIMAGE_QUALITY_DEFAULT);
3577 Warning(
"EndPaint",
"Failed to create image");
3594 Warning(
"GetArgbArray",
"no image");
3601 if (!img->alt.argb32) {
3611 return (
UInt_t *)img->alt.argb32;
3622 Warning(
"GetRgbaArray",
"no image");
3629 if (!img->alt.argb32) {
3647 for (i = 0; i < img->height; i++) {
3648 for (j = 0; j < img->width; j++) {
3650 argb = img->alt.argb32[idx];
3652 rgb = argb & 0x00ffffff;
3653 rgba = (rgb << 8) +
a;
3668 Warning(
"GetScanline",
"no image");
3673 CARD32 *ret =
new CARD32[img->width];
3675 ASImageDecoder *imdec = start_image_decoding(
fgVisual, img, SCL_DO_ALL,
3676 0,
y, img->width, 1, 0);
3680 Warning(
"GetScanline",
"Failed to start image decoding");
3688 imdec->decode_image_scanline(imdec);
3689 memcpy(imdec->buffer.buffer, ret, img->width*
sizeof(CARD32));
3690 stop_image_decoding(&imdec);
3705#if defined(R__GNU) && defined(__i386__) && !defined(__sun)
3706#define _MEMSET_(dst, lng, val) __asm__("movl %0,%%eax \n"\
3707 "movl %1,%%edi \n" \
3708 "movl %2,%%ecx \n" \
3713 :"g" (val), "g" (dst), "g" (lng) \
3714 :"eax","edi","ecx" \
3718 #define _MEMSET_(dst, lng, val) do {\
3719 for( UInt_t j=0; j < lng; j++) *((dst)+j) = val; } while (0)
3723#define FillSpansInternal(npt, ppt, widths, color) do {\
3724 UInt_t yy = ppt[0].fY*fImage->width;\
3725 for (UInt_t i = 0; i < npt; i++) {\
3726 _MEMSET_(&fImage->alt.argb32[Idx(yy + ppt[i].fX)], widths[i], color);\
3727 yy += ((i+1 < npt) && (ppt[i].fY != ppt[i+1].fY) ? fImage->width : 0);\
3739 Warning(
"FillRectangle",
"Visual not initiated");
3744 Warning(
"FillRectangle",
"no image");
3748 if (!
fImage->alt.argb32) {
3752 if (!
fImage->alt.argb32) {
3753 Warning(
"FillRectangle",
"Failed to get pixel array");
3757 ARGB32 color = (ARGB32)col;
3760 if (height == 0) height = 1;
3771 Bool_t has_alpha = (color & 0xff000000) != 0xff000000;
3777 height =
y + height >
fImage->height ?
fImage->height -
y : height;
3779 if (!
fImage->alt.argb32) {
3784 ARGB32 *p0 =
fImage->alt.argb32 + yyy +
x;
3786 for (
UInt_t i = 0; i < height; i++) {
3791 for (
UInt_t i =
y; i <
y + height; i++) {
3816 Warning(
"Fill",
"Visual not initiated");
3820 ARGB32 color = ARGB32_White;
3823 parse_argb_color(col, &color);
3841 ARGB32 color = (ARGB32)col;
3844 if (!thick) thick = 1;
3852 thick += (
x - half);
3860 int yy = y1*
fImage->width;
3862 for (
UInt_t w = 0; w < thick; w++) {
3863 if (
x + w < fImage->
width) {
3876 ARGB32 color = (ARGB32)col;
3879 if (!thick) thick = 1;
3887 thick += (
y - half);
3896 for (
UInt_t w = 0; w < thick; w++) {
3898 if (
y + w < fImage->height) {
3910 const char *col,
UInt_t thick)
3912 ARGB32 color = ARGB32_White;
3913 parse_argb_color(col, &color);
3925 int x,
y, xend, yend;
3932 Warning(
"DrawLine",
"Visual not initiated");
3937 Warning(
"DrawLine",
"no image");
3941 if (!
fImage->alt.argb32) {
3945 if (!
fImage->alt.argb32) {
3946 Warning(
"DrawLine",
"Failed to get pixel array");
3950 ARGB32 color = (ARGB32)col;
3955 if (!dx && !dy)
return;
3959 y2 > y1 ? y2 : y1, color, thick);
3977 i2 = i1 - (dx << 1);
3994 q = (y2 - y1) * ydir;
4027 i2 = i1 - (dy << 1);
4044 q = (
x2 -
x1) * xdir;
4082 const char *col,
UInt_t thick)
4085 Warning(
"DrawRectangle",
"Visual not initiated");
4094 fImage = create_asimage(w,
h, 0);
4099 if (!
fImage->alt.argb32) {
4103 if (!
fImage->alt.argb32) {
4104 Warning(
"DrawRectangle",
"Failed to get pixel array");
4108 ARGB32 color = ARGB32_White;
4109 parse_argb_color(col, &color);
4129 ARGB32 color = ARGB32_White;
4134 fImage = create_asimage(w,
h, 0);
4140 parse_argb_color(col, &color);
4146 parse_argb_color(col, &color);
4176 ARGB32 color = (ARGB32)col;
4186 thick += (
y - half);
4189 thick = thick <= 0 ? 1 : thick;
4198 x2 =
x2 < tmp ? tmp :
x2;
4201 for (
UInt_t w = 0; w < thick; w++) {
4202 if (
y + w < fImage->height) {
4210 if (i >= pDash[iDash]) {
4214 if (iDash >= nDash) {
4230 ARGB32 color = (ARGB32)col;
4240 thick += (
x - half);
4243 thick = thick <= 0 ? 1 : thick;
4250 y1 = y2 < y1 ? y2 : y1;
4251 y2 = y2 < tmp ? tmp : y2;
4255 int yy = y1*
fImage->width;
4257 for (
UInt_t w = 0; w < thick; w++) {
4258 if (
x + w < fImage->
width) {
4266 if (i >= pDash[iDash]) {
4270 if (iDash >= nDash) {
4286 int x,
y, xend, yend;
4296 char *pDash =
new char[nDash];
4301 for (i = 0; i < (int)nDash; i++) {
4307 i2 = i1 - (dx << 1);
4325 q = (y2 - y1) * ydir;
4330 if ((iDash%2) == 0) {
4342 if (i >= pDash[iDash]) {
4346 if (iDash >= nDash) {
4354 if ((iDash%2) == 0) {
4366 if (i >= pDash[iDash]) {
4370 if (iDash >= nDash) {
4379 for (i = 0; i < (int)nDash; i++) {
4385 i2 = i1 - (dy << 1);
4403 q = (
x2 -
x1) * xdir;
4408 if ((iDash%2) == 0) {
4422 if (i >= pDash[iDash]) {
4426 if (iDash >= nDash) {
4434 if ((iDash%2) == 0) {
4448 if (i >= pDash[iDash]) {
4452 if (iDash >= nDash) {
4470 double x,
y, xend=0, yend=0, x0, y0;
4478 double *xDash =
new double[nDash];
4479 double *yDash =
new double[nDash];
4484 for (i = 0; i < (int)nDash; i++) {
4485 xDash[i] = tDash[i] * ac;
4486 yDash[i] = tDash[i] *
as;
4490 xDash[i] = xDash[i]/2;
4491 yDash[i] = yDash[i]/2;
4493 xDash[i] = xDash[i]*2;
4494 yDash[i] = yDash[i]*2;
4511 q = (y2 - y1) * ydir;
4518 while ((
x < xend) && (
y < yend)) {
4522 if ((iDash%2) == 0) {
4532 if (iDash >= nDash) {
4537 while ((
x < xend) && (
y > yend)) {
4541 if ((iDash%2) == 0) {
4551 if (iDash >= nDash) {
4570 q = (
x2 -
x1) * xdir;
4577 while ((
x < xend) && (
y < yend)) {
4581 if ((iDash%2) == 0) {
4591 if (iDash >= nDash) {
4596 while ((
x > xend) && (
y < yend)) {
4600 if ((iDash%2) == 0) {
4610 if (iDash >= nDash) {
4624 const char *pDash,
const char *col,
UInt_t thick)
4628 Warning(
"DrawDashLine",
"Visual not initiated");
4633 Warning(
"DrawDashLine",
"no image");
4637 if (!
fImage->alt.argb32) {
4641 if (!
fImage->alt.argb32) {
4642 Warning(
"DrawDashLine",
"Failed to get pixel array");
4646 if ((nDash < 2) || !pDash || (nDash%2)) {
4647 Warning(
"DrawDashLine",
"Wrong input parameters n=%d %ld", nDash, (
Long_t)
sizeof(pDash)-1);
4651 ARGB32 color = ARGB32_White;
4652 parse_argb_color(col, &color);
4656 }
else if (y1 == y2) {
4670 ARGB32 color = ARGB32_White;
4671 parse_argb_color(col, &color);
4678 for (
UInt_t i = 1; i < nn; i++) {
4695 Warning(
"PutPixel",
"Visual not initiated");
4700 Warning(
"PutPixel",
"no image");
4704 if (!
fImage->alt.argb32) {
4708 if (!
fImage->alt.argb32) {
4709 Warning(
"PutPixel",
"Failed to get pixel array");
4714 parse_argb_color(col, &color);
4716 if ((
x < 0) || (
y < 0) || (
x >= (
int)
fImage->width) || (
y >= (
int)
fImage->height)) {
4717 Warning(
"PutPixel",
"Out of range width=%d x=%d, height=%d y=%d",
4730 Warning(
"PolyPoint",
"Visual not initiated");
4735 Warning(
"PolyPoint",
"no image");
4739 if (!
fImage->alt.argb32) {
4743 if (!
fImage->alt.argb32) {
4744 Warning(
"PolyPoint",
"Failed to get pixel array");
4749 Warning(
"PolyPoint",
"No points specified");
4756 parse_argb_color(col, &color);
4762 for (i = 0; i < npt; i++) {
4763 ipt[i].
fX += ppt[i].
fX;
4764 ipt[i].
fY += ppt[i].
fY;
4769 for (i = 0; i < npt; i++) {
4770 x = ipt ? ipt[i].
fX : ppt[i].
fX;
4771 y = ipt ? ipt[i].
fY : ppt[i].
fY;
4773 if ((
x < 0) || (
y < 0) || (
x >= (
int)
fImage->width) || (
y >= (
int)
fImage->height)) {
4789 if (!nseg || !seg) {
4790 Warning(
"DrawSegments",
"Invalid data nseg=%d seg=0x%lx", nseg, (
Long_t)seg);
4796 for (
UInt_t i = 0; i < nseg; i++) {
4797 pt[0].fX = seg->
fX1;
4798 pt[1].fX = seg->
fX2;
4799 pt[0].fY = seg->
fY1;
4800 pt[1].fY = seg->
fY2;
4814 Warning(
"FillSpans",
"Visual not initiated");
4819 Warning(
"FillSpans",
"no image");
4823 if (!
fImage->alt.argb32) {
4827 if (!
fImage->alt.argb32) {
4828 Warning(
"FillSpans",
"Failed to get pixel array");
4832 if (!npt || !ppt || !widths || (stipple && (!w || !
h))) {
4833 Warning(
"FillSpans",
"Invalid input data npt=%d ppt=0x%lx col=%s widths=0x%lx stipple=0x%lx w=%d h=%d",
4839 parse_argb_color(col, &color);
4844 for (
UInt_t i = 0; i < npt; i++) {
4846 for (
UInt_t j = 0; j < widths[i]; j++) {
4847 if ((ppt[i].fX >= (
Int_t)
fImage->width) || (ppt[i].
fX < 0) ||
4858 if (stipple[ii >> 3] & (1 << (ii%8))) {
4872 Warning(
"FillSpans",
"Visual not initiated");
4877 Warning(
"FillSpans",
"no image");
4881 if (!
fImage->alt.argb32) {
4885 if (!
fImage->alt.argb32) {
4886 Warning(
"FillSpans",
"Failed to get pixel array");
4890 if (!npt || !ppt || !widths || !tile) {
4891 Warning(
"FillSpans",
"Invalid input data npt=%d ppt=0x%lx widths=0x%lx tile=0x%lx",
4905 for (
UInt_t i = 0; i < npt; i++) {
4908 for (
UInt_t j = 0; j < widths[i]; j++) {
4909 if ((ppt[i].fX >= (
Int_t)
fImage->width) || (ppt[i].
fX < 0) ||
4928 Warning(
"CropSpans",
"Visual not initiated");
4933 Warning(
"CropSpans",
"no image");
4937 if (!
fImage->alt.argb32) {
4941 if (!
fImage->alt.argb32) {
4942 Warning(
"CropSpans",
"Failed to get pixel array");
4946 if (!npt || !ppt || !widths) {
4947 Warning(
"CropSpans",
"No points specified npt=%d ppt=0x%lx widths=0x%lx", npt, (
Long_t)ppt, (
Long_t)widths);
4952 int y1 = ppt[npt-1].
fY;
4960 for (
y = 0; (int)
y < y0;
y++) {
4963 if (idx < sz)
fImage->alt.argb32[idx] = 0;
4968 for (i = 0; i < npt; i++) {
4969 for (
x = 0; (int)
x < ppt[i].fX;
x++) {
4971 if (idx < sz)
fImage->alt.argb32[idx] = 0;
4973 for (
x = ppt[i].fX + widths[i] + 1;
x <
fImage->width;
x++) {
4975 if (idx < sz)
fImage->alt.argb32[idx] = 0;
4983 if (idx < sz)
fImage->alt.argb32[idx] = 0;
5017 Warning(
"CopyArea",
"Visual not initiated");
5022 Warning(
"CopyArea",
"no image");
5027 ASImage *out = ((
TASImage*)dst)->GetImage();
5033 xsrc = xsrc < 0 ? 0 : xsrc;
5034 ysrc = ysrc < 0 ? 0 : ysrc;
5036 if ((xsrc >= (
int)
fImage->width) || (ysrc >= (
int)
fImage->height))
return;
5038 w = xsrc + w >
fImage->width ?
fImage->width - xsrc : w;
5042 if (!
fImage->alt.argb32) {
5045 if (!out->alt.argb32) {
5047 out = ((
TASImage*)dst)->GetImage();
5050 if (
fImage->alt.argb32 && out->alt.argb32) {
5051 for (
y = 0;
y < (int)
h;
y++) {
5052 for (
x = 0;
x < (int)w;
x++) {
5053 idx =
Idx(yy +
x + xsrc);
5054 if ((
x + xdst < 0) || (ydst +
y < 0) ||
5055 (
x + xdst >= (
int)out->width) || (
y + ydst >= (
int)out->height) )
continue;
5057 idx2 =
Idx((ydst +
y)*out->width +
x + xdst);
5061 out->alt.argb32[idx2] = 0;
5064 out->alt.argb32[idx2] &=
fImage->alt.argb32[idx];
5067 out->alt.argb32[idx2] =
fImage->alt.argb32[idx] & (~out->alt.argb32[idx2]);
5070 out->alt.argb32[idx2] &= ~fImage->alt.argb32[idx];
5075 out->alt.argb32[idx2] ^=
fImage->alt.argb32[idx];
5078 out->alt.argb32[idx2] |=
fImage->alt.argb32[idx];
5081 out->alt.argb32[idx2] = (~fImage->alt.argb32[idx]) & (~out->alt.argb32[idx2]);
5084 out->alt.argb32[idx2] ^= ~fImage->alt.argb32[idx];
5087 out->alt.argb32[idx2] = ~out->alt.argb32[idx2];
5090 out->alt.argb32[idx2] =
fImage->alt.argb32[idx] | (~out->alt.argb32[idx2]);
5093 out->alt.argb32[idx2] = ~fImage->alt.argb32[idx];
5096 out->alt.argb32[idx2] |= ~fImage->alt.argb32[idx];
5099 out->alt.argb32[idx2] = (~fImage->alt.argb32[idx]) | (~out->alt.argb32[idx2]);
5102 out->alt.argb32[idx2] = 0xFFFFFFFF;
5106 out->alt.argb32[idx2] =
fImage->alt.argb32[idx];
5130 int i, j, ix, iy, w,
h;
5132 ARGB32 color = 0xFFFFFFFF;
5139 for (i = 0; i < nx; i++) {
5141 for (j = 0; j < ny; j++) {
5142 icol = (ARGB32)ic[i + (nx*j)];
5143 if (icol != color) {
5197 return (ptMin - ptsStart);
5213 int mr = 0, m1r = 0;
5214 int incr1l = 0, incr2l = 0;
5215 int incr1r = 0, incr2r = 0;
5220 int nextleft, nextright;
5233 Warning(
"GetPolygonSpans",
"Visual not initiated");
5238 Warning(
"GetPolygonSpans",
"no image");
5242 if (!
fImage->alt.argb32) {
5246 if (!
fImage->alt.argb32) {
5247 Warning(
"GetPolygonSpans",
"Failed to get pixel array");
5251 if ((npt < 3) || !ppt) {
5252 Warning(
"GetPolygonSpans",
"No points specified npt=%d ppt=0x%lx", npt, (
Long_t)ppt);
5261 if ((npt < 3) || (dy < 0))
return kFALSE;
5263 ptsOut = firstPoint =
new TPoint[dy];
5267 nextleft = nextright = imin;
5268 y = ppt[nextleft].
fY;
5273 if (ppt[nextleft].fY ==
y) {
5279 if (nextleft >= (
int)npt) {
5286 ppt[left].fX, ppt[nextleft].fX,
5287 xl, dl, ml, m1l, incr1l, incr2l);
5291 if (ppt[nextright].fY ==
y) {
5297 if (nextright < 0) {
5304 ppt[right].fX, ppt[nextright].fX,
5305 xr, dr, mr, m1r, incr1r, incr2r);
5310 i =
TMath::Min(ppt[nextleft].fY, ppt[nextright].fY) -
y;
5314 delete [] firstWidth;
5315 delete [] firstPoint;
5324 *(
width++) = xr - xl;
5325 (ptsOut++)->fX = xl;
5327 *(
width++) = xl - xr;
5328 (ptsOut++)->fX = xr;
5336 }
while (
y !=
ymax);
5338 *nspans =
UInt_t(ptsOut - firstPoint);
5339 *outPoint = firstPoint;
5340 *outWidth = firstWidth;
5357 ARGB32 color = ARGB32_White;
5358 parse_argb_color(col, &color);
5361 if (!stipple && ((color & 0xff000000)==0xff000000)) {
5364 FillSpans(nspans, firstPoint, firstWidth, col, stipple, w,
h);
5368 delete [] firstWidth;
5369 delete [] firstPoint;
5372 if (firstWidth)
delete [] firstWidth;
5373 if (firstPoint)
delete [] firstPoint;
5390 FillSpans(nspans, firstPoint, firstWidth, tile);
5393 delete [] firstWidth;
5394 delete [] firstPoint;
5397 if (firstWidth)
delete [] firstWidth;
5398 if (firstPoint)
delete [] firstPoint;
5414 CropSpans(nspans, firstPoint, firstWidth);
5417 delete [] firstWidth;
5418 delete [] firstPoint;
5421 if (firstWidth)
delete [] firstWidth;
5422 if (firstPoint)
delete [] firstPoint;
5435 Warning(
"DrawFillArea",
"Visual not initiated");
5440 Warning(
"DrawFillArea",
"no image");
5444 if (!
fImage->alt.argb32) {
5448 if (!
fImage->alt.argb32) {
5449 Warning(
"DrawFillArea",
"Failed to get pixel array");
5453 if ((count < 3) || !ptsIn) {
5454 Warning(
"DrawFillArea",
"No points specified npt=%d ppt=0x%lx", count, (
Long_t)ptsIn);
5463 ARGB32 color = ARGB32_White;
5464 parse_argb_color(col, &color);
5482 static const UInt_t gEdgeTableEntryCacheSize = 200;
5483 static EdgeTableEntry gEdgeTableEntryCache[gEdgeTableEntryCacheSize];
5485 if (count < gEdgeTableEntryCacheSize) {
5493 ptsOut = firstPoint;
5496 pSLL = ET.scanlines.next;
5498 for (
y = ET.ymin;
y < ET.ymax;
y++) {
5499 if (pSLL &&
y == pSLL->scanline) {
5500 loadAET(&AET, pSLL->edgelist);
5507 ptsOut->
fX = pAET->bres.minor_axis;
5512 *
width++ = pAET->next->bres.minor_axis - pAET->bres.minor_axis;
5515 if (!stipple && ((color & 0xff000000)==0xff000000)) {
5518 FillSpans(nPts, firstPoint, firstWidth, col, stipple, w,
h);
5520 ptsOut = firstPoint;
5531 if (!stipple && ((color & 0xff000000)==0xff000000)) {
5534 FillSpans(nPts, firstPoint, firstWidth, col, stipple, w,
h);
5538 if (del)
delete [] pETEs;
5548 Warning(
"DrawFillArea",
"Visual not initiated");
5553 Warning(
"DrawFillArea",
"no image");
5557 if (!
fImage->alt.argb32) {
5561 if (!
fImage->alt.argb32) {
5562 Warning(
"DrawFillArea",
"Failed to get pixel array");
5566 if ((count < 3) || !ptsIn) {
5567 Warning(
"DrawFillArea",
"No points specified npt=%d ppt=0x%lx", count, (
Long_t)ptsIn);
5593 ptsOut = firstPoint;
5596 pSLL = ET.scanlines.next;
5598 for (
y = ET.ymin;
y < ET.ymax;
y++) {
5599 if (pSLL &&
y == pSLL->scanline) {
5600 loadAET(&AET, pSLL->edgelist);
5607 ptsOut->
fX = pAET->bres.minor_axis;
5612 *
width++ = pAET->next->bres.minor_axis - pAET->bres.minor_axis;
5615 FillSpans(nPts, firstPoint, firstWidth, tile);
5616 ptsOut = firstPoint;
5625 FillSpans(nPts, firstPoint, firstWidth, tile);
5636 ASDrawContext *ctx =
new ASDrawContext;
5638 ctx->canvas_width = im->width;
5639 ctx->canvas_height = im->height;
5640 ctx->canvas = im->alt.argb32;
5641 ctx->scratch_canvas = 0;
5643 ctx->flags = ASDrawCTX_CanvasIsARGB;
5644 asim_set_custom_brush_colored( ctx, brush);
5654 if (ctx->scratch_canvas)
free(ctx->scratch_canvas);
5668 Int_t sz = thick*thick;
5675 matrix =
new CARD32[sz];
5678 for (
int i = 0; i < sz; i++) {
5679 matrix[i] = (CARD32)color;
5683 brush.matrix = matrix;
5684 brush.width = thick;
5685 brush.height = thick;
5686 brush.center_y = brush.center_x = thick/2;
5695 if (xx1 ==
fImage->width) --xx1;
5696 if (yy1 ==
fImage->height) --yy1;
5697 if (xx2 ==
fImage->width) --xx2;
5698 if (yy2 ==
fImage->height) --yy2;
5700 asim_move_to(ctx, xx1, yy1);
5701 asim_line_to(ctx, xx2, yy2);
5716 Bool_t has_alpha = (color & 0xff000000) != 0xff000000;
5720 FT_Bitmap *source = (FT_Bitmap*)bitmap;
5723 Int_t dots =
Int_t(source->width * source->rows);
5727 yy = y0 = by > 0 ? by *
fImage->width : 0;
5728 for (
y = 0;
y < (int) source->rows;
y++) {
5730 if ((byy >= (
int)
fImage->height) || (byy <0))
continue;
5732 for (
x = 0;
x < (int) source->width;
x++) {
5734 if ((bxx >= (
int)
fImage->width) || (bxx < 0))
continue;
5736 idx =
Idx(bxx + yy);
5737 r += ((
fImage->alt.argb32[idx] & 0xff0000) >> 16);
5738 g += ((
fImage->alt.argb32[idx] & 0x00ff00) >> 8);
5739 b += (
fImage->alt.argb32[idx] & 0x0000ff);
5749 col[0] = (
r << 16) + (
g << 8) +
b;
5751 Int_t col4r = (col[4] & 0xff0000) >> 16;
5752 Int_t col4g = (col[4] & 0x00ff00) >> 8;
5753 Int_t col4b = (col[4] & 0x0000ff);
5756 for (
x = 3;
x > 0;
x--) {
5758 Int_t colxr = (col4r*
x +
r*xx) >> 2;
5759 Int_t colxg = (col4g*
x +
g*xx) >> 2;
5760 Int_t colxb = (col4b*
x +
b*xx) >> 2;
5761 col[
x] = (colxr << 16) + (colxg << 8) + colxb;
5767 Int_t clipx1=0, clipx2=0, clipy1=0, clipy2=0;
5772 clipx1 =
gPad->XtoAbsPixel(
gPad->GetX1())*is;
5773 clipx2 =
gPad->XtoAbsPixel(
gPad->GetX2())*is;
5774 clipy1 =
gPad->YtoAbsPixel(
gPad->GetY1())*is;
5775 clipy2 =
gPad->YtoAbsPixel(
gPad->GetY2())*is;
5779 for (
y = 0;
y < (int) source->rows;
y++) {
5782 for (
x = 0;
x < (int) source->width;
x++) {
5786 d = ((
d + 10) * 5) >> 8;
5790 if ( noClip || ((
x < (
int) source->width) &&
5791 (bxx < (
int)clipx2) && (bxx >= (
int)clipx1) &&
5792 (byy >= (
int)clipy2) && (byy < (
int)clipy1) )) {
5793 idx =
Idx(bxx + yy);
5794 acolor = (ARGB32)col[
d];
5798 fImage->alt.argb32[idx] = acolor;
5817 Warning(
"DrawText",
"Visual not initiated");
5821 if (!
fImage->alt.argb32) {
5846 const wchar_t *wcsTitle =
reinterpret_cast<const wchar_t *
>(
text->
GetWcsTitle());
5847 if (wcsTitle != NULL) {
5857 col =
gROOT->GetColor(1);
5860 ARGB32 color = ARGB32_White;
5914 if (align == 1 || align == 2 || align == 3) {
5916 }
else if (align == 4 || align == 5 || align == 6) {
5923 if (align == 3 || align == 6 || align == 9) {
5925 }
else if (align == 2 || align == 5 || align == 8) {
5932 ftal.x = (ftal.x >> 6);
5933 ftal.y = (ftal.y >> 6);
5938 if (FT_Glyph_To_Bitmap(&glyph->
fImage, ft_render_mode_normal, 0, 1 ))
continue;
5940 FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyph->
fImage;
5941 FT_Bitmap *source = &bitmap->bitmap;
5943 Int_t bx =
x - ftal.x + bitmap->left;
5944 Int_t by =
y + ftal.y - bitmap->top;
5972 if (FT_Glyph_To_Bitmap(&glyph->
fImage, ft_render_mode_normal, 0, 1 ))
continue;
5974 FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyph->
fImage;
5975 FT_Bitmap *source = &bitmap->bitmap;
5977 Int_t bx =
x + bitmap->left;
5978 Int_t by =
y +
h - bitmap->top;
5990 static ASImageExportParams params;
6000 ret = ASImage2xpmRawBuff(img, (CARD8 **)buffer, size, 0);
6003 ret = ASImage2PNGBuff(img, (CARD8 **)buffer, size, ¶ms);
6044 static ASImageImportParams params;
6048 params.filter = SCL_DO_ALL;
6050 params.gamma_table = 0;
6051 params.compression = 0;
6052 params.format = ASA_ASImage;
6053 params.search_path = 0;
6054 params.subimage = 0;
6059 char *ptr = buffer[0];
6060 while (isspace((
int)*ptr)) ++ptr;
6062 fImage = xpm_data2ASImage((
const char**)buffer, ¶ms);
6064 fImage = xpmRawBuff2ASImage((
const char*)*buffer, ¶ms);
6069 fImage = PNGBuff2ASimage((CARD8 *)*buffer, ¶ms);
6100 static char *buf = 0;
6122 ASImage *rendered_im;
6123 ASImageLayer layers[2];
6124 init_image_layers(&(layers[0]), 2);
6126 layers[0].dst_x = 0;
6127 layers[0].dst_y = 0;
6128 layers[0].clip_width = img->width;
6129 layers[0].clip_height = img->height;
6130 layers[0].bevel = 0;
6132 layers[1].dst_x = 0;
6133 layers[1].dst_y = 0;
6134 layers[1].clip_width = img->width;
6135 layers[1].clip_height = img->height;
6136 layers[1].merge_scanlines = blend_scanlines_name2func(
"tint");
6137 rendered_im = merge_layers(
fgVisual, &(layers[0]), 2, img->width, img->height,
6139 destroy_asimage(&img);
6143 ASImage *padimg = 0;
6148 padimg = pad_asimage(
fgVisual, img, 0,
d, sz, sz, 0x00ffffff,
6152 padimg = pad_asimage(
fgVisual, img,
d, 0, sz, sz, 0x00ffffff,
6157 destroy_asimage(&img);
6162 ASImage2xpmRawBuff(padimg, (CARD8 **)ptr, &size, 0);
6165 destroy_asimage(&padimg);
6179 if (
b.IsReading()) {
6180 Version_t version =
b.ReadVersion(&R__s, &R__c);
6185 if ( version == 1 ) {
6186 Int_t fileVersion =
b.GetVersionOwner();
6187 if (fileVersion > 0 && fileVersion < 50000 ) {
6188 TImage::Streamer(
b);
6195 if ( fileVersion < 40200 ) {
6206 b.CheckByteCount(R__s, R__c, TASImage::IsA());
6211 TNamed::Streamer(
b);
6214 if (image_type != 0) {
6216 buffer =
new char[size];
6217 b.ReadFastArray(buffer, size);
6221 TAttImage::Streamer(
b);
6226 b.ReadFastArray(vec, size);
6230 b.CheckByteCount(R__s, R__c, TASImage::IsA());
6235 R__c =
b.WriteVersion(TASImage::IsA(),
kTRUE);
6240 TNamed::Streamer(
b);
6242 image_type =
fImage->alt.vector ? 0 : 1;
6245 if (image_type != 0) {
6248 b.WriteFastArray(buffer, size);
6251 TAttImage::Streamer(
b);
6256 b.SetByteCount(R__c,
kTRUE);
6265 if (
fImage->alt.vector) {
6307 if ((start > 0) && (stop - start > 0)) {
6318 Int_t sz = thick*thick;
6322 ARGB32 color = ARGB32_White;
6323 parse_argb_color(col, &color);
6328 matrix =
new CARD32[sz];
6331 for (
int i = 0; i < sz; i++) {
6332 matrix[i] = (CARD32)color;
6336 brush.matrix = matrix;
6337 brush.width = thick;
6338 brush.height = thick;
6339 brush.center_y = brush.center_x = thick/2;
6341 ASDrawContext *ctx = 0;
6344 asim_cube_bezier(ctx,
x1, y1,
x2, y2,
x3, y3);
6357 const char *col,
Int_t thick)
6359 thick = !thick ? 1 : thick;
6360 Int_t sz = thick*thick;
6364 ARGB32 color = ARGB32_White;
6365 parse_argb_color(col, &color);
6370 matrix =
new CARD32[sz];
6373 for (
int i = 0; i < sz; i++) {
6374 matrix[i] = (CARD32)color;
6378 brush.matrix = matrix;
6379 brush.width = thick > 0 ? thick : 1;
6380 brush.height = thick > 0 ? thick : 1;
6381 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6384 asim_straight_ellips(ctx,
x,
y, rx, ry, thick < 0);
6398 thick = !thick ? 1 : thick;
6399 Int_t sz = thick*thick;
6403 ARGB32 color = ARGB32_White;
6404 parse_argb_color(col, &color);
6410 matrix =
new CARD32[sz];
6413 for (
int i = 0; i < sz; i++) {
6414 matrix[i] = (CARD32)color;
6418 brush.matrix = matrix;
6419 brush.height = brush.width = thick > 0 ? thick : 1;
6420 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6423 asim_circle(ctx,
x,
y,
r, thick < 0);
6437 const char *col,
Int_t thick)
6439 thick = !thick ? 1 : thick;
6440 Int_t sz = thick*thick;
6444 ARGB32 color = ARGB32_White;
6445 parse_argb_color(col, &color);
6450 matrix =
new CARD32[sz];
6453 for (
int i = 0; i < sz; i++) {
6454 matrix[i] = (CARD32)color;
6458 brush.matrix = matrix;
6459 brush.width = thick > 0 ? thick : 1;
6460 brush.height = thick > 0 ? thick : 1;
6461 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6464 asim_ellips(ctx,
x,
y, rx, ry, angle, thick < 0);
6477 const char *col,
Int_t thick)
6479 thick = !thick ? 1 : thick;
6480 Int_t sz = thick*thick;
6484 ARGB32 color = ARGB32_White;
6485 parse_argb_color(col, &color);
6490 matrix =
new CARD32[sz];
6493 for (
int i = 0; i < sz; i++) {
6494 matrix[i] = (CARD32)color;
6498 brush.matrix = matrix;
6499 brush.width = thick > 0 ? thick : 1;
6500 brush.height = thick > 0 ? thick : 1;
6501 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6504 asim_ellips2(ctx,
x,
y, rx, ry, angle, thick < 0);
6516 const char * ,
const char * )
6530 Warning(
"Gray",
"Image not initiated");
6535 Warning(
"Gray",
"Visual not initiated");
6560 if (
fImage->alt.argb32) {
6562 0, ASA_ARGB32, 0, ASIMAGE_QUALITY_DEFAULT);
6564 for (i = 0; i <
fImage->height; i++) {
6565 for (j = 0; j <
fImage->width; j++) {
6568 r = ((
fImage->alt.argb32[idx] & 0xff0000) >> 16);
6569 g = ((
fImage->alt.argb32[idx] & 0x00ff00) >> 8);
6570 b = (
fImage->alt.argb32[idx] & 0x0000ff);
6571 l = (57*
r + 181*
g + 18*
b)/256;
6579 ASImageDecoder *imdec = start_image_decoding(
fgVisual,
fImage, SCL_DO_ALL,
6591 Warning(
"ToGray",
"Failed to start image output");
6598 CARD32 *aa = imdec->buffer.alpha;
6599 CARD32 *rr = imdec->buffer.red;
6600 CARD32 *gg = imdec->buffer.green;
6601 CARD32 *bb = imdec->buffer.blue;
6606 for (i = 0; i <
fImage->height; i++) {
6607 imdec->decode_image_scanline(imdec);
6608 result.flags = imdec->buffer.flags;
6609 result.back_color = imdec->buffer.back_color;
6611 for (j = 0; j <
fImage->width; j++) {
6612 l = (57*rr[j] + 181*gg[j]+ 18*bb[j])/256;
6613 result.alpha[j] = aa[j];
6615 result.green[j] =
l;
6618 imout->output_image_scanline(imout, &result, 1);
6621 stop_image_decoding(&imdec);
6622 stop_image_output(&imout);
6662 Warning(
"FromWindow",
"Visual not initiated");
6670 static int x11 = -1;
6671 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
6676 unsigned char *bits =
gVirtualX->GetColorBits(wid, 0, 0, w,
h);
6681 fImage = bitmap2asimage(bits, w,
h, 0, 0);
6696 for (
UInt_t i = 0; i <
h/2; ++i) {
6697 memcpy(xx, buf + 4*w*i, 4*w);
6698 memcpy(buf + 4*w*i, buf + 4*w*(
h-i-1), 4*w);
6699 memcpy(buf + 4*w*(
h-i-1), xx, 4*w);
6703 fImage = bitmap2asimage(buf, w,
h, 0, 0);
6716 if (!
fImage->alt.vector && on) {
6727 gPad->Range(-left / (1.0 - left - right),
6728 -bottom / (1.0 - top - bottom),
6729 1 + right / (1.0 - left - right),
6730 1 + top / ( 1.0 - top - bottom));
6731 gPad->RangeAxis(0, 0, 1, 1);
6757 name.ReplaceAll(
".",
"_");
6767 out << std::endl << str << std::endl << std::endl;
6770 out << xpm <<
"_img = TImage::Create();" << std::endl;
6771 out <<
" " << xpm <<
"_img->SetImageBuffer( (char **)" << xpm <<
", TImage::kXpm);" << std::endl;
6772 out <<
" " << xpm <<
"_img->Draw();" << std::endl;
6785 static char buf[32];
6786 FILE *fp = fopen(
name,
"rb+");
6789 printf(
"file %s : failed to open\n",
name);
6793 if (!fread(buf, 1, 20, fp)) {
6798 char dpi1 = (set & 0xffff) >> 8;
6799 char dpi2 = set & 0xff;
6804 for (i = 0; i < 20; i++) {
6805 if ((buf[i] == 0x4a) && (buf[i+1] == 0x46) && (buf[i+2] == 0x49) &&
6806 (buf[i+3] == 0x46) && (buf[i+4] == 0x00) ) {
6812 if (i == 20 || dpi+4 >= 20) {
6814 printf(
"file %s : wrong JPEG format\n",
name);
6821 buf[dpi + 1] = dpi1;
6822 buf[dpi + 2] = dpi2;
6825 buf[dpi + 3] = dpi1;
6826 buf[dpi + 4] = dpi2;
6829 fwrite(buf, 1, 20, fp);
const Mask_t kGCClipXOrigin
const Mask_t kGCClipYOrigin
static const double x2[5]
static const double x1[5]
static const double x3[11]
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)
include TDocParser_001 C image html pict1_TDocParser_001 png width
float type_of_call hi(const int &, const int &)
R__EXTERN TRandom * gRandom
char * Form(const char *fmt,...)
R__EXTERN TStyle * gStyle
R__EXTERN const char * gProgName
R__EXTERN TSystem * gSystem
R__EXTERN TVirtualPS * gVirtualPS
R__EXTERN Int_t(* gThreadXAR)(const char *xact, Int_t nb, void **ar, Int_t *iret)
void FillPolygon(UInt_t npt, TPoint *ppt, const char *col="#000000", const char *stipple=0, UInt_t w=16, UInt_t h=16)
Fill a convex polygon with background color or bitmap.
Bool_t IsEditable() const
Bool_t SetJpegDpi(const char *name, UInt_t dpi=72)
Set an image printing resolution in Dots Per Inch units.
void DrawLineInternal(UInt_t x1, UInt_t y1, UInt_t x2, UInt_t y2, UInt_t col, UInt_t thick)
Internal line drawing.
Pixmap_t GetPixmap()
Returns image pixmap.
Int_t fPaintMode
! 1 - fast mode, 0 - low memory slow mode
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)
Copy source region to the destination image.
Bool_t SetImageBuffer(char **buffer, EImageFileTypes type=TImage::kPng)
Create image from compressed buffer.
Double_t fMinValue
! min value in image
UInt_t GetScaledWidth() const
Return width of the displayed image not of the original image.
void Merge(const TImage *im, const char *op="alphablend", Int_t x=0, Int_t y=0)
Merge two images.
void DrawHLine(UInt_t y, UInt_t x1, UInt_t x2, UInt_t col, UInt_t thick)
Draw an horizontal line.
void FillSpans(UInt_t npt, TPoint *ppt, UInt_t *widths, const char *col="#000000", const char *stipple=0, UInt_t w=16, UInt_t h=16)
Fill spans with specified color or/and stipple.
static Bool_t fgInit
global flag to init afterimage only once
const char * TypeFromMagicNumber(const char *file)
Guess the file type from the first byte of file.
Double_t fMaxValue
! max value in image
void Append(const TImage *im, const char *option="+", const char *color="#00000000")
Append image.
void DrawCircle(Int_t x, Int_t y, Int_t r, const char *col="#000000", Int_t thick=1)
Draw a circle.
void DrawCellArray(Int_t x1, Int_t y1, Int_t x2, Int_t y2, Int_t nx, Int_t ny, UInt_t *ic)
Draw a cell array.
void MapQuality(EImageQuality &quality, UInt_t &asquality, Bool_t toas=kTRUE)
Map quality to/from AfterImage quality.
void Crop(Int_t x=0, Int_t y=0, UInt_t width=0, UInt_t height=0)
Crop an image.
void CropSpans(UInt_t npt, TPoint *ppt, UInt_t *widths)
Crop spans.
TArrayL * GetPixels(Int_t x=0, Int_t y=0, UInt_t w=0, UInt_t h=0)
Return 2D array of machine dependent pixel values.
UInt_t * GetScanline(UInt_t y)
Return a pointer to scan-line.
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
void EndPaint()
EndPaint does internal RLE compression of image data.
void DrawVLine(UInt_t x, UInt_t y1, UInt_t y2, UInt_t col, UInt_t thick)
Draw a vertical line.
UInt_t GetWidth() const
Return width of original image not of the displayed image.
void Gradient(UInt_t angle=0, const char *colors="#FFFFFF #000000", const char *offsets=0, Int_t x=0, Int_t y=0, UInt_t width=0, UInt_t height=0)
Render multipoint gradient inside rectangle of size (width, height) at position (x,...
void DrawStraightEllips(Int_t x, Int_t y, Int_t rx, Int_t ry, const char *col="#000000", Int_t thick=1)
Draw a straight ellipse.
void DrawText(Int_t x=0, Int_t y=0, const char *text="", Int_t size=12, const char *color=0, const char *font="fixed", EText3DType type=TImage::kPlain, const char *fore_file=0, Float_t angle=0)
Draw text of size (in pixels for TrueType fonts) at position (x, y) with color specified by hex strin...
ASImage * fImage
! pointer to image structure of original image
UInt_t GetHeight() const
Return height of original image not of the displayed image.
UInt_t fZoomHeight
! hight of zoomed image in image pixels
static THashTable * fgPlugList
! hash table containing loaded plugins
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 DrawSegments(UInt_t nseg, Segment_t *seg, const char *col="#000000", UInt_t thick=1)
Draw segments.
void DrawPolyLine(UInt_t nn, TPoint *xy, const char *col="#000000", UInt_t thick=1, TImage::ECoordMode mode=kCoordModeOrigin)
Draw a polyline.
void SetDefaults()
Set default parameters.
void DrawWideLine(UInt_t x1, UInt_t y1, UInt_t x2, UInt_t y2, UInt_t col, UInt_t thick)
Draw wide line.
void CropPolygon(UInt_t npt, TPoint *ppt)
Crop a convex polygon.
void StartPaletteEditor()
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)
Bevel is used to create 3D effect while drawing buttons, or any other image that needs to be framed.
void SavePrimitive(std::ostream &out, Option_t *option="")
Save a primitive as a C++ statement(s) on output stream "out".
UInt_t * GetRgbaArray()
Return a pointer to an array[width x height] of RGBA32 values.
void PolyPoint(UInt_t npt, TPoint *ppt, const char *col="#000000", TImage::ECoordMode mode=kCoordModeOrigin)
Draw a poly point.
Pixmap_t GetMask()
Returns image mask pixmap (alpha channel).
static const ASVisual * GetVisual()
Return visual.
const char * GetTitle() const
Title is used to keep 32x32 xpm image's thumbnail.
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="")
Draw image on the drawable wid (pixmap, window) at x,y position.
void SetPaletteEnabled(Bool_t on=kTRUE)
Switch on/off the image palette.
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 Zoom(UInt_t offX, UInt_t offY, UInt_t width, UInt_t height)
The area of an image displayed in a pad is defined by this function.
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...
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)
Draw a dashed line.
void DrawGlyph(void *bitmap, UInt_t color, Int_t x, Int_t y)
Draw glyph bitmap.
TASImage * fScaledImage
! temporary scaled and zoomed image produced from original image
void FillRectangle(const char *col=0, Int_t x=0, Int_t y=0, UInt_t width=0, UInt_t height=0)
Fill rectangle of size (width, height) at position (x,y) within the existing image with specified col...
void DrawLine(UInt_t x1, UInt_t y1, UInt_t x2, UInt_t y2, const char *col="#000000", UInt_t thick=1)
Draw a line.
UInt_t fZoomOffX
! X - offset for zooming in image pixels
void FromWindow(Drawable_t wid, Int_t x=0, Int_t y=0, UInt_t w=0, UInt_t h=0)
Create an image (screenshot) from specified window.
void DrawFillArea(UInt_t npt, TPoint *ppt, const char *col="#000000", const char *stipple=0, UInt_t w=16, UInt_t h=16)
Fill a polygon (any type convex, non-convex).
void GetImageBuffer(char **buffer, int *size, EImageFileTypes type=TImage::kPng)
Return in-memory buffer compressed according image type.
Int_t DistancetoPrimitive(Int_t px, Int_t py)
Is the mouse in the image ?
EImageFileTypes GetFileType(const char *ext)
Return file type depending on specified extension.
void Browse(TBrowser *)
Browse image.
void Gray(Bool_t on=kTRUE)
Convert RGB image to Gray image and vice versa.
void Tile(UInt_t width, UInt_t height)
Tile the original image.
void Draw(Option_t *option="")
Draw image.
void WriteImage(const char *file, EImageFileTypes type=TImage::kUnknown)
Write image to specified file.
char * GetObjectInfo(Int_t px, Int_t py) const
Get image pixel coordinates and the pixel value at the mouse pointer.
static UInt_t AlphaBlend(UInt_t bot, UInt_t top)
Return alpha-blended value computed from bottom and top pixel values.
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 ReadImage(const char *file, EImageFileTypes type=TImage::kUnknown)
Read specified image file.
void BeginPaint(Bool_t fast=kTRUE)
BeginPaint initializes internal array[width x height] of ARGB32 pixel values.
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 DestroyImage()
Destroy 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)
Draw an ellipse.
static Bool_t InitVisual()
Static function to initialize the ASVisual.
void FloodFill(Int_t x, Int_t y, const char *col, const char *min_col, const char *max_col=0)
Flood fill.
UInt_t fZoomOffY
! Y - offset for zooming im image pixels
Double_t * Vectorize(UInt_t max_colors=256, UInt_t dither=4, Int_t opaque_threshold=1)
Reduce color-depth of an image and fills vector of "scientific data" [0...1].
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)
This function will tile original image to specified size with offsets requested, and then it will go ...
void Slice(UInt_t xStart, UInt_t xEnd, UInt_t yStart, UInt_t yEnd, UInt_t toWidth, UInt_t toHeight)
Another method of enlarging images where corners remain unchanged, but middle part gets tiled.
void Scale(UInt_t width, UInt_t height)
Scale the original image.
void Mirror(Bool_t vert=kTRUE)
Mirror image in place.
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)
Draw an ellipse.
TArrayD * GetArray(UInt_t w=0, UInt_t h=0, TImagePalette *pal=gWebImagePalette)
In case of vectorized image return an associated array of doubles otherwise this method creates and r...
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.
UInt_t * GetArgbArray()
Return a pointer to internal array[width x height] of ARGB32 values This array is directly accessible...
void MapFileTypes(EImageFileTypes &type, UInt_t &astype, Bool_t toas=kTRUE)
Map file type to/from AfterImage types.
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 PutPixel(Int_t x, Int_t y, const char *col="#000000")
Draw a point at the specified position.
void UnZoom()
Un-zoom the image to original size.
void SetPalette(const TImagePalette *palette)
Set a new palette to an image.
TASImage()
Default image constructor.
TASImage & operator=(const TASImage &img)
Image assignment operator.
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)
Draw a cubic bezier line.
Double_t * GetVecArray()
Return a pointer to internal array[width x height] of double values [0,1].
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 Paint(Option_t *option="")
Paint image.
void Flip(Int_t flip=180)
Flip image in place.
void FromGLBuffer(UChar_t *buf, UInt_t w, UInt_t h)
Creates an image (screenshot) from a RGBA buffer.
void FromPad(TVirtualPad *pad, Int_t x=0, Int_t y=0, UInt_t w=0, UInt_t h=0)
Create an image from the given pad, afterwards this image can be saved in any of the supported image ...
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 DrawRectangle(UInt_t x, UInt_t y, UInt_t w, UInt_t h, const char *col="#000000", UInt_t thick=1)
Draw a rectangle.
void ExecuteEvent(Int_t event, Int_t px, Int_t py)
Execute mouse events.
void Pad(const char *color="#00FFFFFF", UInt_t left=0, UInt_t right=0, UInt_t top=0, UInt_t bottom=0)
Enlarge image, padding it with specified color on each side in accordance with requested geometry.
static ASVisual * fgVisual
pointer to visual structure
virtual ~TASImage()
Image destructor, clean up image and visual.
void GetZoomPosition(UInt_t &x, UInt_t &y, UInt_t &w, UInt_t &h) const
Return the zoom parameters.
TObject * Clone(const char *newname) const
Clone image.
void Blur(Double_t hr=3, Double_t vr=3)
Perform Gaussian blur of the image (useful for drop shadows).
UInt_t GetScaledHeight() const
Return height of the displayed image not of the original image.
void SetImage(const Double_t *imageData, UInt_t width, UInt_t height, TImagePalette *palette=0)
Deletes the old image and creates a new image depending on the values of imageData.
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)
Draw a box.
void SetTitle(const char *title="")
Set a title for an image.
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 SetFillStyle(Style_t fstyle)
Set the fill area style.
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
UInt_t GetImageCompression() const
Bool_t fPaletteEnabled
! kTRUE - palette is drawn on the image
virtual void StartPaletteEditor()
Opens a GUI to edit the color palette.
virtual void SetLineColor(Color_t lcolor)
Set the line color.
virtual Float_t GetTextSize() const
Return the text size.
virtual Short_t GetTextAlign() const
Return the text alignment.
virtual Font_t GetTextFont() const
Return the text font.
virtual Color_t GetTextColor() const
Return the text color.
virtual Float_t GetTextAngle() const
Return the text angle.
virtual void SetY2(Double_t y2)
virtual void SetX1(Double_t x1)
virtual void Draw(Option_t *option="")
Draw this box with its current attributes.
virtual void SetX2(Double_t x2)
virtual void SetY1(Double_t y1)
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.
const char * AsHexString() const
Return color as hexadecimal string.
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
virtual void Draw(Option_t *option="")
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.
void Add(TObject *obj)
Add object to the hash table.
TObject * FindObject(const char *name) const
Find object using its name.
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
An abstract interface to image processing library.
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
virtual void SetName(const char *name)
Set the name of the TNamed.
virtual const char * GetTitle() const
Returns title of object.
virtual const char * GetName() const
Returns name of object.
Mother of all ROOT objects.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual void Delete(Option_t *option="")
Delete this object.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
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.
Long_t ExecPlugin(int nargs, const T &... params)
Int_t LoadPlugin()
Load the plugin library for this handler.
static const TString & GetTTFFontDir()
Get the fonts directory in the installation. Static utility function.
static const TString & GetIconPath()
Get the icon path in the installation. Static utility function.
virtual UInt_t Integer(UInt_t imax)
Returns a random integer uniformly distributed on the interval [ 0, imax-1 ].
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.
TString & Replace(Ssiz_t pos, Ssiz_t n, const char *s)
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.
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Float_t GetScreenFactor() const
Float_t GetImageScaling() const
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
virtual const char * HomeDirectory(const char *userName=0)
Return the user's home directory.
virtual const char * PrependPathName(const char *dir, TString &name)
Concatenate a directory and a file name.
virtual const char * BaseName(const char *pathname)
Base name of a file name. Base name of /user/root is root.
virtual void Sleep(UInt_t milliSec)
Sleep milliSec milli seconds.
virtual char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
virtual Bool_t ProcessEvents()
Process pending events (GUI, timers, sockets).
TTF helper class containing glyphs description.
FT_Glyph fImage
glyph image
static Bool_t IsInitialized()
static void PrepareString(const char *string)
Put the characters in "string" in the "glyphs" array.
static void Init()
Initialise the TrueType fonts interface.
static void LayoutGlyphs()
Compute the glyphs positions, fgAscent and fgWidth (needed for alignment).
static void SetRotationMatrix(Float_t angle)
Set the rotation matrix used to rotate the font outlines.
static void SetTextFont(Font_t fontnumber)
Set specified font.
static TTGlyph * GetGlyphs()
static Int_t GetNumGlyphs()
static const FT_BBox & GetBox()
static void SetTextSize(Float_t textsize)
Set current text size.
static FT_Matrix * GetRotMatrix()
Base class for several text objects.
const void * GetWcsTitle(void) const
Returns the text as UNICODE.
Int_t GetNoElements() const
Element * GetMatrixArray()
TVirtualPS is an abstract interface to Postscript, PDF, SVG.
virtual void CellArrayEnd()=0
virtual void CellArrayFill(Int_t r, Int_t g, Int_t b)=0
virtual void CellArrayBegin(Int_t W, Int_t H, Double_t x1, Double_t x2, Double_t y1, Double_t y2)=0
virtual void * GetStream() const
virtual void Open(const char *filename, Int_t type=-111)=0
To make it possible to use GL for 2D graphic in a TPad/TCanvas.
TVirtualPad is an abstract base class for the Pad and Canvas classes.
virtual void Paint(Option_t *option="")=0
This method must be overridden if a class wants to paint itself.
virtual Int_t GetPixmapID() const =0
virtual Int_t VtoPixel(Double_t v) const =0
virtual const char * GetName() const =0
Returns name of object.
virtual Int_t UtoPixel(Double_t u) const =0
virtual Int_t GetCanvasID() const =0
virtual TCanvas * GetCanvas() const =0
virtual void SetBorderMode(Short_t bordermode)
RooArgSet S(const RooAbsArg &v1)
static constexpr double s
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)
Double_t ATan2(Double_t y, Double_t x)
Short_t Min(Short_t a, Short_t b)
void flip(struct mesh *m, struct behavior *b, struct otri *flipedge)