60 # include <ft2build.h>
61 # include FT_FREETYPE_H
87 #include "RConfigure.h"
92 # include <X11/Xlib.h>
95 # include "Windows4root.h"
100 # define X_DISPLAY_MISSING 1
102 # include <afterbase.h>
104 # include <win32/config.h>
105 # include <win32/afterbase.h>
106 # define X_DISPLAY_MISSING 1
108 # include <afterimage.h>
129 #if defined(__GNUC__) && __GNUC__ >= 4 && ((__GNUC_MINOR__ == 2 && __GNUC_PATCHLEVEL__ >= 1) || (__GNUC_MINOR__ >= 3)) && !__INTEL_COMPILER
130 #pragma GCC diagnostic ignored "-Wstrict-aliasing"
151 #define _alphaBlend(bot, top) {\
152 __argb32__ *t = (__argb32__*)(top);\
153 __argb32__ *b = (__argb32__*)(bot);\
158 b->a = ((b->a*aa)>>8) + t->a;\
159 b->r = (b->r*aa + t->r*t->a)>>8;\
160 b->g = (b->g*aa + t->g*t->a)>>8;\
161 b->b = (b->b*aa + t->b*t->a)>>8;\
175 destroy_asimage(&fImage);
178 if (fIsGray && fGrayImage) {
179 destroy_asimage(&fGrayImage);
228 fImage = create_asimage(w ? w : 20, h ? h : 20, 0);
254 SetImage(imageData, width, height, palette);
267 SetImage(imageData, width, palette);
280 SetImage(imageData, width, palette);
295 if (img.
fImage->alt.vector) {
298 memcpy(
fImage->alt.vector, img.
fImage->alt.vector, size);
318 if (
this != &img && img.
IsValid()) {
327 if (img.
fImage->alt.vector) {
330 memcpy(
fImage->alt.vector, img.
fImage->alt.vector, size);
362 const char *icons =
"/icons";
375 gIconPaths[0] =
StrDup(
".");
381 gIconPaths[4] =
StrDup(ROOTICONPATH);
385 gIconPaths[5] =
StrDup(EXTRAICONPATH);
397 FILE *fp = fopen(file,
"rb");
398 const char *ret =
"";
402 if (!fread(&magic, 1, 1, fp)) {
410 if (!fread(&magic, 1, 1, fp)) {
414 if (!fread(&magic, 1, 1, fp)) {
419 ret = (magic == 1) ?
"ico" :
"cur";
424 if (!fread(&magic, 1, 1, fp)) {
429 if (magic == 0x21) ret =
"ps";
430 else if (magic == 0x50) ret =
"pdf";
480 Warning(
"Scale",
"Visual not initiated");
484 Bool_t xpm = filename && (filename[0] ==
'/' &&
485 filename[1] ==
'*') && filename[2] ==
' ';
493 if (!gIconPaths[0]) {
497 set_output_threshold(0);
499 static ASImageImportParams iparams;
503 iparams.filter = SCL_DO_ALL;
504 iparams.gamma = SCREEN_GAMMA;
505 iparams.gamma_table =
NULL;
507 iparams.format = ASA_ASImage;
509 iparams.subimage = 0;
510 iparams.return_animation_delay = -1;
514 if (filename) dot = strrchr(filename,
'.');
527 iparams.subimage = ext.
Atoi();
529 ext = strrchr(fname.
Data(),
'.') + 1;
532 image = file2ASImage_extra(fname.
Data(), &iparams);
544 unsigned char *bitmap = 0;
550 if (!handler || ((handler->
LoadPlugin() == -1))) {
569 image = bitmap2asimage(bitmap, w, h, 0, 0);
589 fZoomWidth =
fImage->width;
590 fZoomHeight =
fImage->height;
649 Error(
"WriteImage",
"no image loaded");
653 if (!file || !*file) {
654 Error(
"WriteImage",
"no file name specified");
659 if ((s = strrchr(file,
'.'))) {
663 Error(
"WriteImage",
"cannot determine a valid file type");
671 Error(
"WriteImage",
"not a valid file type was specified");
677 ASImageFileTypes atype = (ASImageFileTypes)mytype;
685 static ASImageExportParams parms;
690 parms.xpm.type = atype;
691 parms.xpm.flags = EXPORT_ALPHA;
692 parms.xpm.dither = 4;
693 parms.xpm.opaque_threshold = 127;
694 parms.xpm.max_colors = 512;
697 ASImage2bmp(im, fname.
Data(), 0);
700 ASImage2xcf(im, fname.
Data(), 0);
703 parms.png.type = atype;
704 parms.png.flags = EXPORT_ALPHA;
708 parms.jpeg.type = atype;
709 parms.jpeg.flags = 0;
710 parms.jpeg.quality = aquality;
713 parms.gif.type = atype;
714 parms.gif.flags = EXPORT_ALPHA;
715 parms.gif.dither = 0;
716 parms.gif.opaque_threshold = 0;
720 parms.gif.type = atype;
721 parms.gif.flags = EXPORT_ALPHA | EXPORT_APPEND;
722 parms.gif.dither = 0;
723 parms.gif.opaque_threshold = 0;
724 parms.gif.animate_repeats = 0;
737 parms.gif.flags |= EXPORT_ANIMATION_REPEATS;
738 parms.gif.animate_repeats = 0;
739 }
else if(sufix==
"") {
756 parms.gif.flags |= EXPORT_ANIMATION_REPEATS;
757 parms.gif.animate_repeats = atoi(s);
766 parms.gif.flags |= EXPORT_ANIMATION_REPEATS;
767 parms.gif.animate_repeats = 0;
774 delay = atoi(sDelay);
775 parms.gif.flags |= EXPORT_ANIMATION_REPEATS;
776 parms.gif.animate_repeats = atoi(sRepeats);
778 Error(
"WriteImage",
"gif suffix %s not yet supported", s);
782 parms.gif.animate_delay = delay;
784 int i1 = fname.
Index(
"gif+");
786 fname = fname(0, i1 + 3);
789 Error(
"WriteImage",
"unexpected gif extension structure %s", fname.
Data());
795 parms.tiff.type = atype;
796 parms.tiff.flags = EXPORT_ALPHA;
797 parms.tiff.rows_per_strip = 0;
798 parms.tiff.compression_type = aquality <= 50 ? TIFF_COMPRESSION_JPEG :
799 TIFF_COMPRESSION_NONE;
800 parms.tiff.jpeg_quality = 100;
801 parms.tiff.opaque_threshold = 0;
804 Error(
"WriteImage",
"file type %s not yet supported", s);
808 if (!ASImage2file(im, 0, fname.
Data(), atype, &parms)) {
809 Error(
"WriteImage",
"error writing file %s", file);
827 if (s ==
"jpg" || s ==
"jpeg")
866 astype = ASIT_Xpm;
break;
868 astype = ASIT_ZCompressedXpm;
break;
870 astype = ASIT_GZCompressedXpm;
break;
872 astype = ASIT_Png;
break;
874 astype = ASIT_Jpeg;
break;
876 astype = ASIT_Xcf;
break;
878 astype = ASIT_Ppm;
break;
880 astype = ASIT_Pnm;
break;
882 astype = ASIT_Bmp;
break;
884 astype = ASIT_Ico;
break;
886 astype = ASIT_Cur;
break;
888 astype = ASIT_Gif;
break;
890 astype = ASIT_Gif;
break;
892 astype = ASIT_Tiff;
break;
894 astype = ASIT_Xbm;
break;
896 astype = ASIT_Targa;
break;
898 astype = ASIT_XMLScript;
break;
900 astype = ASIT_Unknown;
906 case ASIT_ZCompressedXpm:
908 case ASIT_GZCompressedXpm:
951 asquality = 25;
break;
953 asquality = 75;
break;
955 asquality = 50;
break;
957 asquality = 100;
break;
963 if (asquality > 0 && asquality <= 25)
965 if (asquality > 26 && asquality <= 50)
967 if (asquality > 51 && asquality <= 75)
969 if (asquality > 76 && asquality <= 100)
989 Warning(
"SetImage",
"Visual not initiated");
998 fMinValue = fMaxValue = *imageData;
999 for (
Int_t pixel = 1; pixel <
Int_t(width * height); pixel++) {
1000 if (fMinValue > *(imageData + pixel)) fMinValue = *(imageData + pixel);
1001 if (fMaxValue < *(imageData + pixel)) fMaxValue = *(imageData + pixel);
1007 ASVectorPalette asPalette;
1011 for (col = 0; col < 4; col++)
1012 asPalette.channels[col] =
new UShort_t[asPalette.npoints];
1019 asPalette.points =
new Double_t[asPalette.npoints];
1020 for (Int_t point = 0; point <
Int_t(asPalette.npoints); point++)
1021 asPalette.points[point] = fMinValue + (fMaxValue - fMinValue) * pal.
fPoints[point];
1024 height, &asPalette, ASA_ASImage,
1027 delete [] asPalette.points;
1028 for (col = 0; col < 4; col++)
1029 delete [] asPalette.channels[col];
1035 fZoomHeight = height;
1073 Error(
"FromPad",
"pad cannot be 0");
1078 Warning(
"FromPad",
"Visual not initiated");
1088 if (
gROOT->IsBatch()) {
1096 if (itmp && itmp->
fImage) {
1105 if (itmp && itmp->
fImage && (itmp !=
this)) {
1107 if (itmp->
fImage->alt.argb32) {
1109 fImage->alt.argb32 = (ARGB32*)safemalloc(sz*
sizeof(ARGB32));
1110 memcpy(
fImage->alt.argb32, itmp->
fImage->alt.argb32, sz*4);
1140 static int x11 = -1;
1141 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
1144 fImage = pixmap2asimage(
fgVisual, wd, x, y, w, h, kAllPlanes, 0, 0);
1146 unsigned char *bits =
gVirtualX->GetColorBits(wd, 0, 0, w, h);
1151 fImage = bitmap2asimage(bits, w, h, 0, 0);
1172 Error(
"Draw",
"no image set");
1185 w =
Int_t(w*cx) + 4;
1186 h =
Int_t(h*cx) + 28;
1190 rname =
"new TCanvas(\"" + rname +
Form(
"\", %d, %d);", w, h);
1191 gROOT->ProcessLineFast(rname.Data());
1200 gPad->Range(-left / (1.0 - left - right),
1201 -bottom / (1.0 - top - bottom),
1202 1 + right / (1.0 - left - right),
1203 1 + top / ( 1.0 - top - bottom));
1204 gPad->RangeAxis(0, 0, 1, 1);
1227 wsrc = wsrc ? wsrc : im->width;
1228 hsrc = hsrc ? hsrc : im->height;
1230 static int x11 = -1;
1231 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
1238 UInt_t ww = wsrc - ow + (ow ? 8 : 0);
1245 char *bits =
new char[ww*hh];
1247 ASImageDecoder *imdec = start_image_decoding(
fgVisual, im, SCL_DO_ALPHA,
1248 xsrc, ysrc, ww, 0, 0);
1250 for (yy = 0; yy < hh; yy++) {
1251 imdec->decode_image_scanline(imdec);
1252 CARD32 *
a = imdec->buffer.alpha;
1254 for (xx = 0; xx < ww; xx++) {
1269 stop_image_decoding(&imdec);
1272 (
const char *)bits, ww, hh);
1290 if (x11 && (!
gPad ||
gPad->GetGLDevice() == -1)) {
1291 asimage2drawable(
fgVisual, wid, im, (GC)gc, xsrc, ysrc, x, y, wsrc, hsrc, 1);
1294 unsigned char *bits = (
unsigned char *)im->alt.argb32;
1296 img = tile_asimage(
fgVisual, im, xsrc, ysrc, wsrc, hsrc,
1297 0, ASA_ARGB32, 0, ASIMAGE_QUALITY_DEFAULT);
1299 bits = (
unsigned char *)img->alt.argb32;
1306 if (
gPad &&
gPad->GetGLDevice() != -1) {
1308 painter->DrawPixels(bits, wsrc, hsrc, x, y, !option.
Contains(
"opaque"));
1316 gVirtualX->CopyArea(pic, wid, gc, 0, 0, wsrc, hsrc, x, y);
1323 destroy_asimage(&img);
1347 xsrc, ysrc, wsrc, hsrc, opt);
1366 Error(
"Paint",
"no image set");
1371 Warning(
"Paint",
"Visual not initiated");
1375 Int_t tile_x = 0, tile_y = 0;
1376 CARD32 tile_tint = 0;
1385 if (sscanf(opt.
Data() + opt.
Index(
"t"),
"t%d,%d,%s", &tile_x, &tile_y,
1388 if (parse_argb_color(stint, (CARD32*)&tile_tint) == stint)
1391 Error(
"Paint",
"tile option error");
1399 if (!
fImage->alt.vector) {
1412 to_h = (
Int_t)(to_h * (1.0 -
gPad->GetBottomMargin() -
gPad->GetTopMargin() ) + 0.5);
1413 to_w = (
Int_t)(to_w * (1.0 -
gPad->GetLeftMargin() -
gPad->GetRightMargin() ) + 0.5);
1416 if ((to_w < 25 || to_h < 25) && !expand) {
1417 Error(
"Paint",
"pad too small to display an image");
1429 Int_t pal_Ax = to_w +
gPad->UtoAbsPixel(
gPad->GetLeftMargin()) +
1430 (
gPad->UtoAbsPixel(
gPad->GetRightMargin()) / 10);
1432 Int_t pal_x = to_w +
gPad->UtoPixel(
gPad->GetLeftMargin()) +
1433 (
gPad->UtoPixel(
gPad->GetRightMargin()) / 10);
1438 ASImage *grad_im = 0;
1446 grad.type = GRADIENT_Top2Bottom;
1447 grad.color =
new ARGB32[grad.npoints];
1448 grad.offset =
new double[grad.npoints];
1451 Int_t oldPt = grad.npoints -
pt -1;
1452 grad.offset[
pt] = 1 - pal.
fPoints[oldPt];
1453 grad.color[
pt] = (((ARGB32)(pal.
fColorBlue[oldPt] & 0xff00)) >> 8) |
1455 (((ARGB32)(pal.
fColorRed[oldPt] & 0xff00)) << 8) |
1456 (((ARGB32)(pal.
fColorAlpha[oldPt] & 0xff00)) << 16);
1460 pal_h, SCL_DO_COLOR,
1463 delete [] grad.color;
1464 delete [] grad.offset;
1472 to_w, to_h, tile_tint, ASA_ASImage,
1482 fImage->width != fZoomWidth ||
fImage->height != fZoomHeight) {
1496 if (fZoomWidth && fZoomHeight &&
1499 ASImage *tmpImage = 0;
1502 fImage->height - fZoomHeight - fZoomOffY,
1503 fZoomWidth, fZoomHeight, 0, ASA_ASImage,
1510 destroy_asimage(&tmpImage);
1525 Error(
"Paint",
"image could not be rendered to display");
1529 int tox = expand ? 0 : int(
gPad->UtoPixel(1.) *
gPad->GetLeftMargin());
1530 int toy = expand ? 0 : int(
gPad->VtoPixel(0.) *
gPad->GetTopMargin());
1532 if (!
gROOT->IsBatch()) {
1547 axis.
PaintAxis(pal_Xpos,
gPad->PixeltoY(pal_Ay + pal_h - 1),
1548 pal_Xpos,
gPad->PixeltoY(pal_Ay),
1554 pal_Xpos,
gPad->AbsPixeltoY(pal_Ay + 1),
1565 gPad->XtoAbsPixel(0),
gPad->YtoAbsPixel(1));
1570 dump->
Merge(&tgrad,
"alphablend", pal_Ax, pal_Ay);
1580 pal_Xpos,
gPad->AbsPixeltoY(pal_Ay + 1),
1585 Warning(
"Paint",
"PDF not implemented yet");
1588 Warning(
"Paint",
"SVG not implemented yet");
1608 x2 = x1+dx/image->width;
1610 y2 = y1+dy/image->height;
1612 x1 =
gPad->GetX1()+dx*
gPad->GetLeftMargin();
1613 x2 = x1+(dx*(1-
gPad->GetRightMargin()-
gPad->GetLeftMargin()))/image->width;
1614 y1 =
gPad->GetY2()-dy*
gPad->GetTopMargin();
1615 y2 = y1+(dy*(1-
gPad->GetTopMargin()-
gPad->GetBottomMargin()))/image->height;
1620 ASImageDecoder *imdec = start_image_decoding(
fgVisual, image, SCL_DO_ALL,
1621 0, 0, image->width, image->height, 0);
1623 for (
Int_t yt = 0; yt < (
Int_t)image->height; yt++) {
1624 imdec->decode_image_scanline(imdec);
1625 for (
Int_t xt = 0; xt < (
Int_t)image->width; xt++)
1627 imdec->buffer.green[xt],
1628 imdec->buffer.blue[xt]);
1630 stop_image_decoding(&imdec);
1635 Double_t xconv = (
gPad->AbsPixeltoX(pal_Ax + pal_w) -
gPad->AbsPixeltoX(pal_Ax)) / grad_im->width;
1636 Double_t yconv = (
gPad->AbsPixeltoY(pal_Ay - pal_h) -
gPad->AbsPixeltoY(pal_Ay)) / grad_im->height;
1637 x1 =
gPad->AbsPixeltoX(pal_Ax);
1639 y2 =
gPad->AbsPixeltoY(pal_Ay);
1644 imdec = start_image_decoding(
fgVisual, grad_im, SCL_DO_ALL,
1645 0, 0, grad_im->width, grad_im->height, 0);
1647 for (
Int_t yt = 0; yt < (
Int_t)grad_im->height; yt++) {
1648 imdec->decode_image_scanline(imdec);
1649 for (
Int_t xt = 0; xt < (
Int_t)grad_im->width; xt++)
1651 imdec->buffer.green[xt],
1652 imdec->buffer.blue[xt]);
1655 stop_image_decoding(&imdec);
1666 pal_Xpos,
gPad->AbsPixeltoY(pal_Ay + 1),
1673 destroy_asimage(&grad_im);
1682 Int_t pxl, pyl, pxt, pyt;
1689 if (px1 < px2) {pxl = px1; pxt = px2;}
1690 else {pxl = px2; pxt = px1;}
1691 if (py1 < py2) {pyl = py1; pyt = py2;}
1692 else {pyl = py2; pyt = py1;}
1694 if ((px > pxl && px < pxt) && (py > pyl && py < pyt))
1705 static TBox *ZoomBox;
1710 gPad->ExecuteEvent(event, px, py);
1716 static Int_t px1old, py1old, px2old, py2old;
1717 static Int_t px1, py1, px2, py2, pxl, pyl, pxt, pyt;
1728 if (imgX < 0) px = px - imgX;
1729 if (imgY < 0) py = py - imgY;
1734 if (imgX >= (
int)image->width) px = px - imgX + image->width - 1;
1735 if (imgY >= (
int)image->height) py = py - imgY + image->height - 1;
1740 px1 =
gPad->XtoAbsPixel(
gPad->GetX1());
1741 py1 =
gPad->YtoAbsPixel(
gPad->GetY1());
1742 px2 =
gPad->XtoAbsPixel(
gPad->GetX2());
1743 py2 =
gPad->YtoAbsPixel(
gPad->GetY2());
1744 px1old =
px; py1old =
py;
1766 ZoomBox =
new TBox(pxl, pyl, pxt, pyt);
1768 ZoomBox->
Draw(
"l*");
1787 Int_t imgX1 = px1old -
gPad->XtoAbsPixel(0);
1788 Int_t imgY1 = py1old -
gPad->YtoAbsPixel(1);
1789 Int_t imgX2 = px -
gPad->XtoAbsPixel(0);
1790 Int_t imgY2 = py -
gPad->YtoAbsPixel(1);
1792 imgY1 = image->height - 1 - imgY1;
1793 imgY2 = image->height - 1 - imgY2;
1799 Zoom((imgX1 < imgX2) ? imgX1 : imgX2, (imgY1 < imgY2) ? imgY1 : imgY2,
1818 static char info[64];
1824 px -=
gPad->XtoAbsPixel(0);
1825 py -=
gPad->YtoAbsPixel(1);
1828 if (px < 0 || py < 0)
return info;
1832 if (px >= (
int)image->width || py >= (
int)image->height)
1835 py = image->height - 1 -
py;
1842 if (
fImage->alt.vector) {
1843 snprintf(info,64,
"x: %d y: %d %.5g",
1846 snprintf(info,64,
"x: %d y: %d", px, py);
1862 Warning(
"SetPalette",
"Visual not initiated");
1867 Warning(
"SetPalette",
"Image not valid");
1871 if (
fImage->alt.vector == 0)
1877 ASVectorPalette asPalette;
1879 asPalette.channels[0] =
new CARD16 [asPalette.npoints];
1880 asPalette.channels[1] =
new CARD16 [asPalette.npoints];
1881 asPalette.channels[2] =
new CARD16 [asPalette.npoints];
1882 asPalette.channels[3] =
new CARD16 [asPalette.npoints];
1888 asPalette.points =
new double[asPalette.npoints];
1889 for (
Int_t point = 0; point <
Int_t(asPalette.npoints); point++)
1890 asPalette.points[point] = fMinValue + (fMaxValue - fMinValue) * pal.
fPoints[point];
1895 delete [] asPalette.points;
1896 for (Int_t col = 0; col < 4; col++)
1897 delete [] asPalette.channels[col];
1916 Warning(
"Scale",
"Image not initiated");
1921 Warning(
"Scale",
"Visual not initiated");
1929 if (toWidth > 30000)
1931 if (toHeight > 30000)
1934 ASImage *img = scale_asimage(
fgVisual,
fImage, toWidth, toHeight,
1951 Warning(
"Scale",
"Image not initiated");
1956 Warning(
"Scale",
"Visual not initiated");
1964 if (toWidth > 30000)
1966 if (toHeight > 30000)
1970 yStart, yEnd, toWidth, toHeight,
1986 Warning(
"Tile",
"Image not initiated");
1991 Warning(
"Tile",
"Visual not initiated");
1999 if (toWidth > 30000)
2001 if (toHeight > 30000)
2004 ASImage *img = tile_asimage(
fgVisual,
fImage, 0, 0, toWidth, toHeight, 0,
2026 Warning(
"Zoom",
"Image not valid");
2031 fZoomWidth = (width == 0) ? 1 : ((width >
fImage->width) ?
fImage->width : width);
2032 fZoomHeight = (height == 0) ? 1 : ((height >
fImage->height) ?
fImage->height : height);
2034 if (fZoomOffX + fZoomWidth >
fImage->width)
2037 if (fZoomOffY + fZoomHeight >
fImage->height)
2048 Warning(
"UnZoom",
"Image not valid");
2054 fZoomWidth =
fImage->width;
2055 fZoomHeight =
fImage->height;
2076 Warning(
"Flip",
"Image not valid");
2080 Warning(
"Flip",
"Visual not initiated");
2084 if (
fImage->alt.vector) {
2085 Warning(
"Flip",
"flip does not work for data images");
2089 Int_t rflip = flip/90;
2123 Warning(
"Mirror",
"Image not valid");
2128 Warning(
"Mirror",
"Visual not initiated");
2132 if (
fImage->alt.vector) {
2133 Warning(
"Mirror",
"mirror does not work for data images");
2205 if (inbatch && !noX) {
2217 fgVisual = create_asvisual(0, 0, 0, 0);
2224 fgVisual = create_asvisual(0, 0, 0, 0);
2227 disp = (Display*)
gVirtualX->GetDisplay();
2230 Visual *vis = (Visual*)
gVirtualX->GetVisual();
2233 if (vis == 0 || cmap == 0) {
2234 fgVisual = create_asvisual(0, 0, 0, 0);
2236 fgVisual = create_asvisual_for_id(disp, screen, depth,
2237 XVisualIDFromVisual(vis), cmap, 0);
2241 fgVisual = create_asvisual(0, 0, 0, 0);
2254 Warning(
"StartPaletteEditor",
"Image not valid");
2257 if (
fImage->alt.vector == 0) {
2258 Warning(
"StartPaletteEditor",
"palette can be modified only for data images");
2273 Warning(
"GetPixmap",
"Visual not initiated");
2281 static int x11 = -1;
2282 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
2288 if (!
fImage->alt.argb32) {
2291 ret =
gVirtualX->CreatePixmapFromData((
unsigned char*)
fImage->alt.argb32,
2307 Warning(
"GetMask",
"Visual not initiated");
2314 Warning(
"GetMask",
"No image");
2319 UInt_t ow = img->width%8;
2320 UInt_t ww = img->width - ow + (ow ? 8 : 0);
2327 char *bits =
new char[ww*hh];
2329 ASImageDecoder *imdec = start_image_decoding(
fgVisual, img, SCL_DO_ALPHA,
2336 for (y = 0; y < hh; y++) {
2337 imdec->decode_image_scanline(imdec);
2338 CARD32 *
a = imdec->buffer.alpha;
2340 for (x = 0; x < ww; x++) {
2354 stop_image_decoding(&imdec);
2355 pxmap =
gVirtualX->CreateBitmap(
gVirtualX->GetDefaultRootWindow(), (
const char *)bits,
2367 Warning(
"SetImage",
"Visual not initiated");
2377 gVirtualX->GetWindowSize(pxm, xy, xy, w, h);
2381 static int x11 = -1;
2382 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
2385 fImage = picture2asimage(
fgVisual, pxm, mask, 0, 0, w, h, kAllPlanes, 1, 0);
2387 unsigned char *bits =
gVirtualX->GetColorBits(pxm, 0, 0, w, h);
2394 fImage = bitmap2asimage(bits, w, h, 0, 0);
2398 unsigned char *mask_bits =
gVirtualX->GetColorBits(mask, 0, 0, w, h);
2399 fImage = bitmap2asimage(bits, w, h, 0, mask_bits);
2400 delete [] mask_bits;
2411 Warning(
"GetPixels",
"Wrong Image");
2416 ASImageDecoder *imdec;
2418 width = !width ? img->width : width;
2419 height = !height ? img->height : height;
2430 if ((x >= (
int)img->width) || (y >= (
int)img->height)) {
2434 if ((
int)(x + width) > (
int)img->width) {
2435 width = img->width -
x;
2438 if ((
int)(y + height) > (
int)img->height) {
2439 height = img->height -
y;
2442 if ((imdec = start_image_decoding(0,
fImage, SCL_DO_ALL, 0, y,
2443 img->width, height, 0)) == 0) {
2444 Warning(
"GetPixels",
"Failed to create image decoder");
2454 for (
UInt_t k = 0; k < height; k++) {
2455 imdec->decode_image_scanline(imdec);
2457 for (
UInt_t i = 0; i < width; ++i) {
2458 if ((r == (
Int_t)imdec->buffer.red[i]) &&
2459 (g == (
Int_t)imdec->buffer.green[i]) &&
2460 (b == (
Int_t)imdec->buffer.blue[i])) {
2462 r = (
Int_t)imdec->buffer.red[i];
2463 g = (
Int_t)imdec->buffer.green[i];
2464 b = (
Int_t)imdec->buffer.blue[i];
2467 ret->
AddAt(p, k*width + i);
2471 stop_image_decoding(&imdec);
2483 Warning(
"GetVecArray",
"Bad Image");
2486 if (
fImage->alt.vector) {
2487 return fImage->alt.vector;
2505 Warning(
"GetArray",
"Bad Image");
2511 if (
fImage->alt.vector) {
2516 ASImageDecoder *imdec;
2518 w = w ? w :
fImage->width;
2519 h = h ? h :
fImage->height;
2527 if ((imdec = start_image_decoding(0, img, SCL_DO_ALL, 0, 0,
2528 img->width, 0, 0)) == 0) {
2529 Warning(
"GetArray",
"Failed to create image decoder");
2540 for (
UInt_t k = 0; k <
h; k++) {
2541 imdec->decode_image_scanline(imdec);
2543 for (
UInt_t i = 0; i <
w; ++i) {
2544 if ((r == imdec->buffer.red[i]) &&
2545 (g == imdec->buffer.green[i]) &&
2546 (b == imdec->buffer.blue[i])) {
2548 r = imdec->buffer.red[i];
2549 g = imdec->buffer.green[i];
2550 b = imdec->buffer.blue[i];
2551 if (palette) p = palette->
FindColor(r, g, b);
2553 v = palette ? palette->
fPoints[p] :
Double_t((r << 16) + (g << 8) + b)/0xFFFFFF;
2554 ret->
AddAt(v, (h-k-1)*w + i);
2558 stop_image_decoding(&imdec);
2581 const char *color,
const char *font_name,
2584 UInt_t width=0, height=0;
2585 ARGB32 text_color = ARGB32_Black;
2586 ASImage *fore_im = 0;
2587 ASImage *text_im = 0;
2591 Warning(
"DrawText",
"Visual not initiated");
2607 parse_argb_color(color, &text_color);
2615 if (!gFontManager) {
2616 gFontManager = create_font_manager(
fgVisual->dpy, 0, 0);
2619 if (!gFontManager) {
2620 Warning(
"DrawText",
"cannot create Font Manager");
2624 ASFont *font = get_asfont(gFontManager, fn.
Data(), 0, size, ASF_GuessWho);
2627 font = get_asfont(gFontManager,
"fixed", 0, size, ASF_GuessWho);
2629 Warning(
"DrawText",
"cannot find a font %s", font_name);
2634 get_text_size(text, font, (ASText3DType)type, &width, &height);
2637 fImage = create_asimage(width, height, 0);
2641 text_im = draw_text(text, font, (ASText3DType)type, 0);
2646 ASImage *tmp = file2ASImage(fore_file, 0xFFFFFFFF, SCREEN_GAMMA, 0, 0);
2648 if ((tmp->width != width) || (tmp->height != height)) {
2649 fore_im = tile_asimage(
fgVisual, tmp, 0, 0, width, height, 0,
2652 destroy_asimage(&tmp);
2659 move_asimage_channel(fore_im, IC_ALPHA, text_im, IC_ALPHA);
2660 destroy_asimage(&text_im);
2668 ASImage *rendered_im;
2669 ASImageLayer layers[2];
2671 init_image_layers(&(layers[0]), 2);
2672 fore_im->back_color = text_color;
2673 layers[0].im = rimg;
2674 layers[0].dst_x = 0;
2675 layers[0].dst_y = 0;
2676 layers[0].clip_width = rimg->width;
2677 layers[0].clip_height = rimg->height;
2678 layers[0].bevel = 0;
2679 layers[1].im = fore_im;
2680 layers[1].dst_x =
x;
2681 layers[1].dst_y =
y;
2682 layers[1].clip_width = fore_im->width;
2683 layers[1].clip_height = fore_im->height;
2685 rendered_im = merge_layers(
fgVisual, &(layers[0]), 2, rimg->width, rimg->height,
2688 destroy_asimage(&fore_im);
2721 Warning(
"Merge",
"Visual not initiated");
2725 ASImage *rendered_im;
2726 ASImageLayer layers[2];
2728 init_image_layers(&(layers[0]), 2);
2730 layers[0].dst_x = 0;
2731 layers[0].dst_y = 0;
2732 layers[0].clip_width =
fImage->width;
2733 layers[0].clip_height =
fImage->height;
2734 layers[0].bevel = 0;
2735 layers[1].im = ((
TASImage*)im)->fImage;
2736 layers[1].dst_x =
x;
2737 layers[1].dst_y =
y;
2738 layers[1].clip_width = im->
GetWidth();
2739 layers[1].clip_height = im->
GetHeight();
2740 layers[1].merge_scanlines = blend_scanlines_name2func(op ? op :
"add");
2758 Warning(
"Blur",
"Visual not initiated");
2763 fImage = create_asimage(100, 100, 0);
2766 Warning(
"Blur",
"Failed to create image");
2773 ASImage *rendered_im = blur_asimage_gauss(
fgVisual,
fImage, hr > 0 ? hr : 3,
2774 vr > 0 ? vr : 3, SCL_DO_ALL,
2787 Warning(
"Clone",
"Image not initiated");
2794 Warning(
"Clone",
"Failed to create image");
2810 if (
fImage->alt.argb32) {
2812 im->
fImage->alt.argb32 = (ARGB32*)safemalloc(sz*
sizeof(ARGB32));
2813 memcpy(im->
fImage->alt.argb32,
fImage->alt.argb32, sz *
sizeof(ARGB32));
2833 Warning(
"Vectorize",
"Visual not initiated");
2838 fImage = create_asimage(100, 100, 0);
2841 Warning(
"Vectorize",
"Failed to create image");
2852 dither = dither > 7 ? 7 : dither;
2854 res = colormap_asimage(
fImage, &cmap, max_colors, dither, opaque_threshold);
2866 g = INDEX_SHIFT_GREEN(cmap.entries[res[i]].green);
2867 b = INDEX_SHIFT_BLUE(cmap.entries[res[i]].blue);
2868 r = INDEX_SHIFT_RED(cmap.entries[res[i]].red);
2870 v = MAKE_INDEXED_COLOR24(r,
g,b);
2874 if (fMinValue > tmp) fMinValue = tmp;
2875 if (fMaxValue < tmp) fMaxValue = tmp;
2880 for (
UInt_t j = 0; j < cmap.count; j++) {
2881 g = INDEX_SHIFT_GREEN(cmap.entries[j].green);
2882 b = INDEX_SHIFT_BLUE(cmap.entries[j].blue);
2883 r = INDEX_SHIFT_RED(cmap.entries[j].red);
2884 v = MAKE_INDEXED_COLOR24(r,
g,b);
2886 v = (v>>12) & 0x0FFF;
2889 pal->
fColorRed[j] = cmap.entries[j].red << 8;
2891 pal->
fColorBlue[j] = cmap.entries[j].blue << 8;
2895 destroy_colormap(&cmap,
kTRUE);
2898 fImage->alt.vector = vec;
2900 if (res)
delete res;
2946 Warning(
"HSV",
"Visual not initiated");
2951 fImage = create_asimage(width ? width : 20, height ? height : 20, 0);
2954 Warning(
"HSV",
"Failed to create image");
2963 width = !width ?
fImage->width : width;
2964 height = !height ?
fImage->height : height;
2966 ASImage *rendered_im = 0;
2969 rendered_im = adjust_asimage_hsv(
fgVisual,
fImage, x, y, width, height,
2970 hue, radius, H, S, V, ASA_ASImage, 100,
2971 ASIMAGE_QUALITY_TOP);
2974 Warning(
"HSV",
"Failed to create rendered image");
3009 Warning(
"Gradient",
"Visual not initiated");
3013 ASImage *rendered_im = 0;
3014 ASGradient gradient;
3016 int reverse = 0, npoints1 = 0, npoints2 = 0;
3023 if ((angle > 2 * 180 * 15 / 16) || (angle < 2 * 180 * 1 / 16)) {
3024 gradient.type = GRADIENT_Left2Right;
3025 }
else if (angle < 2 * 180 * 3 / 16) {
3026 gradient.type = GRADIENT_TopLeft2BottomRight;
3027 }
else if (angle < 2 * 180 * 5 / 16) {
3028 gradient.type = GRADIENT_Top2Bottom;
3029 }
else if (angle < 2 * 180 * 7 / 16) {
3030 gradient.type = GRADIENT_BottomLeft2TopRight; reverse = 1;
3031 }
else if (angle < 2 * 180 * 9 / 16) {
3032 gradient.type = GRADIENT_Left2Right; reverse = 1;
3033 }
else if (angle < 2 * 180 * 11 / 16) {
3034 gradient.type = GRADIENT_TopLeft2BottomRight; reverse = 1;
3035 }
else if (angle < 2 * 180 * 13 / 16) {
3036 gradient.type = GRADIENT_Top2Bottom; reverse = 1;
3038 gradient.type = GRADIENT_BottomLeft2TopRight;
3041 for (p = (
char*)colors; isspace((
int)*p); p++) { }
3043 for (npoints1 = 0; *p; npoints1++) {
3045 for ( ; *p && !isspace((
int)*p); p++) { }
3047 for ( ; isspace((
int)*p); p++) { }
3050 for (p = (
char*)offsets; isspace((
int)*p); p++) { }
3052 for (npoints2 = 0; *p; npoints2++) {
3054 for ( ; *p && !isspace((
int)*p); p++) { }
3056 for ( ; isspace((
int)*p); p++) { }
3061 if (offsets && (npoints1 > npoints2)) npoints1 = npoints2;
3070 gradient.color =
new ARGB32[npoints1];
3071 gradient.offset =
new double[npoints1];
3073 for (p = (
char*)
colors; isspace((
int)*p); p++) { }
3075 for (npoints1 = 0; *p; ) {
3079 for ( ; *p && !isspace((
int)*p); p++) { }
3081 for ( ; isspace((
int)*p); p++) { }
3083 col = str(pb - colors, p - pb);
3085 if (parse_argb_color(col.
Data(), gradient.color + npoints1) != col) {
3088 Warning(
"Gradient",
"Failed to parse color [%s] - defaulting to black", pb);
3093 for (p = (
char*)offsets; isspace((
int)*p); p++) { }
3095 for (npoints2 = 0; *p; ) {
3099 for ( ; *p && !isspace((
int)*p); p++) { }
3102 gradient.offset[npoints2] = strtod(pb, &pb);
3104 if (pb == p) npoints2++;
3106 for ( ; isspace((
int)*p); p++) { }
3109 for (npoints2 = 0; npoints2 < npoints1; npoints2++) {
3110 gradient.offset[npoints2] = (
double)npoints2 / (npoints1 - 1);
3113 gradient.npoints = npoints1;
3115 if (npoints2 && (gradient.npoints > npoints2)) {
3116 gradient.npoints = npoints2;
3119 for (i = 0; i < gradient.npoints/2; i++) {
3120 int i2 = gradient.npoints - 1 - i;
3121 ARGB32
c = gradient.color[i];
3122 double o = gradient.offset[i];
3123 gradient.color[i] = gradient.color[i2];
3124 gradient.color[i2] =
c;
3125 gradient.offset[i] = gradient.offset[i2];
3126 gradient.offset[i2] = o;
3128 for (i = 0; i < gradient.npoints; i++) {
3129 gradient.offset[i] = 1.0 - gradient.offset[i];
3132 rendered_im = make_gradient(
fgVisual, &gradient, width, height, SCL_DO_ALL,
3135 delete [] gradient.color;
3136 delete [] gradient.offset;
3140 Warning(
"Gradient",
"Failed to create gradient image");
3149 ASImageLayer layers[2];
3151 init_image_layers(&(layers[0]), 2);
3153 layers[0].dst_x = 0;
3154 layers[0].dst_y = 0;
3155 layers[0].clip_width =
fImage->width;
3156 layers[0].clip_height =
fImage->height;
3157 layers[0].bevel = 0;
3158 layers[1].im = rendered_im;
3159 layers[1].dst_x =
x;
3160 layers[1].dst_y =
y;
3161 layers[1].clip_width = width;
3162 layers[1].clip_height = height;
3163 layers[1].merge_scanlines = alphablend_scanlines;
3168 Warning(
"Gradient",
"Failed to create merged image");
3172 destroy_asimage(&rendered_im);
3187 cmp = (cmp * 12) / 10;
3189 return (cmp > 255) ? 255 : cmp;
3210 return (background >> 1) & 0x7F7F7F7F;
3221 a = ARGB32_ALPHA8(foreground) + ARGB32_ALPHA8(background);
3223 r = ARGB32_RED8(foreground) + ARGB32_RED8(background);
3225 g = ARGB32_GREEN8(foreground) + ARGB32_GREEN8(background);
3227 b = ARGB32_BLUE8(foreground) + ARGB32_BLUE8(background);
3230 return MAKE_ARGB32(a, r, g, b);
3246 const char *hi_color,
const char *lo_color,
UShort_t thick,
3250 Warning(
"Bevel",
"Visual not initiated");
3257 ARGB32
hi=ARGB32_White, lo=ARGB32_White;
3258 parse_argb_color(hi_color, &hi);
3259 parse_argb_color(lo_color, &lo);
3262 bevel.lo_color =
hi;
3264 bevel.hi_color = lo;
3267 bevel.hi_color =
hi;
3269 bevel.lo_color = lo;
3274 int extra_hilite = 2;
3275 bevel.left_outline = bevel.top_outline = bevel.right_outline = bevel.bottom_outline = thick;
3276 bevel.left_inline = bevel.top_inline = bevel.right_inline = bevel.bottom_inline = extra_hilite + 1;
3278 if (bevel.top_outline > 1) {
3279 bevel.top_inline += bevel.top_outline - 1;
3282 if (bevel.left_outline > 1) {
3283 bevel.left_inline += bevel.left_outline - 1;
3286 if (bevel.right_outline > 1) {
3287 bevel.right_inline += bevel.right_outline - 1;
3290 if (bevel.bottom_outline > 1) {
3291 bevel.bottom_inline += bevel.bottom_outline - 1;
3295 ARGB32
fill = ((hi>>24) != 0xff) || ((lo>>24) != 0xff) ? bevel.hilo_color : (bevel.hilo_color | 0xff000000);
3298 fImage = create_asimage(width ? width : 20, height ? height : 20, 0);
3301 Warning(
"Bevel",
"Failed to create image");
3310 width = !width ?
fImage->width : width;
3311 height = !height ?
fImage->height : height;
3313 ASImageLayer layers[2];
3314 init_image_layers(&(layers[0]), 2);
3317 layers[0].dst_x = 0;
3318 layers[0].dst_y = 0;
3319 layers[0].clip_width =
fImage->width;
3320 layers[0].clip_height =
fImage->height;
3321 layers[0].bevel = 0;
3323 UInt_t w = width - (bevel.left_outline + bevel.right_outline);
3324 UInt_t h = height - (bevel.top_outline + bevel.bottom_outline);
3325 ASImage *bevel_im = create_asimage(w, h, 0);
3328 Warning(
"Bevel",
"Failed to create bevel image");
3332 layers[1].im = bevel_im;
3333 fill_asimage(
fgVisual, bevel_im, 0, 0, w, h, fill);
3335 layers[1].dst_x =
x;
3336 layers[1].dst_y =
y;
3337 layers[1].clip_width = width;
3338 layers[1].clip_height = height;
3339 layers[1].bevel = &bevel;
3340 layers[1].merge_scanlines = alphablend_scanlines;
3344 destroy_asimage(&bevel_im);
3347 Warning(
"Bevel",
"Failed to image");
3367 Warning(
"Pad",
"Visual not initiated");
3372 fImage = create_asimage(100, 100, 0);
3375 Warning(
"Pad",
"Failed to create image");
3384 ARGB32 color = ARGB32_White;
3385 parse_argb_color(col, &color);
3390 h = t +
fImage->height + b;
3396 Warning(
"Pad",
"Failed to create output image");
3413 Warning(
"Crop",
"Visual not initiated");
3425 width = x + width >
fImage->width ?
fImage->width - x : width;
3426 height = y + height >
fImage->height ?
fImage->height - y : height;
3428 if ((width ==
fImage->width) && (height ==
fImage->height)) {
3429 Warning(
"Crop",
"input size larger than image");
3432 ASImageDecoder *imdec = start_image_decoding(
fgVisual,
fImage, SCL_DO_ALL,
3433 x, y, width, height, 0);
3436 Warning(
"Crop",
"Failed to start image decoding");
3440 ASImage *img = create_asimage(width, height, 0);
3444 Warning(
"Crop",
"Failed to create image");
3448 ASImageOutput *imout = start_image_output(
fgVisual, img, ASA_ASImage,
3452 Warning(
"Crop",
"Failed to start image output");
3453 destroy_asimage(&img);
3454 if (imdec)
delete [] imdec;
3462 for (
UInt_t i = 0; i < height; i++) {
3463 imdec->decode_image_scanline(imdec);
3464 imout->output_image_scanline(imout, &(imdec->buffer), 1);
3467 stop_image_decoding(&imdec);
3468 stop_image_output(&imout);
3492 Warning(
"Append",
"Visual not initiated");
3509 Merge(im,
"alphablend", width, 0);
3510 }
else if (opt ==
"/") {
3512 Merge(im,
"alphablend", 0, height);
3531 Warning(
"BeginPaint",
"Visual not initiated");
3546 0, ASA_ARGB32, 0, ASIMAGE_QUALITY_DEFAULT);
3549 Warning(
"BeginPaint",
"Failed to create image");
3563 Warning(
"EndPaint",
"no image");
3567 if (!
fImage->alt.argb32)
return;
3570 0, ASA_ASImage, 0, ASIMAGE_QUALITY_DEFAULT);
3573 Warning(
"EndPaint",
"Failed to create image");
3590 Warning(
"GetArgbArray",
"no image");
3597 if (!img->alt.argb32) {
3607 return (
UInt_t *)img->alt.argb32;
3618 Warning(
"GetRgbaArray",
"no image");
3625 if (!img->alt.argb32) {
3643 for (i = 0; i < img->height; i++) {
3644 for (j = 0; j < img->width; j++) {
3646 argb = img->alt.argb32[idx];
3648 rgb = argb & 0x00ffffff;
3649 rgba = (rgb << 8) + a;
3664 Warning(
"GetScanline",
"no image");
3669 CARD32 *ret =
new CARD32[img->width];
3671 ASImageDecoder *imdec = start_image_decoding(
fgVisual, img, SCL_DO_ALL,
3672 0, y, img->width, 1, 0);
3676 Warning(
"GetScanline",
"Failed to start image decoding");
3684 imdec->decode_image_scanline(imdec);
3685 memcpy(imdec->buffer.buffer, ret, img->width*
sizeof(CARD32));
3686 stop_image_decoding(&imdec);
3701 #if defined(R__GNU) && defined(__i386__) && !defined(__sun)
3702 #define _MEMSET_(dst, lng, val) __asm__("movl %0,%%eax \n"\
3703 "movl %1,%%edi \n" \
3704 "movl %2,%%ecx \n" \
3709 :"g" (val), "g" (dst), "g" (lng) \
3710 :"eax","edi","ecx" \
3714 #define _MEMSET_(dst, lng, val) do {\
3715 for( UInt_t j=0; j < lng; j++) *((dst)+j) = val; } while (0)
3719 #define FillSpansInternal(npt, ppt, widths, color) do {\
3720 UInt_t yy = ppt[0].fY*fImage->width;\
3721 for (UInt_t i = 0; i < npt; i++) {\
3722 _MEMSET_(&fImage->alt.argb32[yy + ppt[i].fX], widths[i], color);\
3723 yy += ((i+1 < npt) && (ppt[i].fY != ppt[i+1].fY) ? fImage->width : 0);\
3733 ARGB32 color = (ARGB32)col;
3735 if (width == 0) width = 1;
3736 if (height == 0) height = 1;
3747 Bool_t has_alpha = (color & 0xff000000) != 0xff000000;
3752 width = x + width >
fImage->width ?
fImage->width - x : width;
3753 height = y + height >
fImage->height ?
fImage->height - y : height;
3755 if (!
fImage->alt.argb32) {
3758 int yyy = y*
fImage->width;
3760 ARGB32 *p0 =
fImage->alt.argb32 + yyy +
x;
3762 for (
UInt_t i = 0; i < height; i++) {
3767 for (
UInt_t i = y; i < y + height; i++) {
3792 Warning(
"Fill",
"Visual not initiated");
3796 ARGB32 color = ARGB32_White;
3799 parse_argb_color(col, &color);
3803 fImage = create_asimage(width ? width : 20, height ? height : 20, 0);
3817 ARGB32 color = (ARGB32)col;
3820 if (!thick) thick = 1;
3828 thick += (x - half);
3834 x = x + thick >=
fImage->width ?
fImage->width - thick - 1 :
x;
3836 int yy = y1*
fImage->width;
3838 for (
UInt_t w = 0; w < thick; w++) {
3839 if (x + w < fImage->width) {
3852 ARGB32 color = (ARGB32)col;
3855 if (!thick) thick = 1;
3863 thick += (y - half);
3867 y = y + thick >=
fImage->height ?
fImage->height - thick - 1 :
y;
3871 int yy = y*
fImage->width;
3872 for (
UInt_t w = 0; w < thick; w++) {
3874 if (y + w < fImage->height) {
3886 const char *col,
UInt_t thick)
3888 ARGB32 color = ARGB32_White;
3889 parse_argb_color(col, &color);
3901 int x,
y, xend, yend;
3908 Warning(
"DrawLine",
"Visual not initiated");
3913 Warning(
"DrawLine",
"no image");
3917 if (!
fImage->alt.argb32) {
3921 if (!
fImage->alt.argb32) {
3922 Warning(
"DrawLine",
"Failed to get pixel array");
3926 ARGB32 color = (ARGB32)col;
3933 y2 > y1 ? y2 : y1, color, thick);
3939 x2 > x1 ? x2 : x1, color, thick);
3951 i2 = i1 - (dx << 1);
3968 q = (y2 - y1) * ydir;
4000 i2 = i1 - (dy << 1);
4017 q = (x2 -
x1) * xdir;
4055 const char *col,
UInt_t thick)
4058 Warning(
"DrawRectangle",
"Visual not initiated");
4067 fImage = create_asimage(w, h, 0);
4072 if (!
fImage->alt.argb32) {
4076 if (!
fImage->alt.argb32) {
4077 Warning(
"DrawRectangle",
"Failed to get pixel array");
4081 ARGB32 color = ARGB32_White;
4082 parse_argb_color(col, &color);
4102 ARGB32 color = ARGB32_White;
4107 fImage = create_asimage(w, h, 0);
4113 parse_argb_color(col, &color);
4119 parse_argb_color(col, &color);
4149 ARGB32 color = (ARGB32)col;
4159 thick += (y - half);
4162 thick = thick <= 0 ? 1 : thick;
4164 y = y + thick >=
fImage->height ?
fImage->height - thick - 1 :
y;
4170 x1 = x2 < x1 ? x2 :
x1;
4171 x2 = x2 < tmp ? tmp :
x2;
4174 for (
UInt_t w = 0; w < thick; w++) {
4175 if (y + w < fImage->height) {
4183 if (i >= pDash[iDash]) {
4187 if (iDash >= nDash) {
4203 ARGB32 color = (ARGB32)col;
4213 thick += (x - half);
4216 thick = thick <= 0 ? 1 : thick;
4223 y1 = y2 < y1 ? y2 : y1;
4224 y2 = y2 < tmp ? tmp : y2;
4226 x = x + thick >=
fImage->width ?
fImage->width - thick - 1 :
x;
4228 int yy = y1*
fImage->width;
4230 for (
UInt_t w = 0; w < thick; w++) {
4231 if (x + w < fImage->width) {
4239 if (i >= pDash[iDash]) {
4243 if (iDash >= nDash) {
4259 int x,
y, xend, yend;
4269 char *pDash =
new char[nDash];
4274 for (i = 0; i < (int)nDash; i++) {
4280 i2 = i1 - (dx << 1);
4298 q = (y2 - y1) * ydir;
4303 if ((iDash%2) == 0) {
4315 if (i >= pDash[iDash]) {
4319 if (iDash >= nDash) {
4327 if ((iDash%2) == 0) {
4339 if (i >= pDash[iDash]) {
4343 if (iDash >= nDash) {
4352 for (i = 0; i < (int)nDash; i++) {
4358 i2 = i1 - (dy << 1);
4376 q = (x2 -
x1) * xdir;
4381 if ((iDash%2) == 0) {
4395 if (i >= pDash[iDash]) {
4399 if (iDash >= nDash) {
4407 if ((iDash%2) == 0) {
4421 if (i >= pDash[iDash]) {
4425 if (iDash >= nDash) {
4443 double x,
y, xend=0, yend=0, x0, y0;
4451 double *xDash =
new double[nDash];
4452 double *yDash =
new double[nDash];
4457 for (i = 0; i < (int)nDash; i++) {
4458 xDash[i] = tDash[i] * ac;
4459 yDash[i] = tDash[i] *
as;
4463 xDash[i] = xDash[i]/2;
4464 yDash[i] = yDash[i]/2;
4466 xDash[i] = xDash[i]*2;
4467 yDash[i] = yDash[i]*2;
4484 q = (y2 - y1) * ydir;
4491 while ((x < xend) && (y < yend)) {
4495 if ((iDash%2) == 0) {
4505 if (iDash >= nDash) {
4510 while ((x < xend) && (y > yend)) {
4514 if ((iDash%2) == 0) {
4524 if (iDash >= nDash) {
4543 q = (x2 -
x1) * xdir;
4550 while ((x < xend) && (y < yend)) {
4554 if ((iDash%2) == 0) {
4564 if (iDash >= nDash) {
4569 while ((x > xend) && (y < yend)) {
4573 if ((iDash%2) == 0) {
4583 if (iDash >= nDash) {
4597 const char *pDash,
const char *col,
UInt_t thick)
4601 Warning(
"DrawDashLine",
"Visual not initiated");
4606 Warning(
"DrawDashLine",
"no image");
4610 if (!
fImage->alt.argb32) {
4614 if (!
fImage->alt.argb32) {
4615 Warning(
"DrawDashLine",
"Failed to get pixel array");
4619 if ((nDash < 2) || !pDash || (nDash%2)) {
4620 Warning(
"DrawDashLine",
"Wrong input parameters n=%d %ld", nDash, (
Long_t)
sizeof(pDash)-1);
4624 ARGB32 color = ARGB32_White;
4625 parse_argb_color(col, &color);
4629 }
else if (y1 == y2) {
4643 ARGB32 color = ARGB32_White;
4644 parse_argb_color(col, &color);
4651 for (
UInt_t i = 1; i < nn; i++) {
4668 Warning(
"PutPixel",
"Visual not initiated");
4673 Warning(
"PutPixel",
"no image");
4677 if (!
fImage->alt.argb32) {
4681 if (!
fImage->alt.argb32) {
4682 Warning(
"PutPixel",
"Failed to get pixel array");
4687 parse_argb_color(col, &color);
4689 if ((x < 0) || (y < 0) || (x >= (
int)
fImage->width) || (y >= (
int)
fImage->height)) {
4690 Warning(
"PutPixel",
"Out of range width=%d x=%d, height=%d y=%d",
4703 Warning(
"PolyPoint",
"Visual not initiated");
4708 Warning(
"PolyPoint",
"no image");
4712 if (!
fImage->alt.argb32) {
4716 if (!
fImage->alt.argb32) {
4717 Warning(
"PolyPoint",
"Failed to get pixel array");
4722 Warning(
"PolyPoint",
"No points specified");
4729 parse_argb_color(col, &color);
4735 for (i = 0; i < npt; i++) {
4736 ipt[i].
fX += ppt[i].
fX;
4737 ipt[i].
fY += ppt[i].
fY;
4742 for (i = 0; i < npt; i++) {
4743 x = ipt ? ipt[i].
fX : ppt[i].
fX;
4744 y = ipt ? ipt[i].
fY : ppt[i].
fY;
4746 if ((x < 0) || (y < 0) || (x >= (
int)
fImage->width) || (y >= (
int)
fImage->height)) {
4762 if (!nseg || !seg) {
4763 Warning(
"DrawSegments",
"Invalid data nseg=%d seg=0x%lx", nseg, (
Long_t)seg);
4769 for (
UInt_t i = 0; i < nseg; i++) {
4770 pt[0].
fX = seg->
fX1;
4771 pt[1].
fX = seg->
fX2;
4772 pt[0].
fY = seg->
fY1;
4773 pt[1].
fY = seg->
fY2;
4787 Warning(
"FillSpans",
"Visual not initiated");
4792 Warning(
"FillSpans",
"no image");
4796 if (!
fImage->alt.argb32) {
4800 if (!
fImage->alt.argb32) {
4801 Warning(
"FillSpans",
"Failed to get pixel array");
4805 if (!npt || !ppt || !widths || (stipple && (!w || !h))) {
4806 Warning(
"FillSpans",
"Invalid input data npt=%d ppt=0x%lx col=%s widths=0x%lx stipple=0x%lx w=%d h=%d",
4812 parse_argb_color(col, &color);
4817 for (
UInt_t i = 0; i < npt; i++) {
4819 for (
UInt_t j = 0; j < widths[i]; j++) {
4820 if ((ppt[i].fX >= (
Int_t)
fImage->width) || (ppt[i].
fX < 0) ||
4831 if (stipple[ii >> 3] & (1 << (ii%8))) {
4845 Warning(
"FillSpans",
"Visual not initiated");
4850 Warning(
"FillSpans",
"no image");
4854 if (!
fImage->alt.argb32) {
4858 if (!
fImage->alt.argb32) {
4859 Warning(
"FillSpans",
"Failed to get pixel array");
4863 if (!npt || !ppt || !widths || !tile) {
4864 Warning(
"FillSpans",
"Invalid input data npt=%d ppt=0x%lx widths=0x%lx tile=0x%lx",
4878 for (
UInt_t i = 0; i < npt; i++) {
4881 for (
UInt_t j = 0; j < widths[i]; j++) {
4882 if ((ppt[i].fX >= (
Int_t)
fImage->width) || (ppt[i].
fX < 0) ||
4901 Warning(
"CropSpans",
"Visual not initiated");
4906 Warning(
"CropSpans",
"no image");
4910 if (!
fImage->alt.argb32) {
4914 if (!
fImage->alt.argb32) {
4915 Warning(
"CropSpans",
"Failed to get pixel array");
4919 if (!npt || !ppt || !widths) {
4920 Warning(
"CropSpans",
"No points specified npt=%d ppt=0x%lx widths=0x%lx", npt, (
Long_t)ppt, (
Long_t)widths);
4925 int y1 = ppt[npt-1].
fY;
4933 for (y = 0; (int)y < y0; y++) {
4934 for (x = 0; x <
fImage->width; x++) {
4936 if (idx < sz)
fImage->alt.argb32[idx] = 0;
4941 for (i = 0; i < npt; i++) {
4942 for (x = 0; (int)x < ppt[i].fX; x++) {
4944 if (idx < sz)
fImage->alt.argb32[idx] = 0;
4946 for (x = ppt[i].fX + widths[i] + 1; x <
fImage->width; x++) {
4948 if (idx < sz)
fImage->alt.argb32[idx] = 0;
4953 for (y = y1; y <
fImage->height; y++) {
4954 for (x = 0; x <
fImage->width; x++) {
4956 if (idx < sz)
fImage->alt.argb32[idx] = 0;
4990 Warning(
"CopyArea",
"Visual not initiated");
4995 Warning(
"CopyArea",
"no image");
5006 xsrc = xsrc < 0 ? 0 : xsrc;
5007 ysrc = ysrc < 0 ? 0 : ysrc;
5009 if ((xsrc >= (
int)
fImage->width) || (ysrc >= (
int)
fImage->height))
return;
5018 if (!out->alt.argb32) {
5020 out = ((
TASImage*)dst)->GetImage();
5023 if (
fImage->alt.argb32 && out->alt.argb32) {
5024 for (y = 0; y < (int)h; y++) {
5025 for (x = 0; x < (int)w; x++) {
5026 idx = yy + x + xsrc;
5027 if ((x + xdst < 0) || (ydst + y < 0) ||
5028 (x + xdst >= (
int)out->width) || (y + ydst >= (
int)out->height) )
continue;
5030 idx2 = (ydst +
y)*out->width + x + xdst;
5034 out->alt.argb32[idx2] = 0;
5037 out->alt.argb32[idx2] &=
fImage->alt.argb32[idx];
5040 out->alt.argb32[idx2] =
fImage->alt.argb32[idx] & (~out->alt.argb32[idx2]);
5043 out->alt.argb32[idx2] &= ~
fImage->alt.argb32[idx];
5048 out->alt.argb32[idx2] ^=
fImage->alt.argb32[idx];
5051 out->alt.argb32[idx2] |=
fImage->alt.argb32[idx];
5054 out->alt.argb32[idx2] = (~
fImage->alt.argb32[idx]) & (~out->alt.argb32[idx2]);
5057 out->alt.argb32[idx2] ^= ~
fImage->alt.argb32[idx];
5060 out->alt.argb32[idx2] = ~out->alt.argb32[idx2];
5063 out->alt.argb32[idx2] =
fImage->alt.argb32[idx] | (~out->alt.argb32[idx2]);
5066 out->alt.argb32[idx2] = ~
fImage->alt.argb32[idx];
5069 out->alt.argb32[idx2] |= ~
fImage->alt.argb32[idx];
5072 out->alt.argb32[idx2] = (~
fImage->alt.argb32[idx]) | (~out->alt.argb32[idx2]);
5075 out->alt.argb32[idx2] = 0xFFFFFFFF;
5079 out->alt.argb32[idx2] =
fImage->alt.argb32[idx];
5103 int i, j, ix, iy,
w,
h;
5105 ARGB32 color = 0xFFFFFFFF;
5112 for (i = 0; i <
nx; i++) {
5114 for (j = 0; j <
ny; j++) {
5115 icol = (ARGB32)ic[i + (nx*j)];
5116 if (icol != color) {
5155 ymin = ymax = (pts++)->fY;
5158 if (pts->
fY < ymin) {
5162 if (pts->
fY > ymax) {
5170 return (ptMin - ptsStart);
5186 int mr = 0, m1r = 0;
5187 int incr1l = 0, incr2l = 0;
5188 int incr1r = 0, incr2r = 0;
5193 int nextleft, nextright;
5206 Warning(
"GetPolygonSpans",
"Visual not initiated");
5211 Warning(
"GetPolygonSpans",
"no image");
5215 if (!
fImage->alt.argb32) {
5219 if (!
fImage->alt.argb32) {
5220 Warning(
"GetPolygonSpans",
"Failed to get pixel array");
5224 if ((npt < 3) || !ppt) {
5225 Warning(
"GetPolygonSpans",
"No points specified npt=%d ppt=0x%lx", npt, (
Long_t)ppt);
5233 dy = ymax - ymin + 1;
5234 if ((npt < 3) || (dy < 0))
return kFALSE;
5236 ptsOut = firstPoint =
new TPoint[dy];
5237 width = firstWidth =
new UInt_t[dy];
5240 nextleft = nextright = imin;
5241 y = ppt[nextleft].
fY;
5246 if (ppt[nextleft].fY == y) {
5252 if (nextleft >= (
int)npt) {
5259 ppt[left].fX, ppt[nextleft].fX,
5260 xl, dl, ml, m1l, incr1l, incr2l);
5264 if (ppt[nextright].fY == y) {
5270 if (nextright < 0) {
5277 ppt[right].fX, ppt[nextright].fX,
5278 xr, dr, mr, m1r, incr1r, incr2r);
5283 i =
TMath::Min(ppt[nextleft].fY, ppt[nextright].fY) -
y;
5287 delete [] firstWidth;
5288 delete [] firstPoint;
5297 *(width++) = xr - xl;
5298 (ptsOut++)->fX = xl;
5300 *(width++) = xl - xr;
5301 (ptsOut++)->fX = xr;
5309 }
while (y != ymax);
5311 *nspans =
UInt_t(ptsOut - firstPoint);
5312 *outPoint = firstPoint;
5313 *outWidth = firstWidth;
5330 ARGB32 color = ARGB32_White;
5331 parse_argb_color(col, &color);
5334 if (!stipple && ((color & 0xff000000)==0xff000000)) {
5337 FillSpans(nspans, firstPoint, firstWidth, col, stipple, w, h);
5341 delete [] firstWidth;
5342 delete [] firstPoint;
5345 if (firstWidth)
delete [] firstWidth;
5346 if (firstPoint)
delete [] firstPoint;
5363 FillSpans(nspans, firstPoint, firstWidth, tile);
5366 delete [] firstWidth;
5367 delete [] firstPoint;
5370 if (firstWidth)
delete [] firstWidth;
5371 if (firstPoint)
delete [] firstPoint;
5387 CropSpans(nspans, firstPoint, firstWidth);
5390 delete [] firstWidth;
5391 delete [] firstPoint;
5394 if (firstWidth)
delete [] firstWidth;
5395 if (firstPoint)
delete [] firstPoint;
5408 Warning(
"DrawFillArea",
"Visual not initiated");
5413 Warning(
"DrawFillArea",
"no image");
5417 if (!
fImage->alt.argb32) {
5421 if (!
fImage->alt.argb32) {
5422 Warning(
"DrawFillArea",
"Failed to get pixel array");
5426 if ((count < 3) || !ptsIn) {
5427 Warning(
"DrawFillArea",
"No points specified npt=%d ppt=0x%lx", count, (
Long_t)ptsIn);
5436 ARGB32 color = ARGB32_White;
5437 parse_argb_color(col, &color);
5455 static const UInt_t gEdgeTableEntryCacheSize = 200;
5456 static EdgeTableEntry gEdgeTableEntryCache[gEdgeTableEntryCacheSize];
5458 if (count < gEdgeTableEntryCacheSize) {
5466 ptsOut = firstPoint;
5469 pSLL = ET.scanlines.next;
5471 for (y = ET.ymin; y < ET.ymax; y++) {
5472 if (pSLL && y == pSLL->scanline) {
5473 loadAET(&AET, pSLL->edgelist);
5480 ptsOut->
fX = pAET->bres.minor_axis;
5485 *width++ = pAET->next->bres.minor_axis - pAET->bres.minor_axis;
5487 if (nPts == NUMPTSTOBUFFER) {
5488 if (!stipple && ((color & 0xff000000)==0xff000000)) {
5491 FillSpans(nPts, firstPoint, firstWidth, col, stipple, w, h);
5493 ptsOut = firstPoint;
5504 if (!stipple && ((color & 0xff000000)==0xff000000)) {
5507 FillSpans(nPts, firstPoint, firstWidth, col, stipple, w, h);
5511 if (del)
delete [] pETEs;
5521 Warning(
"DrawFillArea",
"Visual not initiated");
5526 Warning(
"DrawFillArea",
"no image");
5530 if (!
fImage->alt.argb32) {
5534 if (!
fImage->alt.argb32) {
5535 Warning(
"DrawFillArea",
"Failed to get pixel array");
5539 if ((count < 3) || !ptsIn) {
5540 Warning(
"DrawFillArea",
"No points specified npt=%d ppt=0x%lx", count, (
Long_t)ptsIn);
5566 ptsOut = firstPoint;
5569 pSLL = ET.scanlines.next;
5571 for (y = ET.ymin; y < ET.ymax; y++) {
5572 if (pSLL && y == pSLL->scanline) {
5573 loadAET(&AET, pSLL->edgelist);
5580 ptsOut->
fX = pAET->bres.minor_axis;
5585 *width++ = pAET->next->bres.minor_axis - pAET->bres.minor_axis;
5587 if (nPts == NUMPTSTOBUFFER) {
5588 FillSpans(nPts, firstPoint, firstWidth, tile);
5589 ptsOut = firstPoint;
5598 FillSpans(nPts, firstPoint, firstWidth, tile);
5609 ASDrawContext *ctx =
new ASDrawContext;
5611 ctx->canvas_width = im->width;
5612 ctx->canvas_height = im->height;
5613 ctx->canvas = im->alt.argb32;
5614 ctx->scratch_canvas = 0;
5616 ctx->flags = ASDrawCTX_CanvasIsARGB;
5617 asim_set_custom_brush_colored( ctx, brush);
5627 if (ctx->scratch_canvas)
free(ctx->scratch_canvas);
5641 Int_t sz = thick*thick;
5648 matrix =
new CARD32[sz];
5651 for (
int i = 0; i < sz; i++) {
5652 matrix[i] = (CARD32)color;
5656 brush.matrix = matrix;
5657 brush.width = thick;
5658 brush.height = thick;
5659 brush.center_y = brush.center_x = thick/2;
5662 asim_move_to(ctx, x1, y1);
5663 asim_line_to(ctx, x2, y2);
5681 FT_Bitmap *source = (FT_Bitmap*)bitmap;
5682 UChar_t d = 0, *s = source->buffer;
5684 Int_t dots =
Int_t(source->width * source->rows);
5688 yy = y0 = by > 0 ? by *
fImage->width : 0;
5689 for (y = 0; y < (int) source->rows; y++) {
5691 if ((byy >= (
int)
fImage->height) || (byy <0))
continue;
5693 for (x = 0; x < (int) source->width; x++) {
5695 if ((bxx >= (
int)
fImage->width) || (bxx < 0))
continue;
5698 r += ((
fImage->alt.argb32[idx] & 0xff0000) >> 16);
5699 g += ((
fImage->alt.argb32[idx] & 0x00ff00) >> 8);
5700 b += (
fImage->alt.argb32[idx] & 0x0000ff);
5710 col[0] = (r << 16) + (g << 8) + b;
5712 Int_t col4r = (col[4] & 0xff0000) >> 16;
5713 Int_t col4g = (col[4] & 0x00ff00) >> 8;
5714 Int_t col4b = (col[4] & 0x0000ff);
5717 for (x = 3; x > 0; x--) {
5719 Int_t colxr = (col4r*x + r*xx) >> 2;
5720 Int_t colxg = (col4g*x + g*xx) >> 2;
5721 Int_t colxb = (col4b*x + b*xx) >> 2;
5722 col[
x] = (colxr << 16) + (colxg << 8) + colxb;
5726 for (y = 0; y < (int) source->rows; y++) {
5728 if ((byy >= (
int)
fImage->height) || (byy <0))
continue;
5730 for (x = 0; x < (int) source->width; x++) {
5735 d = ((d + 10) * 5) >> 8;
5738 if (d && (x < (
int) source->width) && (bxx < (
int)
fImage->width) && (bxx >= 0)) {
5740 fImage->alt.argb32[idx] = (ARGB32)col[d];
5757 Warning(
"DrawText",
"Visual not initiated");
5761 if (!
fImage->alt.argb32) {
5786 const wchar_t *wcsTitle =
reinterpret_cast<const wchar_t *
>(text->
GetWcsTitle());
5787 if (wcsTitle !=
NULL) {
5797 col =
gROOT->GetColor(1);
5800 ARGB32 color = ARGB32_White;
5854 if (align == 1 || align == 2 || align == 3) {
5856 }
else if (align == 4 || align == 5 || align == 6) {
5863 if (align == 3 || align == 6 || align == 9) {
5865 }
else if (align == 2 || align == 5 || align == 8) {
5872 ftal.x = (ftal.x >> 6);
5873 ftal.y = (ftal.y >> 6);
5878 if (FT_Glyph_To_Bitmap(&glyph->
fImage, ft_render_mode_normal, 0, 1 ))
continue;
5880 FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyph->
fImage;
5881 FT_Bitmap *source = &bitmap->bitmap;
5883 Int_t bx = x - ftal.x + bitmap->left;
5884 Int_t by = y + ftal.y - bitmap->top;
5912 if (FT_Glyph_To_Bitmap(&glyph->
fImage, ft_render_mode_normal, 0, 1 ))
continue;
5914 FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyph->
fImage;
5915 FT_Bitmap *source = &bitmap->bitmap;
5917 Int_t bx = x + bitmap->left;
5918 Int_t by = y + h - bitmap->top;
5930 static ASImageExportParams params;
5940 ret = ASImage2xpmRawBuff(img, (CARD8 **)buffer, size, 0);
5943 ret = ASImage2PNGBuff(img, (CARD8 **)buffer, size, ¶ms);
5984 static ASImageImportParams params;
5988 params.filter = SCL_DO_ALL;
5990 params.gamma_table = 0;
5991 params.compression = 0;
5992 params.format = ASA_ASImage;
5993 params.search_path = 0;
5994 params.subimage = 0;
5999 char *ptr = buffer[0];
6000 while (isspace((
int)*ptr)) ++ptr;
6002 fImage = xpm_data2ASImage((
const char**)buffer, ¶ms);
6004 fImage = xpmRawBuff2ASImage((
const char*)*buffer, ¶ms);
6009 fImage = PNGBuff2ASimage((CARD8 *)*buffer, ¶ms);
6040 static char *buf = 0;
6062 ASImage *rendered_im;
6063 ASImageLayer layers[2];
6064 init_image_layers(&(layers[0]), 2);
6066 layers[0].dst_x = 0;
6067 layers[0].dst_y = 0;
6068 layers[0].clip_width = img->width;
6069 layers[0].clip_height = img->height;
6070 layers[0].bevel = 0;
6072 layers[1].dst_x = 0;
6073 layers[1].dst_y = 0;
6074 layers[1].clip_width = img->width;
6075 layers[1].clip_height = img->height;
6076 layers[1].merge_scanlines = blend_scanlines_name2func(
"tint");
6077 rendered_im = merge_layers(
fgVisual, &(layers[0]), 2, img->width, img->height,
6079 destroy_asimage(&img);
6083 ASImage *padimg = 0;
6088 padimg = pad_asimage(
fgVisual, img, 0, d, sz, sz, 0x00ffffff,
6092 padimg = pad_asimage(
fgVisual, img, d, 0, sz, sz, 0x00ffffff,
6097 destroy_asimage(&img);
6102 ASImage2xpmRawBuff(padimg, (CARD8 **)ptr, &size, 0);
6105 destroy_asimage(&padimg);
6111 void TASImage::Streamer(
TBuffer &b)
6125 if ( version == 1 ) {
6127 if (fileVersion > 0 && fileVersion < 50000 ) {
6128 TImage::Streamer(b);
6135 if ( fileVersion < 40200 ) {
6151 TNamed::Streamer(b);
6154 if (image_type != 0) {
6156 buffer =
new char[size];
6161 TAttImage::Streamer(b);
6180 TNamed::Streamer(b);
6182 image_type =
fImage->alt.vector ? 0 : 1;
6185 if (image_type != 0) {
6191 TAttImage::Streamer(b);
6205 if (
fImage->alt.vector) {
6247 if ((start > 0) && (stop - start > 0)) {
6258 Int_t sz = thick*thick;
6262 ARGB32 color = ARGB32_White;
6263 parse_argb_color(col, &color);
6268 matrix =
new CARD32[sz];
6271 for (
int i = 0; i < sz; i++) {
6272 matrix[i] = (CARD32)color;
6276 brush.matrix = matrix;
6277 brush.width = thick;
6278 brush.height = thick;
6279 brush.center_y = brush.center_x = thick/2;
6281 ASDrawContext *ctx = 0;
6284 asim_cube_bezier(ctx, x1, y1, x2, y2, x3, y3);
6297 const char *col,
Int_t thick)
6299 thick = !thick ? 1 : thick;
6300 Int_t sz = thick*thick;
6304 ARGB32 color = ARGB32_White;
6305 parse_argb_color(col, &color);
6310 matrix =
new CARD32[sz];
6313 for (
int i = 0; i < sz; i++) {
6314 matrix[i] = (CARD32)color;
6318 brush.matrix = matrix;
6319 brush.width = thick > 0 ? thick : 1;
6320 brush.height = thick > 0 ? thick : 1;
6321 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6324 asim_straight_ellips(ctx, x, y, rx, ry, thick < 0);
6338 thick = !thick ? 1 : thick;
6339 Int_t sz = thick*thick;
6343 ARGB32 color = ARGB32_White;
6344 parse_argb_color(col, &color);
6350 matrix =
new CARD32[sz];
6353 for (
int i = 0; i < sz; i++) {
6354 matrix[i] = (CARD32)color;
6358 brush.matrix = matrix;
6359 brush.height = brush.width = thick > 0 ? thick : 1;
6360 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6363 asim_circle(ctx, x, y, r, thick < 0);
6377 const char *col,
Int_t thick)
6379 thick = !thick ? 1 : thick;
6380 Int_t sz = thick*thick;
6384 ARGB32 color = ARGB32_White;
6385 parse_argb_color(col, &color);
6390 matrix =
new CARD32[sz];
6393 for (
int i = 0; i < sz; i++) {
6394 matrix[i] = (CARD32)color;
6398 brush.matrix = matrix;
6399 brush.width = thick > 0 ? thick : 1;
6400 brush.height = thick > 0 ? thick : 1;
6401 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6404 asim_ellips(ctx, x, y, rx, ry, angle, thick < 0);
6417 const char *col,
Int_t thick)
6419 thick = !thick ? 1 : thick;
6420 Int_t sz = thick*thick;
6424 ARGB32 color = ARGB32_White;
6425 parse_argb_color(col, &color);
6430 matrix =
new CARD32[sz];
6433 for (
int i = 0; i < sz; i++) {
6434 matrix[i] = (CARD32)color;
6438 brush.matrix = matrix;
6439 brush.width = thick > 0 ? thick : 1;
6440 brush.height = thick > 0 ? thick : 1;
6441 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6444 asim_ellips2(ctx, x, y, rx, ry, angle, thick < 0);
6456 const char * ,
const char * )
6470 Warning(
"Gray",
"Image not initiated");
6475 Warning(
"Gray",
"Visual not initiated");
6500 if (
fImage->alt.argb32) {
6502 0, ASA_ARGB32, 0, ASIMAGE_QUALITY_DEFAULT);
6504 for (i = 0; i <
fImage->height; i++) {
6505 for (j = 0; j <
fImage->width; j++) {
6508 r = ((
fImage->alt.argb32[idx] & 0xff0000) >> 16);
6509 g = ((
fImage->alt.argb32[idx] & 0x00ff00) >> 8);
6510 b = (
fImage->alt.argb32[idx] & 0x0000ff);
6511 l = (57*r + 181*g + 18*b)/256;
6512 fGrayImage->alt.argb32[idx] = (l << 16) + (l << 8) +
l;
6519 ASImageDecoder *imdec = start_image_decoding(
fgVisual,
fImage, SCL_DO_ALL,
6531 Warning(
"ToGray",
"Failed to start image output");
6538 CARD32 *aa = imdec->buffer.alpha;
6539 CARD32 *rr = imdec->buffer.red;
6540 CARD32 *gg = imdec->buffer.green;
6541 CARD32 *bb = imdec->buffer.blue;
6546 for (i = 0; i <
fImage->height; i++) {
6547 imdec->decode_image_scanline(imdec);
6548 result.flags = imdec->buffer.flags;
6549 result.back_color = imdec->buffer.back_color;
6551 for (j = 0; j <
fImage->width; j++) {
6552 l = (57*rr[j] + 181*gg[j]+ 18*bb[j])/256;
6553 result.alpha[j] = aa[j];
6555 result.green[j] =
l;
6558 imout->output_image_scanline(imout, &result, 1);
6561 stop_image_decoding(&imdec);
6562 stop_image_output(&imout);
6593 gVirtualX->GetWindowSize(wid, xy, xy, w, h);
6601 Warning(
"FromWindow",
"Visual not initiated");
6609 static int x11 = -1;
6610 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
6613 fImage = pixmap2asimage(
fgVisual, wid, x, y, w, h, kAllPlanes, 0, 0);
6615 unsigned char *bits =
gVirtualX->GetColorBits(wid, 0, 0, w, h);
6620 fImage = bitmap2asimage(bits, w, h, 0, 0);
6635 for (
UInt_t i = 0; i < h/2; ++i) {
6636 memcpy(xx, buf + 4*w*i, 4*w);
6637 memcpy(buf + 4*w*i, buf + 4*w*(h-i-1), 4*w);
6638 memcpy(buf + 4*w*(h-i-1), xx, 4*w);
6642 fImage = bitmap2asimage(buf, w, h, 0, 0);
6655 if (!
fImage->alt.vector && on) {
6666 gPad->Range(-left / (1.0 - left - right),
6667 -bottom / (1.0 - top - bottom),
6668 1 + right / (1.0 - left - right),
6669 1 + top / ( 1.0 - top - bottom));
6670 gPad->RangeAxis(0, 0, 1, 1);
6706 out << std::endl << str << std::endl << std::endl;
6709 out << xpm <<
"_img = TImage::Create();" << std::endl;
6710 out <<
" " << xpm <<
"_img->SetImageBuffer( (char **)" << xpm <<
", TImage::kXpm);" << std::endl;
6711 out <<
" " << xpm <<
"_img->Draw();" << std::endl;
6724 static char buf[32];
6725 FILE *fp = fopen(name,
"rb+");
6728 printf(
"file %s : failed to open\n", name);
6732 if (!fread(buf, 1, 20, fp)) {
6737 char dpi1 = (set & 0xffff) >> 8;
6738 char dpi2 = set & 0xff;
6743 for (i = 0; i < 20; i++) {
6744 if ((buf[i] == 0x4a) && (buf[i+1] == 0x46) && (buf[i+2] == 0x49) &&
6745 (buf[i+3] == 0x46) && (buf[i+4] == 0x00) ) {
6751 if (i == 20 || dpi+4 >= 20) {
6753 printf(
"file %s : wrong JPEG format\n", name);
6760 buf[dpi + 1] = dpi1;
6761 buf[dpi + 2] = dpi2;
6764 buf[dpi + 3] = dpi1;
6765 buf[dpi + 4] = dpi2;
6768 fwrite(buf, 1, 20, fp);
void SetTitle(const char *title="")
Set a title for an image.
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].
virtual const char * BaseName(const char *pathname)
Base name of a file name. Base name of /user/root is root.
virtual const char * GetTitle() const
Returns title of object.
#define EVALUATEEDGEEVENODD(pAET, pPrevAET, y)
static void Init()
Initialise the TrueType fonts interface.
UInt_t GetScaledHeight() const
Return height of the displayed image not of the original image.
static void FreeStorage(ScanLineListBlock *pSLLBlock)
void GetZoomPosition(UInt_t &x, UInt_t &y, UInt_t &w, UInt_t &h) const
Return the zoom parameters.
virtual Bool_t ProcessEvents()
Process pending events (GUI, timers, sockets).
virtual Float_t GetTextAngle() const
virtual void CellArrayFill(Int_t r, Int_t g, Int_t b)=0
static Vc_ALWAYS_INLINE int_v min(const int_v &x, const int_v &y)
static ASFontManager * gFontManager
static void init_icon_paths()
Set icons paths.
virtual Font_t GetTextFont() const
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 PutPixel(Int_t x, Int_t y, const char *col="#000000")
Draw a point at the specified position.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
static ARGB32 GetAverage(ARGB32 foreground, ARGB32 background)
Get average.
virtual void Paint(Option_t *option="")=0
This method must be overridden if a class wants to paint itself.
static Bool_t InitVisual()
Static function to initialize the ASVisual.
UInt_t GetWidth() const
Return width of original image not of the displayed image.
void SetPaletteEnabled(Bool_t on=kTRUE)
Switch on/off the image palette.
virtual void SetBorderMode(Short_t bordermode)
Bool_t IsEditable() const
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.
const char * GetTitle() const
Title is used to keep 32x32 xpm image's thumbnail.
static const ASVisual * GetVisual()
Return visual.
TString & ReplaceAll(const TString &s1, const TString &s2)
EImageFileTypes GetFileType(const char *ext)
Return file type depending on specified extension.
R__EXTERN TStyle * gStyle
static Bool_t IsInitialized()
UInt_t GetHeight() const
Return height of original image not of the displayed image.
virtual void SetName(const char *name)
Change (i.e.
void Draw(Option_t *option="")
Draw image.
static unsigned long kAllPlanes
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 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.
virtual const char * HomeDirectory(const char *userName=0)
Return the user's home directory.
Buffer base class used for serializing objects.
virtual Float_t GetTextSize() const
virtual UInt_t * GetArgbArray()
static const char * filename()
virtual Int_t CheckByteCount(UInt_t startpos, UInt_t bcnt, const TClass *clss)=0
Bool_t fEditable
kZoom - new zooming required, kZoomOps - other ops in action, kNoZoom - no zooming or ops ...
UInt_t * GetArgbArray()
Return a pointer to internal array[width x height] of ARGB32 values This array is directly accessible...
virtual UInt_t GetWidth() const
Int_t LoadPlugin()
Load the plugin library for this handler.
Short_t Min(Short_t a, Short_t b)
void ToLower()
Change string to lower-case.
void StartPaletteEditor()
Start palette editor.
TObject * Clone(const char *newname) const
Clone image.
void ReadImage(const char *file, EImageFileTypes type=TImage::kUnknown)
Read specified image file.
virtual void Draw(Option_t *option="")
Default Draw method for all objects.
virtual void SetX1(Double_t x1)
virtual void SetFillStyle(Style_t fstyle)
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.
virtual void CellArrayEnd()=0
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 ...
An abstract interface to image processing library.
virtual void Merge(const TImage *, const char *="alphablend", Int_t=0, Int_t=0)
void Browse(TBrowser *)
Browse image.
void CreateThumbnail()
Create image thumbnail.
virtual UInt_t WriteVersion(const TClass *cl, Bool_t useBcnt=kFALSE)=0
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.
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.
virtual void SetX2(Double_t x2)
Long_t ExecPlugin(int nargs, const T &...params)
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
Bool_t fPaletteEnabled
GUI to edit the color palette.
UInt_t * GetScanline(UInt_t y)
Return a pointer to scan-line.
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 SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
static CARD32 gBrushCache[kBrushCacheSize *kBrushCacheSize]
static ARGB32 GetShadow(ARGB32 background)
Calculate shadow color.
Double_t * GetVecArray()
Return a pointer to internal array[width x height] of double values [0,1].
TString & Replace(Ssiz_t pos, Ssiz_t n, const char *s)
Bool_t SetImageBuffer(char **buffer, EImageFileTypes type=TImage::kPng)
Create image from compressed buffer.
static THashTable * fgPlugList
kTRUE if image is gray
void PolyPoint(UInt_t npt, TPoint *ppt, const char *col="#000000", TImage::ECoordMode mode=kCoordModeOrigin)
Draw a poly point.
const char * Data() const
virtual TObject * FindObject(const char *name) const
Find an object in this collection using its name.
EImageQuality GetImageQuality() const
Int_t DistancetoPrimitive(Int_t px, Int_t py)
Is the mouse in the image ?
void Paint(Option_t *option="")
Paint image.
static const double x2[5]
virtual Short_t GetTextAlign() const
Double_t dot(const TVector2 &v1, const TVector2 &v2)
THashTable implements a hash table to store TObject's.
static void LayoutGlyphs()
Compute the glyphs positions, fgAscent and fgWidth (needed for alignment).
virtual void Sleep(UInt_t milliSec)
Sleep milliSec milli seconds.
virtual const char * GetName() const =0
Returns name of object.
void BeginPaint(Bool_t fast=kTRUE)
BeginPaint initializes internal array[width x height] of ARGB32 pixel values.
static void SetTextFont(Font_t fontnumber)
Set specified font.
virtual Int_t GetVersionOwner() const =0
void EndPaint()
EndPaint does internal RLE compression of image data.
#define BRESINCRPGON(d, minval, m, m1, incr1, incr2)
static void PrepareString(const char *string)
Put the characters in "string" in the "glyphs" array.
virtual Color_t GetTextColor() const
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 MapFileTypes(EImageFileTypes &type, UInt_t &astype, Bool_t toas=kTRUE)
Map file type to/from AfterImage types.
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...
UInt_t fZoomOffY
X - offset for zooming in image pixels.
void Gray(Bool_t on=kTRUE)
Convert RGB image to Gray image and vice versa.
virtual const char * Getenv(const char *env)
Get environment variable.
virtual UInt_t Integer(UInt_t imax)
Returns a random integer on [ 0, imax-1 ].
static UInt_t AlphaBlend(UInt_t bot, UInt_t top)
Return alpha-blended value computed from bottom and top pixel values.
if(pyself &&pyself!=Py_None)
static void loadAET(EdgeTableEntry *AET, EdgeTableEntry *ETEs)
void WriteImage(const char *file, EImageFileTypes type=TImage::kUnknown)
Write image to specified file.
Base class for several text objects.
UInt_t GetImageCompression() const
virtual void Draw(Option_t *option="")
Draw this frame with its current attributes.
Int_t Atoi() const
Return integer value of string.
static TTGlyph * GetGlyphs()
static ASDrawContext * create_draw_context_argb32(ASImage *im, ASDrawTool *brush)
Create draw context.
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).
static int GetPolyYBounds(TPoint *pts, int n, int *by, int *ty)
Get poly bounds along Y.
Double_t ATan2(Double_t, Double_t)
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
const char *msg switch(type)
TVirtualPad is an abstract base class for the Pad and Canvas classes.
static ULong_t RGB2Pixel(Int_t r, Int_t g, Int_t b)
Convert r,g,b to graphics system dependent pixel value.
void Scale(UInt_t width, UInt_t height)
Scale the original image.
void DrawGlyph(void *bitmap, UInt_t color, Int_t x, Int_t y)
Draw glyph bitmap.
virtual Int_t GetPixmapID() const =0
R__EXTERN Int_t(* gThreadXAR)(const char *xact, Int_t nb, void **ar, Int_t *iret)
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...
Int_t fPaintMode
kTRUE image can be resized, moved by resizing/moving gPad
virtual UInt_t GetHeight() const
void SavePrimitive(std::ostream &out, Option_t *option="")
Save a primitive as a C++ statement(s) on output stream "out".
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.
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.
Element * GetMatrixArray()
virtual const TImagePalette & GetPalette() const
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.
virtual void SetLineColor(Color_t lcolor)
virtual Int_t UtoPixel(Double_t u) const =0
Bool_t SetJpegDpi(const char *name, UInt_t dpi=72)
Set an image printing resolution in Dots Per Inch units.
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.
virtual void Delete(Option_t *option="")
Delete this object.
Using a TBrowser one can browse all ROOT objects.
void DrawCircle(Int_t x, Int_t y, Int_t r, const char *col="#000000", Int_t thick=1)
Draw a circle.
R__EXTERN const char * gProgName
void UnZoom()
Un-zoom the image to original size.
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 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.
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.
static char * gIconPaths[7]
void Append(const TImage *im, const char *option="+", const char *color="#00000000")
Append image.
void SetPalette(const TImagePalette *palette)
Set a new palette to an image.
void DrawWideLine(UInt_t x1, UInt_t y1, UInt_t x2, UInt_t y2, UInt_t col, UInt_t thick)
Draw wide line.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
Double_t fMaxValue
temporary scaled and zoomed image produced from original image
R__EXTERN TSystem * gSystem
TPaveLabel title(3, 27.1, 15, 28.7,"ROOT Environment and Tools")
void Merge(const TImage *im, const char *op="alphablend", Int_t x=0, Int_t y=0)
Merge two images.
virtual void SetFillColor(Color_t fcolor)
#define FillSpansInternal(npt, ppt, widths, color)
const Mask_t kGCClipXOrigin
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.
virtual Int_t GetValue(const char *name, Int_t dflt)
Returns the integer value for a resource.
void FloodFill(Int_t x, Int_t y, const char *col, const char *min_col, const char *max_col=0)
Flood fill.
void CropPolygon(UInt_t npt, TPoint *ppt)
Crop a convex polygon.
static FT_Matrix * GetRotMatrix()
void CropSpans(UInt_t npt, TPoint *ppt, UInt_t *widths)
Crop spans.
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
const char * AsHexString() const
Return color as hexadecimal string.
TTF helper class containing glyphs description.
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...
char * Form(const char *fmt,...)
virtual void CellArrayBegin(Int_t W, Int_t H, Double_t x1, Double_t x2, Double_t y1, Double_t y2)=0
Pixmap_t GetMask()
Returns image mask pixmap (alpha channel).
virtual void SetPalette(const TImagePalette *palette)
Set a new palette for the image.
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 const char * GetName() const
Returns name of object.
const Mask_t kGCClipYOrigin
TSubString Strip(EStripType s=kTrailing, char c= ' ') const
Return a substring of self stripped at beginning and/or end.
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.
virtual void SetByteCount(UInt_t cntpos, Bool_t packInVersion=kFALSE)=0
void Blur(Double_t hr=3, Double_t vr=3)
Perform Gaussian blur of the image (useful for drop shadows).
virtual Int_t GetCanvasID() const =0
UInt_t fZoomOffX
min value in image
void MapQuality(EImageQuality &quality, UInt_t &asquality, Bool_t toas=kTRUE)
Map quality to/from AfterImage quality.
Int_t CountChar(Int_t c) const
Return number of times character c occurs in the string.
static void CreateETandAET(int count, TPoint *pts, EdgeTable *ET, EdgeTableEntry *AET, EdgeTableEntry *pETEs, ScanLineListBlock *pSLLBlock)
void Flip(Int_t flip=180)
Flip image in place.
R__EXTERN TRandom * gRandom
static int InsertionSort(EdgeTableEntry *AET)
virtual void ReadFastArray(Bool_t *b, Int_t n)=0
virtual void WriteFastArray(const Bool_t *b, Int_t n)=0
virtual ~TASImage()
Image destructor, clean up image and visual.
static const UInt_t NUMPTSTOBUFFER
TASImage * fScaledImage
pointer to image structure of 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...
const Double_t * GetArray() const
char * StrDup(const char *str)
Duplicate the string str.
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 ...
virtual void SetY2(Double_t y2)
UInt_t * GetRgbaArray()
Return a pointer to an array[width x height] of RGBA32 values.
void Tile(UInt_t width, UInt_t height)
Tile the original image.
Int_t fZoomUpdate
hight of zoomed image in image pixels
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...
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 DrawPolyLine(UInt_t nn, TPoint *xy, const char *col="#000000", UInt_t thick=1, TImage::ECoordMode mode=kCoordModeOrigin)
Draw a polyline.
static const double x1[5]
void Crop(Int_t x=0, Int_t y=0, UInt_t width=0, UInt_t height=0)
Crop an image.
struct _EdgeTableEntry EdgeTableEntry
void Mirror(Bool_t vert=kTRUE)
Mirror image in place.
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.
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.
ClassImp(TMCParticle) void TMCParticle printf(": p=(%7.3f,%7.3f,%9.3f) ;", fPx, fPy, fPz)
UInt_t fZoomHeight
width of zoomed image in image pixels
virtual Int_t FindColor(UShort_t r, UShort_t g, UShort_t b)
Returns an index of the closest color.
static ARGB32 GetHilite(ARGB32 background)
Calculate highlite color.
static void destroy_asdraw_context32(ASDrawContext *ctx)
Destroy asdraw context32.
void Add(TObject *obj)
Add object to the hash table.
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.
#define _MEMSET_(dst, lng, val)
The color creation and management class.
struct _ScanLineListBlock ScanLineListBlock
Int_t GetEntries() const
Return the number of objects in array (i.e.
static CARD8 MakeComponentHilite(int cmp)
Make component hilite.
void GetImageBuffer(char **buffer, int *size, EImageFileTypes type=TImage::kPng)
Return in-memory buffer compressed according image type.
void FromGLBuffer(UChar_t *buf, UInt_t w, UInt_t h)
Creates an image (screenshot) from a RGBA buffer.
#define _alphaBlend(bot, top)
TImage & operator=(const TImage &img)
A class to define a conversion from pixel values to pixel color.
void DrawLineInternal(UInt_t x1, UInt_t y1, UInt_t x2, UInt_t y2, UInt_t col, UInt_t thick)
Internal line drawing.
Array of doubles (64 bits per element).
static Vc_ALWAYS_INLINE int_v max(const int_v &x, const int_v &y)
virtual void Draw(Option_t *option="")
Draw this box with its current attributes.
Mother of all ROOT objects.
Double_t fMinValue
max value in 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.
Bool_t IsDigit() const
Returns true if all characters in string are digits (0-9) or white spaces, i.e.
static void SetRotationMatrix(Float_t angle)
Set the rotation matrix used to rotate the font outlines.
Int_t GetNoElements() const
static ASVisual * fgVisual
hash table containing loaded plugins
TASImage()
Default image constructor.
void AddAt(Double_t c, Int_t i)
Add double c at position i. Check for out of bounds.
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.
virtual Int_t VtoPixel(Double_t v) const =0
const char * TypeFromMagicNumber(const char *file)
Guess the file type from the first byte of file.
void DrawSegments(UInt_t nseg, Segment_t *seg, const char *col="#000000", UInt_t thick=1)
Draw segments.
Bool_t GetConstRatio() const
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.
Short_t Max(Short_t a, Short_t b)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
struct _ScanLineList ScanLineList
TObject * FindObject(const char *name) const
Find object using its name.
virtual void * GetStream() const
R__EXTERN TVirtualPS * gVirtualPS
virtual void StartPaletteEditor()
Opens a GUI to edit the color palette.
TASImage & operator=(const TASImage &img)
Image assignment operator.
#define BRESINITPGON(dy, x1, x2, xStart, d, m, m1, incr1, incr2)
static void SetTextSize(Float_t textsize)
Set current text size.
float type_of_call hi(const int &, const int &)
TVirtualPS is an abstract interface to Postscript, PDF, SVG.
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
void flip(struct mesh *m, struct behavior *b, struct otri *flipedge)
UInt_t fZoomWidth
Y - offset for zooming im image pixels.
ASImage * fGrayImage
1 - fast mode, 0 - low memory slow mode
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
void DrawHLine(UInt_t y, UInt_t x1, UInt_t x2, UInt_t col, UInt_t thick)
Draw an horizontal line.
static const UInt_t kBrushCacheSize
static Int_t GetNumGlyphs()
Float_t GetScreenFactor() const
Pixmap_t GetPixmap()
Returns image pixmap.
virtual void SetY1(Double_t y1)
Vc_ALWAYS_INLINE_L T *Vc_ALWAYS_INLINE_R malloc(size_t n)
Allocates memory on the Heap with alignment and padding suitable for vectorized access.
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 ExecuteEvent(Int_t event, Int_t px, Int_t py)
Execute mouse events.
void SetDefaults()
Set default parameters.
virtual void Open(const char *filename, Int_t type=-111)=0
char * GetObjectInfo(Int_t px, Int_t py) const
Get image pixel coordinates and the pixel value at the mouse pointer.
To make it possible to use GL for 2D graphic in a TPad/TCanvas.
virtual unsigned char * ReadFile(const char *filename, UInt_t &w, UInt_t &h)=0
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.
Ssiz_t First(char c) const
Find first occurrence of a character c.
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,y) within the existing image.
ClassImp(TASImage) ClassImp(TASImagePlugin) void TASImage
Destroy image.
virtual Version_t ReadVersion(UInt_t *start=0, UInt_t *bcnt=0, const TClass *cl=0)=0
UInt_t GetScaledWidth() const
Return width of the displayed image not of the original image.
static const FT_BBox & GetBox()
const char Int_t const char * image
virtual TCanvas * GetCanvas() const =0
const void * GetWcsTitle(void) const
Returns the text as UNICODE.
static const double x3[11]
void DrawVLine(UInt_t x, UInt_t y1, UInt_t y2, UInt_t col, UInt_t thick)
Draw a vertical line.
virtual void BeginPaint(Bool_t=kTRUE)
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.