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