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;\ 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);
1138 static int x11 = -1;
1139 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
1144 unsigned char *bits =
gVirtualX->GetColorBits(wd, 0, 0, w, h);
1149 fImage = bitmap2asimage(bits, w, h, 0, 0);
1170 Error(
"Draw",
"no image set");
1183 w =
Int_t(w*cx) + 4;
1184 h =
Int_t(h*cx) + 28;
1188 rname =
"new TCanvas(\"" + rname +
Form(
"\", %d, %d);", w, h);
1189 gROOT->ProcessLineFast(rname.Data());
1198 gPad->Range(-left / (1.0 - left - right),
1199 -bottom / (1.0 - top - bottom),
1200 1 + right / (1.0 - left - right),
1201 1 + top / ( 1.0 - top - bottom));
1202 gPad->RangeAxis(0, 0, 1, 1);
1225 wsrc = wsrc ? wsrc : im->width;
1226 hsrc = hsrc ? hsrc : im->height;
1228 static int x11 = -1;
1229 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
1236 UInt_t ww = wsrc - ow + (ow ? 8 : 0);
1243 char *bits =
new char[ww*hh];
1245 ASImageDecoder *imdec = start_image_decoding(
fgVisual, im, SCL_DO_ALPHA,
1246 xsrc, ysrc, ww, 0, 0);
1248 for (yy = 0; yy < hh; yy++) {
1249 imdec->decode_image_scanline(imdec);
1250 CARD32 *
a = imdec->buffer.alpha;
1252 for (xx = 0; xx < ww; xx++) {
1267 stop_image_decoding(&imdec);
1270 (
const char *)bits, ww, hh);
1288 if (x11 && (!
gPad ||
gPad->GetGLDevice() == -1)) {
1289 asimage2drawable(
fgVisual, wid, im, (GC)gc, xsrc, ysrc, x, y, wsrc, hsrc, 1);
1292 unsigned char *bits = (
unsigned char *)im->alt.argb32;
1294 img = tile_asimage(
fgVisual, im, xsrc, ysrc, wsrc, hsrc,
1295 0, ASA_ARGB32, 0, ASIMAGE_QUALITY_DEFAULT);
1297 bits = (
unsigned char *)img->alt.argb32;
1304 if (
gPad &&
gPad->GetGLDevice() != -1) {
1306 painter->DrawPixels(bits, wsrc, hsrc, x, y, !option.
Contains(
"opaque"));
1314 gVirtualX->CopyArea(pic, wid, gc, 0, 0, wsrc, hsrc, x, y);
1321 destroy_asimage(&img);
1345 xsrc, ysrc, wsrc, hsrc, opt);
1364 Error(
"Paint",
"no image set");
1369 Warning(
"Paint",
"Visual not initiated");
1373 Int_t tile_x = 0, tile_y = 0;
1374 CARD32 tile_tint = 0;
1383 if (sscanf(opt.
Data() + opt.
Index(
"t"),
"t%d,%d,%s", &tile_x, &tile_y,
1386 if (parse_argb_color(stint, (CARD32*)&tile_tint) == stint)
1389 Error(
"Paint",
"tile option error");
1397 if (!
fImage->alt.vector) {
1410 to_h = (
Int_t)(to_h * (1.0 -
gPad->GetBottomMargin() -
gPad->GetTopMargin() ) + 0.5);
1411 to_w = (
Int_t)(to_w * (1.0 -
gPad->GetLeftMargin() -
gPad->GetRightMargin() ) + 0.5);
1414 if ((to_w < 25 || to_h < 25) && !expand) {
1415 Error(
"Paint",
"pad too small to display an image");
1427 Int_t pal_Ax = to_w +
gPad->UtoAbsPixel(
gPad->GetLeftMargin()) +
1428 (
gPad->UtoAbsPixel(
gPad->GetRightMargin()) / 10);
1430 Int_t pal_x = to_w +
gPad->UtoPixel(
gPad->GetLeftMargin()) +
1431 (
gPad->UtoPixel(
gPad->GetRightMargin()) / 10);
1436 ASImage *grad_im = 0;
1444 grad.type = GRADIENT_Top2Bottom;
1445 grad.color =
new ARGB32[grad.npoints];
1446 grad.offset =
new double[grad.npoints];
1449 Int_t oldPt = grad.npoints -
pt -1;
1450 grad.offset[
pt] = 1 - pal.
fPoints[oldPt];
1451 grad.color[
pt] = (((ARGB32)(pal.
fColorBlue[oldPt] & 0xff00)) >> 8) |
1453 (((ARGB32)(pal.
fColorRed[oldPt] & 0xff00)) << 8) |
1454 (((ARGB32)(pal.
fColorAlpha[oldPt] & 0xff00)) << 16);
1458 pal_h, SCL_DO_COLOR,
1461 delete [] grad.color;
1462 delete [] grad.offset;
1470 to_w, to_h, tile_tint, ASA_ASImage,
1497 ASImage *tmpImage = 0;
1508 destroy_asimage(&tmpImage);
1523 Error(
"Paint",
"image could not be rendered to display");
1527 int tox = expand ? 0 : int(
gPad->UtoPixel(1.) *
gPad->GetLeftMargin());
1528 int toy = expand ? 0 : int(
gPad->VtoPixel(0.) *
gPad->GetTopMargin());
1530 if (!
gROOT->IsBatch()) {
1545 axis.
PaintAxis(pal_Xpos,
gPad->PixeltoY(pal_Ay + pal_h - 1),
1546 pal_Xpos,
gPad->PixeltoY(pal_Ay),
1547 min, max, ndiv,
"+LU");
1552 pal_Xpos,
gPad->AbsPixeltoY(pal_Ay + 1),
1553 min, max, ndiv,
"+L");
1563 gPad->XtoAbsPixel(0),
gPad->YtoAbsPixel(1));
1568 dump->
Merge(&tgrad,
"alphablend", pal_Ax, pal_Ay);
1578 pal_Xpos,
gPad->AbsPixeltoY(pal_Ay + 1),
1579 min, max, ndiv,
"+L");
1583 Warning(
"Paint",
"PDF not implemented yet");
1586 Warning(
"Paint",
"SVG not implemented yet");
1606 x2 = x1+dx/image->width;
1608 y2 = y1+dy/image->height;
1610 x1 =
gPad->GetX1()+dx*
gPad->GetLeftMargin();
1611 x2 = x1+(dx*(1-
gPad->GetRightMargin()-
gPad->GetLeftMargin()))/image->width;
1612 y1 =
gPad->GetY2()-dy*
gPad->GetTopMargin();
1613 y2 = y1+(dy*(1-
gPad->GetTopMargin()-
gPad->GetBottomMargin()))/image->height;
1618 ASImageDecoder *imdec = start_image_decoding(
fgVisual, image, SCL_DO_ALL,
1619 0, 0, image->width, image->height, 0);
1621 for (
Int_t yt = 0; yt < (
Int_t)image->height; yt++) {
1622 imdec->decode_image_scanline(imdec);
1623 for (
Int_t xt = 0; xt < (
Int_t)image->width; xt++)
1625 imdec->buffer.green[xt],
1626 imdec->buffer.blue[xt]);
1628 stop_image_decoding(&imdec);
1633 Double_t xconv = (
gPad->AbsPixeltoX(pal_Ax + pal_w) -
gPad->AbsPixeltoX(pal_Ax)) / grad_im->width;
1634 Double_t yconv = (
gPad->AbsPixeltoY(pal_Ay - pal_h) -
gPad->AbsPixeltoY(pal_Ay)) / grad_im->height;
1635 x1 =
gPad->AbsPixeltoX(pal_Ax);
1637 y2 =
gPad->AbsPixeltoY(pal_Ay);
1642 imdec = start_image_decoding(
fgVisual, grad_im, SCL_DO_ALL,
1643 0, 0, grad_im->width, grad_im->height, 0);
1645 for (
Int_t yt = 0; yt < (
Int_t)grad_im->height; yt++) {
1646 imdec->decode_image_scanline(imdec);
1647 for (
Int_t xt = 0; xt < (
Int_t)grad_im->width; xt++)
1649 imdec->buffer.green[xt],
1650 imdec->buffer.blue[xt]);
1653 stop_image_decoding(&imdec);
1664 pal_Xpos,
gPad->AbsPixeltoY(pal_Ay + 1),
1665 min, max, ndiv,
"+L");
1671 destroy_asimage(&grad_im);
1680 Int_t pxl, pyl, pxt, pyt;
1687 if (px1 < px2) {pxl = px1; pxt = px2;}
1688 else {pxl = px2; pxt = px1;}
1689 if (py1 < py2) {pyl = py1; pyt = py2;}
1690 else {pyl = py2; pyt = py1;}
1692 if ((px > pxl && px < pxt) && (py > pyl && py < pyt))
1703 static TBox *ZoomBox;
1708 gPad->ExecuteEvent(event, px, py);
1714 static Int_t px1old, py1old, px2old, py2old;
1715 static Int_t px1, py1, px2, py2, pxl, pyl, pxt, pyt;
1726 if (imgX < 0) px = px - imgX;
1727 if (imgY < 0) py = py - imgY;
1732 if (imgX >= (
int)image->width) px = px - imgX + image->width - 1;
1733 if (imgY >= (
int)image->height) py = py - imgY + image->height - 1;
1738 px1 =
gPad->XtoAbsPixel(
gPad->GetX1());
1739 py1 =
gPad->YtoAbsPixel(
gPad->GetY1());
1740 px2 =
gPad->XtoAbsPixel(
gPad->GetX2());
1741 py2 =
gPad->YtoAbsPixel(
gPad->GetY2());
1742 px1old = px; py1old = py;
1764 ZoomBox =
new TBox(pxl, pyl, pxt, pyt);
1766 ZoomBox->
Draw(
"l*");
1785 Int_t imgX1 = px1old -
gPad->XtoAbsPixel(0);
1786 Int_t imgY1 = py1old -
gPad->YtoAbsPixel(1);
1787 Int_t imgX2 = px -
gPad->XtoAbsPixel(0);
1788 Int_t imgY2 = py -
gPad->YtoAbsPixel(1);
1790 imgY1 = image->height - 1 - imgY1;
1791 imgY2 = image->height - 1 - imgY2;
1797 Zoom((imgX1 < imgX2) ? imgX1 : imgX2, (imgY1 < imgY2) ? imgY1 : imgY2,
1816 static char info[64];
1822 px -=
gPad->XtoAbsPixel(0);
1823 py -=
gPad->YtoAbsPixel(1);
1826 if (px < 0 || py < 0)
return info;
1830 if (px >= (
int)image->width || py >= (
int)image->height)
1833 py = image->height - 1 - py;
1840 if (
fImage->alt.vector) {
1841 snprintf(info,64,
"x: %d y: %d %.5g",
1844 snprintf(info,64,
"x: %d y: %d", px, py);
1860 Warning(
"SetPalette",
"Visual not initiated");
1865 Warning(
"SetPalette",
"Image not valid");
1869 if (
fImage->alt.vector == 0)
1875 ASVectorPalette asPalette;
1877 asPalette.channels[0] =
new CARD16 [asPalette.npoints];
1878 asPalette.channels[1] =
new CARD16 [asPalette.npoints];
1879 asPalette.channels[2] =
new CARD16 [asPalette.npoints];
1880 asPalette.channels[3] =
new CARD16 [asPalette.npoints];
1886 asPalette.points =
new double[asPalette.npoints];
1887 for (
Int_t point = 0; point <
Int_t(asPalette.npoints); point++)
1893 delete [] asPalette.points;
1894 for (Int_t col = 0; col < 4; col++)
1895 delete [] asPalette.channels[col];
1914 Warning(
"Scale",
"Image not initiated");
1919 Warning(
"Scale",
"Visual not initiated");
1927 if (toWidth > 30000)
1929 if (toHeight > 30000)
1932 ASImage *img = scale_asimage(
fgVisual,
fImage, toWidth, toHeight,
1949 Warning(
"Scale",
"Image not initiated");
1954 Warning(
"Scale",
"Visual not initiated");
1962 if (toWidth > 30000)
1964 if (toHeight > 30000)
1968 yStart, yEnd, toWidth, toHeight,
1984 Warning(
"Tile",
"Image not initiated");
1989 Warning(
"Tile",
"Visual not initiated");
1997 if (toWidth > 30000)
1999 if (toHeight > 30000)
2002 ASImage *img = tile_asimage(
fgVisual,
fImage, 0, 0, toWidth, toHeight, 0,
2024 Warning(
"Zoom",
"Image not valid");
2046 Warning(
"UnZoom",
"Image not valid");
2074 Warning(
"Flip",
"Image not valid");
2078 Warning(
"Flip",
"Visual not initiated");
2082 if (
fImage->alt.vector) {
2083 Warning(
"Flip",
"flip does not work for data images");
2087 Int_t rflip = flip/90;
2121 Warning(
"Mirror",
"Image not valid");
2126 Warning(
"Mirror",
"Visual not initiated");
2130 if (
fImage->alt.vector) {
2131 Warning(
"Mirror",
"mirror does not work for data images");
2203 if (inbatch && !noX) {
2215 fgVisual = create_asvisual(0, 0, 0, 0);
2222 fgVisual = create_asvisual(0, 0, 0, 0);
2225 disp = (Display*)
gVirtualX->GetDisplay();
2228 Visual *vis = (Visual*)
gVirtualX->GetVisual();
2231 if (vis == 0 || cmap == 0) {
2232 fgVisual = create_asvisual(0, 0, 0, 0);
2234 fgVisual = create_asvisual_for_id(disp, screen, depth,
2235 XVisualIDFromVisual(vis), cmap, 0);
2239 fgVisual = create_asvisual(0, 0, 0, 0);
2252 Warning(
"StartPaletteEditor",
"Image not valid");
2255 if (
fImage->alt.vector == 0) {
2256 Warning(
"StartPaletteEditor",
"palette can be modified only for data images");
2271 Warning(
"GetPixmap",
"Visual not initiated");
2279 static int x11 = -1;
2280 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
2286 if (!
fImage->alt.argb32) {
2289 ret =
gVirtualX->CreatePixmapFromData((
unsigned char*)
fImage->alt.argb32,
2305 Warning(
"GetMask",
"Visual not initiated");
2312 Warning(
"GetMask",
"No image");
2317 UInt_t ow = img->width%8;
2318 UInt_t ww = img->width - ow + (ow ? 8 : 0);
2325 char *bits =
new char[ww*hh];
2327 ASImageDecoder *imdec = start_image_decoding(
fgVisual, img, SCL_DO_ALPHA,
2334 for (y = 0; y < hh; y++) {
2335 imdec->decode_image_scanline(imdec);
2336 CARD32 *
a = imdec->buffer.alpha;
2338 for (x = 0; x < ww; x++) {
2352 stop_image_decoding(&imdec);
2353 pxmap =
gVirtualX->CreateBitmap(
gVirtualX->GetDefaultRootWindow(), (
const char *)bits,
2365 Warning(
"SetImage",
"Visual not initiated");
2375 gVirtualX->GetWindowSize(pxm, xy, xy, w, h);
2379 static int x11 = -1;
2380 if (x11 < 0) x11 =
gVirtualX->InheritsFrom(
"TGX11");
2385 unsigned char *bits =
gVirtualX->GetColorBits(pxm, 0, 0, w, h);
2392 fImage = bitmap2asimage(bits, w, h, 0, 0);
2396 unsigned char *mask_bits =
gVirtualX->GetColorBits(mask, 0, 0, w, h);
2397 fImage = bitmap2asimage(bits, w, h, 0, mask_bits);
2398 delete [] mask_bits;
2409 Warning(
"GetPixels",
"Wrong Image");
2414 ASImageDecoder *imdec;
2416 width = !width ? img->width :
width;
2417 height = !height ? img->height : height;
2428 if ((x >= (
int)img->width) || (y >= (
int)img->height)) {
2432 if ((
int)(x + width) > (
int)img->width) {
2433 width = img->width -
x;
2436 if ((
int)(y + height) > (
int)img->height) {
2437 height = img->height -
y;
2440 if ((imdec = start_image_decoding(0,
fImage, SCL_DO_ALL, 0, y,
2441 img->width, height, 0)) == 0) {
2442 Warning(
"GetPixels",
"Failed to create image decoder");
2452 for (
UInt_t k = 0; k < height; k++) {
2453 imdec->decode_image_scanline(imdec);
2456 if ((r == (
Int_t)imdec->buffer.red[i]) &&
2457 (g == (
Int_t)imdec->buffer.green[i]) &&
2458 (b == (
Int_t)imdec->buffer.blue[i])) {
2460 r = (
Int_t)imdec->buffer.red[i];
2461 g = (
Int_t)imdec->buffer.green[i];
2462 b = (
Int_t)imdec->buffer.blue[i];
2465 ret->
AddAt(p, k*width + i);
2469 stop_image_decoding(&imdec);
2481 Warning(
"GetVecArray",
"Bad Image");
2484 if (
fImage->alt.vector) {
2485 return fImage->alt.vector;
2503 Warning(
"GetArray",
"Bad Image");
2509 if (
fImage->alt.vector) {
2514 ASImageDecoder *imdec;
2516 w = w ? w :
fImage->width;
2525 if ((imdec = start_image_decoding(0, img, SCL_DO_ALL, 0, 0,
2526 img->width, 0, 0)) == 0) {
2527 Warning(
"GetArray",
"Failed to create image decoder");
2538 for (
UInt_t k = 0; k <
h; k++) {
2539 imdec->decode_image_scanline(imdec);
2541 for (
UInt_t i = 0; i < w; ++i) {
2542 if ((r == imdec->buffer.red[i]) &&
2543 (g == imdec->buffer.green[i]) &&
2544 (b == imdec->buffer.blue[i])) {
2546 r = imdec->buffer.red[i];
2547 g = imdec->buffer.green[i];
2548 b = imdec->buffer.blue[i];
2549 if (palette) p = palette->
FindColor(r, g, b);
2551 v = palette ? palette->
fPoints[p] :
Double_t((r << 16) + (g << 8) + b)/0xFFFFFF;
2552 ret->
AddAt(v, (h-k-1)*w + i);
2556 stop_image_decoding(&imdec);
2579 const char *color,
const char *font_name,
2583 ARGB32 text_color = ARGB32_Black;
2584 ASImage *fore_im = 0;
2585 ASImage *text_im = 0;
2589 Warning(
"DrawText",
"Visual not initiated");
2597 if (fn.
Last(
'/') == 0) fn = fn(1, fn.
Length() - 1);
2610 parse_argb_color(color, &text_color);
2623 Warning(
"DrawText",
"cannot create Font Manager");
2630 font = get_asfont(
gFontManager,
"fixed", 0, size, ASF_GuessWho);
2632 Warning(
"DrawText",
"cannot find a font %s", font_name);
2637 get_text_size(text, font, (ASText3DType)type, &width, &height);
2640 fImage = create_asimage(width, height, 0);
2644 text_im = draw_text(text, font, (ASText3DType)type, 0);
2649 ASImage *tmp = file2ASImage(fore_file, 0xFFFFFFFF, SCREEN_GAMMA, 0, 0);
2651 if ((tmp->width != width) || (tmp->height != height)) {
2652 fore_im = tile_asimage(
fgVisual, tmp, 0, 0, width, height, 0,
2655 destroy_asimage(&tmp);
2662 move_asimage_channel(fore_im, IC_ALPHA, text_im, IC_ALPHA);
2663 destroy_asimage(&text_im);
2671 ASImage *rendered_im;
2672 ASImageLayer layers[2];
2674 init_image_layers(&(layers[0]), 2);
2675 fore_im->back_color = text_color;
2676 layers[0].im = rimg;
2677 layers[0].dst_x = 0;
2678 layers[0].dst_y = 0;
2679 layers[0].clip_width = rimg->width;
2680 layers[0].clip_height = rimg->height;
2681 layers[0].bevel = 0;
2682 layers[1].im = fore_im;
2683 layers[1].dst_x =
x;
2684 layers[1].dst_y =
y;
2685 layers[1].clip_width = fore_im->width;
2686 layers[1].clip_height = fore_im->height;
2688 rendered_im = merge_layers(
fgVisual, &(layers[0]), 2, rimg->width, rimg->height,
2691 destroy_asimage(&fore_im);
2724 Warning(
"Merge",
"Visual not initiated");
2728 ASImage *rendered_im;
2729 ASImageLayer layers[2];
2731 init_image_layers(&(layers[0]), 2);
2733 layers[0].dst_x = 0;
2734 layers[0].dst_y = 0;
2735 layers[0].clip_width =
fImage->width;
2736 layers[0].clip_height =
fImage->height;
2737 layers[0].bevel = 0;
2738 layers[1].im = ((
TASImage*)im)->fImage;
2739 layers[1].dst_x =
x;
2740 layers[1].dst_y =
y;
2741 layers[1].clip_width = im->
GetWidth();
2742 layers[1].clip_height = im->
GetHeight();
2743 layers[1].merge_scanlines = blend_scanlines_name2func(op ? op :
"add");
2761 Warning(
"Blur",
"Visual not initiated");
2766 fImage = create_asimage(100, 100, 0);
2769 Warning(
"Blur",
"Failed to create image");
2776 ASImage *rendered_im = blur_asimage_gauss(
fgVisual,
fImage, hr > 0 ? hr : 3,
2777 vr > 0 ? vr : 3, SCL_DO_ALL,
2790 Warning(
"Clone",
"Image not initiated");
2797 Warning(
"Clone",
"Failed to create image");
2813 if (
fImage->alt.argb32) {
2815 im->
fImage->alt.argb32 = (ARGB32*)safemalloc(sz*
sizeof(ARGB32));
2816 memcpy(im->
fImage->alt.argb32,
fImage->alt.argb32, sz *
sizeof(ARGB32));
2836 Warning(
"Vectorize",
"Visual not initiated");
2841 fImage = create_asimage(100, 100, 0);
2844 Warning(
"Vectorize",
"Failed to create image");
2855 dither = dither > 7 ? 7 : dither;
2857 res = colormap_asimage(
fImage, &cmap, max_colors, dither, opaque_threshold);
2869 g = INDEX_SHIFT_GREEN(cmap.entries[res[i]].green);
2870 b = INDEX_SHIFT_BLUE(cmap.entries[res[i]].blue);
2871 r = INDEX_SHIFT_RED(cmap.entries[res[i]].red);
2873 v = MAKE_INDEXED_COLOR24(r,
g,
b);
2883 for (
UInt_t j = 0; j < cmap.count; j++) {
2884 g = INDEX_SHIFT_GREEN(cmap.entries[j].green);
2885 b = INDEX_SHIFT_BLUE(cmap.entries[j].blue);
2886 r = INDEX_SHIFT_RED(cmap.entries[j].red);
2887 v = MAKE_INDEXED_COLOR24(r,
g,
b);
2889 v = (v>>12) & 0x0FFF;
2892 pal->
fColorRed[j] = cmap.entries[j].red << 8;
2894 pal->
fColorBlue[j] = cmap.entries[j].blue << 8;
2898 destroy_colormap(&cmap,
kTRUE);
2901 fImage->alt.vector = vec;
2903 if (res)
delete res;
2949 Warning(
"HSV",
"Visual not initiated");
2954 fImage = create_asimage(width ? width : 20, height ? height : 20, 0);
2957 Warning(
"HSV",
"Failed to create image");
2967 height = !height ?
fImage->height : height;
2969 ASImage *rendered_im = 0;
2972 rendered_im = adjust_asimage_hsv(
fgVisual,
fImage, x, y, width, height,
2973 hue, radius, H, S, V, ASA_ASImage, 100,
2974 ASIMAGE_QUALITY_TOP);
2977 Warning(
"HSV",
"Failed to create rendered image");
3012 Warning(
"Gradient",
"Visual not initiated");
3016 ASImage *rendered_im = 0;
3017 ASGradient gradient;
3019 int reverse = 0, npoints1 = 0, npoints2 = 0;
3026 if ((angle > 2 * 180 * 15 / 16) || (angle < 2 * 180 * 1 / 16)) {
3027 gradient.type = GRADIENT_Left2Right;
3028 }
else if (angle < 2 * 180 * 3 / 16) {
3029 gradient.type = GRADIENT_TopLeft2BottomRight;
3030 }
else if (angle < 2 * 180 * 5 / 16) {
3031 gradient.type = GRADIENT_Top2Bottom;
3032 }
else if (angle < 2 * 180 * 7 / 16) {
3033 gradient.type = GRADIENT_BottomLeft2TopRight; reverse = 1;
3034 }
else if (angle < 2 * 180 * 9 / 16) {
3035 gradient.type = GRADIENT_Left2Right; reverse = 1;
3036 }
else if (angle < 2 * 180 * 11 / 16) {
3037 gradient.type = GRADIENT_TopLeft2BottomRight; reverse = 1;
3038 }
else if (angle < 2 * 180 * 13 / 16) {
3039 gradient.type = GRADIENT_Top2Bottom; reverse = 1;
3041 gradient.type = GRADIENT_BottomLeft2TopRight;
3044 for (p = (
char*)colors; isspace((
int)*p); p++) { }
3046 for (npoints1 = 0; *p; npoints1++) {
3048 for ( ; *p && !isspace((
int)*p); p++) { }
3050 for ( ; isspace((
int)*p); p++) { }
3053 for (p = (
char*)offsets; isspace((
int)*p); p++) { }
3055 for (npoints2 = 0; *p; npoints2++) {
3057 for ( ; *p && !isspace((
int)*p); p++) { }
3059 for ( ; isspace((
int)*p); p++) { }
3064 if (offsets && (npoints1 > npoints2)) npoints1 = npoints2;
3073 gradient.color =
new ARGB32[npoints1];
3074 gradient.offset =
new double[npoints1];
3076 for (p = (
char*)
colors; isspace((
int)*p); p++) { }
3078 for (npoints1 = 0; *p; ) {
3082 for ( ; *p && !isspace((
int)*p); p++) { }
3084 for ( ; isspace((
int)*p); p++) { }
3086 col = str(pb - colors, p - pb);
3088 if (parse_argb_color(col.
Data(), gradient.color + npoints1) != col) {
3091 Warning(
"Gradient",
"Failed to parse color [%s] - defaulting to black", pb);
3096 for (p = (
char*)offsets; isspace((
int)*p); p++) { }
3098 for (npoints2 = 0; *p; ) {
3102 for ( ; *p && !isspace((
int)*p); p++) { }
3105 gradient.offset[npoints2] = strtod(pb, &pb);
3107 if (pb == p) npoints2++;
3109 for ( ; isspace((
int)*p); p++) { }
3112 for (npoints2 = 0; npoints2 < npoints1; npoints2++) {
3113 gradient.offset[npoints2] = (double)npoints2 / (npoints1 - 1);
3116 gradient.npoints = npoints1;
3118 if (npoints2 && (gradient.npoints > npoints2)) {
3119 gradient.npoints = npoints2;
3122 for (i = 0; i < gradient.npoints/2; i++) {
3123 int i2 = gradient.npoints - 1 - i;
3124 ARGB32
c = gradient.color[i];
3125 double o = gradient.offset[i];
3126 gradient.color[i] = gradient.color[i2];
3127 gradient.color[i2] =
c;
3128 gradient.offset[i] = gradient.offset[i2];
3129 gradient.offset[i2] = o;
3131 for (i = 0; i < gradient.npoints; i++) {
3132 gradient.offset[i] = 1.0 - gradient.offset[i];
3135 rendered_im = make_gradient(
fgVisual, &gradient, width, height, SCL_DO_ALL,
3138 delete [] gradient.color;
3139 delete [] gradient.offset;
3143 Warning(
"Gradient",
"Failed to create gradient image");
3152 ASImageLayer layers[2];
3154 init_image_layers(&(layers[0]), 2);
3156 layers[0].dst_x = 0;
3157 layers[0].dst_y = 0;
3158 layers[0].clip_width =
fImage->width;
3159 layers[0].clip_height =
fImage->height;
3160 layers[0].bevel = 0;
3161 layers[1].im = rendered_im;
3162 layers[1].dst_x =
x;
3163 layers[1].dst_y =
y;
3164 layers[1].clip_width =
width;
3165 layers[1].clip_height = height;
3166 layers[1].merge_scanlines = alphablend_scanlines;
3171 Warning(
"Gradient",
"Failed to create merged image");
3175 destroy_asimage(&rendered_im);
3190 cmp = (cmp * 12) / 10;
3192 return (cmp > 255) ? 255 : cmp;
3213 return (background >> 1) & 0x7F7F7F7F;
3224 a = ARGB32_ALPHA8(foreground) + ARGB32_ALPHA8(background);
3226 r = ARGB32_RED8(foreground) + ARGB32_RED8(background);
3228 g = ARGB32_GREEN8(foreground) + ARGB32_GREEN8(background);
3230 b = ARGB32_BLUE8(foreground) + ARGB32_BLUE8(background);
3233 return MAKE_ARGB32(a, r, g, b);
3249 const char *hi_color,
const char *lo_color,
UShort_t thick,
3253 Warning(
"Bevel",
"Visual not initiated");
3260 ARGB32
hi=ARGB32_White, lo=ARGB32_White;
3261 parse_argb_color(hi_color, &hi);
3262 parse_argb_color(lo_color, &lo);
3265 bevel.lo_color =
hi;
3267 bevel.hi_color = lo;
3270 bevel.hi_color =
hi;
3272 bevel.lo_color = lo;
3277 int extra_hilite = 2;
3278 bevel.left_outline = bevel.top_outline = bevel.right_outline = bevel.bottom_outline = thick;
3279 bevel.left_inline = bevel.top_inline = bevel.right_inline = bevel.bottom_inline = extra_hilite + 1;
3281 if (bevel.top_outline > 1) {
3282 bevel.top_inline += bevel.top_outline - 1;
3285 if (bevel.left_outline > 1) {
3286 bevel.left_inline += bevel.left_outline - 1;
3289 if (bevel.right_outline > 1) {
3290 bevel.right_inline += bevel.right_outline - 1;
3293 if (bevel.bottom_outline > 1) {
3294 bevel.bottom_inline += bevel.bottom_outline - 1;
3298 ARGB32
fill = ((hi>>24) != 0xff) || ((lo>>24) != 0xff) ? bevel.hilo_color : (bevel.hilo_color | 0xff000000);
3301 fImage = create_asimage(width ? width : 20, height ? height : 20, 0);
3304 Warning(
"Bevel",
"Failed to create image");
3314 height = !height ?
fImage->height : height;
3316 ASImageLayer layers[2];
3317 init_image_layers(&(layers[0]), 2);
3320 layers[0].dst_x = 0;
3321 layers[0].dst_y = 0;
3322 layers[0].clip_width =
fImage->width;
3323 layers[0].clip_height =
fImage->height;
3324 layers[0].bevel = 0;
3326 UInt_t w = width - (bevel.left_outline + bevel.right_outline);
3327 UInt_t h = height - (bevel.top_outline + bevel.bottom_outline);
3328 ASImage *bevel_im = create_asimage(w, h, 0);
3331 Warning(
"Bevel",
"Failed to create bevel image");
3335 layers[1].im = bevel_im;
3336 fill_asimage(
fgVisual, bevel_im, 0, 0, w, h, fill);
3338 layers[1].dst_x =
x;
3339 layers[1].dst_y =
y;
3340 layers[1].clip_width =
width;
3341 layers[1].clip_height = height;
3342 layers[1].bevel = &bevel;
3343 layers[1].merge_scanlines = alphablend_scanlines;
3347 destroy_asimage(&bevel_im);
3350 Warning(
"Bevel",
"Failed to image");
3370 Warning(
"Pad",
"Visual not initiated");
3375 fImage = create_asimage(100, 100, 0);
3378 Warning(
"Pad",
"Failed to create image");
3387 ARGB32 color = ARGB32_White;
3388 parse_argb_color(col, &color);
3399 Warning(
"Pad",
"Failed to create output image");
3416 Warning(
"Crop",
"Visual not initiated");
3429 height = y + height >
fImage->height ?
fImage->height -
y : height;
3431 if ((width ==
fImage->width) && (height ==
fImage->height)) {
3432 Warning(
"Crop",
"input size larger than image");
3435 ASImageDecoder *imdec = start_image_decoding(
fgVisual,
fImage, SCL_DO_ALL,
3436 x, y, width, height, 0);
3439 Warning(
"Crop",
"Failed to start image decoding");
3443 ASImage *img = create_asimage(width, height, 0);
3447 Warning(
"Crop",
"Failed to create image");
3451 ASImageOutput *imout = start_image_output(
fgVisual, img, ASA_ASImage,
3455 Warning(
"Crop",
"Failed to start image output");
3456 destroy_asimage(&img);
3457 if (imdec)
delete [] imdec;
3465 for (
UInt_t i = 0; i < height; i++) {
3466 imdec->decode_image_scanline(imdec);
3467 imout->output_image_scanline(imout, &(imdec->buffer), 1);
3470 stop_image_decoding(&imdec);
3471 stop_image_output(&imout);
3495 Warning(
"Append",
"Visual not initiated");
3512 Merge(im,
"alphablend", width, 0);
3513 }
else if (opt ==
"/") {
3515 Merge(im,
"alphablend", 0, height);
3534 Warning(
"BeginPaint",
"Visual not initiated");
3549 0, ASA_ARGB32, 0, ASIMAGE_QUALITY_DEFAULT);
3552 Warning(
"BeginPaint",
"Failed to create image");
3566 Warning(
"EndPaint",
"no image");
3570 if (!
fImage->alt.argb32)
return;
3573 0, ASA_ASImage, 0, ASIMAGE_QUALITY_DEFAULT);
3576 Warning(
"EndPaint",
"Failed to create image");
3593 Warning(
"GetArgbArray",
"no image");
3600 if (!img->alt.argb32) {
3610 return (
UInt_t *)img->alt.argb32;
3621 Warning(
"GetRgbaArray",
"no image");
3628 if (!img->alt.argb32) {
3646 for (i = 0; i < img->height; i++) {
3647 for (j = 0; j < img->width; j++) {
3649 argb = img->alt.argb32[idx];
3651 rgb = argb & 0x00ffffff;
3652 rgba = (rgb << 8) + a;
3667 Warning(
"GetScanline",
"no image");
3672 CARD32 *ret =
new CARD32[img->width];
3674 ASImageDecoder *imdec = start_image_decoding(
fgVisual, img, SCL_DO_ALL,
3675 0, y, img->width, 1, 0);
3679 Warning(
"GetScanline",
"Failed to start image decoding");
3687 imdec->decode_image_scanline(imdec);
3688 memcpy(imdec->buffer.buffer, ret, img->width*
sizeof(CARD32));
3689 stop_image_decoding(&imdec);
3704 #if defined(R__GNU) && defined(__i386__) && !defined(__sun) 3705 #define _MEMSET_(dst, lng, val) __asm__("movl %0,%%eax \n"\ 3706 "movl %1,%%edi \n" \ 3707 "movl %2,%%ecx \n" \ 3712 :"g" (val), "g" (dst), "g" (lng) \ 3713 :"eax","edi","ecx" \ 3717 #define _MEMSET_(dst, lng, val) do {\ 3718 for( UInt_t j=0; j < lng; j++) *((dst)+j) = val; } while (0) 3722 #define FillSpansInternal(npt, ppt, widths, color) do {\ 3723 UInt_t yy = ppt[0].fY*fImage->width;\ 3724 for (UInt_t i = 0; i < npt; i++) {\ 3725 _MEMSET_(&fImage->alt.argb32[Idx(yy + ppt[i].fX)], widths[i], color);\ 3726 yy += ((i+1 < npt) && (ppt[i].fY != ppt[i+1].fY) ? fImage->width : 0);\ 3738 Warning(
"FillRectangle",
"Visual not initiated");
3743 Warning(
"FillRectangle",
"no image");
3747 if (!
fImage->alt.argb32) {
3751 if (!
fImage->alt.argb32) {
3752 Warning(
"FillRectangle",
"Failed to get pixel array");
3756 ARGB32 color = (ARGB32)col;
3758 if (width == 0) width = 1;
3759 if (height == 0) height = 1;
3770 Bool_t has_alpha = (color & 0xff000000) != 0xff000000;
3776 height = y + height >
fImage->height ?
fImage->height -
y : height;
3778 if (!
fImage->alt.argb32) {
3781 int yyy = y*
fImage->width;
3783 ARGB32 *p0 =
fImage->alt.argb32 + yyy +
x;
3785 for (
UInt_t i = 0; i < height; i++) {
3790 for (
UInt_t i = y; i < y + height; i++) {
3815 Warning(
"Fill",
"Visual not initiated");
3819 ARGB32 color = ARGB32_White;
3822 parse_argb_color(col, &color);
3826 fImage = create_asimage(width ? width : 20, height ? height : 20, 0);
3840 ARGB32 color = (ARGB32)col;
3843 if (!thick) thick = 1;
3851 thick += (x - half);
3857 x = x + thick >=
fImage->width ?
fImage->width - thick - 1 :
x;
3859 int yy = y1*
fImage->width;
3861 for (
UInt_t w = 0; w < thick; w++) {
3862 if (x + w < fImage->
width) {
3875 ARGB32 color = (ARGB32)col;
3878 if (!thick) thick = 1;
3886 thick += (y - half);
3890 y = y + thick >=
fImage->height ?
fImage->height - thick - 1 :
y;
3894 int yy = y*
fImage->width;
3895 for (
UInt_t w = 0; w < thick; w++) {
3897 if (y + w < fImage->height) {
3909 const char *col,
UInt_t thick)
3911 ARGB32 color = ARGB32_White;
3912 parse_argb_color(col, &color);
3924 int x,
y, xend, yend;
3931 Warning(
"DrawLine",
"Visual not initiated");
3936 Warning(
"DrawLine",
"no image");
3940 if (!
fImage->alt.argb32) {
3944 if (!
fImage->alt.argb32) {
3945 Warning(
"DrawLine",
"Failed to get pixel array");
3949 ARGB32 color = (ARGB32)col;
3954 if (!dx && !dy)
return;
3958 y2 > y1 ? y2 : y1, color, thick);
3964 x2 > x1 ? x2 : x1, color, thick);
3976 i2 = i1 - (dx << 1);
3993 q = (y2 - y1) * ydir;
4026 i2 = i1 - (dy << 1);
4043 q = (x2 -
x1) * xdir;
4081 const char *col,
UInt_t thick)
4084 Warning(
"DrawRectangle",
"Visual not initiated");
4093 fImage = create_asimage(w, h, 0);
4098 if (!
fImage->alt.argb32) {
4102 if (!
fImage->alt.argb32) {
4103 Warning(
"DrawRectangle",
"Failed to get pixel array");
4107 ARGB32 color = ARGB32_White;
4108 parse_argb_color(col, &color);
4128 ARGB32 color = ARGB32_White;
4133 fImage = create_asimage(w, h, 0);
4139 parse_argb_color(col, &color);
4145 parse_argb_color(col, &color);
4175 ARGB32 color = (ARGB32)col;
4185 thick += (y - half);
4188 thick = thick <= 0 ? 1 : thick;
4190 y = y + thick >=
fImage->height ?
fImage->height - thick - 1 :
y;
4196 x1 = x2 < x1 ?
x2 :
x1;
4197 x2 = x2 < tmp ? tmp :
x2;
4200 for (
UInt_t w = 0; w < thick; w++) {
4201 if (y + w < fImage->height) {
4209 if (i >= pDash[iDash]) {
4213 if (iDash >= nDash) {
4229 ARGB32 color = (ARGB32)col;
4239 thick += (x - half);
4242 thick = thick <= 0 ? 1 : thick;
4249 y1 = y2 < y1 ? y2 : y1;
4250 y2 = y2 < tmp ? tmp : y2;
4252 x = x + thick >=
fImage->width ?
fImage->width - thick - 1 :
x;
4254 int yy = y1*
fImage->width;
4256 for (
UInt_t w = 0; w < thick; w++) {
4257 if (x + w < fImage->
width) {
4265 if (i >= pDash[iDash]) {
4269 if (iDash >= nDash) {
4285 int x,
y, xend, yend;
4295 char *pDash =
new char[nDash];
4300 for (i = 0; i < (int)nDash; i++) {
4306 i2 = i1 - (dx << 1);
4324 q = (y2 - y1) * ydir;
4329 if ((iDash%2) == 0) {
4341 if (i >= pDash[iDash]) {
4345 if (iDash >= nDash) {
4353 if ((iDash%2) == 0) {
4365 if (i >= pDash[iDash]) {
4369 if (iDash >= nDash) {
4378 for (i = 0; i < (int)nDash; i++) {
4384 i2 = i1 - (dy << 1);
4402 q = (x2 -
x1) * xdir;
4407 if ((iDash%2) == 0) {
4421 if (i >= pDash[iDash]) {
4425 if (iDash >= nDash) {
4433 if ((iDash%2) == 0) {
4447 if (i >= pDash[iDash]) {
4451 if (iDash >= nDash) {
4469 double x,
y, xend=0, yend=0, x0, y0;
4477 double *xDash =
new double[nDash];
4478 double *yDash =
new double[nDash];
4483 for (i = 0; i < (int)nDash; i++) {
4484 xDash[i] = tDash[i] * ac;
4485 yDash[i] = tDash[i] *
as;
4489 xDash[i] = xDash[i]/2;
4490 yDash[i] = yDash[i]/2;
4492 xDash[i] = xDash[i]*2;
4493 yDash[i] = yDash[i]*2;
4510 q = (y2 - y1) * ydir;
4517 while ((x < xend) && (y < yend)) {
4521 if ((iDash%2) == 0) {
4531 if (iDash >= nDash) {
4536 while ((x < xend) && (y > yend)) {
4540 if ((iDash%2) == 0) {
4550 if (iDash >= nDash) {
4569 q = (x2 -
x1) * xdir;
4576 while ((x < xend) && (y < yend)) {
4580 if ((iDash%2) == 0) {
4590 if (iDash >= nDash) {
4595 while ((x > xend) && (y < yend)) {
4599 if ((iDash%2) == 0) {
4609 if (iDash >= nDash) {
4623 const char *pDash,
const char *col,
UInt_t thick)
4627 Warning(
"DrawDashLine",
"Visual not initiated");
4632 Warning(
"DrawDashLine",
"no image");
4636 if (!
fImage->alt.argb32) {
4640 if (!
fImage->alt.argb32) {
4641 Warning(
"DrawDashLine",
"Failed to get pixel array");
4645 if ((nDash < 2) || !pDash || (nDash%2)) {
4646 Warning(
"DrawDashLine",
"Wrong input parameters n=%d %ld", nDash, (
Long_t)
sizeof(pDash)-1);
4650 ARGB32 color = ARGB32_White;
4651 parse_argb_color(col, &color);
4655 }
else if (y1 == y2) {
4669 ARGB32 color = ARGB32_White;
4670 parse_argb_color(col, &color);
4677 for (
UInt_t i = 1; i < nn; i++) {
4694 Warning(
"PutPixel",
"Visual not initiated");
4699 Warning(
"PutPixel",
"no image");
4703 if (!
fImage->alt.argb32) {
4707 if (!
fImage->alt.argb32) {
4708 Warning(
"PutPixel",
"Failed to get pixel array");
4713 parse_argb_color(col, &color);
4715 if ((x < 0) || (y < 0) || (x >= (
int)
fImage->width) || (y >= (
int)
fImage->height)) {
4716 Warning(
"PutPixel",
"Out of range width=%d x=%d, height=%d y=%d",
4729 Warning(
"PolyPoint",
"Visual not initiated");
4734 Warning(
"PolyPoint",
"no image");
4738 if (!
fImage->alt.argb32) {
4742 if (!
fImage->alt.argb32) {
4743 Warning(
"PolyPoint",
"Failed to get pixel array");
4748 Warning(
"PolyPoint",
"No points specified");
4755 parse_argb_color(col, &color);
4761 for (i = 0; i < npt; i++) {
4762 ipt[i].
fX += ppt[i].
fX;
4763 ipt[i].
fY += ppt[i].
fY;
4768 for (i = 0; i < npt; i++) {
4769 x = ipt ? ipt[i].
fX : ppt[i].
fX;
4770 y = ipt ? ipt[i].
fY : ppt[i].
fY;
4772 if ((x < 0) || (y < 0) || (x >= (
int)
fImage->width) || (y >= (
int)
fImage->height)) {
4788 if (!nseg || !seg) {
4789 Warning(
"DrawSegments",
"Invalid data nseg=%d seg=0x%lx", nseg, (
Long_t)seg);
4795 for (
UInt_t i = 0; i < nseg; i++) {
4796 pt[0].
fX = seg->
fX1;
4797 pt[1].
fX = seg->
fX2;
4798 pt[0].
fY = seg->
fY1;
4799 pt[1].
fY = seg->
fY2;
4813 Warning(
"FillSpans",
"Visual not initiated");
4818 Warning(
"FillSpans",
"no image");
4822 if (!
fImage->alt.argb32) {
4826 if (!
fImage->alt.argb32) {
4827 Warning(
"FillSpans",
"Failed to get pixel array");
4831 if (!npt || !ppt || !widths || (stipple && (!w || !h))) {
4832 Warning(
"FillSpans",
"Invalid input data npt=%d ppt=0x%lx col=%s widths=0x%lx stipple=0x%lx w=%d h=%d",
4838 parse_argb_color(col, &color);
4843 for (
UInt_t i = 0; i < npt; i++) {
4845 for (
UInt_t j = 0; j < widths[i]; j++) {
4846 if ((ppt[i].fX >= (
Int_t)
fImage->width) || (ppt[i].
fX < 0) ||
4857 if (stipple[ii >> 3] & (1 << (ii%8))) {
4871 Warning(
"FillSpans",
"Visual not initiated");
4876 Warning(
"FillSpans",
"no image");
4880 if (!
fImage->alt.argb32) {
4884 if (!
fImage->alt.argb32) {
4885 Warning(
"FillSpans",
"Failed to get pixel array");
4889 if (!npt || !ppt || !widths || !tile) {
4890 Warning(
"FillSpans",
"Invalid input data npt=%d ppt=0x%lx widths=0x%lx tile=0x%lx",
4904 for (
UInt_t i = 0; i < npt; i++) {
4907 for (
UInt_t j = 0; j < widths[i]; j++) {
4908 if ((ppt[i].fX >= (
Int_t)
fImage->width) || (ppt[i].
fX < 0) ||
4927 Warning(
"CropSpans",
"Visual not initiated");
4932 Warning(
"CropSpans",
"no image");
4936 if (!
fImage->alt.argb32) {
4940 if (!
fImage->alt.argb32) {
4941 Warning(
"CropSpans",
"Failed to get pixel array");
4945 if (!npt || !ppt || !widths) {
4946 Warning(
"CropSpans",
"No points specified npt=%d ppt=0x%lx widths=0x%lx", npt, (
Long_t)ppt, (
Long_t)widths);
4951 int y1 = ppt[npt-1].
fY;
4959 for (y = 0; (int)y < y0; y++) {
4960 for (x = 0; x <
fImage->width; x++) {
4962 if (idx < sz)
fImage->alt.argb32[idx] = 0;
4967 for (i = 0; i < npt; i++) {
4968 for (x = 0; (int)x < ppt[i].fX; x++) {
4970 if (idx < sz)
fImage->alt.argb32[idx] = 0;
4972 for (x = ppt[i].fX + widths[i] + 1; x <
fImage->width; x++) {
4974 if (idx < sz)
fImage->alt.argb32[idx] = 0;
4979 for (y = y1; y <
fImage->height; y++) {
4980 for (x = 0; x <
fImage->width; x++) {
4982 if (idx < sz)
fImage->alt.argb32[idx] = 0;
5016 Warning(
"CopyArea",
"Visual not initiated");
5021 Warning(
"CopyArea",
"no image");
5026 ASImage *out = ((
TASImage*)dst)->GetImage();
5032 xsrc = xsrc < 0 ? 0 : xsrc;
5033 ysrc = ysrc < 0 ? 0 : ysrc;
5035 if ((xsrc >= (
int)
fImage->width) || (ysrc >= (
int)
fImage->height))
return;
5037 w = xsrc + w >
fImage->width ?
fImage->width - xsrc : w;
5041 if (!
fImage->alt.argb32) {
5044 if (!out->alt.argb32) {
5046 out = ((
TASImage*)dst)->GetImage();
5049 if (
fImage->alt.argb32 && out->alt.argb32) {
5050 for (y = 0; y < (int)h; y++) {
5051 for (x = 0; x < (int)w; x++) {
5052 idx =
Idx(yy + x + xsrc);
5053 if ((x + xdst < 0) || (ydst + y < 0) ||
5054 (x + xdst >= (
int)out->width) || (y + ydst >= (
int)out->height) )
continue;
5056 idx2 =
Idx((ydst + y)*out->width + x + xdst);
5060 out->alt.argb32[idx2] = 0;
5063 out->alt.argb32[idx2] &=
fImage->alt.argb32[idx];
5066 out->alt.argb32[idx2] =
fImage->alt.argb32[idx] & (~out->alt.argb32[idx2]);
5069 out->alt.argb32[idx2] &= ~
fImage->alt.argb32[idx];
5074 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]) & (~out->alt.argb32[idx2]);
5083 out->alt.argb32[idx2] ^= ~
fImage->alt.argb32[idx];
5086 out->alt.argb32[idx2] = ~out->alt.argb32[idx2];
5089 out->alt.argb32[idx2] =
fImage->alt.argb32[idx] | (~out->alt.argb32[idx2]);
5092 out->alt.argb32[idx2] = ~
fImage->alt.argb32[idx];
5095 out->alt.argb32[idx2] |= ~
fImage->alt.argb32[idx];
5098 out->alt.argb32[idx2] = (~
fImage->alt.argb32[idx]) | (~out->alt.argb32[idx2]);
5101 out->alt.argb32[idx2] = 0xFFFFFFFF;
5105 out->alt.argb32[idx2] =
fImage->alt.argb32[idx];
5129 int i, j, ix, iy, w,
h;
5131 ARGB32 color = 0xFFFFFFFF;
5138 for (i = 0; i < nx; i++) {
5140 for (j = 0; j < ny; j++) {
5141 icol = (ARGB32)ic[i + (nx*j)];
5142 if (icol != color) {
5181 ymin = ymax = (pts++)->fY;
5184 if (pts->
fY < ymin) {
5188 if (pts->
fY > ymax) {
5196 return (ptMin - ptsStart);
5212 int mr = 0, m1r = 0;
5213 int incr1l = 0, incr2l = 0;
5214 int incr1r = 0, incr2r = 0;
5219 int nextleft, nextright;
5232 Warning(
"GetPolygonSpans",
"Visual not initiated");
5237 Warning(
"GetPolygonSpans",
"no image");
5241 if (!
fImage->alt.argb32) {
5245 if (!
fImage->alt.argb32) {
5246 Warning(
"GetPolygonSpans",
"Failed to get pixel array");
5250 if ((npt < 3) || !ppt) {
5251 Warning(
"GetPolygonSpans",
"No points specified npt=%d ppt=0x%lx", npt, (
Long_t)ppt);
5259 dy = ymax - ymin + 1;
5260 if ((npt < 3) || (dy < 0))
return kFALSE;
5262 ptsOut = firstPoint =
new TPoint[dy];
5263 width = firstWidth =
new UInt_t[dy];
5266 nextleft = nextright = imin;
5267 y = ppt[nextleft].
fY;
5272 if (ppt[nextleft].fY == y) {
5278 if (nextleft >= (
int)npt) {
5285 ppt[left].fX, ppt[nextleft].fX,
5286 xl, dl, ml, m1l, incr1l, incr2l);
5290 if (ppt[nextright].fY == y) {
5296 if (nextright < 0) {
5303 ppt[right].fX, ppt[nextright].fX,
5304 xr, dr, mr, m1r, incr1r, incr2r);
5309 i =
TMath::Min(ppt[nextleft].fY, ppt[nextright].fY) -
y;
5313 delete [] firstWidth;
5314 delete [] firstPoint;
5323 *(width++) = xr - xl;
5324 (ptsOut++)->fX = xl;
5326 *(width++) = xl - xr;
5327 (ptsOut++)->fX = xr;
5335 }
while (y != ymax);
5337 *nspans =
UInt_t(ptsOut - firstPoint);
5338 *outPoint = firstPoint;
5339 *outWidth = firstWidth;
5356 ARGB32 color = ARGB32_White;
5357 parse_argb_color(col, &color);
5360 if (!stipple && ((color & 0xff000000)==0xff000000)) {
5363 FillSpans(nspans, firstPoint, firstWidth, col, stipple, w, h);
5367 delete [] firstWidth;
5368 delete [] firstPoint;
5371 if (firstWidth)
delete [] firstWidth;
5372 if (firstPoint)
delete [] firstPoint;
5389 FillSpans(nspans, firstPoint, firstWidth, tile);
5392 delete [] firstWidth;
5393 delete [] firstPoint;
5396 if (firstWidth)
delete [] firstWidth;
5397 if (firstPoint)
delete [] firstPoint;
5413 CropSpans(nspans, firstPoint, firstWidth);
5416 delete [] firstWidth;
5417 delete [] firstPoint;
5420 if (firstWidth)
delete [] firstWidth;
5421 if (firstPoint)
delete [] firstPoint;
5434 Warning(
"DrawFillArea",
"Visual not initiated");
5439 Warning(
"DrawFillArea",
"no image");
5443 if (!
fImage->alt.argb32) {
5447 if (!
fImage->alt.argb32) {
5448 Warning(
"DrawFillArea",
"Failed to get pixel array");
5452 if ((count < 3) || !ptsIn) {
5453 Warning(
"DrawFillArea",
"No points specified npt=%d ppt=0x%lx", count, (
Long_t)ptsIn);
5462 ARGB32 color = ARGB32_White;
5463 parse_argb_color(col, &color);
5481 static const UInt_t gEdgeTableEntryCacheSize = 200;
5482 static EdgeTableEntry gEdgeTableEntryCache[gEdgeTableEntryCacheSize];
5484 if (count < gEdgeTableEntryCacheSize) {
5492 ptsOut = firstPoint;
5495 pSLL = ET.scanlines.next;
5497 for (y = ET.ymin; y < ET.ymax; y++) {
5498 if (pSLL && y == pSLL->scanline) {
5499 loadAET(&AET, pSLL->edgelist);
5506 ptsOut->
fX = pAET->bres.minor_axis;
5511 *width++ = pAET->next->bres.minor_axis - pAET->bres.minor_axis;
5514 if (!stipple && ((color & 0xff000000)==0xff000000)) {
5517 FillSpans(nPts, firstPoint, firstWidth, col, stipple, w, h);
5519 ptsOut = firstPoint;
5530 if (!stipple && ((color & 0xff000000)==0xff000000)) {
5533 FillSpans(nPts, firstPoint, firstWidth, col, stipple, w, h);
5537 if (del)
delete [] pETEs;
5547 Warning(
"DrawFillArea",
"Visual not initiated");
5552 Warning(
"DrawFillArea",
"no image");
5556 if (!
fImage->alt.argb32) {
5560 if (!
fImage->alt.argb32) {
5561 Warning(
"DrawFillArea",
"Failed to get pixel array");
5565 if ((count < 3) || !ptsIn) {
5566 Warning(
"DrawFillArea",
"No points specified npt=%d ppt=0x%lx", count, (
Long_t)ptsIn);
5592 ptsOut = firstPoint;
5595 pSLL = ET.scanlines.next;
5597 for (y = ET.ymin; y < ET.ymax; y++) {
5598 if (pSLL && y == pSLL->scanline) {
5599 loadAET(&AET, pSLL->edgelist);
5606 ptsOut->
fX = pAET->bres.minor_axis;
5611 *width++ = pAET->next->bres.minor_axis - pAET->bres.minor_axis;
5614 FillSpans(nPts, firstPoint, firstWidth, tile);
5615 ptsOut = firstPoint;
5624 FillSpans(nPts, firstPoint, firstWidth, tile);
5635 ASDrawContext *ctx =
new ASDrawContext;
5637 ctx->canvas_width = im->width;
5638 ctx->canvas_height = im->height;
5639 ctx->canvas = im->alt.argb32;
5640 ctx->scratch_canvas = 0;
5642 ctx->flags = ASDrawCTX_CanvasIsARGB;
5643 asim_set_custom_brush_colored( ctx, brush);
5653 if (ctx->scratch_canvas)
free(ctx->scratch_canvas);
5667 Int_t sz = thick*thick;
5674 matrix =
new CARD32[sz];
5677 for (
int i = 0; i < sz; i++) {
5678 matrix[i] = (CARD32)color;
5682 brush.matrix = matrix;
5683 brush.width = thick;
5684 brush.height = thick;
5685 brush.center_y = brush.center_x = thick/2;
5694 if (xx1 ==
fImage->width) --xx1;
5695 if (yy1 ==
fImage->height) --yy1;
5696 if (xx2 ==
fImage->width) --xx2;
5697 if (yy2 ==
fImage->height) --yy2;
5699 asim_move_to(ctx, xx1, yy1);
5700 asim_line_to(ctx, xx2, yy2);
5715 Bool_t has_alpha = (color & 0xff000000) != 0xff000000;
5719 FT_Bitmap *source = (FT_Bitmap*)bitmap;
5722 Int_t dots =
Int_t(source->width * source->rows);
5726 yy = y0 = by > 0 ? by *
fImage->width : 0;
5727 for (y = 0; y < (int) source->rows; y++) {
5729 if ((byy >= (
int)
fImage->height) || (byy <0))
continue;
5731 for (x = 0; x < (int) source->width; x++) {
5733 if ((bxx >= (
int)
fImage->width) || (bxx < 0))
continue;
5735 idx =
Idx(bxx + yy);
5736 r += ((
fImage->alt.argb32[idx] & 0xff0000) >> 16);
5737 g += ((
fImage->alt.argb32[idx] & 0x00ff00) >> 8);
5738 b += (
fImage->alt.argb32[idx] & 0x0000ff);
5748 col[0] = (r << 16) + (g << 8) +
b;
5750 Int_t col4r = (col[4] & 0xff0000) >> 16;
5751 Int_t col4g = (col[4] & 0x00ff00) >> 8;
5752 Int_t col4b = (col[4] & 0x0000ff);
5755 for (x = 3; x > 0; x--) {
5757 Int_t colxr = (col4r*x + r*xx) >> 2;
5758 Int_t colxg = (col4g*x + g*xx) >> 2;
5759 Int_t colxb = (col4b*x + b*xx) >> 2;
5760 col[
x] = (colxr << 16) + (colxg << 8) + colxb;
5766 Int_t clipx1=0, clipx2=0, clipy1=0, clipy2=0;
5771 clipx1 =
gPad->XtoAbsPixel(
gPad->GetX1())*is;
5772 clipx2 =
gPad->XtoAbsPixel(
gPad->GetX2())*is;
5773 clipy1 =
gPad->YtoAbsPixel(
gPad->GetY1())*is;
5774 clipy2 =
gPad->YtoAbsPixel(
gPad->GetY2())*is;
5778 for (y = 0; y < (int) source->rows; y++) {
5781 for (x = 0; x < (int) source->width; x++) {
5785 d = ((d + 10) * 5) >> 8;
5789 if ( noClip || ((x < (
int) source->width) &&
5790 (bxx < (
int)clipx2) && (bxx >= (
int)clipx1) &&
5791 (byy >= (
int)clipy2) && (byy < (
int)clipy1) )) {
5792 idx =
Idx(bxx + yy);
5793 acolor = (ARGB32)col[d];
5797 fImage->alt.argb32[idx] = acolor;
5816 Warning(
"DrawText",
"Visual not initiated");
5820 if (!
fImage->alt.argb32) {
5845 const wchar_t *wcsTitle =
reinterpret_cast<const wchar_t *
>(text->
GetWcsTitle());
5846 if (wcsTitle != NULL) {
5856 col =
gROOT->GetColor(1);
5859 ARGB32 color = ARGB32_White;
5913 if (align == 1 || align == 2 || align == 3) {
5915 }
else if (align == 4 || align == 5 || align == 6) {
5922 if (align == 3 || align == 6 || align == 9) {
5924 }
else if (align == 2 || align == 5 || align == 8) {