60 # include <ft2build.h> 61 # include FT_FREETYPE_H 87 #include "RConfigure.h" 92 # include <X11/Xlib.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;\ 178 destroy_asimage(&fImage);
181 if (fIsGray && fGrayImage) {
182 destroy_asimage(&fGrayImage);
231 fImage = create_asimage(w ? w : 20, h ? h : 20, 0);
257 SetImage(imageData, width, height, palette);
270 SetImage(imageData, width, palette);
283 SetImage(imageData, width, palette);
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");
654 if (!file || !*file) {
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;
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")
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");
1000 for (
Int_t pixel = 1; pixel <
Int_t(width * height); pixel++) {
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);
1141 static int x11 = -1;
1142 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
1147 unsigned char *bits =
gVirtualX->GetColorBits(wd, 0, 0, w, h);
1152 fImage = bitmap2asimage(bits, w, h, 0, 0);
1173 Error(
"Draw",
"no image set");
1186 w =
Int_t(w*cx) + 4;
1187 h =
Int_t(h*cx) + 28;
1191 rname =
"new TCanvas(\"" + rname +
Form(
"\", %d, %d);", w, h);
1192 gROOT->ProcessLineFast(rname.Data());
1201 gPad->Range(-left / (1.0 - left - right),
1202 -bottom / (1.0 - top - bottom),
1203 1 + right / (1.0 - left - right),
1204 1 + top / ( 1.0 - top - bottom));
1205 gPad->RangeAxis(0, 0, 1, 1);
1228 wsrc = wsrc ? wsrc : im->width;
1229 hsrc = hsrc ? hsrc : im->height;
1231 static int x11 = -1;
1232 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
1239 UInt_t ww = wsrc - ow + (ow ? 8 : 0);
1246 char *bits =
new char[ww*hh];
1248 ASImageDecoder *imdec = start_image_decoding(
fgVisual, im, SCL_DO_ALPHA,
1249 xsrc, ysrc, ww, 0, 0);
1251 for (yy = 0; yy < hh; yy++) {
1252 imdec->decode_image_scanline(imdec);
1253 CARD32 *
a = imdec->buffer.alpha;
1255 for (xx = 0; xx < ww; xx++) {
1270 stop_image_decoding(&imdec);
1273 (
const char *)bits, ww, hh);
1291 if (x11 && (!
gPad ||
gPad->GetGLDevice() == -1)) {
1292 asimage2drawable(
fgVisual, wid, im, (GC)gc, xsrc, ysrc, x, y, wsrc, hsrc, 1);
1295 unsigned char *bits = (
unsigned char *)im->alt.argb32;
1297 img = tile_asimage(
fgVisual, im, xsrc, ysrc, wsrc, hsrc,
1298 0, ASA_ARGB32, 0, ASIMAGE_QUALITY_DEFAULT);
1300 bits = (
unsigned char *)img->alt.argb32;
1307 if (
gPad &&
gPad->GetGLDevice() != -1) {
1309 painter->DrawPixels(bits, wsrc, hsrc, x, y, !option.
Contains(
"opaque"));
1317 gVirtualX->CopyArea(pic, wid, gc, 0, 0, wsrc, hsrc, x, y);
1324 destroy_asimage(&img);
1348 xsrc, ysrc, wsrc, hsrc, opt);
1367 Error(
"Paint",
"no image set");
1372 Warning(
"Paint",
"Visual not initiated");
1376 Int_t tile_x = 0, tile_y = 0;
1377 CARD32 tile_tint = 0;
1386 if (sscanf(opt.
Data() + opt.
Index(
"t"),
"t%d,%d,%s", &tile_x, &tile_y,
1389 if (parse_argb_color(stint, (CARD32*)&tile_tint) == stint)
1392 Error(
"Paint",
"tile option error");
1400 if (!
fImage->alt.vector) {
1413 to_h = (
Int_t)(to_h * (1.0 -
gPad->GetBottomMargin() -
gPad->GetTopMargin() ) + 0.5);
1414 to_w = (
Int_t)(to_w * (1.0 -
gPad->GetLeftMargin() -
gPad->GetRightMargin() ) + 0.5);
1417 if ((to_w < 25 || to_h < 25) && !expand) {
1418 Error(
"Paint",
"pad too small to display an image");
1430 Int_t pal_Ax = to_w +
gPad->UtoAbsPixel(
gPad->GetLeftMargin()) +
1431 (
gPad->UtoAbsPixel(
gPad->GetRightMargin()) / 10);
1433 Int_t pal_x = to_w +
gPad->UtoPixel(
gPad->GetLeftMargin()) +
1434 (
gPad->UtoPixel(
gPad->GetRightMargin()) / 10);
1439 ASImage *grad_im = 0;
1447 grad.type = GRADIENT_Top2Bottom;
1448 grad.color =
new ARGB32[grad.npoints];
1449 grad.offset =
new double[grad.npoints];
1452 Int_t oldPt = grad.npoints -
pt -1;
1453 grad.offset[
pt] = 1 - pal.
fPoints[oldPt];
1454 grad.color[
pt] = (((ARGB32)(pal.
fColorBlue[oldPt] & 0xff00)) >> 8) |
1456 (((ARGB32)(pal.
fColorRed[oldPt] & 0xff00)) << 8) |
1457 (((ARGB32)(pal.
fColorAlpha[oldPt] & 0xff00)) << 16);
1461 pal_h, SCL_DO_COLOR,
1464 delete [] grad.color;
1465 delete [] grad.offset;
1473 to_w, to_h, tile_tint, ASA_ASImage,
1500 ASImage *tmpImage = 0;
1511 destroy_asimage(&tmpImage);
1526 Error(
"Paint",
"image could not be rendered to display");
1530 int tox = expand ? 0 : int(
gPad->UtoPixel(1.) *
gPad->GetLeftMargin());
1531 int toy = expand ? 0 : int(
gPad->VtoPixel(0.) *
gPad->GetTopMargin());
1533 if (!
gROOT->IsBatch()) {
1548 axis.
PaintAxis(pal_Xpos,
gPad->PixeltoY(pal_Ay + pal_h - 1),
1549 pal_Xpos,
gPad->PixeltoY(pal_Ay),
1550 min, max, ndiv,
"+LU");
1555 pal_Xpos,
gPad->AbsPixeltoY(pal_Ay + 1),
1556 min, max, ndiv,
"+L");
1566 gPad->XtoAbsPixel(0),
gPad->YtoAbsPixel(1));
1571 dump->
Merge(&tgrad,
"alphablend", pal_Ax, pal_Ay);
1581 pal_Xpos,
gPad->AbsPixeltoY(pal_Ay + 1),
1582 min, max, ndiv,
"+L");
1586 Warning(
"Paint",
"PDF not implemented yet");
1589 Warning(
"Paint",
"SVG not implemented yet");
1609 x2 = x1+dx/image->width;
1611 y2 = y1+dy/image->height;
1613 x1 =
gPad->GetX1()+dx*
gPad->GetLeftMargin();
1614 x2 = x1+(dx*(1-
gPad->GetRightMargin()-
gPad->GetLeftMargin()))/image->width;
1615 y1 =
gPad->GetY2()-dy*
gPad->GetTopMargin();
1616 y2 = y1+(dy*(1-
gPad->GetTopMargin()-
gPad->GetBottomMargin()))/image->height;
1621 ASImageDecoder *imdec = start_image_decoding(
fgVisual, image, SCL_DO_ALL,
1622 0, 0, image->width, image->height, 0);
1624 for (
Int_t yt = 0; yt < (
Int_t)image->height; yt++) {
1625 imdec->decode_image_scanline(imdec);
1626 for (
Int_t xt = 0; xt < (
Int_t)image->width; xt++)
1628 imdec->buffer.green[xt],
1629 imdec->buffer.blue[xt]);
1631 stop_image_decoding(&imdec);
1636 Double_t xconv = (
gPad->AbsPixeltoX(pal_Ax + pal_w) -
gPad->AbsPixeltoX(pal_Ax)) / grad_im->width;
1637 Double_t yconv = (
gPad->AbsPixeltoY(pal_Ay - pal_h) -
gPad->AbsPixeltoY(pal_Ay)) / grad_im->height;
1638 x1 =
gPad->AbsPixeltoX(pal_Ax);
1640 y2 =
gPad->AbsPixeltoY(pal_Ay);
1645 imdec = start_image_decoding(
fgVisual, grad_im, SCL_DO_ALL,
1646 0, 0, grad_im->width, grad_im->height, 0);
1648 for (
Int_t yt = 0; yt < (
Int_t)grad_im->height; yt++) {
1649 imdec->decode_image_scanline(imdec);
1650 for (
Int_t xt = 0; xt < (
Int_t)grad_im->width; xt++)
1652 imdec->buffer.green[xt],
1653 imdec->buffer.blue[xt]);
1656 stop_image_decoding(&imdec);
1667 pal_Xpos,
gPad->AbsPixeltoY(pal_Ay + 1),
1668 min, max, ndiv,
"+L");
1674 destroy_asimage(&grad_im);
1683 Int_t pxl, pyl, pxt, pyt;
1690 if (px1 < px2) {pxl = px1; pxt = px2;}
1691 else {pxl = px2; pxt = px1;}
1692 if (py1 < py2) {pyl = py1; pyt = py2;}
1693 else {pyl = py2; pyt = py1;}
1695 if ((px > pxl && px < pxt) && (py > pyl && py < pyt))
1706 static TBox *ZoomBox;
1711 gPad->ExecuteEvent(event, px, py);
1717 static Int_t px1old, py1old, px2old, py2old;
1718 static Int_t px1, py1, px2, py2, pxl, pyl, pxt, pyt;
1729 if (imgX < 0) px = px - imgX;
1730 if (imgY < 0) py = py - imgY;
1735 if (imgX >= (
int)image->width) px = px - imgX + image->width - 1;
1736 if (imgY >= (
int)image->height) py = py - imgY + image->height - 1;
1741 px1 =
gPad->XtoAbsPixel(
gPad->GetX1());
1742 py1 =
gPad->YtoAbsPixel(
gPad->GetY1());
1743 px2 =
gPad->XtoAbsPixel(
gPad->GetX2());
1744 py2 =
gPad->YtoAbsPixel(
gPad->GetY2());
1745 px1old = px; py1old = py;
1767 ZoomBox =
new TBox(pxl, pyl, pxt, pyt);
1769 ZoomBox->
Draw(
"l*");
1788 Int_t imgX1 = px1old -
gPad->XtoAbsPixel(0);
1789 Int_t imgY1 = py1old -
gPad->YtoAbsPixel(1);
1790 Int_t imgX2 = px -
gPad->XtoAbsPixel(0);
1791 Int_t imgY2 = py -
gPad->YtoAbsPixel(1);
1793 imgY1 = image->height - 1 - imgY1;
1794 imgY2 = image->height - 1 - imgY2;
1800 Zoom((imgX1 < imgX2) ? imgX1 : imgX2, (imgY1 < imgY2) ? imgY1 : imgY2,
1819 static char info[64];
1825 px -=
gPad->XtoAbsPixel(0);
1826 py -=
gPad->YtoAbsPixel(1);
1829 if (px < 0 || py < 0)
return info;
1833 if (px >= (
int)image->width || py >= (
int)image->height)
1836 py = image->height - 1 - py;
1843 if (
fImage->alt.vector) {
1844 snprintf(info,64,
"x: %d y: %d %.5g",
1847 snprintf(info,64,
"x: %d y: %d", px, py);
1863 Warning(
"SetPalette",
"Visual not initiated");
1868 Warning(
"SetPalette",
"Image not valid");
1872 if (
fImage->alt.vector == 0)
1878 ASVectorPalette asPalette;
1880 asPalette.channels[0] =
new CARD16 [asPalette.npoints];
1881 asPalette.channels[1] =
new CARD16 [asPalette.npoints];
1882 asPalette.channels[2] =
new CARD16 [asPalette.npoints];
1883 asPalette.channels[3] =
new CARD16 [asPalette.npoints];
1889 asPalette.points =
new double[asPalette.npoints];
1890 for (
Int_t point = 0; point <
Int_t(asPalette.npoints); point++)
1896 delete [] asPalette.points;
1897 for (Int_t col = 0; col < 4; col++)
1898 delete [] asPalette.channels[col];
1917 Warning(
"Scale",
"Image not initiated");
1922 Warning(
"Scale",
"Visual not initiated");
1930 if (toWidth > 30000)
1932 if (toHeight > 30000)
1935 ASImage *img = scale_asimage(
fgVisual,
fImage, toWidth, toHeight,
1952 Warning(
"Scale",
"Image not initiated");
1957 Warning(
"Scale",
"Visual not initiated");
1965 if (toWidth > 30000)
1967 if (toHeight > 30000)
1971 yStart, yEnd, toWidth, toHeight,
1987 Warning(
"Tile",
"Image not initiated");
1992 Warning(
"Tile",
"Visual not initiated");
2000 if (toWidth > 30000)
2002 if (toHeight > 30000)
2005 ASImage *img = tile_asimage(
fgVisual,
fImage, 0, 0, toWidth, toHeight, 0,
2027 Warning(
"Zoom",
"Image not valid");
2049 Warning(
"UnZoom",
"Image not valid");
2077 Warning(
"Flip",
"Image not valid");
2081 Warning(
"Flip",
"Visual not initiated");
2085 if (
fImage->alt.vector) {
2086 Warning(
"Flip",
"flip does not work for data images");
2090 Int_t rflip = flip/90;
2124 Warning(
"Mirror",
"Image not valid");
2129 Warning(
"Mirror",
"Visual not initiated");
2133 if (
fImage->alt.vector) {
2134 Warning(
"Mirror",
"mirror does not work for data images");
2206 if (inbatch && !noX) {
2218 fgVisual = create_asvisual(0, 0, 0, 0);
2225 fgVisual = create_asvisual(0, 0, 0, 0);
2228 disp = (Display*)
gVirtualX->GetDisplay();
2231 Visual *vis = (Visual*)
gVirtualX->GetVisual();
2234 if (vis == 0 || cmap == 0) {
2235 fgVisual = create_asvisual(0, 0, 0, 0);
2237 fgVisual = create_asvisual_for_id(disp, screen, depth,
2238 XVisualIDFromVisual(vis), cmap, 0);
2242 fgVisual = create_asvisual(0, 0, 0, 0);
2255 Warning(
"StartPaletteEditor",
"Image not valid");
2258 if (
fImage->alt.vector == 0) {
2259 Warning(
"StartPaletteEditor",
"palette can be modified only for data images");
2274 Warning(
"GetPixmap",
"Visual not initiated");
2282 static int x11 = -1;
2283 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
2289 if (!
fImage->alt.argb32) {
2292 ret =
gVirtualX->CreatePixmapFromData((
unsigned char*)
fImage->alt.argb32,
2308 Warning(
"GetMask",
"Visual not initiated");
2315 Warning(
"GetMask",
"No image");
2320 UInt_t ow = img->width%8;
2321 UInt_t ww = img->width - ow + (ow ? 8 : 0);
2328 char *bits =
new char[ww*hh];
2330 ASImageDecoder *imdec = start_image_decoding(
fgVisual, img, SCL_DO_ALPHA,
2337 for (y = 0; y < hh; y++) {
2338 imdec->decode_image_scanline(imdec);
2339 CARD32 *
a = imdec->buffer.alpha;
2341 for (x = 0; x < ww; x++) {
2355 stop_image_decoding(&imdec);
2356 pxmap =
gVirtualX->CreateBitmap(
gVirtualX->GetDefaultRootWindow(), (
const char *)bits,
2368 Warning(
"SetImage",
"Visual not initiated");
2378 gVirtualX->GetWindowSize(pxm, xy, xy, w, h);
2382 static int x11 = -1;
2383 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
2388 unsigned char *bits =
gVirtualX->GetColorBits(pxm, 0, 0, w, h);
2395 fImage = bitmap2asimage(bits, w, h, 0, 0);
2399 unsigned char *mask_bits =
gVirtualX->GetColorBits(mask, 0, 0, w, h);
2400 fImage = bitmap2asimage(bits, w, h, 0, mask_bits);
2401 delete [] mask_bits;
2412 Warning(
"GetPixels",
"Wrong Image");
2417 ASImageDecoder *imdec;
2419 width = !width ? img->width : width;
2420 height = !height ? img->height : height;
2431 if ((x >= (
int)img->width) || (y >= (
int)img->height)) {
2435 if ((
int)(x + width) > (
int)img->width) {
2436 width = img->width -
x;
2439 if ((
int)(y + height) > (
int)img->height) {
2440 height = img->height -
y;
2443 if ((imdec = start_image_decoding(0,
fImage, SCL_DO_ALL, 0, y,
2444 img->width, height, 0)) == 0) {
2445 Warning(
"GetPixels",
"Failed to create image decoder");
2455 for (
UInt_t k = 0; k < height; k++) {
2456 imdec->decode_image_scanline(imdec);
2458 for (
UInt_t i = 0; i < width; ++i) {
2459 if ((r == (
Int_t)imdec->buffer.red[i]) &&
2460 (g == (
Int_t)imdec->buffer.green[i]) &&
2461 (b == (
Int_t)imdec->buffer.blue[i])) {
2463 r = (
Int_t)imdec->buffer.red[i];
2464 g = (
Int_t)imdec->buffer.green[i];
2465 b = (
Int_t)imdec->buffer.blue[i];
2468 ret->
AddAt(p, k*width + i);
2472 stop_image_decoding(&imdec);
2484 Warning(
"GetVecArray",
"Bad Image");
2487 if (
fImage->alt.vector) {
2488 return fImage->alt.vector;
2506 Warning(
"GetArray",
"Bad Image");
2512 if (
fImage->alt.vector) {
2517 ASImageDecoder *imdec;
2519 w = w ? w :
fImage->width;
2528 if ((imdec = start_image_decoding(0, img, SCL_DO_ALL, 0, 0,
2529 img->width, 0, 0)) == 0) {
2530 Warning(
"GetArray",
"Failed to create image decoder");
2541 for (
UInt_t k = 0; k <
h; k++) {
2542 imdec->decode_image_scanline(imdec);
2544 for (
UInt_t i = 0; i < w; ++i) {
2545 if ((r == imdec->buffer.red[i]) &&
2546 (g == imdec->buffer.green[i]) &&
2547 (b == imdec->buffer.blue[i])) {
2549 r = imdec->buffer.red[i];
2550 g = imdec->buffer.green[i];
2551 b = imdec->buffer.blue[i];
2552 if (palette) p = palette->
FindColor(r, g, b);
2554 v = palette ? palette->
fPoints[p] :
Double_t((r << 16) + (g << 8) + b)/0xFFFFFF;
2555 ret->
AddAt(v, (h-k-1)*w + i);
2559 stop_image_decoding(&imdec);
2582 const char *color,
const char *font_name,
2585 UInt_t width=0, height=0;
2586 ARGB32 text_color = ARGB32_Black;
2587 ASImage *fore_im = 0;
2588 ASImage *text_im = 0;
2592 Warning(
"DrawText",
"Visual not initiated");
2600 if (fn.
Last(
'/') == 0) fn = fn(1, fn.
Length() - 1);
2613 parse_argb_color(color, &text_color);
2626 Warning(
"DrawText",
"cannot create Font Manager");
2633 font = get_asfont(
gFontManager,
"fixed", 0, size, ASF_GuessWho);
2635 Warning(
"DrawText",
"cannot find a font %s", font_name);
2640 get_text_size(text, font, (ASText3DType)type, &width, &height);
2643 fImage = create_asimage(width, height, 0);
2647 text_im = draw_text(text, font, (ASText3DType)type, 0);
2652 ASImage *tmp = file2ASImage(fore_file, 0xFFFFFFFF, SCREEN_GAMMA, 0, 0);
2654 if ((tmp->width != width) || (tmp->height != height)) {
2655 fore_im = tile_asimage(
fgVisual, tmp, 0, 0, width, height, 0,
2658 destroy_asimage(&tmp);
2665 move_asimage_channel(fore_im, IC_ALPHA, text_im, IC_ALPHA);
2666 destroy_asimage(&text_im);
2674 ASImage *rendered_im;
2675 ASImageLayer layers[2];
2677 init_image_layers(&(layers[0]), 2);
2678 fore_im->back_color = text_color;
2679 layers[0].im = rimg;
2680 layers[0].dst_x = 0;
2681 layers[0].dst_y = 0;
2682 layers[0].clip_width = rimg->width;
2683 layers[0].clip_height = rimg->height;
2684 layers[0].bevel = 0;
2685 layers[1].im = fore_im;
2686 layers[1].dst_x =
x;
2687 layers[1].dst_y =
y;
2688 layers[1].clip_width = fore_im->width;
2689 layers[1].clip_height = fore_im->height;
2691 rendered_im = merge_layers(
fgVisual, &(layers[0]), 2, rimg->width, rimg->height,
2694 destroy_asimage(&fore_im);
2727 Warning(
"Merge",
"Visual not initiated");
2731 ASImage *rendered_im;
2732 ASImageLayer layers[2];
2734 init_image_layers(&(layers[0]), 2);
2736 layers[0].dst_x = 0;
2737 layers[0].dst_y = 0;
2738 layers[0].clip_width =
fImage->width;
2739 layers[0].clip_height =
fImage->height;
2740 layers[0].bevel = 0;
2741 layers[1].im = ((
TASImage*)im)->fImage;
2742 layers[1].dst_x =
x;
2743 layers[1].dst_y =
y;
2744 layers[1].clip_width = im->
GetWidth();
2745 layers[1].clip_height = im->
GetHeight();
2746 layers[1].merge_scanlines = blend_scanlines_name2func(op ? op :
"add");
2764 Warning(
"Blur",
"Visual not initiated");
2769 fImage = create_asimage(100, 100, 0);
2772 Warning(
"Blur",
"Failed to create image");
2779 ASImage *rendered_im = blur_asimage_gauss(
fgVisual,
fImage, hr > 0 ? hr : 3,
2780 vr > 0 ? vr : 3, SCL_DO_ALL,
2793 Warning(
"Clone",
"Image not initiated");
2800 Warning(
"Clone",
"Failed to create image");
2816 if (
fImage->alt.argb32) {
2818 im->
fImage->alt.argb32 = (ARGB32*)safemalloc(sz*
sizeof(ARGB32));
2819 memcpy(im->
fImage->alt.argb32,
fImage->alt.argb32, sz *
sizeof(ARGB32));
2839 Warning(
"Vectorize",
"Visual not initiated");
2844 fImage = create_asimage(100, 100, 0);
2847 Warning(
"Vectorize",
"Failed to create image");
2858 dither = dither > 7 ? 7 : dither;
2860 res = colormap_asimage(
fImage, &cmap, max_colors, dither, opaque_threshold);
2872 g = INDEX_SHIFT_GREEN(cmap.entries[res[i]].green);
2873 b = INDEX_SHIFT_BLUE(cmap.entries[res[i]].blue);
2874 r = INDEX_SHIFT_RED(cmap.entries[res[i]].red);
2876 v = MAKE_INDEXED_COLOR24(r,g,
b);
2886 for (
UInt_t j = 0; j < cmap.count; j++) {
2887 g = INDEX_SHIFT_GREEN(cmap.entries[j].green);
2888 b = INDEX_SHIFT_BLUE(cmap.entries[j].blue);
2889 r = INDEX_SHIFT_RED(cmap.entries[j].red);
2890 v = MAKE_INDEXED_COLOR24(r,g,
b);
2892 v = (v>>12) & 0x0FFF;
2895 pal->
fColorRed[j] = cmap.entries[j].red << 8;
2897 pal->
fColorBlue[j] = cmap.entries[j].blue << 8;
2901 destroy_colormap(&cmap,
kTRUE);
2904 fImage->alt.vector = vec;
2906 if (res)
delete res;
2952 Warning(
"HSV",
"Visual not initiated");
2957 fImage = create_asimage(width ? width : 20, height ? height : 20, 0);
2960 Warning(
"HSV",
"Failed to create image");
2969 width = !width ?
fImage->width : width;
2970 height = !height ?
fImage->height : height;
2972 ASImage *rendered_im = 0;
2975 rendered_im = adjust_asimage_hsv(
fgVisual,
fImage, x, y, width, height,
2976 hue, radius, H, S, V, ASA_ASImage, 100,
2977 ASIMAGE_QUALITY_TOP);
2980 Warning(
"HSV",
"Failed to create rendered image");
3015 Warning(
"Gradient",
"Visual not initiated");
3019 ASImage *rendered_im = 0;
3020 ASGradient gradient;
3022 int reverse = 0, npoints1 = 0, npoints2 = 0;
3029 if ((angle > 2 * 180 * 15 / 16) || (angle < 2 * 180 * 1 / 16)) {
3030 gradient.type = GRADIENT_Left2Right;
3031 }
else if (angle < 2 * 180 * 3 / 16) {
3032 gradient.type = GRADIENT_TopLeft2BottomRight;
3033 }
else if (angle < 2 * 180 * 5 / 16) {
3034 gradient.type = GRADIENT_Top2Bottom;
3035 }
else if (angle < 2 * 180 * 7 / 16) {
3036 gradient.type = GRADIENT_BottomLeft2TopRight; reverse = 1;
3037 }
else if (angle < 2 * 180 * 9 / 16) {
3038 gradient.type = GRADIENT_Left2Right; reverse = 1;
3039 }
else if (angle < 2 * 180 * 11 / 16) {
3040 gradient.type = GRADIENT_TopLeft2BottomRight; reverse = 1;
3041 }
else if (angle < 2 * 180 * 13 / 16) {
3042 gradient.type = GRADIENT_Top2Bottom; reverse = 1;
3044 gradient.type = GRADIENT_BottomLeft2TopRight;
3047 for (p = (
char*)colors; isspace((
int)*p); p++) { }
3049 for (npoints1 = 0; *p; npoints1++) {
3051 for ( ; *p && !isspace((
int)*p); p++) { }
3053 for ( ; isspace((
int)*p); p++) { }
3056 for (p = (
char*)offsets; isspace((
int)*p); p++) { }
3058 for (npoints2 = 0; *p; npoints2++) {
3060 for ( ; *p && !isspace((
int)*p); p++) { }
3062 for ( ; isspace((
int)*p); p++) { }
3067 if (offsets && (npoints1 > npoints2)) npoints1 = npoints2;
3076 gradient.color =
new ARGB32[npoints1];
3077 gradient.offset =
new double[npoints1];
3079 for (p = (
char*)
colors; isspace((
int)*p); p++) { }
3081 for (npoints1 = 0; *p; ) {
3085 for ( ; *p && !isspace((
int)*p); p++) { }
3087 for ( ; isspace((
int)*p); p++) { }
3089 col = str(pb - colors, p - pb);
3091 if (parse_argb_color(col.
Data(), gradient.color + npoints1) != col) {
3094 Warning(
"Gradient",
"Failed to parse color [%s] - defaulting to black", pb);
3099 for (p = (
char*)offsets; isspace((
int)*p); p++) { }
3101 for (npoints2 = 0; *p; ) {
3105 for ( ; *p && !isspace((
int)*p); p++) { }
3108 gradient.offset[npoints2] = strtod(pb, &pb);
3110 if (pb == p) npoints2++;
3112 for ( ; isspace((
int)*p); p++) { }
3115 for (npoints2 = 0; npoints2 < npoints1; npoints2++) {
3116 gradient.offset[npoints2] = (double)npoints2 / (npoints1 - 1);
3119 gradient.npoints = npoints1;
3121 if (npoints2 && (gradient.npoints > npoints2)) {
3122 gradient.npoints = npoints2;
3125 for (i = 0; i < gradient.npoints/2; i++) {
3126 int i2 = gradient.npoints - 1 - i;
3127 ARGB32 c = gradient.color[i];
3128 double o = gradient.offset[i];
3129 gradient.color[i] = gradient.color[i2];
3130 gradient.color[i2] = c;
3131 gradient.offset[i] = gradient.offset[i2];
3132 gradient.offset[i2] = o;
3134 for (i = 0; i < gradient.npoints; i++) {
3135 gradient.offset[i] = 1.0 - gradient.offset[i];
3138 rendered_im = make_gradient(
fgVisual, &gradient, width, height, SCL_DO_ALL,
3141 delete [] gradient.color;
3142 delete [] gradient.offset;
3146 Warning(
"Gradient",
"Failed to create gradient image");
3155 ASImageLayer layers[2];
3157 init_image_layers(&(layers[0]), 2);
3159 layers[0].dst_x = 0;
3160 layers[0].dst_y = 0;
3161 layers[0].clip_width =
fImage->width;
3162 layers[0].clip_height =
fImage->height;
3163 layers[0].bevel = 0;
3164 layers[1].im = rendered_im;
3165 layers[1].dst_x =
x;
3166 layers[1].dst_y =
y;
3167 layers[1].clip_width = width;
3168 layers[1].clip_height = height;
3169 layers[1].merge_scanlines = alphablend_scanlines;
3174 Warning(
"Gradient",
"Failed to create merged image");
3178 destroy_asimage(&rendered_im);
3193 cmp = (cmp * 12) / 10;
3195 return (cmp > 255) ? 255 : cmp;
3216 return (background >> 1) & 0x7F7F7F7F;
3227 a = ARGB32_ALPHA8(foreground) + ARGB32_ALPHA8(background);
3229 r = ARGB32_RED8(foreground) + ARGB32_RED8(background);
3231 g = ARGB32_GREEN8(foreground) + ARGB32_GREEN8(background);
3233 b = ARGB32_BLUE8(foreground) + ARGB32_BLUE8(background);
3236 return MAKE_ARGB32(a, r, g, b);
3252 const char *hi_color,
const char *lo_color,
UShort_t thick,
3256 Warning(
"Bevel",
"Visual not initiated");
3263 ARGB32
hi=ARGB32_White, lo=ARGB32_White;
3264 parse_argb_color(hi_color, &hi);
3265 parse_argb_color(lo_color, &lo);
3268 bevel.lo_color =
hi;
3270 bevel.hi_color = lo;
3273 bevel.hi_color =
hi;
3275 bevel.lo_color = lo;
3280 int extra_hilite = 2;
3281 bevel.left_outline = bevel.top_outline = bevel.right_outline = bevel.bottom_outline = thick;
3282 bevel.left_inline = bevel.top_inline = bevel.right_inline = bevel.bottom_inline = extra_hilite + 1;
3284 if (bevel.top_outline > 1) {
3285 bevel.top_inline += bevel.top_outline - 1;
3288 if (bevel.left_outline > 1) {
3289 bevel.left_inline += bevel.left_outline - 1;
3292 if (bevel.right_outline > 1) {
3293 bevel.right_inline += bevel.right_outline - 1;
3296 if (bevel.bottom_outline > 1) {
3297 bevel.bottom_inline += bevel.bottom_outline - 1;
3301 ARGB32
fill = ((hi>>24) != 0xff) || ((lo>>24) != 0xff) ? bevel.hilo_color : (bevel.hilo_color | 0xff000000);
3304 fImage = create_asimage(width ? width : 20, height ? height : 20, 0);
3307 Warning(
"Bevel",
"Failed to create image");
3316 width = !width ?
fImage->width : width;
3317 height = !height ?
fImage->height : height;
3319 ASImageLayer layers[2];
3320 init_image_layers(&(layers[0]), 2);
3323 layers[0].dst_x = 0;
3324 layers[0].dst_y = 0;
3325 layers[0].clip_width =
fImage->width;
3326 layers[0].clip_height =
fImage->height;
3327 layers[0].bevel = 0;
3329 UInt_t w = width - (bevel.left_outline + bevel.right_outline);
3330 UInt_t h = height - (bevel.top_outline + bevel.bottom_outline);
3331 ASImage *bevel_im = create_asimage(w, h, 0);
3334 Warning(
"Bevel",
"Failed to create bevel image");
3338 layers[1].im = bevel_im;
3339 fill_asimage(
fgVisual, bevel_im, 0, 0, w, h, fill);
3341 layers[1].dst_x =
x;
3342 layers[1].dst_y =
y;
3343 layers[1].clip_width = width;
3344 layers[1].clip_height = height;
3345 layers[1].bevel = &bevel;
3346 layers[1].merge_scanlines = alphablend_scanlines;
3350 destroy_asimage(&bevel_im);
3353 Warning(
"Bevel",
"Failed to image");
3373 Warning(
"Pad",
"Visual not initiated");
3378 fImage = create_asimage(100, 100, 0);
3381 Warning(
"Pad",
"Failed to create image");
3390 ARGB32 color = ARGB32_White;
3391 parse_argb_color(col, &color);
3402 Warning(
"Pad",
"Failed to create output image");
3419 Warning(
"Crop",
"Visual not initiated");
3431 width = x + width >
fImage->width ?
fImage->width -
x : width;
3432 height = y + height >
fImage->height ?
fImage->height -
y : height;
3434 if ((width ==
fImage->width) && (height ==
fImage->height)) {
3435 Warning(
"Crop",
"input size larger than image");
3438 ASImageDecoder *imdec = start_image_decoding(
fgVisual,
fImage, SCL_DO_ALL,
3439 x, y, width, height, 0);
3442 Warning(
"Crop",
"Failed to start image decoding");
3446 ASImage *img = create_asimage(width, height, 0);
3450 Warning(
"Crop",
"Failed to create image");
3454 ASImageOutput *imout = start_image_output(
fgVisual, img, ASA_ASImage,
3458 Warning(
"Crop",
"Failed to start image output");
3459 destroy_asimage(&img);
3460 if (imdec)
delete [] imdec;
3468 for (
UInt_t i = 0; i < height; i++) {
3469 imdec->decode_image_scanline(imdec);
3470 imout->output_image_scanline(imout, &(imdec->buffer), 1);
3473 stop_image_decoding(&imdec);
3474 stop_image_output(&imout);
3498 Warning(
"Append",
"Visual not initiated");
3515 Merge(im,
"alphablend", width, 0);
3516 }
else if (opt ==
"/") {
3518 Merge(im,
"alphablend", 0, height);
3537 Warning(
"BeginPaint",
"Visual not initiated");
3552 0, ASA_ARGB32, 0, ASIMAGE_QUALITY_DEFAULT);
3555 Warning(
"BeginPaint",
"Failed to create image");
3569 Warning(
"EndPaint",
"no image");
3573 if (!
fImage->alt.argb32)
return;
3576 0, ASA_ASImage, 0, ASIMAGE_QUALITY_DEFAULT);
3579 Warning(
"EndPaint",
"Failed to create image");
3596 Warning(
"GetArgbArray",
"no image");
3603 if (!img->alt.argb32) {
3613 return (
UInt_t *)img->alt.argb32;
3624 Warning(
"GetRgbaArray",
"no image");
3631 if (!img->alt.argb32) {
3649 for (i = 0; i < img->height; i++) {
3650 for (j = 0; j < img->width; j++) {
3652 argb = img->alt.argb32[idx];
3654 rgb = argb & 0x00ffffff;
3655 rgba = (rgb << 8) + a;
3670 Warning(
"GetScanline",
"no image");
3675 CARD32 *ret =
new CARD32[img->width];
3677 ASImageDecoder *imdec = start_image_decoding(
fgVisual, img, SCL_DO_ALL,
3678 0, y, img->width, 1, 0);
3682 Warning(
"GetScanline",
"Failed to start image decoding");
3690 imdec->decode_image_scanline(imdec);
3691 memcpy(imdec->buffer.buffer, ret, img->width*
sizeof(CARD32));
3692 stop_image_decoding(&imdec);
3707 #if defined(R__GNU) && defined(__i386__) && !defined(__sun) 3708 #define _MEMSET_(dst, lng, val) __asm__("movl %0,%%eax \n"\ 3709 "movl %1,%%edi \n" \ 3710 "movl %2,%%ecx \n" \ 3715 :"g" (val), "g" (dst), "g" (lng) \ 3716 :"eax","edi","ecx" \ 3720 #define _MEMSET_(dst, lng, val) do {\ 3721 for( UInt_t j=0; j < lng; j++) *((dst)+j) = val; } while (0) 3725 #define FillSpansInternal(npt, ppt, widths, color) do {\ 3726 UInt_t yy = ppt[0].fY*fImage->width;\ 3727 for (UInt_t i = 0; i < npt; i++) {\ 3728 _MEMSET_(&fImage->alt.argb32[Idx(yy + ppt[i].fX)], widths[i], color);\ 3729 yy += ((i+1 < npt) && (ppt[i].fY != ppt[i+1].fY) ? fImage->width : 0);\ 3741 Warning(
"FillRectangle",
"Visual not initiated");
3746 Warning(
"FillRectangle",
"no image");
3750 if (!
fImage->alt.argb32) {
3754 if (!
fImage->alt.argb32) {
3755 Warning(
"FillRectangle",
"Failed to get pixel array");
3759 ARGB32 color = (ARGB32)col;
3761 if (width == 0) width = 1;
3762 if (height == 0) height = 1;
3773 Bool_t has_alpha = (color & 0xff000000) != 0xff000000;
3778 width = x + width >
fImage->width ?
fImage->width -
x : width;
3779 height = y + height >
fImage->height ?
fImage->height -
y : height;
3781 if (!
fImage->alt.argb32) {
3784 int yyy = y*
fImage->width;
3786 ARGB32 *p0 =
fImage->alt.argb32 + yyy +
x;
3788 for (
UInt_t i = 0; i < height; i++) {
3793 for (
UInt_t i = y; i < y + height; i++) {
3818 Warning(
"Fill",
"Visual not initiated");
3822 ARGB32 color = ARGB32_White;
3825 parse_argb_color(col, &color);
3829 fImage = create_asimage(width ? width : 20, height ? height : 20, 0);
3843 ARGB32 color = (ARGB32)col;
3846 if (!thick) thick = 1;
3854 thick += (x - half);
3860 x = x + thick >=
fImage->width ?
fImage->width - thick - 1 :
x;
3862 int yy = y1*
fImage->width;
3864 for (
UInt_t w = 0; w < thick; w++) {
3865 if (x + w < fImage->width) {
3878 ARGB32 color = (ARGB32)col;
3881 if (!thick) thick = 1;
3889 thick += (y - half);
3893 y = y + thick >=
fImage->height ?
fImage->height - thick - 1 :
y;
3897 int yy = y*
fImage->width;
3898 for (
UInt_t w = 0; w < thick; w++) {
3900 if (y + w < fImage->height) {
3912 const char *col,
UInt_t thick)
3914 ARGB32 color = ARGB32_White;
3915 parse_argb_color(col, &color);
3927 int x,
y, xend, yend;
3934 Warning(
"DrawLine",
"Visual not initiated");
3939 Warning(
"DrawLine",
"no image");
3943 if (!
fImage->alt.argb32) {
3947 if (!
fImage->alt.argb32) {
3948 Warning(
"DrawLine",
"Failed to get pixel array");
3952 ARGB32 color = (ARGB32)col;
3957 if (!dx && !dy)
return;
3961 y2 > y1 ? y2 : y1, color, thick);
3967 x2 > x1 ? x2 : x1, color, thick);
3979 i2 = i1 - (dx << 1);
3996 q = (y2 - y1) * ydir;
4029 i2 = i1 - (dy << 1);
4046 q = (x2 -
x1) * xdir;
4084 const char *col,
UInt_t thick)
4087 Warning(
"DrawRectangle",
"Visual not initiated");
4096 fImage = create_asimage(w, h, 0);
4101 if (!
fImage->alt.argb32) {
4105 if (!
fImage->alt.argb32) {
4106 Warning(
"DrawRectangle",
"Failed to get pixel array");
4110 ARGB32 color = ARGB32_White;
4111 parse_argb_color(col, &color);
4131 ARGB32 color = ARGB32_White;
4136 fImage = create_asimage(w, h, 0);
4142 parse_argb_color(col, &color);
4148 parse_argb_color(col, &color);
4178 ARGB32 color = (ARGB32)col;
4188 thick += (y - half);
4191 thick = thick <= 0 ? 1 : thick;
4193 y = y + thick >=
fImage->height ?
fImage->height - thick - 1 :
y;
4199 x1 = x2 < x1 ?
x2 :
x1;
4200 x2 = x2 < tmp ? tmp :
x2;
4203 for (
UInt_t w = 0; w < thick; w++) {
4204 if (y + w < fImage->height) {
4212 if (i >= pDash[iDash]) {
4216 if (iDash >= nDash) {
4232 ARGB32 color = (ARGB32)col;
4242 thick += (x - half);
4245 thick = thick <= 0 ? 1 : thick;
4252 y1 = y2 < y1 ? y2 : y1;
4253 y2 = y2 < tmp ? tmp : y2;
4255 x = x + thick >=
fImage->width ?
fImage->width - thick - 1 :
x;
4257 int yy = y1*
fImage->width;
4259 for (
UInt_t w = 0; w < thick; w++) {
4260 if (x + w < fImage->width) {
4268 if (i >= pDash[iDash]) {
4272 if (iDash >= nDash) {
4288 int x,
y, xend, yend;
4298 char *pDash =
new char[nDash];
4303 for (i = 0; i < (int)nDash; i++) {
4309 i2 = i1 - (dx << 1);
4327 q = (y2 - y1) * ydir;
4332 if ((iDash%2) == 0) {
4344 if (i >= pDash[iDash]) {
4348 if (iDash >= nDash) {
4356 if ((iDash%2) == 0) {
4368 if (i >= pDash[iDash]) {
4372 if (iDash >= nDash) {
4381 for (i = 0; i < (int)nDash; i++) {
4387 i2 = i1 - (dy << 1);
4405 q = (x2 -
x1) * xdir;
4410 if ((iDash%2) == 0) {
4424 if (i >= pDash[iDash]) {
4428 if (iDash >= nDash) {
4436 if ((iDash%2) == 0) {
4450 if (i >= pDash[iDash]) {
4454 if (iDash >= nDash) {
4472 double x,
y, xend=0, yend=0, x0, y0;
4480 double *xDash =
new double[nDash];
4481 double *yDash =
new double[nDash];
4486 for (i = 0; i < (int)nDash; i++) {
4487 xDash[i] = tDash[i] * ac;
4488 yDash[i] = tDash[i] *
as;
4492 xDash[i] = xDash[i]/2;
4493 yDash[i] = yDash[i]/2;
4495 xDash[i] = xDash[i]*2;
4496 yDash[i] = yDash[i]*2;
4513 q = (y2 - y1) * ydir;
4520 while ((x < xend) && (y < yend)) {
4524 if ((iDash%2) == 0) {
4534 if (iDash >= nDash) {
4539 while ((x < xend) && (y > yend)) {
4543 if ((iDash%2) == 0) {
4553 if (iDash >= nDash) {
4572 q = (x2 -
x1) * xdir;
4579 while ((x < xend) && (y < yend)) {
4583 if ((iDash%2) == 0) {
4593 if (iDash >= nDash) {
4598 while ((x > xend) && (y < yend)) {
4602 if ((iDash%2) == 0) {
4612 if (iDash >= nDash) {
4626 const char *pDash,
const char *col,
UInt_t thick)
4630 Warning(
"DrawDashLine",
"Visual not initiated");
4635 Warning(
"DrawDashLine",
"no image");
4639 if (!
fImage->alt.argb32) {
4643 if (!
fImage->alt.argb32) {
4644 Warning(
"DrawDashLine",
"Failed to get pixel array");
4648 if ((nDash < 2) || !pDash || (nDash%2)) {
4649 Warning(
"DrawDashLine",
"Wrong input parameters n=%d %ld", nDash, (
Long_t)
sizeof(pDash)-1);
4653 ARGB32 color = ARGB32_White;
4654 parse_argb_color(col, &color);
4658 }
else if (y1 == y2) {
4672 ARGB32 color = ARGB32_White;
4673 parse_argb_color(col, &color);
4697 Warning(
"PutPixel",
"Visual not initiated");
4702 Warning(
"PutPixel",
"no image");
4706 if (!
fImage->alt.argb32) {
4710 if (!
fImage->alt.argb32) {
4711 Warning(
"PutPixel",
"Failed to get pixel array");
4716 parse_argb_color(col, &color);
4718 if ((x < 0) || (y < 0) || (x >= (
int)
fImage->width) || (y >= (
int)
fImage->height)) {
4719 Warning(
"PutPixel",
"Out of range width=%d x=%d, height=%d y=%d",
4732 Warning(
"PolyPoint",
"Visual not initiated");
4737 Warning(
"PolyPoint",
"no image");
4741 if (!
fImage->alt.argb32) {
4745 if (!
fImage->alt.argb32) {
4746 Warning(
"PolyPoint",
"Failed to get pixel array");
4751 Warning(
"PolyPoint",
"No points specified");
4758 parse_argb_color(col, &color);
4764 for (i = 0; i < npt; i++) {
4765 ipt[i].
fX += ppt[i].
fX;
4766 ipt[i].
fY += ppt[i].
fY;
4771 for (i = 0; i < npt; i++) {
4772 x = ipt ? ipt[i].
fX : ppt[i].
fX;
4773 y = ipt ? ipt[i].
fY : ppt[i].
fY;
4775 if ((x < 0) || (y < 0) || (x >= (
int)
fImage->width) || (y >= (
int)
fImage->height)) {
4791 if (!nseg || !seg) {
4792 Warning(
"DrawSegments",
"Invalid data nseg=%d seg=0x%lx", nseg, (
Long_t)seg);
4798 for (
UInt_t i = 0; i < nseg; i++) {
4799 pt[0].
fX = seg->
fX1;
4800 pt[1].
fX = seg->
fX2;
4801 pt[0].
fY = seg->
fY1;
4802 pt[1].
fY = seg->
fY2;
4816 Warning(
"FillSpans",
"Visual not initiated");
4821 Warning(
"FillSpans",
"no image");
4825 if (!
fImage->alt.argb32) {
4829 if (!
fImage->alt.argb32) {
4830 Warning(
"FillSpans",
"Failed to get pixel array");
4834 if (!npt || !ppt || !widths || (stipple && (!w || !h))) {
4835 Warning(
"FillSpans",
"Invalid input data npt=%d ppt=0x%lx col=%s widths=0x%lx stipple=0x%lx w=%d h=%d",
4841 parse_argb_color(col, &color);
4846 for (
UInt_t i = 0; i < npt; i++) {
4848 for (
UInt_t j = 0; j < widths[i]; j++) {
4849 if ((ppt[i].fX >= (
Int_t)
fImage->width) || (ppt[i].
fX < 0) ||
4860 if (stipple[ii >> 3] & (1 << (ii%8))) {
4874 Warning(
"FillSpans",
"Visual not initiated");
4879 Warning(
"FillSpans",
"no image");
4883 if (!
fImage->alt.argb32) {
4887 if (!
fImage->alt.argb32) {
4888 Warning(
"FillSpans",
"Failed to get pixel array");
4892 if (!npt || !ppt || !widths || !tile) {
4893 Warning(
"FillSpans",
"Invalid input data npt=%d ppt=0x%lx widths=0x%lx tile=0x%lx",
4907 for (
UInt_t i = 0; i < npt; i++) {
4910 for (
UInt_t j = 0; j < widths[i]; j++) {
4911 if ((ppt[i].fX >= (
Int_t)
fImage->width) || (ppt[i].
fX < 0) ||
4930 Warning(
"CropSpans",
"Visual not initiated");
4935 Warning(
"CropSpans",
"no image");
4939 if (!
fImage->alt.argb32) {
4943 if (!
fImage->alt.argb32) {
4944 Warning(
"CropSpans",
"Failed to get pixel array");
4948 if (!npt || !ppt || !widths) {
4949 Warning(
"CropSpans",
"No points specified npt=%d ppt=0x%lx widths=0x%lx", npt, (
Long_t)ppt, (
Long_t)widths);
4954 int y1 = ppt[npt-1].
fY;
4962 for (y = 0; (int)y < y0; y++) {
4963 for (x = 0; x <
fImage->width; x++) {
4965 if (idx < sz)
fImage->alt.argb32[idx] = 0;
4970 for (i = 0; i < npt; i++) {
4971 for (x = 0; (int)x < ppt[i].fX; x++) {
4973 if (idx < sz)
fImage->alt.argb32[idx] = 0;
4975 for (x = ppt[i].fX + widths[i] + 1; x <
fImage->width; x++) {
4977 if (idx < sz)
fImage->alt.argb32[idx] = 0;
4982 for (y = y1; y <
fImage->height; y++) {
4983 for (x = 0; x <
fImage->width; x++) {
4985 if (idx < sz)
fImage->alt.argb32[idx] = 0;
5019 Warning(
"CopyArea",
"Visual not initiated");
5024 Warning(
"CopyArea",
"no image");
5029 ASImage *out = ((
TASImage*)dst)->GetImage();
5035 xsrc = xsrc < 0 ? 0 : xsrc;
5036 ysrc = ysrc < 0 ? 0 : ysrc;
5038 if ((xsrc >= (
int)
fImage->width) || (ysrc >= (
int)
fImage->height))
return;
5040 w = xsrc + w >
fImage->width ?
fImage->width - xsrc : w;
5044 if (!
fImage->alt.argb32) {
5047 if (!out->alt.argb32) {
5049 out = ((
TASImage*)dst)->GetImage();
5052 if (
fImage->alt.argb32 && out->alt.argb32) {
5053 for (y = 0; y < (int)h; y++) {
5054 for (x = 0; x < (int)w; x++) {
5055 idx =
Idx(yy + x + xsrc);
5056 if ((x + xdst < 0) || (ydst + y < 0) ||
5057 (x + xdst >= (
int)out->width) || (y + ydst >= (
int)out->height) )
continue;
5059 idx2 =
Idx((ydst + y)*out->width + x + xdst);
5063 out->alt.argb32[idx2] = 0;
5066 out->alt.argb32[idx2] &=
fImage->alt.argb32[idx];
5069 out->alt.argb32[idx2] =
fImage->alt.argb32[idx] & (~out->alt.argb32[idx2]);
5072 out->alt.argb32[idx2] &= ~
fImage->alt.argb32[idx];
5077 out->alt.argb32[idx2] ^=
fImage->alt.argb32[idx];
5080 out->alt.argb32[idx2] |=
fImage->alt.argb32[idx];
5083 out->alt.argb32[idx2] = (~
fImage->alt.argb32[idx]) & (~out->alt.argb32[idx2]);
5086 out->alt.argb32[idx2] ^= ~
fImage->alt.argb32[idx];
5089 out->alt.argb32[idx2] = ~out->alt.argb32[idx2];
5092 out->alt.argb32[idx2] =
fImage->alt.argb32[idx] | (~out->alt.argb32[idx2]);
5095 out->alt.argb32[idx2] = ~
fImage->alt.argb32[idx];
5098 out->alt.argb32[idx2] |= ~
fImage->alt.argb32[idx];
5101 out->alt.argb32[idx2] = (~
fImage->alt.argb32[idx]) | (~out->alt.argb32[idx2]);
5104 out->alt.argb32[idx2] = 0xFFFFFFFF;
5108 out->alt.argb32[idx2] =
fImage->alt.argb32[idx];
5132 int i, j, ix, iy, w,
h;
5134 ARGB32 color = 0xFFFFFFFF;
5141 for (i = 0; i <
nx; i++) {
5143 for (j = 0; j <
ny; j++) {
5144 icol = (ARGB32)ic[i + (nx*j)];
5145 if (icol != color) {
5184 ymin = ymax = (pts++)->fY;
5187 if (pts->
fY < ymin) {
5191 if (pts->
fY > ymax) {
5199 return (ptMin - ptsStart);
5215 int mr = 0, m1r = 0;
5216 int incr1l = 0, incr2l = 0;
5217 int incr1r = 0, incr2r = 0;
5222 int nextleft, nextright;
5235 Warning(
"GetPolygonSpans",
"Visual not initiated");
5240 Warning(
"GetPolygonSpans",
"no image");
5244 if (!
fImage->alt.argb32) {
5248 if (!
fImage->alt.argb32) {
5249 Warning(
"GetPolygonSpans",
"Failed to get pixel array");
5253 if ((npt < 3) || !ppt) {
5254 Warning(
"GetPolygonSpans",
"No points specified npt=%d ppt=0x%lx", npt, (
Long_t)ppt);
5262 dy = ymax - ymin + 1;
5263 if ((npt < 3) || (dy < 0))
return kFALSE;
5265 ptsOut = firstPoint =
new TPoint[dy];
5266 width = firstWidth =
new UInt_t[dy];
5269 nextleft = nextright = imin;
5270 y = ppt[nextleft].
fY;
5275 if (ppt[nextleft].fY == y) {
5281 if (nextleft >= (
int)npt) {
5288 ppt[left].fX, ppt[nextleft].fX,
5289 xl, dl, ml, m1l, incr1l, incr2l);
5293 if (ppt[nextright].fY == y) {
5299 if (nextright < 0) {
5306 ppt[right].fX, ppt[nextright].fX,
5307 xr, dr, mr, m1r, incr1r, incr2r);
5312 i =
TMath::Min(ppt[nextleft].fY, ppt[nextright].fY) -
y;
5316 delete [] firstWidth;
5317 delete [] firstPoint;
5326 *(width++) = xr - xl;
5327 (ptsOut++)->fX = xl;
5329 *(width++) = xl - xr;
5330 (ptsOut++)->fX = xr;
5338 }
while (y != ymax);
5340 *nspans =
UInt_t(ptsOut - firstPoint);
5341 *outPoint = firstPoint;
5342 *outWidth = firstWidth;
5359 ARGB32 color = ARGB32_White;
5360 parse_argb_color(col, &color);
5363 if (!stipple && ((color & 0xff000000)==0xff000000)) {
5366 FillSpans(nspans, firstPoint, firstWidth, col, stipple, w, h);
5370 delete [] firstWidth;
5371 delete [] firstPoint;
5374 if (firstWidth)
delete [] firstWidth;
5375 if (firstPoint)
delete [] firstPoint;
5392 FillSpans(nspans, firstPoint, firstWidth, tile);
5395 delete [] firstWidth;
5396 delete [] firstPoint;
5399 if (firstWidth)
delete [] firstWidth;
5400 if (firstPoint)
delete [] firstPoint;
5416 CropSpans(nspans, firstPoint, firstWidth);
5419 delete [] firstWidth;
5420 delete [] firstPoint;
5423 if (firstWidth)
delete [] firstWidth;
5424 if (firstPoint)
delete [] firstPoint;
5437 Warning(
"DrawFillArea",
"Visual not initiated");
5442 Warning(
"DrawFillArea",
"no image");
5446 if (!
fImage->alt.argb32) {
5450 if (!
fImage->alt.argb32) {
5451 Warning(
"DrawFillArea",
"Failed to get pixel array");
5455 if ((count < 3) || !ptsIn) {
5456 Warning(
"DrawFillArea",
"No points specified npt=%d ppt=0x%lx", count, (
Long_t)ptsIn);
5465 ARGB32 color = ARGB32_White;
5466 parse_argb_color(col, &color);
5484 static const UInt_t gEdgeTableEntryCacheSize = 200;
5485 static EdgeTableEntry gEdgeTableEntryCache[gEdgeTableEntryCacheSize];
5487 if (count < gEdgeTableEntryCacheSize) {
5495 ptsOut = firstPoint;
5498 pSLL = ET.scanlines.next;
5500 for (y = ET.ymin; y < ET.ymax; y++) {
5501 if (pSLL && y == pSLL->scanline) {
5502 loadAET(&AET, pSLL->edgelist);
5509 ptsOut->
fX = pAET->bres.minor_axis;
5514 *width++ = pAET->next->bres.minor_axis - pAET->bres.minor_axis;
5517 if (!stipple && ((color & 0xff000000)==0xff000000)) {
5520 FillSpans(nPts, firstPoint, firstWidth, col, stipple, w, h);
5522 ptsOut = firstPoint;
5533 if (!stipple && ((color & 0xff000000)==0xff000000)) {
5536 FillSpans(nPts, firstPoint, firstWidth, col, stipple, w, h);
5540 if (del)
delete [] pETEs;
5550 Warning(
"DrawFillArea",
"Visual not initiated");
5555 Warning(
"DrawFillArea",
"no image");
5559 if (!
fImage->alt.argb32) {
5563 if (!
fImage->alt.argb32) {
5564 Warning(
"DrawFillArea",
"Failed to get pixel array");
5568 if ((count < 3) || !ptsIn) {
5569 Warning(
"DrawFillArea",
"No points specified npt=%d ppt=0x%lx", count, (
Long_t)ptsIn);
5595 ptsOut = firstPoint;
5598 pSLL = ET.scanlines.next;
5600 for (y = ET.ymin; y < ET.ymax; y++) {
5601 if (pSLL && y == pSLL->scanline) {
5602 loadAET(&AET, pSLL->edgelist);
5609 ptsOut->
fX = pAET->bres.minor_axis;
5614 *width++ = pAET->next->bres.minor_axis - pAET->bres.minor_axis;
5617 FillSpans(nPts, firstPoint, firstWidth, tile);
5618 ptsOut = firstPoint;
5627 FillSpans(nPts, firstPoint, firstWidth, tile);
5638 ASDrawContext *ctx =
new ASDrawContext;
5640 ctx->canvas_width = im->width;
5641 ctx->canvas_height = im->height;
5642 ctx->canvas = im->alt.argb32;
5643 ctx->scratch_canvas = 0;
5645 ctx->flags = ASDrawCTX_CanvasIsARGB;
5646 asim_set_custom_brush_colored( ctx, brush);
5656 if (ctx->scratch_canvas)
free(ctx->scratch_canvas);
5670 Int_t sz = thick*thick;
5677 matrix =
new CARD32[sz];
5680 for (
int i = 0; i < sz; i++) {
5681 matrix[i] = (CARD32)color;
5685 brush.matrix = matrix;
5686 brush.width = thick;
5687 brush.height = thick;
5688 brush.center_y = brush.center_x = thick/2;
5697 if (xx1 ==
fImage->width) --xx1;
5698 if (yy1 ==
fImage->height) --yy1;
5699 if (xx2 ==
fImage->width) --xx2;
5700 if (yy2 ==
fImage->height) --yy2;
5702 asim_move_to(ctx, xx1, yy1);
5703 asim_line_to(ctx, xx2, yy2);
5718 Bool_t has_alpha = (color & 0xff000000) != 0xff000000;
5722 FT_Bitmap *source = (FT_Bitmap*)bitmap;
5723 UChar_t d = 0, *s = source->buffer;
5725 Int_t dots =
Int_t(source->width * source->rows);
5729 yy = y0 = by > 0 ? by *
fImage->width : 0;
5730 for (y = 0; y < (int) source->rows; y++) {
5732 if ((byy >= (
int)
fImage->height) || (byy <0))
continue;
5734 for (x = 0; x < (int) source->width; x++) {
5736 if ((bxx >= (
int)
fImage->width) || (bxx < 0))
continue;
5738 idx =
Idx(bxx + yy);
5739 r += ((
fImage->alt.argb32[idx] & 0xff0000) >> 16);
5740 g += ((
fImage->alt.argb32[idx] & 0x00ff00) >> 8);
5741 b += (
fImage->alt.argb32[idx] & 0x0000ff);
5751 col[0] = (r << 16) + (g << 8) +
b;
5753 Int_t col4r = (col[4] & 0xff0000) >> 16;
5754 Int_t col4g = (col[4] & 0x00ff00) >> 8;
5755 Int_t col4b = (col[4] & 0x0000ff);
5758 for (x = 3; x > 0; x--) {
5760 Int_t colxr = (col4r*x + r*xx) >> 2;
5761 Int_t colxg = (col4g*x + g*xx) >> 2;
5762 Int_t colxb = (col4b*x + b*xx) >> 2;
5763 col[
x] = (colxr << 16) + (colxg << 8) + colxb;
5769 Int_t clipx1=0, clipx2=0, clipy1=0, clipy2=0;
5773 clipx1 =
gPad->XtoAbsPixel(
gPad->GetX1());
5774 clipx2 =
gPad->XtoAbsPixel(
gPad->GetX2());
5775 clipy1 =
gPad->YtoAbsPixel(
gPad->GetY1());
5776 clipy2 =
gPad->YtoAbsPixel(
gPad->GetY2());
5780 for (y = 0; y < (int) source->rows; y++) {
5783 for (x = 0; x < (int) source->width; x++) {
5787 d = ((d + 10) * 5) >> 8;
5791 if ( noClip || ((x < (
int) source->width) &&
5792 (bxx < (
int)clipx2) && (bxx >= (
int)clipx1) &&
5793 (byy >= (
int)clipy2) && (byy < (
int)clipy1) )) {
5794 idx =
Idx(bxx + yy);
5795 acolor = (ARGB32)col[d];
5799 fImage->alt.argb32[idx] = acolor;
5818 Warning(
"DrawText",
"Visual not initiated");
5822 if (!
fImage->alt.argb32) {
5847 const wchar_t *wcsTitle =
reinterpret_cast<const wchar_t *
>(text->
GetWcsTitle());
5848 if (wcsTitle !=
NULL) {
5858 col =
gROOT->GetColor(1);
5861 ARGB32 color = ARGB32_White;
5915 if (align == 1 || align == 2 || align == 3) {
5917 }
else if (align == 4 || align == 5 || align == 6) {
5924 if (align == 3 || align == 6 || align == 9) {
5926 }
else if (align == 2 || align == 5 || align == 8) {
5933 ftal.x = (ftal.x >> 6);
5934 ftal.y = (ftal.y >> 6);
5939 if (FT_Glyph_To_Bitmap(&glyph->
fImage, ft_render_mode_normal, 0, 1 ))
continue;
5941 FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyph->
fImage;
5942 FT_Bitmap *source = &bitmap->bitmap;
5944 Int_t bx = x - ftal.x + bitmap->left;
5945 Int_t by = y + ftal.y - bitmap->top;
5973 if (FT_Glyph_To_Bitmap(&glyph->
fImage, ft_render_mode_normal, 0, 1 ))
continue;
5975 FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyph->
fImage;
5976 FT_Bitmap *source = &bitmap->bitmap;
5978 Int_t bx = x + bitmap->left;
5979 Int_t by = y + h - bitmap->top;
5991 static ASImageExportParams params;
6001 ret = ASImage2xpmRawBuff(img, (CARD8 **)buffer, size, 0);
6004 ret = ASImage2PNGBuff(img, (CARD8 **)buffer, size, ¶ms);
6045 static ASImageImportParams params;
6049 params.filter = SCL_DO_ALL;
6051 params.gamma_table = 0;
6052 params.compression = 0;
6053 params.format = ASA_ASImage;
6054 params.search_path = 0;
6055 params.subimage = 0;
6060 char *ptr = buffer[0];
6061 while (isspace((
int)*ptr)) ++ptr;
6063 fImage = xpm_data2ASImage((
const char**)buffer, ¶ms);
6065 fImage = xpmRawBuff2ASImage((
const char*)*buffer, ¶ms);
6070 fImage = PNGBuff2ASimage((CARD8 *)*buffer, ¶ms);
6101 static char *buf = 0;
6123 ASImage *rendered_im;
6124 ASImageLayer layers[2];
6125 init_image_layers(&(layers[0]), 2);
6127 layers[0].dst_x = 0;
6128 layers[0].dst_y = 0;
6129 layers[0].clip_width = img->width;
6130 layers[0].clip_height = img->height;
6131 layers[0].bevel = 0;
6133 layers[1].dst_x = 0;
6134 layers[1].dst_y = 0;
6135 layers[1].clip_width = img->width;
6136 layers[1].clip_height = img->height;
6137 layers[1].merge_scanlines = blend_scanlines_name2func(
"tint");
6138 rendered_im = merge_layers(
fgVisual, &(layers[0]), 2, img->width, img->height,
6140 destroy_asimage(&img);
6144 ASImage *padimg = 0;
6149 padimg = pad_asimage(
fgVisual, img, 0, d, sz, sz, 0x00ffffff,
6153 padimg = pad_asimage(
fgVisual, img, d, 0, sz, sz, 0x00ffffff,
6158 destroy_asimage(&img);
6163 ASImage2xpmRawBuff(padimg, (CARD8 **)ptr, &size, 0);
6166 destroy_asimage(&padimg);
6172 void TASImage::Streamer(
TBuffer &
b)
6186 if ( version == 1 ) {
6188 if (fileVersion > 0 && fileVersion < 50000 ) {
6189 TImage::Streamer(b);
6196 if ( fileVersion < 40200 ) {
6212 TNamed::Streamer(b);
6215 if (image_type != 0) {
6217 buffer =
new char[size];
6222 TAttImage::Streamer(b);
6241 TNamed::Streamer(b);
6243 image_type =
fImage->alt.vector ? 0 : 1;
6246 if (image_type != 0) {
6252 TAttImage::Streamer(b);
6266 if (
fImage->alt.vector) {
6308 if ((start > 0) && (stop - start > 0)) {
6319 Int_t sz = thick*thick;
6323 ARGB32 color = ARGB32_White;
6324 parse_argb_color(col, &color);
6329 matrix =
new CARD32[sz];
6332 for (
int i = 0; i < sz; i++) {
6333 matrix[i] = (CARD32)color;
6337 brush.matrix = matrix;
6338 brush.width = thick;
6339 brush.height = thick;
6340 brush.center_y = brush.center_x = thick/2;
6342 ASDrawContext *ctx = 0;
6345 asim_cube_bezier(ctx, x1, y1, x2, y2, x3, y3);
6358 const char *col,
Int_t thick)
6360 thick = !thick ? 1 : thick;
6361 Int_t sz = thick*thick;
6365 ARGB32 color = ARGB32_White;
6366 parse_argb_color(col, &color);
6371 matrix =
new CARD32[sz];
6374 for (
int i = 0; i < sz; i++) {
6375 matrix[i] = (CARD32)color;
6379 brush.matrix = matrix;
6380 brush.width = thick > 0 ? thick : 1;
6381 brush.height = thick > 0 ? thick : 1;
6382 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6385 asim_straight_ellips(ctx, x, y, rx, ry, thick < 0);
6399 thick = !thick ? 1 : thick;
6400 Int_t sz = thick*thick;
6404 ARGB32 color = ARGB32_White;
6405 parse_argb_color(col, &color);
6411 matrix =
new CARD32[sz];
6414 for (
int i = 0; i < sz; i++) {
6415 matrix[i] = (CARD32)color;
6419 brush.matrix = matrix;
6420 brush.height = brush.width = thick > 0 ? thick : 1;
6421 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6424 asim_circle(ctx, x, y, r, thick < 0);
6438 const char *col,
Int_t thick)
6440 thick = !thick ? 1 : thick;
6441 Int_t sz = thick*thick;
6445 ARGB32 color = ARGB32_White;
6446 parse_argb_color(col, &color);
6451 matrix =
new CARD32[sz];
6454 for (
int i = 0; i < sz; i++) {
6455 matrix[i] = (CARD32)color;
6459 brush.matrix = matrix;
6460 brush.width = thick > 0 ? thick : 1;
6461 brush.height = thick > 0 ? thick : 1;
6462 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6465 asim_ellips(ctx, x, y, rx, ry, angle, thick < 0);
6478 const char *col,
Int_t thick)
6480 thick = !thick ? 1 : thick;
6481 Int_t sz = thick*thick;
6485 ARGB32 color = ARGB32_White;
6486 parse_argb_color(col, &color);
6491 matrix =
new CARD32[sz];
6494 for (
int i = 0; i < sz; i++) {
6495 matrix[i] = (CARD32)color;
6499 brush.matrix = matrix;
6500 brush.width = thick > 0 ? thick : 1;
6501 brush.height = thick > 0 ? thick : 1;
6502 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6505 asim_ellips2(ctx, x, y, rx, ry, angle, thick < 0);
6517 const char * ,
const char * )
6531 Warning(
"Gray",
"Image not initiated");
6536 Warning(
"Gray",
"Visual not initiated");
6561 if (
fImage->alt.argb32) {
6563 0, ASA_ARGB32, 0, ASIMAGE_QUALITY_DEFAULT);
6565 for (i = 0; i <
fImage->height; i++) {
6566 for (j = 0; j <
fImage->width; j++) {
6569 r = ((
fImage->alt.argb32[idx] & 0xff0000) >> 16);
6570 g = ((
fImage->alt.argb32[idx] & 0x00ff00) >> 8);
6571 b = (
fImage->alt.argb32[idx] & 0x0000ff);
6572 l = (57*r + 181*g + 18*
b)/256;
6573 fGrayImage->alt.argb32[idx] = (l << 16) + (l << 8) +
l;
6580 ASImageDecoder *imdec = start_image_decoding(
fgVisual,
fImage, SCL_DO_ALL,
6592 Warning(
"ToGray",
"Failed to start image output");
6599 CARD32 *aa = imdec->buffer.alpha;
6600 CARD32 *rr = imdec->buffer.red;
6601 CARD32 *gg = imdec->buffer.green;
6602 CARD32 *bb = imdec->buffer.blue;
6607 for (i = 0; i <
fImage->height; i++) {
6608 imdec->decode_image_scanline(imdec);
6609 result.flags = imdec->buffer.flags;
6610 result.back_color = imdec->buffer.back_color;
6612 for (j = 0; j <
fImage->width; j++) {
6613 l = (57*rr[j] + 181*gg[j]+ 18*bb[j])/256;
6614 result.alpha[j] = aa[j];
6616 result.green[j] =
l;
6619 imout->output_image_scanline(imout, &result, 1);
6622 stop_image_decoding(&imdec);
6623 stop_image_output(&imout);
6654 gVirtualX->GetWindowSize(wid, xy, xy, w, h);
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);
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);
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 * GetName() const
Returns name of object.
#define EVALUATEEDGEEVENODD(pAET, pPrevAET, y)
static void Init()
Initialise the TrueType fonts interface.
static const TString & GetTTFFontDir()
Get the fonts directory in the installation. Static utility function.
Double_t * fPoints
[fNumPoints] value of each anchor point [0..1]
static void FreeStorage(ScanLineListBlock *pSLLBlock)
virtual Bool_t ProcessEvents()
Process pending events (GUI, timers, sockets).
virtual void CellArrayFill(Int_t r, Int_t g, Int_t b)=0
static ASFontManager * gFontManager
static void init_icon_paths()
Set icons paths.
virtual UInt_t GetHeight() 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.
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.
virtual Color_t GetTextColor() const
Return the text color.
static Bool_t InitVisual()
Static function to initialize the ASVisual.
void SetPaletteEnabled(Bool_t on=kTRUE)
Switch on/off the image palette.
virtual void SetBorderMode(Short_t bordermode)
virtual Short_t GetTextAlign() const
Return the text alignment.
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.
virtual UInt_t GetWidth() const
static const TString & GetIconPath()
Get the icon path in the installation. Static utility function.
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
const Double_t * GetArray() const
static Bool_t IsInitialized()
FT_Glyph fImage
glyph image
virtual void SetName(const char *name)
Set the name of the TNamed.
void Draw(Option_t *option="")
Draw image.
virtual Float_t GetTextAngle() const
Return the text angle.
static unsigned long kAllPlanes
char * GetObjectInfo(Int_t px, Int_t py) const
Get image pixel coordinates and the pixel value at the mouse pointer.
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 UInt_t * GetArgbArray()
UInt_t GetScaledWidth() const
Return width of the displayed image not of the original image.
virtual Int_t CheckByteCount(UInt_t startpos, UInt_t bcnt, const TClass *clss)=0
UInt_t GetHeight() const
Return height of original image not of the displayed image.
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Bool_t fEditable
! kTRUE image can be resized, moved by resizing/moving gPad
UInt_t * GetArgbArray()
Return a pointer to internal array[width x height] of ARGB32 values This array is directly accessible...
Int_t LoadPlugin()
Load the plugin library for this handler.
EImageQuality GetImageQuality() const
Short_t Min(Short_t a, Short_t b)
void ToLower()
Change string to lower-case.
void StartPaletteEditor()
Start palette editor.
void ReadImage(const char *file, EImageFileTypes type=TImage::kUnknown)
Read specified image file.
UInt_t GetWidth() const
Return width of original image not of the displayed image.
virtual void Draw(Option_t *option="")
Default Draw method for all objects.
virtual void SetX1(Double_t x1)
virtual void SetFillStyle(Style_t fstyle)
Set the fill area style.
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 char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
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
Float_t GetScreenFactor() const
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)
Bool_t fPaletteEnabled
! kTRUE - palette is drawn on the image
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.
UShort_t * fColorRed
[fNumPoints] red color at each anchor point
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
! hash table containing loaded plugins
void PolyPoint(UInt_t npt, TPoint *ppt, const char *col="#000000", TImage::ECoordMode mode=kCoordModeOrigin)
Draw a poly point.
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]
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...
THashTable implements a hash table to store TObject's.
static void LayoutGlyphs()
Compute the glyphs positions, fgAscent and fgWidth (needed for alignment).
R__EXTERN Int_t(* gThreadXAR)(const char *xact, Int_t nb, void **ar, Int_t *iret)
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 Float_t GetTextSize() const
Return the text size.
virtual TObject * FindObject(const char *name) const
Find an object in this collection using its name.
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.
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
! Y - offset for zooming im image pixels
void Gray(Bool_t on=kTRUE)
Convert RGB image to Gray image and vice versa.
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.
static void loadAET(EdgeTableEntry *AET, EdgeTableEntry *ETEs)
virtual const char * PrependPathName(const char *dir, TString &name)
Concatenate a directory and a file name.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
void WriteImage(const char *file, EImageFileTypes type=TImage::kUnknown)
Write image to specified file.
virtual void * GetStream() const
Base class for several text objects.
virtual void Draw(Option_t *option="")
Draw this frame with its current attributes.
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).
Ssiz_t First(char c) const
Find first occurrence of a character c.
static int GetPolyYBounds(TPoint *pts, int n, int *by, int *ty)
Get poly bounds along Y.
Double_t ATan2(Double_t, Double_t)
virtual const TImagePalette & GetPalette() const
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
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
! 1 - fast mode, 0 - low memory slow mode
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()
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)
Set the line color.
virtual Int_t UtoPixel(Double_t u) const =0
void GetZoomPosition(UInt_t &x, UInt_t &y, UInt_t &w, UInt_t &h) const
Return the zoom parameters.
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.
RooArgSet S(const RooAbsArg &v1)
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...
Bool_t fIsGray
! kTRUE if image is gray
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.
Double_t fMaxValue
! max value in image
UInt_t GetScaledHeight() const
Return height of the displayed image not of the original image.
R__EXTERN TSystem * gSystem
const char * GetTitle() const
Title is used to keep 32x32 xpm image's thumbnail.
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)
Set the fill area color.
#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 Font_t GetTextFont() const
Return the text font.
Long_t ExecPlugin(int nargs, const T &... params)
virtual Int_t GetValue(const char *name, Int_t dflt)
Returns the integer value for a resource.
TImagePalette fPalette
color palette for value -> color conversion
void FloodFill(Int_t x, Int_t y, const char *col, const char *min_col, const char *max_col=0)
Flood fill.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
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.
UShort_t * fColorAlpha
[fNumPoints] alpha at each anchor point
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
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...
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
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
UInt_t GetImageCompression() const
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.
TSubString Strip(EStripType s=kTrailing, char c=' ') const
Return a substring of self stripped at beginning and/or end.
const Mask_t kGCClipYOrigin
Int_t GetNoElements() const
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).
UInt_t fNumPoints
number of anchor points
virtual Int_t GetCanvasID() const =0
UInt_t fZoomOffX
! X - offset for zooming in image pixels
void MapQuality(EImageQuality &quality, UInt_t &asquality, Bool_t toas=kTRUE)
Map quality to/from AfterImage quality.
static void CreateETandAET(int count, TPoint *pts, EdgeTable *ET, EdgeTableEntry *AET, EdgeTableEntry *pETEs, ScanLineListBlock *pSLLBlock)
Bool_t IsEditable() const
void Flip(Int_t flip=180)
Flip image in place.
R__EXTERN TRandom * gRandom
static int InsertionSort(EdgeTableEntry *AET)
UShort_t * fColorBlue
[fNumPoints] blue color at each anchor point
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
! 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 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)
Bool_t fConstRatio
keep aspect ratio of image on the screen
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
! kZoom - new zooming required, kZoomOps - other ops in action, kNoZoom - no zooming or ops ...
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...
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
TObject * FindObject(const char *name) const
Find object using its name.
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.
Ssiz_t Last(char c) const
Find last occurrence of a character c.
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.
UInt_t fZoomHeight
! hight 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.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
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
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.
TObject * Clone(const char *newname) const
Clone image.
Array of doubles (64 bits per element).
virtual void Draw(Option_t *option="")
Draw this box with its current attributes.
Mother of all ROOT objects.
Double_t fMinValue
! min 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.
static void SetRotationMatrix(Float_t angle)
Set the rotation matrix used to rotate the font outlines.
typedef void((*Func_t)())
static ASVisual * fgVisual
pointer to visual structure
UShort_t * fColorGreen
[fNumPoints] green color at each anchor point
TASImage()
Default image constructor.
void AddAt(Double_t c, Int_t i)
Add double c at position i. Check for out of bounds.
static Bool_t fgInit
global flag to init afterimage only once
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.
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)
struct _ScanLineList ScanLineList
you should not use this method at all Int_t Int_t Double_t Double_t Double_t Int_t Double_t Double_t Double_t Double_t b
const void * GetWcsTitle(void) const
Returns the text as UNICODE.
R__EXTERN TVirtualPS * gVirtualPS
Int_t GetEntries() const
Return the number of objects in array (i.e.
virtual void StartPaletteEditor()
Opens a GUI to edit the color palette.
TASImage & operator=(const TASImage &img)
Image assignment operator.
Int_t CountChar(Int_t c) const
Return number of times character c occurs in the string.
Int_t Atoi() const
Return integer value of string.
#define BRESINITPGON(dy, x1, x2, xStart, d, m, m1, incr1, incr2)
static void SetTextSize(Float_t textsize)
Set current text size.
Bool_t IsDigit() const
Returns true if all characters in string are digits (0-9) or white spaces, i.e.
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
! width of zoomed image in image pixels
ASImage * fGrayImage
! gray image
static TImage * Create()
Create an image.
void DestroyImage()
Destroy image.
const char * AsHexString() const
Return color as hexadecimal string.
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()
Pixmap_t GetPixmap()
Returns image pixmap.
virtual void SetY1(Double_t y1)
ASImage * fImage
! pointer to image structure of original 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 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
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.
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.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual Version_t ReadVersion(UInt_t *start=0, UInt_t *bcnt=0, const TClass *cl=0)=0
virtual const char * GetTitle() const
Returns title of object.
static const FT_BBox & GetBox()
Bool_t GetConstRatio() const
virtual TCanvas * GetCanvas() const =0
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)
const char * Data() const