xref: /petsc/src/sys/classes/draw/impls/image/drawimage.c (revision 4d86920da9ee67c835173a5dfffa1b3a52fd24ca)
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)
62c71b3e2SJacob Faibussowitsch   #define PetscDrawValidColor(color) PetscCheck((color) >= 0 && (color) < 256, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Color value %" PetscInt_FMT " out of range [0..255]", (PetscInt)(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 
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;
22*4d86920dSPierre 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 
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;
44*4d86920dSPierre 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 
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;
54*4d86920dSPierre 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 
69d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawPoint_Image(PetscDraw draw, PetscReal x, PetscReal y, int c)
70d71ae5a4SJacob Faibussowitsch {
712b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
72*4d86920dSPierre 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 
84d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawPointPixel_Image(PetscDraw draw, int x, int y, int c)
85d71ae5a4SJacob Faibussowitsch {
862b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
87*4d86920dSPierre 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 
104d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawLineGetWidth_Image(PetscDraw draw, PetscReal *width)
105d71ae5a4SJacob Faibussowitsch {
1062b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
107*4d86920dSPierre 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 
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;
119*4d86920dSPierre 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 
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;
132*4d86920dSPierre 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 
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;
165*4d86920dSPierre 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 
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;
183*4d86920dSPierre 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 
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;
200*4d86920dSPierre 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 
221d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawStringGetSize_Image(PetscDraw draw, PetscReal *w, PetscReal *h)
222d71ae5a4SJacob Faibussowitsch {
2232b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
224*4d86920dSPierre 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 
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;
2392b8d69caSLisandro Dalcin   char      *subtext;
240*4d86920dSPierre 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 
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;
261*4d86920dSPierre 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 
295d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawClear_Image(PetscDraw draw)
296d71ae5a4SJacob Faibussowitsch {
2972b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
298*4d86920dSPierre 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 
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 
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 
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 
3742b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawView_Image(PetscDraw draw, PetscViewer viewer)
3752b8d69caSLisandro Dalcin {
376ccb5f961SBarry Smith   PetscBool iascii;
377ccb5f961SBarry Smith 
3782b8d69caSLisandro Dalcin   PetscFunctionBegin;
379ccb5f961SBarry Smith   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
380ccb5f961SBarry Smith   if (iascii) {
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 
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 
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 
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 
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];
5589371c9d4SSatish Balay   draw->w = w = size[0];
5599371c9d4SSatish Balay   draw->x     = 0;
5609371c9d4SSatish Balay   draw->h = h = size[1];
5619371c9d4SSatish Balay   draw->x     = 0;
5622b8d69caSLisandro Dalcin 
5634dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew(&img));
564aea10558SJacob Faibussowitsch   draw->ops[0] = DvOps;
5652b8d69caSLisandro Dalcin   draw->data   = (void *)img;
5662b8d69caSLisandro Dalcin 
5679371c9d4SSatish Balay   img->w = w;
5689371c9d4SSatish Balay   img->h = h;
5699566063dSJacob Faibussowitsch   PetscCall(PetscCalloc1((size_t)(img->w * img->h), &img->buffer));
5702b8d69caSLisandro Dalcin   PetscImageSetClip(img, 0, 0, img->w, img->h);
5712b8d69caSLisandro Dalcin   {
5722b8d69caSLisandro Dalcin     int           i, k, ncolors = 256 - PETSC_DRAW_BASIC_COLORS;
5732b8d69caSLisandro Dalcin     unsigned char R[256 - PETSC_DRAW_BASIC_COLORS];
5742b8d69caSLisandro Dalcin     unsigned char G[256 - PETSC_DRAW_BASIC_COLORS];
5752b8d69caSLisandro Dalcin     unsigned char B[256 - PETSC_DRAW_BASIC_COLORS];
5769566063dSJacob Faibussowitsch     PetscCall(PetscDrawUtilitySetCmap(NULL, ncolors, R, G, B));
5772b8d69caSLisandro Dalcin     for (k = 0; k < PETSC_DRAW_BASIC_COLORS; k++) {
5782b8d69caSLisandro Dalcin       img->palette[k][0] = BasicColors[k][0];
5792b8d69caSLisandro Dalcin       img->palette[k][1] = BasicColors[k][1];
5802b8d69caSLisandro Dalcin       img->palette[k][2] = BasicColors[k][2];
5812b8d69caSLisandro Dalcin     }
5822b8d69caSLisandro Dalcin     for (i = 0; i < ncolors; i++, k++) {
5832b8d69caSLisandro Dalcin       img->palette[k][0] = R[i];
5842b8d69caSLisandro Dalcin       img->palette[k][1] = G[i];
5852b8d69caSLisandro Dalcin       img->palette[k][2] = B[i];
5862b8d69caSLisandro Dalcin     }
5872b8d69caSLisandro Dalcin   }
5882b8d69caSLisandro Dalcin 
5899566063dSJacob Faibussowitsch   if (!draw->savefilename) PetscCall(PetscDrawSetSave(draw, draw->title));
5903ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5912b8d69caSLisandro Dalcin }
5922b8d69caSLisandro Dalcin 
5932b8d69caSLisandro Dalcin /*@C
594811af0c4SBarry Smith   PetscDrawOpenImage - Opens an image for use with the `PetscDraw` routines.
5952b8d69caSLisandro Dalcin 
596d083f849SBarry Smith   Collective
5972b8d69caSLisandro Dalcin 
5982b8d69caSLisandro Dalcin   Input Parameters:
5992b8d69caSLisandro Dalcin + comm     - the communicator that will share image
6002fe279fdSBarry Smith . filename - optional name of the file where the image will be stored
6012fe279fdSBarry Smith . w        - the image width in pixels
6022fe279fdSBarry Smith - h        - the image height in pixels
6032b8d69caSLisandro Dalcin 
6042fe279fdSBarry Smith   Output Parameter:
6052b8d69caSLisandro Dalcin . draw - the drawing context.
6062b8d69caSLisandro Dalcin 
6072b8d69caSLisandro Dalcin   Level: beginner
6082b8d69caSLisandro Dalcin 
609811af0c4SBarry Smith .seealso: `PetscDraw`, `PETSC_DRAW_IMAGE`, `PETSC_DRAW_X`, `PetscDrawSetSave()`, `PetscDrawSetFromOptions()`, `PetscDrawCreate()`, `PetscDrawDestroy()`
6102b8d69caSLisandro Dalcin @*/
611d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawOpenImage(MPI_Comm comm, const char filename[], int w, int h, PetscDraw *draw)
612d71ae5a4SJacob Faibussowitsch {
6132b8d69caSLisandro Dalcin   PetscFunctionBegin;
6149566063dSJacob Faibussowitsch   PetscCall(PetscDrawCreate(comm, NULL, NULL, 0, 0, w, h, draw));
6159566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetType(*draw, PETSC_DRAW_IMAGE));
6169566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetSave(*draw, filename));
6173ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6182b8d69caSLisandro Dalcin }
619