12b8d69caSLisandro Dalcin #include <../src/sys/classes/draw/impls/image/drawimage.h> /*I "petscdraw.h" I*/
22b8d69caSLisandro Dalcin #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/
3ccb5f961SBarry Smith #include <petscviewer.h>
42b8d69caSLisandro Dalcin
52b8d69caSLisandro Dalcin #if defined(PETSC_USE_DEBUG)
6835f2295SStefano Zampini #define PetscDrawValidColor(color) PetscCheck((color) >= 0 && (color) < 256, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Color value %d out of range [0..255]", (color))
72b8d69caSLisandro Dalcin #else
89371c9d4SSatish Balay #define PetscDrawValidColor(color) \
99371c9d4SSatish Balay do { \
109371c9d4SSatish Balay } while (0)
112b8d69caSLisandro Dalcin #endif
122b8d69caSLisandro Dalcin
132b8d69caSLisandro Dalcin #define XTRANS(draw, img, x) ((int)(((img)->w - 1) * ((draw)->port_xl + ((((x) - (draw)->coor_xl) * ((draw)->port_xr - (draw)->port_xl)) / ((draw)->coor_xr - (draw)->coor_xl)))))
142b8d69caSLisandro Dalcin #define YTRANS(draw, img, y) (((img)->h - 1) - (int)(((img)->h - 1) * ((draw)->port_yl + ((((y) - (draw)->coor_yl) * ((draw)->port_yr - (draw)->port_yl)) / ((draw)->coor_yr - (draw)->coor_yl)))))
152b8d69caSLisandro Dalcin
162b8d69caSLisandro Dalcin #define ITRANS(draw, img, i) ((draw)->coor_xl + (((PetscReal)(i)) * ((draw)->coor_xr - (draw)->coor_xl) / ((img)->w - 1) - (draw)->port_xl) / ((draw)->port_xr - (draw)->port_xl))
172b8d69caSLisandro Dalcin #define JTRANS(draw, img, j) ((draw)->coor_yl + (((PetscReal)(j)) / ((img)->h - 1) + (draw)->port_yl - 1) * ((draw)->coor_yr - (draw)->coor_yl) / ((draw)->port_yl - (draw)->port_yr))
182b8d69caSLisandro Dalcin
PetscDrawSetViewport_Image(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr)19d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawSetViewport_Image(PetscDraw draw, PetscReal xl, PetscReal yl, PetscReal xr, PetscReal yr)
20d71ae5a4SJacob Faibussowitsch {
212b8d69caSLisandro Dalcin PetscImage img = (PetscImage)draw->data;
224d86920dSPierre Jolivet
232b8d69caSLisandro Dalcin PetscFunctionBegin;
242b8d69caSLisandro Dalcin {
252b8d69caSLisandro Dalcin int xmax = img->w - 1, ymax = img->h - 1;
262b8d69caSLisandro Dalcin int xa = (int)(xl * xmax), ya = ymax - (int)(yr * ymax);
272b8d69caSLisandro Dalcin int xb = (int)(xr * xmax), yb = ymax - (int)(yl * ymax);
282b8d69caSLisandro Dalcin PetscImageSetClip(img, xa, ya, xb + 1 - xa, yb + 1 - ya);
292b8d69caSLisandro Dalcin }
303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
312b8d69caSLisandro Dalcin }
322b8d69caSLisandro Dalcin
332b8d69caSLisandro Dalcin /*
342b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawSetCoordinates_Image(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr)
352b8d69caSLisandro Dalcin {
362b8d69caSLisandro Dalcin PetscFunctionBegin;
373ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
382b8d69caSLisandro Dalcin }*/
392b8d69caSLisandro Dalcin #define PetscDrawSetCoordinates_Image NULL
402b8d69caSLisandro Dalcin
PetscDrawCoordinateToPixel_Image(PetscDraw draw,PetscReal x,PetscReal y,int * i,int * j)41d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawCoordinateToPixel_Image(PetscDraw draw, PetscReal x, PetscReal y, int *i, int *j)
42d71ae5a4SJacob Faibussowitsch {
432b8d69caSLisandro Dalcin PetscImage img = (PetscImage)draw->data;
444d86920dSPierre Jolivet
452b8d69caSLisandro Dalcin PetscFunctionBegin;
462b8d69caSLisandro Dalcin if (i) *i = XTRANS(draw, img, x);
472b8d69caSLisandro Dalcin if (j) *j = YTRANS(draw, img, y);
483ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
492b8d69caSLisandro Dalcin }
502b8d69caSLisandro Dalcin
PetscDrawPixelToCoordinate_Image(PetscDraw draw,int i,int j,PetscReal * x,PetscReal * y)51d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawPixelToCoordinate_Image(PetscDraw draw, int i, int j, PetscReal *x, PetscReal *y)
52d71ae5a4SJacob Faibussowitsch {
532b8d69caSLisandro Dalcin PetscImage img = (PetscImage)draw->data;
544d86920dSPierre Jolivet
552b8d69caSLisandro Dalcin PetscFunctionBegin;
562b8d69caSLisandro Dalcin if (x) *x = ITRANS(draw, img, i);
572b8d69caSLisandro Dalcin if (y) *y = JTRANS(draw, img, j);
583ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
592b8d69caSLisandro Dalcin }
602b8d69caSLisandro Dalcin
612b8d69caSLisandro Dalcin /*
622b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawPointSetSize_Image(PetscDraw draw,PetscReal width)
632b8d69caSLisandro Dalcin {
642b8d69caSLisandro Dalcin PetscFunctionBegin;
653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
662b8d69caSLisandro Dalcin }*/
672b8d69caSLisandro Dalcin #define PetscDrawPointSetSize_Image NULL
682b8d69caSLisandro Dalcin
PetscDrawPoint_Image(PetscDraw draw,PetscReal x,PetscReal y,int c)69d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawPoint_Image(PetscDraw draw, PetscReal x, PetscReal y, int c)
70d71ae5a4SJacob Faibussowitsch {
712b8d69caSLisandro Dalcin PetscImage img = (PetscImage)draw->data;
724d86920dSPierre Jolivet
732b8d69caSLisandro Dalcin PetscFunctionBegin;
742b8d69caSLisandro Dalcin PetscDrawValidColor(c);
752b8d69caSLisandro Dalcin {
762b8d69caSLisandro Dalcin int j, xx = XTRANS(draw, img, x);
772b8d69caSLisandro Dalcin int i, yy = YTRANS(draw, img, y);
782b8d69caSLisandro Dalcin for (i = -1; i <= 1; i++)
799371c9d4SSatish Balay for (j = -1; j <= 1; j++) PetscImageDrawPixel(img, xx + j, yy + i, c);
802b8d69caSLisandro Dalcin }
813ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
822b8d69caSLisandro Dalcin }
832b8d69caSLisandro Dalcin
PetscDrawPointPixel_Image(PetscDraw draw,int x,int y,int c)84d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawPointPixel_Image(PetscDraw draw, int x, int y, int c)
85d71ae5a4SJacob Faibussowitsch {
862b8d69caSLisandro Dalcin PetscImage img = (PetscImage)draw->data;
874d86920dSPierre Jolivet
882b8d69caSLisandro Dalcin PetscFunctionBegin;
892b8d69caSLisandro Dalcin PetscDrawValidColor(c);
90d71ae5a4SJacob Faibussowitsch {
91d71ae5a4SJacob Faibussowitsch PetscImageDrawPixel(img, x, y, c);
92d71ae5a4SJacob Faibussowitsch }
933ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
942b8d69caSLisandro Dalcin }
952b8d69caSLisandro Dalcin
962b8d69caSLisandro Dalcin /*
972b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawLineSetWidth_Image(PetscDraw draw,PetscReal width)
982b8d69caSLisandro Dalcin {
992b8d69caSLisandro Dalcin PetscFunctionBegin;
1003ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1012b8d69caSLisandro Dalcin }*/
1022b8d69caSLisandro Dalcin #define PetscDrawLineSetWidth_Image NULL
1032b8d69caSLisandro Dalcin
PetscDrawLineGetWidth_Image(PetscDraw draw,PetscReal * width)104d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawLineGetWidth_Image(PetscDraw draw, PetscReal *width)
105d71ae5a4SJacob Faibussowitsch {
1062b8d69caSLisandro Dalcin PetscImage img = (PetscImage)draw->data;
1074d86920dSPierre Jolivet
1082b8d69caSLisandro Dalcin PetscFunctionBegin;
1092b8d69caSLisandro Dalcin {
1102b8d69caSLisandro Dalcin int lw = 1;
1112b8d69caSLisandro Dalcin *width = lw * (draw->coor_xr - draw->coor_xl) / (img->w * (draw->port_xr - draw->port_xl));
1122b8d69caSLisandro Dalcin }
1133ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1142b8d69caSLisandro Dalcin }
1152b8d69caSLisandro Dalcin
PetscDrawLine_Image(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int c)116d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawLine_Image(PetscDraw draw, PetscReal xl, PetscReal yl, PetscReal xr, PetscReal yr, int c)
117d71ae5a4SJacob Faibussowitsch {
1182b8d69caSLisandro Dalcin PetscImage img = (PetscImage)draw->data;
1194d86920dSPierre Jolivet
1202b8d69caSLisandro Dalcin PetscFunctionBegin;
1212b8d69caSLisandro Dalcin {
1222b8d69caSLisandro Dalcin int x_1 = XTRANS(draw, img, xl), x_2 = XTRANS(draw, img, xr);
1232b8d69caSLisandro Dalcin int y_1 = YTRANS(draw, img, yl), y_2 = YTRANS(draw, img, yr);
1242b8d69caSLisandro Dalcin PetscImageDrawLine(img, x_1, y_1, x_2, y_2, c);
1252b8d69caSLisandro Dalcin }
1263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1272b8d69caSLisandro Dalcin }
1282b8d69caSLisandro Dalcin
PetscDrawArrow_Image(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int c)129d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawArrow_Image(PetscDraw draw, PetscReal xl, PetscReal yl, PetscReal xr, PetscReal yr, int c)
130d71ae5a4SJacob Faibussowitsch {
1312b8d69caSLisandro Dalcin PetscImage img = (PetscImage)draw->data;
1324d86920dSPierre Jolivet
1332b8d69caSLisandro Dalcin PetscFunctionBegin;
1342b8d69caSLisandro Dalcin PetscDrawValidColor(c);
1352b8d69caSLisandro Dalcin {
1362b8d69caSLisandro Dalcin int x_1 = XTRANS(draw, img, xl), x_2 = XTRANS(draw, img, xr);
1372b8d69caSLisandro Dalcin int y_1 = YTRANS(draw, img, yl), y_2 = YTRANS(draw, img, yr);
1383ba16761SJacob Faibussowitsch if (x_1 == x_2 && y_1 == y_2) PetscFunctionReturn(PETSC_SUCCESS);
1392b8d69caSLisandro Dalcin PetscImageDrawLine(img, x_1, y_1, x_2, y_2, c);
1402b8d69caSLisandro Dalcin if (x_1 == x_2 && PetscAbs(y_1 - y_2) > 7) {
1412b8d69caSLisandro Dalcin if (y_2 > y_1) {
1422b8d69caSLisandro Dalcin PetscImageDrawLine(img, x_2, y_2, x_2 - 3, y_2 - 3, c);
1432b8d69caSLisandro Dalcin PetscImageDrawLine(img, x_2, y_2, x_2 + 3, y_2 - 3, c);
1442b8d69caSLisandro Dalcin } else {
1452b8d69caSLisandro Dalcin PetscImageDrawLine(img, x_2, y_2, x_2 - 3, y_2 + 3, c);
1462b8d69caSLisandro Dalcin PetscImageDrawLine(img, x_2, y_2, x_2 + 3, y_2 + 3, c);
1472b8d69caSLisandro Dalcin }
1482b8d69caSLisandro Dalcin }
1492b8d69caSLisandro Dalcin if (y_1 == y_2 && PetscAbs(x_1 - x_2) > 7) {
1502b8d69caSLisandro Dalcin if (x_2 > x_1) {
1512b8d69caSLisandro Dalcin PetscImageDrawLine(img, x_2 - 3, y_2 - 3, x_2, y_2, c);
1522b8d69caSLisandro Dalcin PetscImageDrawLine(img, x_2 - 3, y_2 + 3, x_2, y_2, c);
1532b8d69caSLisandro Dalcin } else {
1542b8d69caSLisandro Dalcin PetscImageDrawLine(img, x_2, y_2, x_2 + 3, y_2 - 3, c);
1552b8d69caSLisandro Dalcin PetscImageDrawLine(img, x_2, y_2, x_2 + 3, y_2 + 3, c);
1562b8d69caSLisandro Dalcin }
1572b8d69caSLisandro Dalcin }
1582b8d69caSLisandro Dalcin }
1593ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1602b8d69caSLisandro Dalcin }
1612b8d69caSLisandro Dalcin
PetscDrawRectangle_Image(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int c1,int c2,int c3,int c4)162d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawRectangle_Image(PetscDraw draw, PetscReal xl, PetscReal yl, PetscReal xr, PetscReal yr, int c1, int c2, int c3, int c4)
163d71ae5a4SJacob Faibussowitsch {
1642b8d69caSLisandro Dalcin PetscImage img = (PetscImage)draw->data;
1654d86920dSPierre Jolivet
1662b8d69caSLisandro Dalcin PetscFunctionBegin;
1672b8d69caSLisandro Dalcin PetscDrawValidColor(c1);
1682b8d69caSLisandro Dalcin PetscDrawValidColor(c2);
1692b8d69caSLisandro Dalcin PetscDrawValidColor(c3);
1702b8d69caSLisandro Dalcin PetscDrawValidColor(c4);
1712b8d69caSLisandro Dalcin {
1722b8d69caSLisandro Dalcin int x = XTRANS(draw, img, xl), w = XTRANS(draw, img, xr) + 1 - x;
1732b8d69caSLisandro Dalcin int y = YTRANS(draw, img, yr), h = YTRANS(draw, img, yl) + 1 - y;
1742b8d69caSLisandro Dalcin int c = (c1 + c2 + c3 + c4) / 4;
1752b8d69caSLisandro Dalcin PetscImageDrawRectangle(img, x, y, w, h, c);
1762b8d69caSLisandro Dalcin }
1773ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1782b8d69caSLisandro Dalcin }
1792b8d69caSLisandro Dalcin
PetscDrawEllipse_Image(PetscDraw draw,PetscReal x,PetscReal y,PetscReal a,PetscReal b,int c)180d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawEllipse_Image(PetscDraw draw, PetscReal x, PetscReal y, PetscReal a, PetscReal b, int c)
181d71ae5a4SJacob Faibussowitsch {
1822b8d69caSLisandro Dalcin PetscImage img = (PetscImage)draw->data;
1834d86920dSPierre Jolivet
1842b8d69caSLisandro Dalcin PetscFunctionBegin;
1852b8d69caSLisandro Dalcin PetscDrawValidColor(c);
1862b8d69caSLisandro Dalcin a = PetscAbsReal(a);
1872b8d69caSLisandro Dalcin b = PetscAbsReal(b);
1882b8d69caSLisandro Dalcin {
1892b8d69caSLisandro Dalcin int xc = XTRANS(draw, img, x), w = XTRANS(draw, img, x + a / 2) + 0 - xc;
1902b8d69caSLisandro Dalcin int yc = YTRANS(draw, img, y), h = YTRANS(draw, img, y - b / 2) + 0 - yc;
1912b8d69caSLisandro Dalcin if (PetscAbsReal(a - b) <= 0) w = h = PetscMin(w, h); /* workaround truncation errors */
1922b8d69caSLisandro Dalcin PetscImageDrawEllipse(img, xc, yc, w, h, c);
1932b8d69caSLisandro Dalcin }
1943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1952b8d69caSLisandro Dalcin }
1962b8d69caSLisandro Dalcin
PetscDrawTriangle_Image(PetscDraw draw,PetscReal X_1,PetscReal Y_1,PetscReal X_2,PetscReal Y_2,PetscReal X_3,PetscReal Y_3,int c1,int c2,int c3)197d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawTriangle_Image(PetscDraw draw, PetscReal X_1, PetscReal Y_1, PetscReal X_2, PetscReal Y_2, PetscReal X_3, PetscReal Y_3, int c1, int c2, int c3)
198d71ae5a4SJacob Faibussowitsch {
1992b8d69caSLisandro Dalcin PetscImage img = (PetscImage)draw->data;
2004d86920dSPierre Jolivet
2012b8d69caSLisandro Dalcin PetscFunctionBegin;
2022b8d69caSLisandro Dalcin PetscDrawValidColor(c1);
2032b8d69caSLisandro Dalcin PetscDrawValidColor(c2);
2042b8d69caSLisandro Dalcin PetscDrawValidColor(c3);
2052b8d69caSLisandro Dalcin {
2062b8d69caSLisandro Dalcin int x_1 = XTRANS(draw, img, X_1), x_2 = XTRANS(draw, img, X_2), x_3 = XTRANS(draw, img, X_3);
2072b8d69caSLisandro Dalcin int y_1 = YTRANS(draw, img, Y_1), y_2 = YTRANS(draw, img, Y_2), y_3 = YTRANS(draw, img, Y_3);
2082b8d69caSLisandro Dalcin PetscImageDrawTriangle(img, x_1, y_1, c1, x_2, y_2, c2, x_3, y_3, c3);
2092b8d69caSLisandro Dalcin }
2103ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2112b8d69caSLisandro Dalcin }
2122b8d69caSLisandro Dalcin
2132b8d69caSLisandro Dalcin /*
2142b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawStringSetSize_Image(PetscDraw draw,PetscReal w,PetscReal h)
2152b8d69caSLisandro Dalcin {
2162b8d69caSLisandro Dalcin PetscFunctionBegin;
2173ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2182b8d69caSLisandro Dalcin }*/
2192b8d69caSLisandro Dalcin #define PetscDrawStringSetSize_Image NULL
2202b8d69caSLisandro Dalcin
PetscDrawStringGetSize_Image(PetscDraw draw,PetscReal * w,PetscReal * h)221d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawStringGetSize_Image(PetscDraw draw, PetscReal *w, PetscReal *h)
222d71ae5a4SJacob Faibussowitsch {
2232b8d69caSLisandro Dalcin PetscImage img = (PetscImage)draw->data;
2244d86920dSPierre Jolivet
2252b8d69caSLisandro Dalcin PetscFunctionBegin;
2262b8d69caSLisandro Dalcin {
2272b8d69caSLisandro Dalcin int tw = PetscImageFontWidth;
2282b8d69caSLisandro Dalcin int th = PetscImageFontHeight;
2292b8d69caSLisandro Dalcin if (w) *w = tw * (draw->coor_xr - draw->coor_xl) / (img->w * (draw->port_xr - draw->port_xl));
2302b8d69caSLisandro Dalcin if (h) *h = th * (draw->coor_yr - draw->coor_yl) / (img->h * (draw->port_yr - draw->port_yl));
2312b8d69caSLisandro Dalcin }
2323ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2332b8d69caSLisandro Dalcin }
2342b8d69caSLisandro Dalcin
PetscDrawString_Image(PetscDraw draw,PetscReal x,PetscReal y,int c,const char text[])235d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawString_Image(PetscDraw draw, PetscReal x, PetscReal y, int c, const char text[])
236d71ae5a4SJacob Faibussowitsch {
2372b8d69caSLisandro Dalcin PetscImage img = (PetscImage)draw->data;
2382b8d69caSLisandro Dalcin PetscToken token;
239ce78bad3SBarry Smith const char *subtext;
2404d86920dSPierre Jolivet
2412b8d69caSLisandro Dalcin PetscFunctionBegin;
2422b8d69caSLisandro Dalcin PetscDrawValidColor(c);
2432b8d69caSLisandro Dalcin {
2442b8d69caSLisandro Dalcin int xx = XTRANS(draw, img, x);
2452b8d69caSLisandro Dalcin int yy = YTRANS(draw, img, y);
2469566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(text, '\n', &token));
2479566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &subtext));
2482b8d69caSLisandro Dalcin while (subtext) {
2492b8d69caSLisandro Dalcin PetscImageDrawText(img, xx, yy, c, subtext);
2502b8d69caSLisandro Dalcin yy += PetscImageFontHeight;
2519566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &subtext));
2522b8d69caSLisandro Dalcin }
2539566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token));
2542b8d69caSLisandro Dalcin }
2553ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2562b8d69caSLisandro Dalcin }
2572b8d69caSLisandro Dalcin
PetscDrawStringVertical_Image(PetscDraw draw,PetscReal x,PetscReal y,int c,const char text[])258d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawStringVertical_Image(PetscDraw draw, PetscReal x, PetscReal y, int c, const char text[])
259d71ae5a4SJacob Faibussowitsch {
2602b8d69caSLisandro Dalcin PetscImage img = (PetscImage)draw->data;
2614d86920dSPierre Jolivet
2622b8d69caSLisandro Dalcin PetscFunctionBegin;
2632b8d69caSLisandro Dalcin PetscDrawValidColor(c);
2642b8d69caSLisandro Dalcin {
2652b8d69caSLisandro Dalcin char chr[2] = {0, 0};
2662b8d69caSLisandro Dalcin int xx = XTRANS(draw, img, x);
2672b8d69caSLisandro Dalcin int yy = YTRANS(draw, img, y);
2682b8d69caSLisandro Dalcin int offset = PetscImageFontHeight;
2692b8d69caSLisandro Dalcin while ((chr[0] = *text++)) {
2702b8d69caSLisandro Dalcin PetscImageDrawText(img, xx, yy + offset, c, chr);
2712b8d69caSLisandro Dalcin yy += PetscImageFontHeight;
2722b8d69caSLisandro Dalcin }
2732b8d69caSLisandro Dalcin }
2743ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2752b8d69caSLisandro Dalcin }
2762b8d69caSLisandro Dalcin
2772b8d69caSLisandro Dalcin /*
2782b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawStringBoxed_Image(PetscDraw draw,PetscReal sxl,PetscReal syl,int sc,int bc,const char text[],PetscReal *w,PetscReal *h)
2792b8d69caSLisandro Dalcin {
2802b8d69caSLisandro Dalcin PetscFunctionBegin;
2812b8d69caSLisandro Dalcin if (w) *w = 0;
2822b8d69caSLisandro Dalcin if (h) *h = 0;
2833ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2842b8d69caSLisandro Dalcin */
2852b8d69caSLisandro Dalcin #define PetscDrawStringBoxed_Image NULL
2862b8d69caSLisandro Dalcin
2872b8d69caSLisandro Dalcin /*
2882b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawFlush_Image(PetscDraw draw)
2892b8d69caSLisandro Dalcin {
2902b8d69caSLisandro Dalcin PetscFunctionBegin;
2913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2922b8d69caSLisandro Dalcin }*/
2932b8d69caSLisandro Dalcin #define PetscDrawFlush_Image NULL
2942b8d69caSLisandro Dalcin
PetscDrawClear_Image(PetscDraw draw)295d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawClear_Image(PetscDraw draw)
296d71ae5a4SJacob Faibussowitsch {
2972b8d69caSLisandro Dalcin PetscImage img = (PetscImage)draw->data;
2984d86920dSPierre Jolivet
2992b8d69caSLisandro Dalcin PetscFunctionBegin;
300d71ae5a4SJacob Faibussowitsch {
301d71ae5a4SJacob Faibussowitsch PetscImageClear(img);
302d71ae5a4SJacob Faibussowitsch }
3033ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3042b8d69caSLisandro Dalcin }
3052b8d69caSLisandro Dalcin
3062b8d69caSLisandro Dalcin /*
3072b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawSetDoubleBuffer_Image(PetscDraw draw)
3082b8d69caSLisandro Dalcin {
3092b8d69caSLisandro Dalcin PetscFunctionBegin;
3103ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3112b8d69caSLisandro Dalcin }*/
3122b8d69caSLisandro Dalcin #define PetscDrawSetDoubleBuffer_Image NULL
3132b8d69caSLisandro Dalcin
PetscDrawGetPopup_Image(PetscDraw draw,PetscDraw * popup)314d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawGetPopup_Image(PetscDraw draw, PetscDraw *popup)
315d71ae5a4SJacob Faibussowitsch {
3162b8d69caSLisandro Dalcin PetscBool flg = PETSC_FALSE;
3172b8d69caSLisandro Dalcin
3182b8d69caSLisandro Dalcin PetscFunctionBegin;
3199566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(((PetscObject)draw)->options, ((PetscObject)draw)->prefix, "-draw_popup", &flg, NULL));
3209371c9d4SSatish Balay if (!flg) {
3219371c9d4SSatish Balay *popup = NULL;
3223ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3239371c9d4SSatish Balay }
3249566063dSJacob Faibussowitsch PetscCall(PetscDrawCreate(PetscObjectComm((PetscObject)draw), NULL, NULL, 0, 0, 220, 220, popup));
3259566063dSJacob Faibussowitsch PetscCall(PetscDrawSetType(*popup, PETSC_DRAW_IMAGE));
3269566063dSJacob Faibussowitsch PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*popup, "popup_"));
3279566063dSJacob Faibussowitsch PetscCall(PetscObjectAppendOptionsPrefix((PetscObject)*popup, ((PetscObject)draw)->prefix));
3282b8d69caSLisandro Dalcin draw->popup = *popup;
3293ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3302b8d69caSLisandro Dalcin }
3312b8d69caSLisandro Dalcin
3322b8d69caSLisandro Dalcin /*
3332b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawSetTitle_Image(PetscDraw draw,const char title[])
3342b8d69caSLisandro Dalcin {
3352b8d69caSLisandro Dalcin PetscFunctionBegin;
3363ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3372b8d69caSLisandro Dalcin }*/
3382b8d69caSLisandro Dalcin #define PetscDrawSetTitle_Image NULL
3392b8d69caSLisandro Dalcin
3402b8d69caSLisandro Dalcin /*
3412b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawCheckResizedWindow_Image(PetscDraw draw)
3422b8d69caSLisandro Dalcin {
3432b8d69caSLisandro Dalcin PetscFunctionBegin;
3443ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3452b8d69caSLisandro Dalcin }*/
3462b8d69caSLisandro Dalcin #define PetscDrawCheckResizedWindow_Image NULL
3472b8d69caSLisandro Dalcin
PetscDrawResizeWindow_Image(PetscDraw draw,int w,int h)348d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawResizeWindow_Image(PetscDraw draw, int w, int h)
349d71ae5a4SJacob Faibussowitsch {
3502b8d69caSLisandro Dalcin PetscImage img = (PetscImage)draw->data;
3512b8d69caSLisandro Dalcin
3522b8d69caSLisandro Dalcin PetscFunctionBegin;
3533ba16761SJacob Faibussowitsch if (w == img->w && h == img->h) PetscFunctionReturn(PETSC_SUCCESS);
3549566063dSJacob Faibussowitsch PetscCall(PetscFree(img->buffer));
3552b8d69caSLisandro Dalcin
3569371c9d4SSatish Balay img->w = w;
3579371c9d4SSatish Balay img->h = h;
3589566063dSJacob Faibussowitsch PetscCall(PetscCalloc1((size_t)(img->w * img->h), &img->buffer));
3599566063dSJacob Faibussowitsch PetscCall(PetscDrawSetViewport_Image(draw, draw->port_xl, draw->port_yl, draw->port_xr, draw->port_yr));
3603ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3612b8d69caSLisandro Dalcin }
3622b8d69caSLisandro Dalcin
PetscDrawDestroy_Image(PetscDraw draw)363d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawDestroy_Image(PetscDraw draw)
364d71ae5a4SJacob Faibussowitsch {
3652b8d69caSLisandro Dalcin PetscImage img = (PetscImage)draw->data;
3662b8d69caSLisandro Dalcin
3672b8d69caSLisandro Dalcin PetscFunctionBegin;
3689566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&draw->popup));
3699566063dSJacob Faibussowitsch PetscCall(PetscFree(img->buffer));
3709566063dSJacob Faibussowitsch PetscCall(PetscFree(draw->data));
3713ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3722b8d69caSLisandro Dalcin }
3732b8d69caSLisandro Dalcin
PetscDrawView_Image(PetscDraw draw,PetscViewer viewer)3742b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawView_Image(PetscDraw draw, PetscViewer viewer)
3752b8d69caSLisandro Dalcin {
376*9f196a02SMartin Diehl PetscBool isascii;
377ccb5f961SBarry Smith
3782b8d69caSLisandro Dalcin PetscFunctionBegin;
379*9f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
380*9f196a02SMartin Diehl if (isascii) {
381ccb5f961SBarry Smith const char *filename = draw->savefilename ? draw->savefilename : draw->title;
382ccb5f961SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Image file name %s\n", filename));
383ccb5f961SBarry Smith }
3843ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
385ccb5f961SBarry Smith }
3862b8d69caSLisandro Dalcin
3872b8d69caSLisandro Dalcin /*
3882b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawGetMouseButton_Image(PetscDraw draw,PetscDrawButton *button,PetscReal *x_user,PetscReal *y_user,PetscReal *x_phys,PetscReal *y_phys)
3892b8d69caSLisandro Dalcin {
3902b8d69caSLisandro Dalcin PetscFunctionBegin;
3912b8d69caSLisandro Dalcin *button = PETSC_BUTTON_NONE;
3922b8d69caSLisandro Dalcin if (x_user) *x_user = 0;
3932b8d69caSLisandro Dalcin if (y_user) *y_user = 0;
3942b8d69caSLisandro Dalcin if (x_phys) *x_phys = 0;
3952b8d69caSLisandro Dalcin if (y_phys) *y_phys = 0;
3963ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3972b8d69caSLisandro Dalcin }*/
3982b8d69caSLisandro Dalcin #define PetscDrawGetMouseButton_Image NULL
3992b8d69caSLisandro Dalcin
4002b8d69caSLisandro Dalcin /*
4012b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawPause_Image(PetscDraw draw)
4022b8d69caSLisandro Dalcin {
4032b8d69caSLisandro Dalcin PetscFunctionBegin;
4043ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
4052b8d69caSLisandro Dalcin }*/
4062b8d69caSLisandro Dalcin #define PetscDrawPause_Image NULL
4072b8d69caSLisandro Dalcin
4082b8d69caSLisandro Dalcin /*
4092b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawBeginPage_Image(PetscDraw draw)
4102b8d69caSLisandro Dalcin {
4112b8d69caSLisandro Dalcin PetscFunctionBegin;
4123ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
4132b8d69caSLisandro Dalcin }*/
4142b8d69caSLisandro Dalcin #define PetscDrawBeginPage_Image NULL
4152b8d69caSLisandro Dalcin
4162b8d69caSLisandro Dalcin /*
4172b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawEndPage_Image(PetscDraw draw)
4182b8d69caSLisandro Dalcin {
4192b8d69caSLisandro Dalcin PetscFunctionBegin;
4203ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
4212b8d69caSLisandro Dalcin }*/
4222b8d69caSLisandro Dalcin #define PetscDrawEndPage_Image NULL
4232b8d69caSLisandro Dalcin
PetscDrawGetSingleton_Image(PetscDraw draw,PetscDraw * sdraw)424d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawGetSingleton_Image(PetscDraw draw, PetscDraw *sdraw)
425d71ae5a4SJacob Faibussowitsch {
4262b8d69caSLisandro Dalcin PetscImage pimg = (PetscImage)draw->data;
4272b8d69caSLisandro Dalcin PetscImage simg;
4282b8d69caSLisandro Dalcin
4292b8d69caSLisandro Dalcin PetscFunctionBegin;
4309566063dSJacob Faibussowitsch PetscCall(PetscDrawCreate(PETSC_COMM_SELF, NULL, NULL, 0, 0, draw->w, draw->h, sdraw));
4319566063dSJacob Faibussowitsch PetscCall(PetscDrawSetType(*sdraw, PETSC_DRAW_IMAGE));
4322b8d69caSLisandro Dalcin (*sdraw)->ops->resizewindow = NULL;
4332b8d69caSLisandro Dalcin simg = (PetscImage)(*sdraw)->data;
4349566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(simg->buffer, pimg->buffer, pimg->w * pimg->h));
4353ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
4362b8d69caSLisandro Dalcin }
4372b8d69caSLisandro Dalcin
PetscDrawRestoreSingleton_Image(PetscDraw draw,PetscDraw * sdraw)438d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawRestoreSingleton_Image(PetscDraw draw, PetscDraw *sdraw)
439d71ae5a4SJacob Faibussowitsch {
4402b8d69caSLisandro Dalcin PetscImage pimg = (PetscImage)draw->data;
4412b8d69caSLisandro Dalcin PetscImage simg = (PetscImage)(*sdraw)->data;
4422b8d69caSLisandro Dalcin
4432b8d69caSLisandro Dalcin PetscFunctionBegin;
4449566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(pimg->buffer, simg->buffer, pimg->w * pimg->h));
4459566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(sdraw));
4463ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
4472b8d69caSLisandro Dalcin }
4482b8d69caSLisandro Dalcin
4492b8d69caSLisandro Dalcin /*
4502b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawSave_Image(PetscDraw draw)
4512b8d69caSLisandro Dalcin {
4522b8d69caSLisandro Dalcin PetscFunctionBegin;
4533ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
4542b8d69caSLisandro Dalcin }*/
4552b8d69caSLisandro Dalcin #define PetscDrawSave_Image NULL
4562b8d69caSLisandro Dalcin
PetscDrawGetImage_Image(PetscDraw draw,unsigned char palette[256][3],unsigned int * w,unsigned int * h,unsigned char * pixels[])457d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawGetImage_Image(PetscDraw draw, unsigned char palette[256][3], unsigned int *w, unsigned int *h, unsigned char *pixels[])
458d71ae5a4SJacob Faibussowitsch {
4592b8d69caSLisandro Dalcin PetscImage img = (PetscImage)draw->data;
4602b8d69caSLisandro Dalcin unsigned char *buffer = NULL;
4612b8d69caSLisandro Dalcin PetscMPIInt rank, size;
4622b8d69caSLisandro Dalcin
4632b8d69caSLisandro Dalcin PetscFunctionBegin;
4642b8d69caSLisandro Dalcin if (w) *w = (unsigned int)img->w;
4652b8d69caSLisandro Dalcin if (h) *h = (unsigned int)img->h;
4662b8d69caSLisandro Dalcin if (pixels) *pixels = NULL;
4679566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)draw), &rank));
468dd400576SPatrick Sanan if (rank == 0) {
4699566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(palette, img->palette, sizeof(img->palette)));
4709566063dSJacob Faibussowitsch PetscCall(PetscMalloc1((size_t)(img->w * img->h), &buffer));
471f416af30SBarry Smith if (pixels) *pixels = buffer;
4722b8d69caSLisandro Dalcin }
4739566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw), &size));
4742b8d69caSLisandro Dalcin if (size == 1) {
4759566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(buffer, img->buffer, img->w * img->h));
4762b8d69caSLisandro Dalcin } else {
4779566063dSJacob Faibussowitsch PetscCallMPI(MPI_Reduce(img->buffer, buffer, img->w * img->h, MPI_UNSIGNED_CHAR, MPI_MAX, 0, PetscObjectComm((PetscObject)draw)));
4782b8d69caSLisandro Dalcin }
4793ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
4802b8d69caSLisandro Dalcin }
4812b8d69caSLisandro Dalcin
4826e4289a0SDuncan Campbell static struct _PetscDrawOps DvOps = {PetscDrawSetDoubleBuffer_Image, PetscDrawFlush_Image, PetscDrawLine_Image, PetscDrawLineSetWidth_Image, PetscDrawLineGetWidth_Image, PetscDrawPoint_Image, PetscDrawPointSetSize_Image, PetscDrawString_Image, PetscDrawStringVertical_Image, PetscDrawStringSetSize_Image, PetscDrawStringGetSize_Image, PetscDrawSetViewport_Image, PetscDrawClear_Image, PetscDrawRectangle_Image, PetscDrawTriangle_Image, PetscDrawEllipse_Image, PetscDrawGetMouseButton_Image, PetscDrawPause_Image, PetscDrawBeginPage_Image, PetscDrawEndPage_Image, PetscDrawGetPopup_Image, PetscDrawSetTitle_Image, PetscDrawCheckResizedWindow_Image, PetscDrawResizeWindow_Image, PetscDrawDestroy_Image, PetscDrawView_Image, PetscDrawGetSingleton_Image, PetscDrawRestoreSingleton_Image, PetscDrawSave_Image, PetscDrawGetImage_Image, PetscDrawSetCoordinates_Image, PetscDrawArrow_Image, PetscDrawCoordinateToPixel_Image, PetscDrawPixelToCoordinate_Image, PetscDrawPointPixel_Image, PetscDrawStringBoxed_Image, NULL};
4832b8d69caSLisandro Dalcin
4842b8d69caSLisandro Dalcin static const unsigned char BasicColors[PETSC_DRAW_BASIC_COLORS][3] = {
4852b8d69caSLisandro Dalcin {255, 255, 255}, /* white */
4862b8d69caSLisandro Dalcin {0, 0, 0 }, /* black */
4872b8d69caSLisandro Dalcin {255, 0, 0 }, /* red */
4882b8d69caSLisandro Dalcin {0, 255, 0 }, /* green */
4892b8d69caSLisandro Dalcin {0, 255, 255}, /* cyan */
4902b8d69caSLisandro Dalcin {0, 0, 255}, /* blue */
4912b8d69caSLisandro Dalcin {255, 0, 255}, /* magenta */
4922b8d69caSLisandro Dalcin {127, 255, 212}, /* aquamarine */
4932b8d69caSLisandro Dalcin {34, 139, 34 }, /* forestgreen */
4942b8d69caSLisandro Dalcin {255, 165, 0 }, /* orange */
4952b8d69caSLisandro Dalcin {238, 130, 238}, /* violet */
4962b8d69caSLisandro Dalcin {165, 42, 42 }, /* brown */
4972b8d69caSLisandro Dalcin {255, 192, 203}, /* pink */
4982b8d69caSLisandro Dalcin {255, 127, 80 }, /* coral */
4992b8d69caSLisandro Dalcin {190, 190, 190}, /* gray */
5002b8d69caSLisandro Dalcin {255, 255, 0 }, /* yellow */
5012b8d69caSLisandro Dalcin {255, 215, 0 }, /* gold */
5022b8d69caSLisandro Dalcin {255, 182, 193}, /* lightpink */
5032b8d69caSLisandro Dalcin {72, 209, 204}, /* mediumturquoise */
5042b8d69caSLisandro Dalcin {240, 230, 140}, /* khaki */
5052b8d69caSLisandro Dalcin {105, 105, 105}, /* dimgray */
5062b8d69caSLisandro Dalcin {54, 205, 50 }, /* yellowgreen */
5072b8d69caSLisandro Dalcin {135, 206, 235}, /* skyblue */
5082b8d69caSLisandro Dalcin {0, 100, 0 }, /* darkgreen */
5092b8d69caSLisandro Dalcin {0, 0, 128}, /* navyblue */
5102b8d69caSLisandro Dalcin {244, 164, 96 }, /* sandybrown */
5112b8d69caSLisandro Dalcin {95, 158, 160}, /* cadetblue */
5122b8d69caSLisandro Dalcin {176, 224, 230}, /* powderblue */
5132b8d69caSLisandro Dalcin {255, 20, 147}, /* deeppink */
5142b8d69caSLisandro Dalcin {216, 191, 216}, /* thistle */
5152b8d69caSLisandro Dalcin {50, 205, 50 }, /* limegreen */
5162b8d69caSLisandro Dalcin {255, 240, 245}, /* lavenderblush */
5172b8d69caSLisandro Dalcin {221, 160, 221}, /* plum */
5182b8d69caSLisandro Dalcin };
5192b8d69caSLisandro Dalcin
5202b8d69caSLisandro Dalcin /*MC
5212b8d69caSLisandro Dalcin PETSC_DRAW_IMAGE - PETSc graphics device that uses a raster buffer
5222b8d69caSLisandro Dalcin
5232b8d69caSLisandro Dalcin Options Database Keys:
5242b8d69caSLisandro Dalcin . -draw_size w,h - size of image in pixels
5252b8d69caSLisandro Dalcin
5262b8d69caSLisandro Dalcin Level: beginner
5272b8d69caSLisandro Dalcin
528db781477SPatrick Sanan .seealso: `PetscDrawOpenImage()`, `PetscDrawSetFromOptions()`
5292b8d69caSLisandro Dalcin M*/
5302b8d69caSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscDrawCreate_Image(PetscDraw);
5312b8d69caSLisandro Dalcin
PetscDrawCreate_Image(PetscDraw draw)532d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDrawCreate_Image(PetscDraw draw)
533d71ae5a4SJacob Faibussowitsch {
5342b8d69caSLisandro Dalcin PetscImage img;
5352b8d69caSLisandro Dalcin int w = draw->w, h = draw->h;
5362b8d69caSLisandro Dalcin PetscInt size[2], nsize = 2;
5372b8d69caSLisandro Dalcin PetscBool set;
5382b8d69caSLisandro Dalcin
5392b8d69caSLisandro Dalcin PetscFunctionBegin;
5402b8d69caSLisandro Dalcin draw->pause = 0;
5419371c9d4SSatish Balay draw->coor_xl = 0;
5429371c9d4SSatish Balay draw->coor_xr = 1;
5439371c9d4SSatish Balay draw->coor_yl = 0;
5449371c9d4SSatish Balay draw->coor_yr = 1;
5459371c9d4SSatish Balay draw->port_xl = 0;
5469371c9d4SSatish Balay draw->port_xr = 1;
5479371c9d4SSatish Balay draw->port_yl = 0;
5489371c9d4SSatish Balay draw->port_yr = 1;
5492b8d69caSLisandro Dalcin
5509371c9d4SSatish Balay size[0] = w;
5519371c9d4SSatish Balay if (size[0] < 1) size[0] = 300;
5529371c9d4SSatish Balay size[1] = h;
5539371c9d4SSatish Balay if (size[1] < 1) size[1] = size[0];
5549566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetIntArray(((PetscObject)draw)->options, ((PetscObject)draw)->prefix, "-draw_size", size, &nsize, &set));
5552b8d69caSLisandro Dalcin if (set && nsize == 1) size[1] = size[0];
5562b8d69caSLisandro Dalcin if (size[0] < 1) size[0] = 300;
5572b8d69caSLisandro Dalcin if (size[1] < 1) size[1] = size[0];
558835f2295SStefano Zampini PetscCall(PetscCIntCast(size[0], &w));
559835f2295SStefano Zampini PetscCall(PetscCIntCast(size[1], &h));
560835f2295SStefano Zampini draw->w = w;
561835f2295SStefano Zampini draw->h = h;
5629371c9d4SSatish Balay draw->x = 0;
5632b8d69caSLisandro Dalcin
5644dfa11a4SJacob Faibussowitsch PetscCall(PetscNew(&img));
565aea10558SJacob Faibussowitsch draw->ops[0] = DvOps;
5662b8d69caSLisandro Dalcin draw->data = (void *)img;
5672b8d69caSLisandro Dalcin
5689371c9d4SSatish Balay img->w = w;
5699371c9d4SSatish Balay img->h = h;
5709566063dSJacob Faibussowitsch PetscCall(PetscCalloc1((size_t)(img->w * img->h), &img->buffer));
5712b8d69caSLisandro Dalcin PetscImageSetClip(img, 0, 0, img->w, img->h);
5722b8d69caSLisandro Dalcin {
5732b8d69caSLisandro Dalcin int i, k, ncolors = 256 - PETSC_DRAW_BASIC_COLORS;
5742b8d69caSLisandro Dalcin unsigned char R[256 - PETSC_DRAW_BASIC_COLORS];
5752b8d69caSLisandro Dalcin unsigned char G[256 - PETSC_DRAW_BASIC_COLORS];
5762b8d69caSLisandro Dalcin unsigned char B[256 - PETSC_DRAW_BASIC_COLORS];
5779566063dSJacob Faibussowitsch PetscCall(PetscDrawUtilitySetCmap(NULL, ncolors, R, G, B));
5782b8d69caSLisandro Dalcin for (k = 0; k < PETSC_DRAW_BASIC_COLORS; k++) {
5792b8d69caSLisandro Dalcin img->palette[k][0] = BasicColors[k][0];
5802b8d69caSLisandro Dalcin img->palette[k][1] = BasicColors[k][1];
5812b8d69caSLisandro Dalcin img->palette[k][2] = BasicColors[k][2];
5822b8d69caSLisandro Dalcin }
5832b8d69caSLisandro Dalcin for (i = 0; i < ncolors; i++, k++) {
5842b8d69caSLisandro Dalcin img->palette[k][0] = R[i];
5852b8d69caSLisandro Dalcin img->palette[k][1] = G[i];
5862b8d69caSLisandro Dalcin img->palette[k][2] = B[i];
5872b8d69caSLisandro Dalcin }
5882b8d69caSLisandro Dalcin }
5892b8d69caSLisandro Dalcin
5909566063dSJacob Faibussowitsch if (!draw->savefilename) PetscCall(PetscDrawSetSave(draw, draw->title));
5913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
5922b8d69caSLisandro Dalcin }
5932b8d69caSLisandro Dalcin
594cc4c1da9SBarry Smith /*@
595811af0c4SBarry Smith PetscDrawOpenImage - Opens an image for use with the `PetscDraw` routines.
5962b8d69caSLisandro Dalcin
597d083f849SBarry Smith Collective
5982b8d69caSLisandro Dalcin
5992b8d69caSLisandro Dalcin Input Parameters:
6002b8d69caSLisandro Dalcin + comm - the communicator that will share image
6012fe279fdSBarry Smith . filename - optional name of the file where the image will be stored
6022fe279fdSBarry Smith . w - the image width in pixels
6032fe279fdSBarry Smith - h - the image height in pixels
6042b8d69caSLisandro Dalcin
6052fe279fdSBarry Smith Output Parameter:
6062b8d69caSLisandro Dalcin . draw - the drawing context.
6072b8d69caSLisandro Dalcin
6082b8d69caSLisandro Dalcin Level: beginner
6092b8d69caSLisandro Dalcin
610811af0c4SBarry Smith .seealso: `PetscDraw`, `PETSC_DRAW_IMAGE`, `PETSC_DRAW_X`, `PetscDrawSetSave()`, `PetscDrawSetFromOptions()`, `PetscDrawCreate()`, `PetscDrawDestroy()`
6112b8d69caSLisandro Dalcin @*/
PetscDrawOpenImage(MPI_Comm comm,const char filename[],int w,int h,PetscDraw * draw)612d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawOpenImage(MPI_Comm comm, const char filename[], int w, int h, PetscDraw *draw)
613d71ae5a4SJacob Faibussowitsch {
6142b8d69caSLisandro Dalcin PetscFunctionBegin;
6159566063dSJacob Faibussowitsch PetscCall(PetscDrawCreate(comm, NULL, NULL, 0, 0, w, h, draw));
6169566063dSJacob Faibussowitsch PetscCall(PetscDrawSetType(*draw, PETSC_DRAW_IMAGE));
6179566063dSJacob Faibussowitsch PetscCall(PetscDrawSetSave(*draw, filename));
6183ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
6192b8d69caSLisandro Dalcin }
620