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> 113 #include <fontconfig/fontconfig.h> 134 #if defined(__GNUC__) && __GNUC__ >= 4 && ((__GNUC_MINOR__ == 2 && __GNUC_PATCHLEVEL__ >= 1) || (__GNUC_MINOR__ >= 3)) && !__INTEL_COMPILER 135 #pragma GCC diagnostic ignored "-Wstrict-aliasing" 156 #define _alphaBlend(bot, top) {\ 157 __argb32__ *T = (__argb32__*)(top);\ 158 __argb32__ *B = (__argb32__*)(bot);\ 163 B->a = ((B->a*aa)>>8) + T->a;\ 164 B->r = (B->r*aa + T->r*T->a)>>8;\ 165 B->g = (B->g*aa + T->g*T->a)>>8;\ 166 B->b = (B->b*aa + T->b*T->a)>>8;\ 233 fImage = create_asimage(w ? w : 20,
h ?
h : 20, 0);
259 SetImage(imageData, width, height, palette);
272 SetImage(imageData, width, palette);
285 SetImage(imageData, width, palette);
300 if (img.
fImage->alt.vector) {
303 memcpy(
fImage->alt.vector, img.
fImage->alt.vector, size);
321 if (
this != &img && img.
IsValid()) {
330 if (img.
fImage->alt.vector) {
333 memcpy(
fImage->alt.vector, img.
fImage->alt.vector, size);
380 const char *delim =
":";
382 const char *delim =
";";
384 while (icon_path.
Tokenize(token, from, delim) &&
cnt < 6) {
400 FILE *fp = fopen(
file,
"rb");
401 const char *ret =
"";
405 if (!fread(&magic, 1, 1, fp)) {
413 if (!fread(&magic, 1, 1, fp)) {
417 if (!fread(&magic, 1, 1, fp)) {
422 ret = (magic == 1) ?
"ico" :
"cur";
427 if (!fread(&magic, 1, 1, fp)) {
432 if (magic == 0x21) ret =
"ps";
433 else if (magic == 0x50) ret =
"pdf";
483 Warning(
"Scale",
"Visual not initiated");
487 Bool_t xpm = filename && (filename[0] ==
'/' &&
488 filename[1] ==
'*') && filename[2] ==
' ';
500 set_output_threshold(0);
502 static ASImageImportParams iparams;
506 iparams.filter = SCL_DO_ALL;
507 iparams.gamma = SCREEN_GAMMA;
508 iparams.gamma_table = NULL;
510 iparams.format = ASA_ASImage;
512 iparams.subimage = 0;
513 iparams.return_animation_delay = -1;
517 if (filename) dot = strrchr(filename,
'.');
530 iparams.subimage = ext.
Atoi();
532 ext = strrchr(fname.
Data(),
'.') + 1;
535 image = file2ASImage_extra(fname.
Data(), &iparams);
547 unsigned char *bitmap = 0;
553 if (!handler || ((handler->
LoadPlugin() == -1))) {
572 image = bitmap2asimage(bitmap, w,
h, 0, 0);
652 Error(
"WriteImage",
"no image loaded");
657 Error(
"WriteImage",
"no file name specified");
662 if ((
s = strrchr(
file,
'.'))) {
666 Error(
"WriteImage",
"cannot determine a valid file type");
674 Error(
"WriteImage",
"not a valid file type was specified");
680 ASImageFileTypes atype = (ASImageFileTypes)mytype;
688 static ASImageExportParams parms;
693 parms.xpm.type = atype;
694 parms.xpm.flags = EXPORT_ALPHA;
695 parms.xpm.dither = 4;
696 parms.xpm.opaque_threshold = 127;
697 parms.xpm.max_colors = 512;
700 ASImage2bmp(im, fname.
Data(), 0);
703 ASImage2xcf(im, fname.
Data(), 0);
706 parms.png.type = atype;
707 parms.png.flags = EXPORT_ALPHA;
711 parms.jpeg.type = atype;
712 parms.jpeg.flags = 0;
713 parms.jpeg.quality = aquality;
716 parms.gif.type = atype;
717 parms.gif.flags = EXPORT_ALPHA;
718 parms.gif.dither = 0;
719 parms.gif.opaque_threshold = 0;
723 parms.gif.type = atype;
724 parms.gif.flags = EXPORT_ALPHA | EXPORT_APPEND;
725 parms.gif.dither = 0;
726 parms.gif.opaque_threshold = 0;
727 parms.gif.animate_repeats = 0;
740 parms.gif.flags |= EXPORT_ANIMATION_REPEATS;
741 parms.gif.animate_repeats = 0;
742 }
else if(sufix==
"") {
759 parms.gif.flags |= EXPORT_ANIMATION_REPEATS;
760 parms.gif.animate_repeats = atoi(
s);
769 parms.gif.flags |= EXPORT_ANIMATION_REPEATS;
770 parms.gif.animate_repeats = 0;
777 delay = atoi(sDelay);
778 parms.gif.flags |= EXPORT_ANIMATION_REPEATS;
779 parms.gif.animate_repeats = atoi(sRepeats);
781 Error(
"WriteImage",
"gif suffix %s not yet supported",
s);
785 parms.gif.animate_delay = delay;
787 int i1 = fname.
Index(
"gif+");
789 fname = fname(0, i1 + 3);
792 Error(
"WriteImage",
"unexpected gif extension structure %s", fname.
Data());
798 parms.tiff.type = atype;
799 parms.tiff.flags = EXPORT_ALPHA;
800 parms.tiff.rows_per_strip = 0;
801 parms.tiff.compression_type = aquality <= 50 ? TIFF_COMPRESSION_JPEG :
802 TIFF_COMPRESSION_NONE;
803 parms.tiff.jpeg_quality = 100;
804 parms.tiff.opaque_threshold = 0;
807 Error(
"WriteImage",
"file type %s not yet supported",
s);
811 if (!ASImage2file(im, 0, fname.
Data(), atype, &parms)) {
812 Error(
"WriteImage",
"error writing file %s",
file);
830 if (
s ==
"jpg" ||
s ==
"jpeg")
846 if (
s.Contains(
"gif+"))
869 astype = ASIT_Xpm;
break;
871 astype = ASIT_ZCompressedXpm;
break;
873 astype = ASIT_GZCompressedXpm;
break;
875 astype = ASIT_Png;
break;
877 astype = ASIT_Jpeg;
break;
879 astype = ASIT_Xcf;
break;
881 astype = ASIT_Ppm;
break;
883 astype = ASIT_Pnm;
break;
885 astype = ASIT_Bmp;
break;
887 astype = ASIT_Ico;
break;
889 astype = ASIT_Cur;
break;
891 astype = ASIT_Gif;
break;
893 astype = ASIT_Gif;
break;
895 astype = ASIT_Tiff;
break;
897 astype = ASIT_Xbm;
break;
899 astype = ASIT_Targa;
break;
901 astype = ASIT_XMLScript;
break;
903 astype = ASIT_Unknown;
909 case ASIT_ZCompressedXpm:
911 case ASIT_GZCompressedXpm:
954 asquality = 25;
break;
956 asquality = 75;
break;
958 asquality = 50;
break;
960 asquality = 100;
break;
966 if (asquality > 0 && asquality <= 25)
968 if (asquality > 26 && asquality <= 50)
970 if (asquality > 51 && asquality <= 75)
972 if (asquality > 76 && asquality <= 100)
992 Warning(
"SetImage",
"Visual not initiated");
1002 for (
Int_t pixel = 1; pixel <
Int_t(width * height); pixel++) {
1010 ASVectorPalette asPalette;
1014 for (col = 0; col < 4; col++)
1015 asPalette.channels[col] =
new UShort_t[asPalette.npoints];
1022 asPalette.points =
new Double_t[asPalette.npoints];
1023 for (
Int_t point = 0; point <
Int_t(asPalette.npoints); point++)
1027 height, &asPalette, ASA_ASImage,
1030 delete [] asPalette.points;
1031 for (col = 0; col < 4; col++)
1032 delete [] asPalette.channels[col];
1076 Error(
"FromPad",
"pad cannot be 0");
1081 Warning(
"FromPad",
"Visual not initiated");
1091 if (
gROOT->IsBatch()) {
1099 if (itmp && itmp->
fImage) {
1108 if (itmp && itmp->
fImage && (itmp !=
this)) {
1110 if (itmp->
fImage->alt.argb32) {
1112 fImage->alt.argb32 = (ARGB32*)safemalloc(sz*
sizeof(ARGB32));
1113 memcpy(
fImage->alt.argb32, itmp->
fImage->alt.argb32, sz*4);
1140 static int x11 = -1;
1141 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
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;
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,
1499 ASImage *tmpImage = 0;
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),
1549 min, max, ndiv,
"+LU");
1554 pal_Xpos,
gPad->AbsPixeltoY(pal_Ay + 1),
1555 min, max, ndiv,
"+L");
1565 gPad->XtoAbsPixel(0),
gPad->YtoAbsPixel(1));
1570 dump->
Merge(&tgrad,
"alphablend", pal_Ax, pal_Ay);
1580 pal_Xpos,
gPad->AbsPixeltoY(pal_Ay + 1),
1581 min, max, ndiv,
"+L");
1585 Warning(
"Paint",
"PDF not implemented yet");
1588 Warning(
"Paint",
"SVG not implemented yet");
1596 if ((color = (
TColor*)
colors->FindObject(
"Image_PS")) == 0)
1597 color =
new TColor(
colors->GetEntries(), 1., 1., 1.,
"Image_PS");
1608 x2 =
x1+dx/image->width;
1610 y2 = y1+dy/image->height;
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),
1667 min, max, ndiv,
"+L");
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++)
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");
2048 Warning(
"UnZoom",
"Image not valid");
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");
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");
2381 static int x11 = -1;
2382 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
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;
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];
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");
2603 FcPattern *pat, *match;
2606 pat = FcPatternCreate ();
2608 if (strcmp(basename,
"timesi.ttf") == 0 ||
2609 strcmp(basename,
"FreeSerifItalic.otf") == 0) {
2610 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freeserif");
2611 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
2612 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
2614 else if (strcmp(basename,
"timesbd.ttf") == 0 ||
2615 strcmp(basename,
"FreeSerifBold.otf") == 0) {
2616 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freeserif");
2617 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
2618 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
2620 else if (strcmp(basename,
"timesbi.ttf") == 0 ||
2621 strcmp(basename,
"FreeSerifBoldItalic.otf") == 0) {
2622 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freeserif");
2623 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
2624 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
2626 else if (strcmp(basename,
"arial.ttf") == 0 ||
2627 strcmp(basename,
"FreeSans.otf") == 0) {
2628 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freesans");
2629 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
2630 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
2632 else if (strcmp(basename,
"ariali.ttf") == 0 ||
2633 strcmp(basename,
"FreeSansOblique.otf") == 0) {
2634 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freesans");
2635 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
2636 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
2638 else if (strcmp(basename,
"arialbd.ttf") == 0 ||
2639 strcmp(basename,
"FreeSansBold.otf") == 0) {
2640 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freesans");
2641 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
2642 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
2644 else if (strcmp(basename,
"arialbi.ttf") == 0 ||
2645 strcmp(basename,
"FreeSansBoldOblique.otf") == 0) {
2646 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freesans");
2647 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
2648 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
2650 else if (strcmp(basename,
"cour.ttf") == 0 ||
2651 strcmp(basename,
"FreeMono.otf") == 0) {
2652 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freemono");
2653 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
2654 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
2656 else if (strcmp(basename,
"couri.ttf") == 0 ||
2657 strcmp(basename,
"FreeMonoOblique.otf") == 0) {
2658 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freemono");
2659 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
2660 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
2662 else if (strcmp(basename,
"courbd.ttf") == 0 ||
2663 strcmp(basename,
"FreeMonoBold.otf") == 0) {
2664 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freemono");
2665 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
2666 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
2668 else if (strcmp(basename,
"courbi.ttf") == 0 ||
2669 strcmp(basename,
"FreeMonoBoldOblique.otf") == 0) {
2670 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freemono");
2671 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
2672 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
2674 else if (strcmp(basename,
"symbol.ttf") == 0) {
2675 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"symbol");
2676 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
2677 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
2679 else if (strcmp(basename,
"times.ttf") == 0 ||
2680 strcmp(basename,
"FreeSerif.otf") == 0) {
2681 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freeserif");
2682 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
2683 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
2685 else if (strcmp(basename,
"wingding.ttf") == 0) {
2686 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"dingbats");
2687 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
2688 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
2690 else if (strcmp(basename,
"BlackChancery.ttf") == 0) {
2691 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"urwchanceryl");
2692 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
2693 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
2696 Warning(
"DrawText",
"cannot find a font %s", font_name);
2697 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freemono");
2698 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
2699 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
2702 FcConfigSubstitute (NULL, pat, FcMatchPattern);
2703 FcDefaultSubstitute (pat);
2704 match = FcFontMatch (NULL, pat, &result);
2705 FcPatternGetString (match, FC_FILE, 0, (FcChar8**)&ttfnt);
2706 FcPatternGetInteger (match, FC_INDEX, 0, &ttindex);
2710 FcPatternDestroy (match);
2711 FcPatternDestroy (pat);
2718 parse_argb_color(color, &text_color);
2731 Warning(
"DrawText",
"cannot create Font Manager");
2735 ASFont *font = get_asfont(
gFontManager, fn.
Data(), ttindex, size, ASF_GuessWho);
2738 Warning(
"DrawText",
"cannot find a font %s", font_name);
2742 get_text_size(
text, font, (ASText3DType)type, &width, &height);
2745 fImage = create_asimage(width, height, 0);
2749 text_im = draw_text(
text, font, (ASText3DType)type, 0);
2754 ASImage *tmp = file2ASImage(fore_file, 0xFFFFFFFF, SCREEN_GAMMA, 0, 0);
2756 if ((tmp->width != width) || (tmp->height != height)) {
2757 fore_im = tile_asimage(
fgVisual, tmp, 0, 0, width, height, 0,
2760 destroy_asimage(&tmp);
2767 move_asimage_channel(fore_im, IC_ALPHA, text_im, IC_ALPHA);
2768 destroy_asimage(&text_im);
2776 ASImage *rendered_im;
2777 ASImageLayer layers[2];
2779 init_image_layers(&(layers[0]), 2);
2780 fore_im->back_color = text_color;
2781 layers[0].im = rimg;
2782 layers[0].dst_x = 0;
2783 layers[0].dst_y = 0;
2784 layers[0].clip_width = rimg->width;
2785 layers[0].clip_height = rimg->height;
2786 layers[0].bevel = 0;
2787 layers[1].im = fore_im;
2788 layers[1].dst_x =
x;
2789 layers[1].dst_y =
y;
2790 layers[1].clip_width = fore_im->width;
2791 layers[1].clip_height = fore_im->height;
2793 rendered_im = merge_layers(
fgVisual, &(layers[0]), 2, rimg->width, rimg->height,
2796 destroy_asimage(&fore_im);
2829 Warning(
"Merge",
"Visual not initiated");
2833 ASImage *rendered_im;
2834 ASImageLayer layers[2];
2836 init_image_layers(&(layers[0]), 2);
2838 layers[0].dst_x = 0;
2839 layers[0].dst_y = 0;
2840 layers[0].clip_width =
fImage->width;
2841 layers[0].clip_height =
fImage->height;
2842 layers[0].bevel = 0;
2843 layers[1].im = ((
TASImage*)im)->fImage;
2844 layers[1].dst_x =
x;
2845 layers[1].dst_y =
y;
2846 layers[1].clip_width = im->
GetWidth();
2847 layers[1].clip_height = im->
GetHeight();
2848 layers[1].merge_scanlines = blend_scanlines_name2func(op ? op :
"add");
2866 Warning(
"Blur",
"Visual not initiated");
2871 fImage = create_asimage(100, 100, 0);
2874 Warning(
"Blur",
"Failed to create image");
2881 ASImage *rendered_im = blur_asimage_gauss(
fgVisual,
fImage, hr > 0 ? hr : 3,
2882 vr > 0 ? vr : 3, SCL_DO_ALL,
2895 Warning(
"Clone",
"Image not initiated");
2902 Warning(
"Clone",
"Failed to create image");
2918 if (
fImage->alt.argb32) {
2920 im->
fImage->alt.argb32 = (ARGB32*)safemalloc(sz*
sizeof(ARGB32));
2921 memcpy(im->
fImage->alt.argb32,
fImage->alt.argb32, sz *
sizeof(ARGB32));
2941 Warning(
"Vectorize",
"Visual not initiated");
2946 fImage = create_asimage(100, 100, 0);
2949 Warning(
"Vectorize",
"Failed to create image");
2960 dither = dither > 7 ? 7 : dither;
2962 res = colormap_asimage(
fImage, &cmap, max_colors, dither, opaque_threshold);
2974 g = INDEX_SHIFT_GREEN(cmap.entries[res[i]].green);
2975 b = INDEX_SHIFT_BLUE(cmap.entries[res[i]].blue);
2976 r = INDEX_SHIFT_RED(cmap.entries[res[i]].red);
2978 v = MAKE_INDEXED_COLOR24(
r,
g,
b);
2988 for (
UInt_t j = 0; j < cmap.count; j++) {
2989 g = INDEX_SHIFT_GREEN(cmap.entries[j].green);
2990 b = INDEX_SHIFT_BLUE(cmap.entries[j].blue);
2991 r = INDEX_SHIFT_RED(cmap.entries[j].red);
2992 v = MAKE_INDEXED_COLOR24(
r,
g,
b);
2994 v = (
v>>12) & 0x0FFF;
2997 pal->
fColorRed[j] = cmap.entries[j].red << 8;
2999 pal->
fColorBlue[j] = cmap.entries[j].blue << 8;
3003 destroy_colormap(&cmap,
kTRUE);
3006 fImage->alt.vector = vec;
3008 if (res)
delete res;
3054 Warning(
"HSV",
"Visual not initiated");
3059 fImage = create_asimage(width ? width : 20, height ? height : 20, 0);
3062 Warning(
"HSV",
"Failed to create image");
3071 width = !width ?
fImage->width : width;
3072 height = !height ?
fImage->height : height;
3074 ASImage *rendered_im = 0;
3078 hue, radius,
H,
S, V, ASA_ASImage, 100,
3079 ASIMAGE_QUALITY_TOP);
3082 Warning(
"HSV",
"Failed to create rendered image");
3117 Warning(
"Gradient",
"Visual not initiated");
3121 ASImage *rendered_im = 0;
3122 ASGradient gradient;
3124 int reverse = 0, npoints1 = 0, npoints2 = 0;
3131 if ((angle > 2 * 180 * 15 / 16) || (angle < 2 * 180 * 1 / 16)) {
3132 gradient.type = GRADIENT_Left2Right;
3133 }
else if (angle < 2 * 180 * 3 / 16) {
3134 gradient.type = GRADIENT_TopLeft2BottomRight;
3135 }
else if (angle < 2 * 180 * 5 / 16) {
3136 gradient.type = GRADIENT_Top2Bottom;
3137 }
else if (angle < 2 * 180 * 7 / 16) {
3138 gradient.type = GRADIENT_BottomLeft2TopRight; reverse = 1;
3139 }
else if (angle < 2 * 180 * 9 / 16) {
3140 gradient.type = GRADIENT_Left2Right; reverse = 1;
3141 }
else if (angle < 2 * 180 * 11 / 16) {
3142 gradient.type = GRADIENT_TopLeft2BottomRight; reverse = 1;
3143 }
else if (angle < 2 * 180 * 13 / 16) {
3144 gradient.type = GRADIENT_Top2Bottom; reverse = 1;
3146 gradient.type = GRADIENT_BottomLeft2TopRight;
3149 for (p = (
char*)
colors; isspace((
int)*p); p++) { }
3151 for (npoints1 = 0; *p; npoints1++) {
3153 for ( ; *p && !isspace((
int)*p); p++) { }
3155 for ( ; isspace((
int)*p); p++) { }
3158 for (p = (
char*)offsets; isspace((
int)*p); p++) { }
3160 for (npoints2 = 0; *p; npoints2++) {
3162 for ( ; *p && !isspace((
int)*p); p++) { }
3164 for ( ; isspace((
int)*p); p++) { }
3169 if (offsets && (npoints1 > npoints2)) npoints1 = npoints2;
3178 gradient.color =
new ARGB32[npoints1];
3179 gradient.offset =
new double[npoints1];
3181 for (p = (
char*)
colors; isspace((
int)*p); p++) { }
3183 for (npoints1 = 0; *p; ) {
3187 for ( ; *p && !isspace((
int)*p); p++) { }
3189 for ( ; isspace((
int)*p); p++) { }
3191 col = str(pb -
colors, p - pb);
3193 if (parse_argb_color(col.
Data(), gradient.color + npoints1) != col) {
3196 Warning(
"Gradient",
"Failed to parse color [%s] - defaulting to black", pb);
3201 for (p = (
char*)offsets; isspace((
int)*p); p++) { }
3203 for (npoints2 = 0; *p; ) {
3207 for ( ; *p && !isspace((
int)*p); p++) { }
3210 gradient.offset[npoints2] = strtod(pb, &pb);
3212 if (pb == p) npoints2++;
3214 for ( ; isspace((
int)*p); p++) { }
3217 for (npoints2 = 0; npoints2 < npoints1; npoints2++) {
3218 gradient.offset[npoints2] = (double)npoints2 / (npoints1 - 1);
3221 gradient.npoints = npoints1;
3223 if (npoints2 && (gradient.npoints > npoints2)) {
3224 gradient.npoints = npoints2;
3227 for (i = 0; i < gradient.npoints/2; i++) {
3228 int i2 = gradient.npoints - 1 - i;
3229 ARGB32 c = gradient.color[i];
3230 double o = gradient.offset[i];
3231 gradient.color[i] = gradient.color[i2];
3232 gradient.color[i2] = c;
3233 gradient.offset[i] = gradient.offset[i2];
3234 gradient.offset[i2] = o;
3236 for (i = 0; i < gradient.npoints; i++) {
3237 gradient.offset[i] = 1.0 - gradient.offset[i];
3240 rendered_im = make_gradient(
fgVisual, &gradient, width, height, SCL_DO_ALL,
3243 delete [] gradient.color;
3244 delete [] gradient.offset;
3248 Warning(
"Gradient",
"Failed to create gradient image");
3257 ASImageLayer layers[2];
3259 init_image_layers(&(layers[0]), 2);
3261 layers[0].dst_x = 0;
3262 layers[0].dst_y = 0;
3263 layers[0].clip_width =
fImage->width;
3264 layers[0].clip_height =
fImage->height;
3265 layers[0].bevel = 0;
3266 layers[1].im = rendered_im;
3267 layers[1].dst_x =
x;
3268 layers[1].dst_y =
y;
3269 layers[1].clip_width = width;
3270 layers[1].clip_height = height;
3271 layers[1].merge_scanlines = alphablend_scanlines;
3276 Warning(
"Gradient",
"Failed to create merged image");
3280 destroy_asimage(&rendered_im);
3295 cmp = (cmp * 12) / 10;
3297 return (cmp > 255) ? 255 : cmp;
3329 a = ARGB32_ALPHA8(foreground) + ARGB32_ALPHA8(
background);
3331 r = ARGB32_RED8(foreground) + ARGB32_RED8(
background);
3333 g = ARGB32_GREEN8(foreground) + ARGB32_GREEN8(
background);
3335 b = ARGB32_BLUE8(foreground) + ARGB32_BLUE8(
background);
3338 return MAKE_ARGB32(
a,
r,
g,
b);
3354 const char *hi_color,
const char *lo_color,
UShort_t thick,
3358 Warning(
"Bevel",
"Visual not initiated");
3365 ARGB32
hi=ARGB32_White, lo=ARGB32_White;
3366 parse_argb_color(hi_color, &
hi);
3367 parse_argb_color(lo_color, &lo);
3370 bevel.lo_color =
hi;
3372 bevel.hi_color = lo;
3375 bevel.hi_color =
hi;
3377 bevel.lo_color = lo;
3382 int extra_hilite = 2;
3383 bevel.left_outline = bevel.top_outline = bevel.right_outline = bevel.bottom_outline = thick;
3384 bevel.left_inline = bevel.top_inline = bevel.right_inline = bevel.bottom_inline = extra_hilite + 1;
3386 if (bevel.top_outline > 1) {
3387 bevel.top_inline += bevel.top_outline - 1;
3390 if (bevel.left_outline > 1) {
3391 bevel.left_inline += bevel.left_outline - 1;
3394 if (bevel.right_outline > 1) {
3395 bevel.right_inline += bevel.right_outline - 1;
3398 if (bevel.bottom_outline > 1) {
3399 bevel.bottom_inline += bevel.bottom_outline - 1;
3403 ARGB32
fill = ((
hi>>24) != 0xff) || ((lo>>24) != 0xff) ? bevel.hilo_color : (bevel.hilo_color | 0xff000000);
3406 fImage = create_asimage(width ? width : 20, height ? height : 20, 0);
3409 Warning(
"Bevel",
"Failed to create image");
3418 width = !width ?
fImage->width : width;
3419 height = !height ?
fImage->height : height;
3421 ASImageLayer layers[2];
3422 init_image_layers(&(layers[0]), 2);
3425 layers[0].dst_x = 0;
3426 layers[0].dst_y = 0;
3427 layers[0].clip_width =
fImage->width;
3428 layers[0].clip_height =
fImage->height;
3429 layers[0].bevel = 0;
3431 UInt_t w = width - (bevel.left_outline + bevel.right_outline);
3432 UInt_t h = height - (bevel.top_outline + bevel.bottom_outline);
3433 ASImage *bevel_im = create_asimage(w,
h, 0);
3436 Warning(
"Bevel",
"Failed to create bevel image");
3440 layers[1].im = bevel_im;
3443 layers[1].dst_x =
x;
3444 layers[1].dst_y =
y;
3445 layers[1].clip_width = width;
3446 layers[1].clip_height = height;
3447 layers[1].bevel = &bevel;
3448 layers[1].merge_scanlines = alphablend_scanlines;
3452 destroy_asimage(&bevel_im);
3455 Warning(
"Bevel",
"Failed to image");
3475 Warning(
"Pad",
"Visual not initiated");
3480 fImage = create_asimage(100, 100, 0);
3483 Warning(
"Pad",
"Failed to create image");
3492 ARGB32 color = ARGB32_White;
3493 parse_argb_color(col, &color);
3504 Warning(
"Pad",
"Failed to create output image");
3521 Warning(
"Crop",
"Visual not initiated");
3534 height =
y + height >
fImage->height ?
fImage->height -
y : height;
3536 if ((width ==
fImage->width) && (height ==
fImage->height)) {
3537 Warning(
"Crop",
"input size larger than image");
3540 ASImageDecoder *imdec = start_image_decoding(
fgVisual,
fImage, SCL_DO_ALL,
3541 x,
y, width, height, 0);
3544 Warning(
"Crop",
"Failed to start image decoding");
3548 ASImage *img = create_asimage(width, height, 0);
3552 Warning(
"Crop",
"Failed to create image");
3556 ASImageOutput *imout = start_image_output(
fgVisual, img, ASA_ASImage,
3560 Warning(
"Crop",
"Failed to start image output");
3561 destroy_asimage(&img);
3562 if (imdec)
delete [] imdec;
3570 for (
UInt_t i = 0; i < height; i++) {
3571 imdec->decode_image_scanline(imdec);
3572 imout->output_image_scanline(imout, &(imdec->buffer), 1);
3575 stop_image_decoding(&imdec);
3576 stop_image_output(&imout);
3600 Warning(
"Append",
"Visual not initiated");
3617 Merge(im,
"alphablend", width, 0);
3618 }
else if (opt ==
"/") {
3620 Merge(im,
"alphablend", 0, height);
3639 Warning(
"BeginPaint",
"Visual not initiated");
3654 0, ASA_ARGB32, 0, ASIMAGE_QUALITY_DEFAULT);
3657 Warning(
"BeginPaint",
"Failed to create image");
3671 Warning(
"EndPaint",
"no image");
3675 if (!
fImage->alt.argb32)
return;
3678 0, ASA_ASImage, 0, ASIMAGE_QUALITY_DEFAULT);
3681 Warning(
"EndPaint",
"Failed to create image");
3698 Warning(
"GetArgbArray",
"no image");
3705 if (!img->alt.argb32) {
3715 return (
UInt_t *)img->alt.argb32;
3726 Warning(
"GetRgbaArray",
"no image");
3733 if (!img->alt.argb32) {
3751 for (i = 0; i < img->height; i++) {
3752 for (j = 0; j < img->width; j++) {
3754 argb = img->alt.argb32[idx];
3756 rgb = argb & 0x00ffffff;
3757 rgba = (rgb << 8) +
a;
3772 Warning(
"GetScanline",
"no image");
3777 CARD32 *ret =
new CARD32[img->width];
3779 ASImageDecoder *imdec = start_image_decoding(
fgVisual, img, SCL_DO_ALL,
3780 0,
y, img->width, 1, 0);
3784 Warning(
"GetScanline",
"Failed to start image decoding");
3792 imdec->decode_image_scanline(imdec);
3793 memcpy(imdec->buffer.buffer, ret, img->width*
sizeof(CARD32));
3794 stop_image_decoding(&imdec);
3809 #if defined(R__GNU) && defined(__i386__) && !defined(__sun) 3810 #define _MEMSET_(dst, lng, val) __asm__("movl %0,%%eax \n"\ 3811 "movl %1,%%edi \n" \ 3812 "movl %2,%%ecx \n" \ 3817 :"g" (val), "g" (dst), "g" (lng) \ 3818 :"eax","edi","ecx" \ 3822 #define _MEMSET_(dst, lng, val) do {\ 3823 for( UInt_t j=0; j < lng; j++) *((dst)+j) = val; } while (0) 3827 #define FillSpansInternal(npt, ppt, widths, color) do {\ 3828 UInt_t yy = ppt[0].fY*fImage->width;\ 3829 for (UInt_t i = 0; i < npt; i++) {\ 3830 _MEMSET_(&fImage->alt.argb32[Idx(yy + ppt[i].fX)], widths[i], color);\ 3831 yy += ((i+1 < npt) && (ppt[i].fY != ppt[i+1].fY) ? fImage->width : 0);\ 3843 Warning(
"FillRectangle",
"Visual not initiated");
3848 Warning(
"FillRectangle",
"no image");
3852 if (!
fImage->alt.argb32) {
3856 if (!
fImage->alt.argb32) {
3857 Warning(
"FillRectangle",
"Failed to get pixel array");
3861 ARGB32 color = (ARGB32)col;
3863 if (width == 0) width = 1;
3864 if (height == 0) height = 1;
3875 Bool_t has_alpha = (color & 0xff000000) != 0xff000000;
3881 height =
y + height >
fImage->height ?
fImage->height -
y : height;
3883 if (!
fImage->alt.argb32) {
3888 ARGB32 *p0 =
fImage->alt.argb32 + yyy +
x;
3890 for (
UInt_t i = 0; i < height; i++) {
3895 for (
UInt_t i =
y; i <
y + height; i++) {
3920 Warning(
"Fill",
"Visual not initiated");
3924 ARGB32 color = ARGB32_White;
3927 parse_argb_color(col, &color);
3931 fImage = create_asimage(width ? width : 20, height ? height : 20, 0);
3945 ARGB32 color = (ARGB32)col;
3948 if (!thick) thick = 1;
3956 thick += (
x - half);
3964 int yy = y1*
fImage->width;
3966 for (
UInt_t w = 0; w < thick; w++) {
3967 if (
x + w < fImage->width) {
3980 ARGB32 color = (ARGB32)col;
3983 if (!thick) thick = 1;
3991 thick += (
y - half);
4000 for (
UInt_t w = 0; w < thick; w++) {
4002 if (
y + w < fImage->height) {
4014 const char *col,
UInt_t thick)
4016 ARGB32 color = ARGB32_White;
4017 parse_argb_color(col, &color);
4029 int x,
y, xend, yend;
4036 Warning(
"DrawLine",
"Visual not initiated");
4041 Warning(
"DrawLine",
"no image");
4045 if (!
fImage->alt.argb32) {
4049 if (!
fImage->alt.argb32) {
4050 Warning(
"DrawLine",
"Failed to get pixel array");
4054 ARGB32 color = (ARGB32)col;
4059 if (!dx && !dy)
return;
4063 y2 > y1 ? y2 : y1, color, thick);
4081 i2 = i1 - (dx << 1);
4098 q = (y2 - y1) * ydir;
4131 i2 = i1 - (dy << 1);
4148 q = (
x2 -
x1) * xdir;
4186 const char *col,
UInt_t thick)
4189 Warning(
"DrawRectangle",
"Visual not initiated");
4198 fImage = create_asimage(w,
h, 0);
4203 if (!
fImage->alt.argb32) {
4207 if (!
fImage->alt.argb32) {
4208 Warning(
"DrawRectangle",
"Failed to get pixel array");
4212 ARGB32 color = ARGB32_White;
4213 parse_argb_color(col, &color);
4233 ARGB32 color = ARGB32_White;
4238 fImage = create_asimage(w,
h, 0);
4244 parse_argb_color(col, &color);
4250 parse_argb_color(col, &color);
4280 ARGB32 color = (ARGB32)col;
4290 thick += (
y - half);
4293 thick = thick <= 0 ? 1 : thick;
4302 x2 =
x2 < tmp ? tmp :
x2;
4305 for (
UInt_t w = 0; w < thick; w++) {
4306 if (
y + w < fImage->height) {
4314 if (i >= pDash[iDash]) {
4318 if (iDash >= nDash) {
4334 ARGB32 color = (ARGB32)col;
4344 thick += (
x - half);
4347 thick = thick <= 0 ? 1 : thick;
4354 y1 = y2 < y1 ? y2 : y1;
4355 y2 = y2 < tmp ? tmp : y2;
4359 int yy = y1*
fImage->width;
4361 for (
UInt_t w = 0; w < thick; w++) {
4362 if (
x + w < fImage->width) {
4370 if (i >= pDash[iDash]) {
4374 if (iDash >= nDash) {
4390 int x,
y, xend, yend;
4400 char *pDash =
new char[nDash];
4405 for (i = 0; i < (int)nDash; i++) {
4411 i2 = i1 - (dx << 1);
4429 q = (y2 - y1) * ydir;
4434 if ((iDash%2) == 0) {
4446 if (i >= pDash[iDash]) {
4450 if (iDash >= nDash) {
4458 if ((iDash%2) == 0) {
4470 if (i >= pDash[iDash]) {
4474 if (iDash >= nDash) {
4483 for (i = 0; i < (int)nDash; i++) {
4489 i2 = i1 - (dy << 1);
4507 q = (
x2 -
x1) * xdir;
4512 if ((iDash%2) == 0) {
4526 if (i >= pDash[iDash]) {
4530 if (iDash >= nDash) {
4538 if ((iDash%2) == 0) {
4552 if (i >= pDash[iDash]) {
4556 if (iDash >= nDash) {
4574 double x,
y, xend=0, yend=0, x0, y0;
4582 double *xDash =
new double[nDash];
4583 double *yDash =
new double[nDash];
4588 for (i = 0; i < (int)nDash; i++) {
4589 xDash[i] = tDash[i] * ac;
4590 yDash[i] = tDash[i] *
as;
4594 xDash[i] = xDash[i]/2;
4595 yDash[i] = yDash[i]/2;
4597 xDash[i] = xDash[i]*2;
4598 yDash[i] = yDash[i]*2;
4615 q = (y2 - y1) * ydir;
4622 while ((
x < xend) && (
y < yend)) {
4626 if ((iDash%2) == 0) {
4636 if (iDash >= nDash) {
4641 while ((
x < xend) && (
y > yend)) {
4645 if ((iDash%2) == 0) {
4655 if (iDash >= nDash) {
4674 q = (
x2 -
x1) * xdir;
4681 while ((
x < xend) && (
y < yend)) {
4685 if ((iDash%2) == 0) {
4695 if (iDash >= nDash) {
4700 while ((
x > xend) && (
y < yend)) {
4704 if ((iDash%2) == 0) {
4714 if (iDash >= nDash) {
4728 const char *pDash,
const char *col,
UInt_t thick)
4732 Warning(
"DrawDashLine",
"Visual not initiated");
4737 Warning(
"DrawDashLine",
"no image");
4741 if (!
fImage->alt.argb32) {
4745 if (!
fImage->alt.argb32) {
4746 Warning(
"DrawDashLine",
"Failed to get pixel array");
4750 if ((nDash < 2) || !pDash || (nDash%2)) {
4751 Warning(
"DrawDashLine",
"Wrong input parameters n=%d %ld", nDash, (
Long_t)
sizeof(pDash)-1);
4755 ARGB32 color = ARGB32_White;
4756 parse_argb_color(col, &color);
4760 }
else if (y1 == y2) {
4774 ARGB32 color = ARGB32_White;
4775 parse_argb_color(col, &color);
4782 for (
UInt_t i = 1; i < nn; i++) {
4799 Warning(
"PutPixel",
"Visual not initiated");
4804 Warning(
"PutPixel",
"no image");
4808 if (!
fImage->alt.argb32) {
4812 if (!
fImage->alt.argb32) {
4813 Warning(
"PutPixel",
"Failed to get pixel array");
4818 parse_argb_color(col, &color);
4820 if ((
x < 0) || (
y < 0) || (
x >= (
int)
fImage->width) || (
y >= (
int)
fImage->height)) {
4821 Warning(
"PutPixel",
"Out of range width=%d x=%d, height=%d y=%d",
4834 Warning(
"PolyPoint",
"Visual not initiated");
4839 Warning(
"PolyPoint",
"no image");
4843 if (!
fImage->alt.argb32) {
4847 if (!
fImage->alt.argb32) {
4848 Warning(
"PolyPoint",
"Failed to get pixel array");
4853 Warning(
"PolyPoint",
"No points specified");
4860 parse_argb_color(col, &color);
4866 for (i = 0; i < npt; i++) {
4867 ipt[i].
fX += ppt[i].
fX;
4868 ipt[i].
fY += ppt[i].
fY;
4873 for (i = 0; i < npt; i++) {
4874 x = ipt ? ipt[i].
fX : ppt[i].
fX;
4875 y = ipt ? ipt[i].
fY : ppt[i].
fY;
4877 if ((
x < 0) || (
y < 0) || (
x >= (
int)
fImage->width) || (
y >= (
int)
fImage->height)) {
4893 if (!nseg || !seg) {
4894 Warning(
"DrawSegments",
"Invalid data nseg=%d seg=0x%lx", nseg, (
Long_t)seg);
4900 for (
UInt_t i = 0; i < nseg; i++) {
4901 pt[0].fX = seg->
fX1;
4902 pt[1].fX = seg->
fX2;
4903 pt[0].fY = seg->
fY1;
4904 pt[1].fY = seg->
fY2;
4918 Warning(
"FillSpans",
"Visual not initiated");
4923 Warning(
"FillSpans",
"no image");
4927 if (!
fImage->alt.argb32) {
4931 if (!
fImage->alt.argb32) {
4932 Warning(
"FillSpans",
"Failed to get pixel array");
4936 if (!npt || !ppt || !widths || (stipple && (!w || !
h))) {
4937 Warning(
"FillSpans",
"Invalid input data npt=%d ppt=0x%lx col=%s widths=0x%lx stipple=0x%lx w=%d h=%d",
4943 parse_argb_color(col, &color);
4948 for (
UInt_t i = 0; i < npt; i++) {
4950 for (
UInt_t j = 0; j < widths[i]; j++) {
4951 if ((ppt[i].fX >= (
Int_t)
fImage->width) || (ppt[i].
fX < 0) ||
4962 if (stipple[ii >> 3] & (1 << (ii%8))) {
4976 Warning(
"FillSpans",
"Visual not initiated");
4981 Warning(
"FillSpans",
"no image");
4985 if (!
fImage->alt.argb32) {
4989 if (!
fImage->alt.argb32) {
4990 Warning(
"FillSpans",
"Failed to get pixel array");
4994 if (!npt || !ppt || !widths || !tile) {
4995 Warning(
"FillSpans",
"Invalid input data npt=%d ppt=0x%lx widths=0x%lx tile=0x%lx",
5009 for (
UInt_t i = 0; i < npt; i++) {
5012 for (
UInt_t j = 0; j < widths[i]; j++) {
5013 if ((ppt[i].fX >= (
Int_t)
fImage->width) || (ppt[i].
fX < 0) ||
5032 Warning(
"CropSpans",
"Visual not initiated");
5037 Warning(
"CropSpans",
"no image");
5041 if (!
fImage->alt.argb32) {
5045 if (!
fImage->alt.argb32) {
5046 Warning(
"CropSpans",
"Failed to get pixel array");
5050 if (!npt || !ppt || !widths) {
5051 Warning(
"CropSpans",
"No points specified npt=%d ppt=0x%lx widths=0x%lx", npt, (
Long_t)ppt, (
Long_t)widths);
5056 int y1 = ppt[npt-1].
fY;
5064 for (
y = 0; (int)
y < y0;
y++) {
5067 if (idx < sz)
fImage->alt.argb32[idx] = 0;
5072 for (i = 0; i < npt; i++) {
5073 for (
x = 0; (int)
x < ppt[i].fX;
x++) {
5075 if (idx < sz)
fImage->alt.argb32[idx] = 0;
5077 for (
x = ppt[i].fX + widths[i] + 1;
x <
fImage->width;
x++) {
5079 if (idx < sz)
fImage->alt.argb32[idx] = 0;
5087 if (idx < sz)
fImage->alt.argb32[idx] = 0;
5121 Warning(
"CopyArea",
"Visual not initiated");
5126 Warning(
"CopyArea",
"no image");
5131 ASImage *out = ((
TASImage*)dst)->GetImage();
5137 xsrc = xsrc < 0 ? 0 : xsrc;
5138 ysrc = ysrc < 0 ? 0 : ysrc;
5140 if ((xsrc >= (
int)
fImage->width) || (ysrc >= (
int)
fImage->height))
return;
5142 w = xsrc + w >
fImage->width ?
fImage->width - xsrc : w;
5146 if (!
fImage->alt.argb32) {
5149 if (!out->alt.argb32) {
5151 out = ((
TASImage*)dst)->GetImage();
5154 if (
fImage->alt.argb32 && out->alt.argb32) {
5155 for (
y = 0;
y < (int)
h;
y++) {
5156 for (
x = 0;
x < (int)w;
x++) {
5157 idx =
Idx(yy +
x + xsrc);
5158 if ((
x + xdst < 0) || (ydst +
y < 0) ||
5159 (
x + xdst >= (
int)out->width) || (
y + ydst >= (
int)out->height) )
continue;
5161 idx2 =
Idx((ydst +
y)*out->width +
x + xdst);
5165 out->alt.argb32[idx2] = 0;
5168 out->alt.argb32[idx2] &=
fImage->alt.argb32[idx];
5171 out->alt.argb32[idx2] =
fImage->alt.argb32[idx] & (~out->alt.argb32[idx2]);
5174 out->alt.argb32[idx2] &= ~
fImage->alt.argb32[idx];
5179 out->alt.argb32[idx2] ^=
fImage->alt.argb32[idx];
5182 out->alt.argb32[idx2] |=
fImage->alt.argb32[idx];
5185 out->alt.argb32[idx2] = (~
fImage->alt.argb32[idx]) & (~out->alt.argb32[idx2]);
5188 out->alt.argb32[idx2] ^= ~
fImage->alt.argb32[idx];
5191 out->alt.argb32[idx2] = ~out->alt.argb32[idx2];
5194 out->alt.argb32[idx2] =
fImage->alt.argb32[idx] | (~out->alt.argb32[idx2]);
5197 out->alt.argb32[idx2] = ~
fImage->alt.argb32[idx];
5200 out->alt.argb32[idx2] |= ~
fImage->alt.argb32[idx];
5203 out->alt.argb32[idx2] = (~
fImage->alt.argb32[idx]) | (~out->alt.argb32[idx2]);
5206 out->alt.argb32[idx2] = 0xFFFFFFFF;
5210 out->alt.argb32[idx2] =
fImage->alt.argb32[idx];
5234 int i, j, ix, iy, w,
h;
5236 ARGB32 color = 0xFFFFFFFF;
5243 for (i = 0; i < nx; i++) {
5245 for (j = 0; j < ny; j++) {
5246 icol = (ARGB32)ic[i + (nx*j)];
5247 if (icol != color) {
5301 return (ptMin - ptsStart);
5317 int mr = 0, m1r = 0;
5318 int incr1l = 0, incr2l = 0;
5319 int incr1r = 0, incr2r = 0;
5324 int nextleft, nextright;
5337 Warning(
"GetPolygonSpans",
"Visual not initiated");
5342 Warning(
"GetPolygonSpans",
"no image");
5346 if (!
fImage->alt.argb32) {
5350 if (!
fImage->alt.argb32) {
5351 Warning(
"GetPolygonSpans",
"Failed to get pixel array");
5355 if ((npt < 3) || !ppt) {
5356 Warning(
"GetPolygonSpans",
"No points specified npt=%d ppt=0x%lx", npt, (
Long_t)ppt);
5365 if ((npt < 3) || (dy < 0))
return kFALSE;
5367 ptsOut = firstPoint =
new TPoint[dy];
5368 width = firstWidth =
new UInt_t[dy];
5371 nextleft = nextright = imin;
5372 y = ppt[nextleft].
fY;
5377 if (ppt[nextleft].fY ==
y) {
5383 if (nextleft >= (
int)npt) {
5390 ppt[left].fX, ppt[nextleft].fX,
5391 xl, dl, ml, m1l, incr1l, incr2l);
5395 if (ppt[nextright].fY ==
y) {
5401 if (nextright < 0) {
5408 ppt[right].fX, ppt[nextright].fX,
5409 xr, dr, mr, m1r, incr1r, incr2r);
5414 i =
TMath::Min(ppt[nextleft].fY, ppt[nextright].fY) -
y;
5418 delete [] firstWidth;
5419 delete [] firstPoint;
5428 *(width++) = xr - xl;
5429 (ptsOut++)->fX = xl;
5431 *(width++) = xl - xr;
5432 (ptsOut++)->fX = xr;
5440 }
while (
y !=
ymax);
5442 *nspans =
UInt_t(ptsOut - firstPoint);
5443 *outPoint = firstPoint;
5444 *outWidth = firstWidth;
5461 ARGB32 color = ARGB32_White;
5462 parse_argb_color(col, &color);
5465 if (!stipple && ((color & 0xff000000)==0xff000000)) {
5468 FillSpans(nspans, firstPoint, firstWidth, col, stipple, w,
h);
5472 delete [] firstWidth;
5473 delete [] firstPoint;
5476 if (firstWidth)
delete [] firstWidth;
5477 if (firstPoint)
delete [] firstPoint;
5494 FillSpans(nspans, firstPoint, firstWidth, tile);
5497 delete [] firstWidth;
5498 delete [] firstPoint;
5501 if (firstWidth)
delete [] firstWidth;
5502 if (firstPoint)
delete [] firstPoint;
5518 CropSpans(nspans, firstPoint, firstWidth);
5521 delete [] firstWidth;
5522 delete [] firstPoint;
5525 if (firstWidth)
delete [] firstWidth;
5526 if (firstPoint)
delete [] firstPoint;
5539 Warning(
"DrawFillArea",
"Visual not initiated");
5544 Warning(
"DrawFillArea",
"no image");
5548 if (!
fImage->alt.argb32) {
5552 if (!
fImage->alt.argb32) {
5553 Warning(
"DrawFillArea",
"Failed to get pixel array");
5557 if ((count < 3) || !ptsIn) {
5558 Warning(
"DrawFillArea",
"No points specified npt=%d ppt=0x%lx", count, (
Long_t)ptsIn);
5567 ARGB32 color = ARGB32_White;
5568 parse_argb_color(col, &color);
5586 static const UInt_t gEdgeTableEntryCacheSize = 200;
5587 static EdgeTableEntry gEdgeTableEntryCache[gEdgeTableEntryCacheSize];
5589 if (count < gEdgeTableEntryCacheSize) {
5597 ptsOut = firstPoint;
5600 pSLL = ET.scanlines.next;
5602 for (
y = ET.ymin;
y < ET.ymax;
y++) {
5603 if (pSLL &&
y == pSLL->scanline) {
5604 loadAET(&AET, pSLL->edgelist);
5611 ptsOut->
fX = pAET->bres.minor_axis;
5616 *width++ = pAET->next->bres.minor_axis - pAET->bres.minor_axis;
5619 if (!stipple && ((color & 0xff000000)==0xff000000)) {
5622 FillSpans(nPts, firstPoint, firstWidth, col, stipple, w,
h);
5624 ptsOut = firstPoint;
5635 if (!stipple && ((color & 0xff000000)==0xff000000)) {
5638 FillSpans(nPts, firstPoint, firstWidth, col, stipple, w,
h);
5642 if (del)
delete [] pETEs;
5652 Warning(
"DrawFillArea",
"Visual not initiated");
5657 Warning(
"DrawFillArea",
"no image");
5661 if (!
fImage->alt.argb32) {
5665 if (!
fImage->alt.argb32) {
5666 Warning(
"DrawFillArea",
"Failed to get pixel array");
5670 if ((count < 3) || !ptsIn) {
5671 Warning(
"DrawFillArea",
"No points specified npt=%d ppt=0x%lx", count, (
Long_t)ptsIn);
5697 ptsOut = firstPoint;
5700 pSLL = ET.scanlines.next;
5702 for (
y = ET.ymin;
y < ET.ymax;
y++) {
5703 if (pSLL &&
y == pSLL->scanline) {
5704 loadAET(&AET, pSLL->edgelist);
5711 ptsOut->
fX = pAET->bres.minor_axis;
5716 *width++ = pAET->next->bres.minor_axis - pAET->bres.minor_axis;
5719 FillSpans(nPts, firstPoint, firstWidth, tile);
5720 ptsOut = firstPoint;
5729 FillSpans(nPts, firstPoint, firstWidth, tile);
5740 ASDrawContext *ctx =
new ASDrawContext;
5742 ctx->canvas_width = im->width;
5743 ctx->canvas_height = im->height;
5744 ctx->canvas = im->alt.argb32;
5745 ctx->scratch_canvas = 0;
5747 ctx->flags = ASDrawCTX_CanvasIsARGB;
5748 asim_set_custom_brush_colored( ctx, brush);
5758 if (ctx->scratch_canvas)
free(ctx->scratch_canvas);
5772 Int_t sz = thick*thick;
5779 matrix =
new CARD32[sz];
5782 for (
int i = 0; i < sz; i++) {
5783 matrix[i] = (CARD32)color;
5787 brush.matrix = matrix;
5788 brush.width = thick;
5789 brush.height = thick;
5790 brush.center_y = brush.center_x = thick/2;
5799 if (xx1 ==
fImage->width) --xx1;
5800 if (yy1 ==
fImage->height) --yy1;
5801 if (xx2 ==
fImage->width) --xx2;
5802 if (yy2 ==
fImage->height) --yy2;
5804 asim_move_to(ctx, xx1, yy1);
5805 asim_line_to(ctx, xx2, yy2);
5820 Bool_t has_alpha = (color & 0xff000000) != 0xff000000;
5824 FT_Bitmap *source = (FT_Bitmap*)bitmap;
5825 UChar_t d = 0, *
s = source->buffer;
5827 Int_t dots =
Int_t(source->width * source->rows);
5831 yy = y0 = by > 0 ? by *
fImage->width : 0;
5832 for (
y = 0;
y < (int) source->rows;
y++) {
5834 if ((byy >= (
int)
fImage->height) || (byy <0))
continue;
5836 for (
x = 0;
x < (int) source->width;
x++) {
5838 if ((bxx >= (
int)
fImage->width) || (bxx < 0))
continue;
5840 idx =
Idx(bxx + yy);
5841 r += ((
fImage->alt.argb32[idx] & 0xff0000) >> 16);
5842 g += ((
fImage->alt.argb32[idx] & 0x00ff00) >> 8);
5843 b += (
fImage->alt.argb32[idx] & 0x0000ff);
5853 col[0] = (
r << 16) + (
g << 8) +
b;
5855 Int_t col4r = (col[4] & 0xff0000) >> 16;
5856 Int_t col4g = (col[4] & 0x00ff00) >> 8;
5857 Int_t col4b = (col[4] & 0x0000ff);
5860 for (
x = 3;
x > 0;
x--) {
5862 Int_t colxr = (col4r*
x +
r*xx) >> 2;
5863 Int_t colxg = (col4g*
x +
g*xx) >> 2;
5864 Int_t colxb = (col4b*
x +
b*xx) >> 2;
5865 col[
x] = (colxr << 16) + (colxg << 8) + colxb;
5871 Int_t clipx1=0, clipx2=0, clipy1=0, clipy2=0;
5875 clipx1 =
gPad->XtoAbsPixel(
gPad->GetX1());
5876 clipx2 =
gPad->XtoAbsPixel(
gPad->GetX2());
5877 clipy1 =
gPad->YtoAbsPixel(
gPad->GetY1());
5878 clipy2 =
gPad->YtoAbsPixel(
gPad->GetY2());
5882 for (
y = 0;
y < (int) source->rows;
y++) {
5885 for (
x = 0;
x < (int) source->width;
x++) {
5889 d = ((d + 10) * 5) >> 8;
5893 if ( noClip || ((
x < (
int) source->width) &&
5894 (bxx < (
int)clipx2) && (bxx >= (
int)clipx1) &&
5895 (byy >= (
int)clipy2) && (byy < (
int)clipy1) )) {
5896 idx =
Idx(bxx + yy);
5897 acolor = (ARGB32)col[d];
5901 fImage->alt.argb32[idx] = acolor;
5920 Warning(
"DrawText",
"Visual not initiated");
5924 if (!
fImage->alt.argb32) {
5949 const wchar_t *wcsTitle =
reinterpret_cast<const wchar_t *
>(
text->
GetWcsTitle());
5950 if (wcsTitle != NULL) {
5960 col =
gROOT->GetColor(1);
5963 ARGB32 color = ARGB32_White;
6017 if (align == 1 || align == 2 || align == 3) {
6019 }
else if (align == 4 || align == 5 || align == 6) {
6026 if (align == 3 || align == 6 || align == 9) {
6028 }
else if (align == 2 || align == 5 || align == 8) {
6035 ftal.x = (ftal.x >> 6);
6036 ftal.y = (ftal.y >> 6);
6041 if (FT_Glyph_To_Bitmap(&glyph->
fImage, ft_render_mode_normal, 0, 1 ))
continue;
6043 FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyph->
fImage;
6044 FT_Bitmap *source = &bitmap->bitmap;
6046 Int_t bx =
x - ftal.x + bitmap->left;
6047 Int_t by =
y + ftal.y - bitmap->top;
6075 if (FT_Glyph_To_Bitmap(&glyph->
fImage, ft_render_mode_normal, 0, 1 ))
continue;
6077 FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyph->
fImage;
6078 FT_Bitmap *source = &bitmap->bitmap;
6080 Int_t bx =
x + bitmap->left;
6081 Int_t by =
y +
h - bitmap->top;
6093 static ASImageExportParams params;
6103 ret = ASImage2xpmRawBuff(img, (CARD8 **)buffer, size, 0);
6106 ret = ASImage2PNGBuff(img, (CARD8 **)buffer, size, ¶ms);
6147 static ASImageImportParams params;
6151 params.filter = SCL_DO_ALL;
6153 params.gamma_table = 0;
6154 params.compression = 0;
6155 params.format = ASA_ASImage;
6156 params.search_path = 0;
6157 params.subimage = 0;
6162 char *ptr = buffer[0];
6163 while (isspace((
int)*ptr)) ++ptr;
6165 fImage = xpm_data2ASImage((
const char**)buffer, ¶ms);
6167 fImage = xpmRawBuff2ASImage((
const char*)*buffer, ¶ms);
6172 fImage = PNGBuff2ASimage((CARD8 *)*buffer, ¶ms);
6203 static char *buf = 0;
6225 ASImage *rendered_im;
6226 ASImageLayer layers[2];
6227 init_image_layers(&(layers[0]), 2);
6229 layers[0].dst_x = 0;
6230 layers[0].dst_y = 0;
6231 layers[0].clip_width = img->width;
6232 layers[0].clip_height = img->height;
6233 layers[0].bevel = 0;
6235 layers[1].dst_x = 0;
6236 layers[1].dst_y = 0;
6237 layers[1].clip_width = img->width;
6238 layers[1].clip_height = img->height;
6239 layers[1].merge_scanlines = blend_scanlines_name2func(
"tint");
6240 rendered_im = merge_layers(
fgVisual, &(layers[0]), 2, img->width, img->height,
6242 destroy_asimage(&img);
6246 ASImage *padimg = 0;
6251 padimg = pad_asimage(
fgVisual, img, 0, d, sz, sz, 0x00ffffff,
6255 padimg = pad_asimage(
fgVisual, img, d, 0, sz, sz, 0x00ffffff,
6260 destroy_asimage(&img);
6265 ASImage2xpmRawBuff(padimg, (CARD8 **)ptr, &size, 0);
6268 destroy_asimage(&padimg);
6274 void TASImage::Streamer(
TBuffer &
b)
6282 if (
b.IsReading()) {
6283 Version_t version =
b.ReadVersion(&R__s, &R__c);
6288 if ( version == 1 ) {
6289 Int_t fileVersion =
b.GetVersionOwner();
6290 if (fileVersion > 0 && fileVersion < 50000 ) {
6291 TImage::Streamer(
b);
6298 if ( fileVersion < 40200 ) {
6309 b.CheckByteCount(R__s, R__c, TASImage::IsA());
6314 TNamed::Streamer(
b);
6317 if (image_type != 0) {
6319 buffer =
new char[size];
6320 b.ReadFastArray(buffer, size);
6324 TAttImage::Streamer(
b);
6329 b.ReadFastArray(vec, size);
6333 b.CheckByteCount(R__s, R__c, TASImage::IsA());
6338 R__c =
b.WriteVersion(TASImage::IsA(),
kTRUE);
6343 TNamed::Streamer(
b);
6345 image_type =
fImage->alt.vector ? 0 : 1;
6348 if (image_type != 0) {
6351 b.WriteFastArray(buffer, size);
6354 TAttImage::Streamer(
b);
6359 b.SetByteCount(R__c,
kTRUE);
6368 if (
fImage->alt.vector) {
6410 if ((start > 0) && (stop - start > 0)) {
6421 Int_t sz = thick*thick;
6425 ARGB32 color = ARGB32_White;
6426 parse_argb_color(col, &color);
6431 matrix =
new CARD32[sz];
6434 for (
int i = 0; i < sz; i++) {
6435 matrix[i] = (CARD32)color;
6439 brush.matrix = matrix;
6440 brush.width = thick;
6441 brush.height = thick;
6442 brush.center_y = brush.center_x = thick/2;
6444 ASDrawContext *ctx = 0;
6447 asim_cube_bezier(ctx,
x1, y1,
x2, y2,
x3, y3);
6460 const char *col,
Int_t thick)
6462 thick = !thick ? 1 : thick;
6463 Int_t sz = thick*thick;
6467 ARGB32 color = ARGB32_White;
6468 parse_argb_color(col, &color);
6473 matrix =
new CARD32[sz];
6476 for (
int i = 0; i < sz; i++) {
6477 matrix[i] = (CARD32)color;
6481 brush.matrix = matrix;
6482 brush.width = thick > 0 ? thick : 1;
6483 brush.height = thick > 0 ? thick : 1;
6484 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6487 asim_straight_ellips(ctx,
x,
y, rx, ry, thick < 0);
6501 thick = !thick ? 1 : thick;
6502 Int_t sz = thick*thick;
6506 ARGB32 color = ARGB32_White;
6507 parse_argb_color(col, &color);
6513 matrix =
new CARD32[sz];
6516 for (
int i = 0; i < sz; i++) {
6517 matrix[i] = (CARD32)color;
6521 brush.matrix = matrix;
6522 brush.height = brush.width = thick > 0 ? thick : 1;
6523 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6526 asim_circle(ctx,
x,
y,
r, thick < 0);
6540 const char *col,
Int_t thick)
6542 thick = !thick ? 1 : thick;
6543 Int_t sz = thick*thick;
6547 ARGB32 color = ARGB32_White;
6548 parse_argb_color(col, &color);
6553 matrix =
new CARD32[sz];
6556 for (
int i = 0; i < sz; i++) {
6557 matrix[i] = (CARD32)color;
6561 brush.matrix = matrix;
6562 brush.width = thick > 0 ? thick : 1;
6563 brush.height = thick > 0 ? thick : 1;
6564 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6567 asim_ellips(ctx,
x,
y, rx, ry, angle, thick < 0);
6580 const char *col,
Int_t thick)
6582 thick = !thick ? 1 : thick;
6583 Int_t sz = thick*thick;
6587 ARGB32 color = ARGB32_White;
6588 parse_argb_color(col, &color);
6593 matrix =
new CARD32[sz];
6596 for (
int i = 0; i < sz; i++) {
6597 matrix[i] = (CARD32)color;
6601 brush.matrix = matrix;
6602 brush.width = thick > 0 ? thick : 1;
6603 brush.height = thick > 0 ? thick : 1;
6604 brush.center_y = brush.center_x = thick > 0 ? thick/2 : 0;
6607 asim_ellips2(ctx,
x,
y, rx, ry, angle, thick < 0);
6619 const char * ,
const char * )
6633 Warning(
"Gray",
"Image not initiated");
6638 Warning(
"Gray",
"Visual not initiated");
6663 if (
fImage->alt.argb32) {
6665 0, ASA_ARGB32, 0, ASIMAGE_QUALITY_DEFAULT);
6667 for (i = 0; i <
fImage->height; i++) {
6668 for (j = 0; j <
fImage->width; j++) {
6671 r = ((
fImage->alt.argb32[idx] & 0xff0000) >> 16);
6672 g = ((
fImage->alt.argb32[idx] & 0x00ff00) >> 8);
6673 b = (
fImage->alt.argb32[idx] & 0x0000ff);
6674 l = (57*
r + 181*
g + 18*
b)/256;
6682 ASImageDecoder *imdec = start_image_decoding(
fgVisual,
fImage, SCL_DO_ALL,
6694 Warning(
"ToGray",
"Failed to start image output");
6701 CARD32 *aa = imdec->buffer.alpha;
6702 CARD32 *rr = imdec->buffer.red;
6703 CARD32 *gg = imdec->buffer.green;
6704 CARD32 *bb = imdec->buffer.blue;
6709 for (i = 0; i <
fImage->height; i++) {
6710 imdec->decode_image_scanline(imdec);
6711 result.flags = imdec->buffer.flags;
6712 result.back_color = imdec->buffer.back_color;
6714 for (j = 0; j <
fImage->width; j++) {
6715 l = (57*rr[j] + 181*gg[j]+ 18*bb[j])/256;
6716 result.alpha[j] = aa[j];
6718 result.green[j] =
l;
6721 imout->output_image_scanline(imout, &result, 1);
6724 stop_image_decoding(&imdec);
6725 stop_image_output(&imout);
6765 Warning(
"FromWindow",
"Visual not initiated");
6773 static int x11 = -1;
6774 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
6779 unsigned char *bits =
gVirtualX->GetColorBits(wid, 0, 0, w,
h);
6784 fImage = bitmap2asimage(bits, w,
h, 0, 0);
6799 for (
UInt_t i = 0; i <
h/2; ++i) {
6800 memcpy(xx, buf + 4*w*i, 4*w);
6801 memcpy(buf + 4*w*i, buf + 4*w*(
h-i-1), 4*w);
6802 memcpy(buf + 4*w*(
h-i-1), xx, 4*w);
6806 fImage = bitmap2asimage(buf, w,
h, 0, 0);
6819 if (!
fImage->alt.vector && on) {
6830 gPad->Range(-left / (1.0 - left - right),
6831 -bottom / (1.0 - top - bottom),
6832 1 + right / (1.0 - left - right),
6833 1 + top / ( 1.0 - top - bottom));
6834 gPad->RangeAxis(0, 0, 1, 1);
6860 name.ReplaceAll(
".",
"_");
6870 out << std::endl << str << std::endl << std::endl;
6873 out << xpm <<
"_img = TImage::Create();" << std::endl;
6874 out <<
" " << xpm <<
"_img->SetImageBuffer( (char **)" << xpm <<
", TImage::kXpm);" << std::endl;
6875 out <<
" " << xpm <<
"_img->Draw();" << std::endl;
6888 static char buf[32];
6889 FILE *fp = fopen(
name,
"rb+");
6892 printf(
"file %s : failed to open\n",
name);
6896 if (!fread(buf, 1, 20, fp)) {
6901 char dpi1 = (
set & 0xffff) >> 8;
6902 char dpi2 =
set & 0xff;
6907 for (i = 0; i < 20; i++) {
6908 if ((buf[i] == 0x4a) && (buf[i+1] == 0x46) && (buf[i+2] == 0x49) &&
6909 (buf[i+3] == 0x46) && (buf[i+4] == 0x00) ) {
6915 if (i == 20 || dpi+4 >= 20) {
6917 printf(
"file %s : wrong JPEG format\n",
name);
6924 buf[dpi + 1] = dpi1;
6925 buf[dpi + 2] = dpi2;
6928 buf[dpi + 3] = dpi1;
6929 buf[dpi + 4] = dpi2;
6932 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.
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.
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 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.
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)
virtual Float_t GetTextSize() const
Return the text size.
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)
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.
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 ~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.
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.
static constexpr double s
#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.
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)
Set the double c value at position i in the array.
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
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)
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
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 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
static constexpr double g