int main(int argc, char **argv) { XGCValues values; XEvent report; int x0=0, y0=0, width=300, height=200, border=3; char *fontname = "6x13"; XFontStruct *dsp_font; Window menu; char *str1 = " Print out the PostScript file? ", *str0 = "Generate a PostScript file (OUTPUT.ps)?"; int m_width, m_height, flag=yes; /* open display */ if ((dsply = XOpenDisplay(NULL)) == NULL) { printf("Can't open display NULL\n"); exit(-1); } scrn = DefaultScreen(dsply); /* access font */ Gdraws_load_font(&dsp_font, fontname); values.background = WhitePixel(dsply, scrn); values.foreground = BlackPixel(dsply, scrn); gc = XCreateGC(dsply, RootWindow(dsply, scrn), (GCForeground | GCBackground), &values); PSGlobalInit(); /* must initiate before using G/PS functions */ PSCreateContext(gc, "gc", psNormalWidth, psButtCap, psMiterJoin, psWhite, psBlack); XSetFont(dsply, gc, dsp_font->fid); gc1 = XCreateGC(dsply, RootWindow(dsply, scrn), (GCForeground | GCBackground), &values); PSCreateContext(gc1, "gc1", psNormalWidth, psButtCap, psMiterJoin, psWhite, psBlack); XSetFont(dsply, gc1, dsp_font->fid); if (!(viewport = (viewPoints *)malloc(sizeof(viewPoints)))) { fprintf(stderr,"Ran out of memory (malloc) trying to create a viewport.\n"); exit(-1); } viewport->titleWindow = XCreateSimpleWindow(dsply, RootWindow(dsply,scrn), x0, y0, width+6, height+32+height/4, border, BlackPixel(dsply, scrn), WhitePixel(dsply, scrn)); viewport->viewWindow = XCreateSimpleWindow(dsply, viewport->titleWindow, x0, y0+20, width, height, border, BlackPixel(dsply, scrn), WhitePixel(dsply, scrn)); strcpy(viewport->title, "what is a test title?"); m_width = width; m_height = height/4; menu = XCreateSimpleWindow(dsply, viewport->titleWindow, x0, y0+20+height+6, m_width, m_height, border, BlackPixel(dsply,scrn), WhitePixel(dsply,scrn)); XSelectInput(dsply, viewport->viewWindow, KeyPressMask|ButtonPressMask|ExposureMask); XSelectInput(dsply, viewport->titleWindow, KeyPressMask|ExposureMask); XSelectInput(dsply, menu, KeyPressMask|ButtonPressMask|ExposureMask); XMapWindow(dsply, viewport->viewWindow); XMapWindow(dsply, viewport->titleWindow); XFlush(dsply); while (yes) { XNextEvent(dsply, &report); switch (report.type) { case Expose: if (report.xexpose.window==viewport->titleWindow) { if (GDrawImageString(gc, viewport->titleWindow, 20, 15, viewport->title, strlen(viewport->title),X) == psError) printf("screen draw image string failed.\n"); if (Gdraws_data(X) == psError) printf("screen Gdraws_data failed.\n"); } if (report.xexpose.window==viewport->viewWindow) { if (Gdraws_data(X) == psError) printf("screen Gdraws_data failed.\n"); } else if (report.xexpose.window==menu) { if (flag) Gdraws_draw_menu(menu, str0, m_width, m_height); else Gdraws_draw_menu(menu, str1, m_width, m_height); } break; case ButtonPress: if (report.xbutton.window==viewport->viewWindow) { XMapWindow(dsply, menu); XFlush(dsply); } else if (report.xbutton.window==menu && flag) { XUnmapWindow(dsply, menu); if (Gdraws_pressed_yes(m_width, m_height, report.xbutton.x, report.xbutton.y)) { flag=no; XMapWindow(dsply, menu); PSInit(viewport->viewWindow, viewport->titleWindow); if (Gdraws_data(PS) != psError) PSCreateFile(3,viewport->viewWindow, viewport->titleWindow,viewport->title); else printf("PS Gdraws_data failed.\n"); } } else if (report.xbutton.window==menu && !flag) { XUnmapWindow(dsply, menu); if (Gdraws_pressed_yes(m_width, m_height, report.xbutton.x, report.xbutton.y)) system("print OUTPUT.ps"); flag = yes; } break; case KeyPress: if (report.xkey.window==viewport->viewWindow || report.xkey.window==viewport->titleWindow) { XFreeGC(dsply, gc); XFreeGC(dsply, gc1); XCloseDisplay(dsply); PSClose(); exit(1); } else if (report.xkey.window==menu) XUnmapWindow(dsply, menu); default: break; } } return 0; }
int writeViewport (int thingsToWrite) { int i, j, k, ii, code, *anIndex; LLPoint *anLLPoint; LPoint *anLPoint; viewTriple *aPt; XWindowAttributes vwInfo; FILE *viewDataFile; char viewDirName[80], viewDataFilename[80], viewBitmapFilename[80], viewPixmapFilename[80], command[80]; XGetWindowAttributes(dsply,viewport->titleWindow,&vwInfo); sprintf(viewDirName,"%s%s",filename,".VIEW"); sprintf(command,"%s%s%s","rm -r ",viewDirName," > /dev/null 2>&1"); code = system(command); sprintf(command,"%s%s%s","mkdir ",viewDirName," > /dev/null 2>&1"); system(command); if (0) { fprintf(stderr," Error: Cannot create %s\n",viewDirName); return(-1); } else { /*** Create the data file ***/ sprintf(viewDataFilename,"%s%s",viewDirName,"/data"); if ((viewDataFile = fopen(viewDataFilename,"w")) == NULL) { fprintf(stderr," Error: Cannot create %s\n",viewDataFilename); perror("fopen"); return(-1); } else { /*** write out the view3DStruct stuff ***/ fprintf(viewDataFile,"%d\n",viewData.typeOf3D); fprintf(viewDataFile,"%g %g %g %g %g %g\n", viewData.xmin,viewData.xmax,viewData.ymin,viewData.ymax, viewData.zmin,viewData.zmax); fprintf(viewDataFile,"%s\n",viewport->title); fprintf(viewDataFile,"%g %g %g %g %g %g %g %g\n",viewport->deltaX, viewport->deltaY,viewport->scale, viewport->scaleX,viewport->scaleY,viewport->scaleZ, viewport->theta,viewport->phi); fprintf(viewDataFile,"%d %d %d %d\n",vwInfo.x,vwInfo.y,vwInfo.width, vwInfo.height); fprintf(viewDataFile,"%d %d %d %d %d %d %d\n",viewport->haveControl, viewData.style, viewport->axesOn, viewport->hueOffset,viewport->numberOfHues, viewport->diagonals, viewData.outlineRenderOn); fprintf(viewDataFile,"%g %g %g %g\n",viewport->lightVector[0], viewport->lightVector[1], viewport->lightVector[2], viewport->translucency); fprintf(viewDataFile,"%d %g\n",viewData.perspective, viewData.eyeDistance); /* write out the generalized 3D components */ fprintf(viewDataFile,"%d\n",viewData.numOfPoints); for (i=0; i<viewData.numOfPoints; i++) { aPt = refPt3D(viewData,i); fprintf(viewDataFile,"%g %g %g %g\n",aPt->x, aPt->y, aPt->z, aPt->c); } fprintf(viewDataFile,"%d\n",viewData.lllp.numOfComponents); anLLPoint = viewData.lllp.llp; for (i=0; i<viewData.lllp.numOfComponents; i++,anLLPoint++) { fprintf(viewDataFile,"%d %d\n",anLLPoint->prop.closed, anLLPoint->prop.solid); fprintf(viewDataFile,"%d\n",anLLPoint->numOfLists); anLPoint = anLLPoint->lp; for (j=0; j<anLLPoint->numOfLists; j++,anLPoint++) { fprintf(viewDataFile,"%d %d\n",anLPoint->prop.closed, anLPoint->prop.solid); fprintf(viewDataFile,"%d\n",anLPoint->numOfPoints); anIndex = anLPoint->indices; for (k=0; k<anLPoint->numOfPoints; k++,anIndex++) { fprintf(viewDataFile,"%d\n",*anIndex); } /* for points in LPoints (k) */ } /* for LPoints in LLPoints (j) */ } /* for LLPoints in LLLPoints (i) */ fclose(viewDataFile); } /* else was able to open file under the given filename */ /* write out special files */ for (ii=1; ii<numBits; ii++) { /* write.h is one-based */ if (thingsToWrite & (1<<ii)) { switch (ii) { case Bitmap: /*** Create the pixmap (bitmaps need leaf name) ***/ sprintf(viewBitmapFilename,"%s%s%s",viewDirName,"/","image.bm"); XGetWindowAttributes(dsply,viewport->viewWindow,&vwInfo); code = XWriteBitmapFile(dsply,viewBitmapFilename, viewport->titleWindow,vwInfo.width, vwInfo.height+vwInfo.border_width+20,-1,-1); break; case Pixmap: /*** Create the pixmap (bitmaps need leaf name) ***/ sprintf(viewPixmapFilename,"%s%s%s",viewDirName,"/","image.xpm"); XGetWindowAttributes(dsply,viewport->viewWindow,&vwInfo); write_pixmap_file(dsply,scrn,viewPixmapFilename, viewport->titleWindow,0,0,vwInfo.width, vwInfo.height+titleHeight); break; case Image: /*** Create the image (bitmaps need leaf name) ***/ writeImage = yes; sprintf(viewPixmapFilename,"%s%s%s",viewDirName,"/","image.xpm"); XResizeWindow(dsply,viewport->titleWindow,300,300+titleHeight); XResizeWindow(dsply,viewport->viewWindow,300,300); viewport->hueTop = totalHues-1; viewport->hueOffset = 0; viewport->numberOfHues = viewport->hueTop - viewport->hueOffset; firstTime = 1; if (viewData.style == transparent) { viewData.style = render; viewData.outlineRenderOn = 1; } else { if (viewData.style == render) viewData.outlineRenderOn = 1; } drawViewport(Xoption); writeTitle(); XGetWindowAttributes(dsply,viewport->viewWindow,&vwInfo); write_pixmap_file(dsply,scrn,viewPixmapFilename, viewport->titleWindow,0,0,vwInfo.width, vwInfo.height+titleHeight); viewport->monoOn = 1; maxGreyShade = XInitShades(dsply,scrn); firstTime = 1; drawViewport(Xoption); writeTitle(); sprintf(viewBitmapFilename,"%s%s%s",viewDirName,"/","image.bm"); code = XWriteBitmapFile(dsply,viewBitmapFilename, viewport->titleWindow,vwInfo.width, vwInfo.height+vwInfo.border_width+20,-1,-1); writeImage = no; break; case Postscript: /*** Create postscript output for viewport (in axiom3D.ps) ***/ sprintf(PSfilename,"%s%s",viewDirName,"/axiom3D.ps"); if (PSInit(viewport->viewWindow,viewport->titleWindow) == psError) return(-1); drawViewport(PSoption); /* write new script file in /tmp */ if (PSCreateFile(viewBorderWidth,viewport->viewWindow, viewport->titleWindow, viewport->title) == psError) return(-1); /* concat script & proc into axiom3D.ps */ break; } /* switch on ii */ } /* if thingsToWrite >> ii */ } /* for ii */ return(0); } /* else create directory okay */ }
int writeViewport(int thingsToWrite) { FILE *viewDataFile; char viewDirName[80], viewBitmapFilename[80],viewDataFilename[80],command[80]; int i,j,k,code,ii; pointListStruct *aList; pointStruct *aPoint; XWindowAttributes vwInfo; XGetWindowAttributes(dsply,viewport->titleWindow,&vwInfo); sprintf(viewDirName,"%s%s",filename,".VIEW"); sprintf(command,"%s%s%s","rm -r ",viewDirName," > /dev/null 2>&1"); code = system(command); sprintf(command,"%s%s%s","mkdir ",viewDirName," > /dev/null 2>&1"); if (system(command)) { fprintf(stderr," Error: Cannot create %s\n",viewDirName); return(-1); } else { /*** Create the data file ***/ sprintf(viewDataFilename,"%s%s",viewDirName,"/data"); if ((viewDataFile = fopen(viewDataFilename,"w")) == NULL) { fprintf(stderr," Error: Cannot create %s\n",viewDataFilename); perror("fopen"); return(-1); } else { /*** write out the view2DStruct stuff ***/ fprintf(viewDataFile,"%d\n",view2DType); fprintf(viewDataFile,"%s\n",viewport->title); fprintf(viewDataFile,"%d %d %d %d\n",vwInfo.x,vwInfo.y, vwInfo.width,vwInfo.height); for (i=0; i<maxGraphs; i++) { fprintf(viewDataFile,"%d\n",graphArray[i].key); fprintf(viewDataFile,"%g %g\n", graphStateArray[i].scaleX,graphStateArray[i].scaleY); fprintf(viewDataFile,"%g %g\n", graphStateArray[i].deltaX,graphStateArray[i].deltaY); fprintf(viewDataFile,"%g %g\n", graphStateArray[i].centerX,graphStateArray[i].centerY); fprintf(viewDataFile,"%d %d %d %d %d %d %d\n", graphStateArray[i].pointsOn,graphStateArray[i].connectOn, graphStateArray[i].splineOn, graphStateArray[i].axesOn, graphStateArray[i].axesColor, graphStateArray[i].unitsOn, graphStateArray[i].unitsColor); fprintf(viewDataFile,"%d %d\n", graphStateArray[i].showing,graphStateArray[i].selected); } fclose(viewDataFile); for (i=0; i<maxGraphs; i++) { if (graphArray[i].key) { sprintf(viewDataFilename,"%s%s%d",viewDirName,"/graph",i); if ((viewDataFile = fopen(viewDataFilename,"w")) == NULL) { fprintf(stderr," Error: Cannot create %s\n",viewDataFilename); perror("fopen"); return(-1); } else { fprintf(viewDataFile,"%g %g %g %g\n", graphArray[i].xmin,graphArray[i].ymin, graphArray[i].xmax,graphArray[i].ymax); fprintf(viewDataFile,"%g %g\n", graphArray[i].xNorm,graphArray[i].yNorm); fprintf(viewDataFile,"%g %g\n", graphArray[i].originX,graphArray[i].originY); fprintf(viewDataFile,"%g %g\n", graphArray[i].spadUnitX,graphArray[i].spadUnitY); fprintf(viewDataFile,"%g %g\n", graphArray[i].unitX,graphArray[i].unitY); fprintf(viewDataFile,"%d\n",graphArray[i].numberOfLists); for (j=0,aList=graphArray[i].listOfListsOfPoints; j<graphArray[i].numberOfLists; j++, aList++) { fprintf(viewDataFile,"%d\n",aList->numberOfPoints); fprintf(viewDataFile,"%d %d %d\n", aList->pointColor,aList->lineColor,aList->pointSize); for (k=0,aPoint=aList->listOfPoints; k<aList->numberOfPoints; k++,aPoint++) fprintf(viewDataFile,"%g %g %g %g\n", aPoint->x,aPoint->y,aPoint->hue,aPoint->shade); } /* for j, aList */ fclose(viewDataFile); } /* else graph i */ } /* if */ } /* for */ } /* else */ /* write out special files */ for (ii=1; ii<numBits; ii++) { /* write.h is one-based */ if (thingsToWrite & (1<<ii)) { switch (ii) { case Pixmap: /*** Create the pixmap (bitmaps need leaf name) ***/ sprintf(viewBitmapFilename,"%s%s",viewDirName,"/image.xpm"); XGetWindowAttributes(dsply,viewport->viewWindow,&vwInfo); write_pixmap_file(dsply,scrn,viewBitmapFilename, viewport->titleWindow,0,0,vwInfo.width, vwInfo.height+titleHeight); break; case Bitmap: /*** Create the bitmap (bitmaps need leaf name) ***/ sprintf(viewBitmapFilename,"%s%s",viewDirName,"/image.bm"); XGetWindowAttributes(dsply,viewport->viewWindow,&vwInfo); code = XWriteBitmapFile(dsply,viewBitmapFilename, viewport->titleWindow,vwInfo.width, vwInfo.height+vwInfo.border_width+20,-1,-1); break; case Image: /*** Create the pixmap (bitmaps need leaf name) ***/ sprintf(viewBitmapFilename,"%s%s",viewDirName,"/image.xpm"); XResizeWindow(dsply,viewport->titleWindow,300,300+titleHeight); XResizeWindow(dsply,viewport->viewWindow,300,300); XGetWindowAttributes(dsply,viewport->viewWindow,&vwInfo); drawViewport(Xoption); writeTitle(); write_pixmap_file(dsply,scrn,viewBitmapFilename, viewport->titleWindow,0,0,vwInfo.width, vwInfo.height+titleHeight); /*** Create the bitmap (bitmaps need leaf name) ***/ mono = 1; drawViewport(Xoption); writeTitle(); sprintf(viewBitmapFilename,"%s%s%s",viewDirName,"/","image.bm"); code = XWriteBitmapFile(dsply,viewBitmapFilename, viewport->titleWindow,vwInfo.width, vwInfo.height+vwInfo.border_width+20,-1,-1); mono = 0; break; case Postscript: /*** Create postscript output for viewport (in axiom2D.ps) ***/ sprintf(PSfilename,"%s%s",viewDirName,"/axiom2D.ps"); if (PSInit(viewport->viewWindow,viewport->titleWindow) == psError) return (-1); drawViewport(PSoption); /* write new script file in /tmp */ if (PSCreateFile(viewBorderWidth,viewport->viewWindow, viewport->titleWindow, viewport->title) == psError) return(-1); /* concat script & proc into axiom2D.ps */ break; } /* switch on ii */ } /* if thingsToWrite >> ii */ } /* for ii */ return(0); } /* else create directory okay */ }