/*@C PetscDrawOpenImage - Opens an image for use with the PetscDraw routines. Collective on MPI_Comm Input Parameters: + comm - the communicator that will share image - filename - optional name of the file - w, h - the image width and height in pixels Output Parameters: . draw - the drawing context. Level: beginner .seealso: PetscDrawSetSave(), PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy() @*/ PetscErrorCode PetscDrawOpenImage(MPI_Comm comm,const char filename[],int w,int h,PetscDraw *draw) { PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscDrawCreate(comm,NULL,NULL,0,0,w,h,draw);CHKERRQ(ierr); ierr = PetscDrawSetType(*draw,PETSC_DRAW_IMAGE);CHKERRQ(ierr); ierr = PetscDrawSetSave(*draw,filename);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscDrawSetFromOptions - Sets the graphics type from the options database. Defaults to a PETSc X windows graphics. Collective on PetscDraw Input Parameter: . draw - the graphics context Options Database Keys: + -nox - do not use X graphics (ignore graphics calls, but run program correctly) - -nox_warning - when X windows support is not installed this prevents the warning message from being printed Level: intermediate Notes: Must be called after PetscDrawCreate() before the PetscDrawtor is used. Concepts: drawing^setting options Concepts: graphics^setting options .seealso: PetscDrawCreate(), PetscDrawSetType() @*/ PetscErrorCode PetscDrawSetFromOptions(PetscDraw draw) { PetscErrorCode ierr; PetscBool flg,nox; char vtype[256]; const char *def; PetscBool save; #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X) PetscBool warn; #endif char filename[PETSC_MAX_PATH_LEN]; PetscBool movie = PETSC_FALSE; PetscFunctionBegin; PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); if (!PetscDrawList) { ierr = PetscDrawRegisterAll(PETSC_NULL);CHKERRQ(ierr); } if (((PetscObject)draw)->type_name) { def = ((PetscObject)draw)->type_name; } else { ierr = PetscOptionsHasName(PETSC_NULL,"-nox",&nox);CHKERRQ(ierr); def = PETSC_DRAW_NULL; #if defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X) if (!nox) def = PETSC_DRAW_WIN32; #elif defined(PETSC_HAVE_X) if (!nox) def = PETSC_DRAW_X; #else ierr = PetscOptionsHasName(PETSC_NULL,"-nox_warning",&warn);CHKERRQ(ierr); if (!nox && !warn) { (*PetscErrorPrintf)("PETSc installed without X windows on this machine\nproceeding without graphics\n"); } #endif } ierr = PetscObjectOptionsBegin((PetscObject)draw);CHKERRQ(ierr); ierr = PetscOptionsList("-draw_type","Type of graphical output","PetscDrawSetType",PetscDrawList,def,vtype,256,&flg);CHKERRQ(ierr); if (flg) { ierr = PetscDrawSetType(draw,vtype);CHKERRQ(ierr); } else if (!((PetscObject)draw)->type_name) { ierr = PetscDrawSetType(draw,def);CHKERRQ(ierr); } ierr = PetscOptionsName("-nox","Run without graphics","None",&nox);CHKERRQ(ierr); ierr = PetscOptionsBool("-draw_save_movie","Make a movie from the images saved","PetscDrawSetSave",movie,&movie,PETSC_NULL);CHKERRQ(ierr); ierr = PetscOptionsString("-draw_save","Save graphics to file","PetscDrawSetSave",filename,filename,PETSC_MAX_PATH_LEN,&save);CHKERRQ(ierr); if (save) { ierr = PetscDrawSetSave(draw,filename,movie);CHKERRQ(ierr); } /* process any options handlers added with PetscObjectAddOptionsHandler() */ ierr = PetscObjectProcessOptionsHandlers((PetscObject)draw);CHKERRQ(ierr); ierr = PetscOptionsEnd();CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode PetscDrawCreate_Image(PetscDraw draw) { PetscImage img; int w = draw->w, h = draw->h; PetscInt size[2], nsize = 2; PetscBool set; PetscErrorCode ierr; PetscFunctionBegin; draw->pause = 0; draw->coor_xl = 0; draw->coor_xr = 1; draw->coor_yl = 0; draw->coor_yr = 1; draw->port_xl = 0; draw->port_xr = 1; draw->port_yl = 0; draw->port_yr = 1; size[0] = w; if (size[0] < 1) size[0] = 300; size[1] = h; if (size[1] < 1) size[1] = size[0]; ierr = PetscOptionsGetIntArray(((PetscObject)draw)->options,((PetscObject)draw)->prefix,"-draw_size",size,&nsize,&set);CHKERRQ(ierr); if (set && nsize == 1) size[1] = size[0]; if (size[0] < 1) size[0] = 300; if (size[1] < 1) size[1] = size[0]; draw->w = w = size[0]; draw->x = 0; draw->h = h = size[1]; draw->x = 0; ierr = PetscNewLog(draw,&img);CHKERRQ(ierr); ierr = PetscMemcpy(draw->ops,&DvOps,sizeof(DvOps));CHKERRQ(ierr); draw->data = (void*)img; img->w = w; img->h = h; ierr = PetscCalloc1((size_t)(img->w*img->h),&img->buffer);CHKERRQ(ierr); PetscImageSetClip(img,0,0,img->w,img->h); { int i,k,ncolors = 256-PETSC_DRAW_BASIC_COLORS; unsigned char R[256-PETSC_DRAW_BASIC_COLORS]; unsigned char G[256-PETSC_DRAW_BASIC_COLORS]; unsigned char B[256-PETSC_DRAW_BASIC_COLORS]; ierr = PetscDrawUtilitySetCmap(NULL,ncolors,R,G,B);CHKERRQ(ierr); for (k=0; k<PETSC_DRAW_BASIC_COLORS; k++) { img->palette[k][0] = BasicColors[k][0]; img->palette[k][1] = BasicColors[k][1]; img->palette[k][2] = BasicColors[k][2]; } for (i=0; i<ncolors; i++, k++) { img->palette[k][0] = R[i]; img->palette[k][1] = G[i]; img->palette[k][2] = B[i]; } } if (!draw->savefilename) {ierr = PetscDrawSetSave(draw,draw->title);CHKERRQ(ierr);} PetscFunctionReturn(0); }
/*@ PetscDrawSetFromOptions - Sets the graphics type from the options database. Defaults to a PETSc X windows graphics. Collective on PetscDraw Input Parameter: . draw - the graphics context Options Database Keys: + -nox - do not use X graphics (ignore graphics calls, but run program correctly) . -nox_warning - when X windows support is not installed this prevents the warning message from being printed . -draw_pause <pause amount> -- -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed . -draw_save [optional filename] - (X windows only) saves each image before it is cleared to a file . -draw_save_final_image [optional filename] - (X windows only) saves the final image displayed in a window . -draw_save_movie - converts image files to a movie at the end of the run. See PetscDrawSetSave() . -draw_save_on_flush - saves an image on each flush in addition to each clear - -draw_save_single_file - saves each new image in the same file, normally each new image is saved in a new file with filename_%d Level: intermediate Notes: Must be called after PetscDrawCreate() before the PetscDraw is used. Concepts: drawing^setting options Concepts: graphics^setting options .seealso: PetscDrawCreate(), PetscDrawSetType(), PetscDrawSetSave(), PetscDrawSetSaveFinalImage() @*/ PetscErrorCode PetscDrawSetFromOptions(PetscDraw draw) { PetscErrorCode ierr; PetscBool flg,nox; char vtype[256]; const char *def; PetscReal dpause; #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X) PetscBool warn; #endif PetscFunctionBegin; PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); if (!PetscDrawList) { ierr = PetscDrawRegisterAll();CHKERRQ(ierr); } if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name; else { ierr = PetscOptionsHasName(NULL,"-nox",&nox);CHKERRQ(ierr); def = PETSC_DRAW_NULL; #if defined(PETSC_USE_WINDOWS_GRAPHICS) if (!nox) def = PETSC_DRAW_WIN32; #elif defined(PETSC_HAVE_X) if (!nox) def = PETSC_DRAW_X; #elif defined(PETSC_HAVE_GLUT) if (!nox) def = PETSC_DRAW_GLUT; #elif defined(PETSC_HAVE_OPENGLES) if (!nox) def = PETSC_DRAW_OPENGLES; #else ierr = PetscOptionsHasName(NULL,"-nox_warning",&warn);CHKERRQ(ierr); if (!nox && !warn) (*PetscErrorPrintf)("PETSc installed without X windows, Microsoft Graphics, OpenGL ES, or GLUT/OpenGL on this machine\nproceeding without graphics\n"); #endif } ierr = PetscObjectOptionsBegin((PetscObject)draw);CHKERRQ(ierr); ierr = PetscOptionsFList("-draw_type","Type of graphical output","PetscDrawSetType",PetscDrawList,def,vtype,256,&flg);CHKERRQ(ierr); if (flg) { ierr = PetscDrawSetType(draw,vtype);CHKERRQ(ierr); } else if (!((PetscObject)draw)->type_name) { ierr = PetscDrawSetType(draw,def);CHKERRQ(ierr); } ierr = PetscOptionsName("-nox","Run without graphics","None",&nox);CHKERRQ(ierr); #if defined(PETSC_HAVE_X) { char filename[PETSC_MAX_PATH_LEN]; PetscBool save,movie = PETSC_FALSE; ierr = PetscOptionsBool("-draw_save_movie","Make a movie from the images saved (X Windows only)","PetscDrawSetSave",movie,&movie,NULL);CHKERRQ(ierr); ierr = PetscOptionsBool("-draw_save_single_file","Each new image replaces previous image in file","PetscDrawSetSave",draw->savesinglefile,&draw->savesinglefile,NULL);CHKERRQ(ierr); ierr = PetscOptionsString("-draw_save","Save graphics to file (X Windows only)","PetscDrawSetSave",filename,filename,PETSC_MAX_PATH_LEN,&save);CHKERRQ(ierr); if (save) { ierr = PetscDrawSetSave(draw,filename,movie);CHKERRQ(ierr); } ierr = PetscOptionsString("-draw_save_final_image","Save graphics to file (X Windows only)","PetscDrawSetSaveFinalImage",filename,filename,PETSC_MAX_PATH_LEN,&save);CHKERRQ(ierr); if (save) { ierr = PetscDrawSetSaveFinalImage(draw,filename);CHKERRQ(ierr); } ierr = PetscOptionsBool("-draw_save_on_flush","Save graphics to file (X Windows only) on each flush","PetscDrawSetSave",draw->saveonflush,&draw->saveonflush,NULL);CHKERRQ(ierr); } #endif ierr = PetscOptionsGetReal(NULL,"-draw_pause",&dpause,&flg);CHKERRQ(ierr); if (flg) draw->pause = dpause; /* process any options handlers added with PetscObjectAddOptionsHandler() */ ierr = PetscObjectProcessOptionsHandlers((PetscObject)draw);CHKERRQ(ierr); ierr = PetscDrawViewFromOptions(draw,NULL,"-draw_view");CHKERRQ(ierr); ierr = PetscOptionsEnd();CHKERRQ(ierr); PetscFunctionReturn(0); }