This is eps1.c in view mode; [Download] [Up]
#include <stdio.h>
#include <X11/StringDefs.h>
#include <X11/Intrinsic.h>
#include <DPS/dpsXclient.h>
#include <DPS/dpsXpreview.h>
#include <ieeefp.h>
int isinf(double d) {return !finite(d);}
/*
* The following declarations are part of the mechanism that
* calls the Redisplay procedure whenever the contents need
* to be updated.
*/
void Redisplay();
double PixelsPerPoint(Screen *);
String translations = "<Expose> : Redisplay()";
XtActionsRec actions[] = { {"Redisplay", Redisplay} };
Display *display; /* Connection to the X server */
Window window; /* Window that we'll draw in */
GC gc; /* X graphics context */
DPSContext ctxt;
FILE *epsf;
Pixmap pixmap;
XRectangle pixmapSize;
XRectangle bbox;
void main(argc, argv)
int argc;
char **argv;
{
Widget appShell, w;
XtAppContext app;
int retval;
Bool doneFlag;
char *file;
double pixelsperpoint;
int depth;
/*
* The call to XtAppInitialize creates a connection to the
* X server. We extract that connection with the call to
* XtDisplay()
*/
appShell = XtAppInitialize(&app, "Demo", NULL, 0, &argc, argv,
NULL, NULL, 0);
if(argc < 2) {
fprintf(stderr,"Usage: %s eps-file\n",argv[0]);
exit(1);
}
file = argv[1];
display = XtDisplay(appShell);
depth = DefaultDepthOfScreen(XtScreen(appShell));
pixelsperpoint = PixelsPerPoint(XtScreen(appShell));
/*
* XtAppAddActions adds Redisplay as an action procedure that
* is called when an Expose event is received by the widget.
*/
XtAppAddActions(app, actions, XtNumber(actions));
/*
* Now we can create the window. First we set up some parameters
* like width and height. The call to XtVaCreateManagedWidget and
* XtRealize create and initialize the window. We extract the
* window identifier with the XtWindow call.
*/
w = XtVaCreateManagedWidget("main", coreWidgetClass, appShell,
XtNwidth, 500,
XtNheight, 500,
XtNtranslations,
XtParseTranslationTable(translations),
NULL);
XtRealizeWidget(appShell);
window = XtWindow(w);
gc = XCreateGC(display, window, 0, NULL);
/*
* Create a context to which the PostScript language code
* will be sent
*/
ctxt = XDPSCreateSimpleContext(display, window, gc, 0, 400,
DPSDefaultTextBackstop,
DPSDefaultErrorProc, (DPSSpace) NULL);
XDPSRegisterContext(ctxt, True);
epsf = fopen(file, "r");
if(epsf == NULL) {
perror(file);
exit(1);
}
retval = XDPSCreatePixmapForEPSF(ctxt,
XtScreen(w), epsf,
depth, pixelsperpoint, &pixmap,
&pixmapSize, &bbox);
switch(retval) {
case dps_status_success:
break;
case dps_status_failure:
fprintf(stderr,"File is not EPSF\n");
exit(1);
case dps_status_no_extension:
fprintf(stderr,"Server does not support DPS\n");
exit(1);
default:
fprintf(stderr, "Internal error %d\n", retval);
exit(1);
}
retval = XDPSImageFileIntoDrawable(ctxt,
XtScreen(w), pixmap, epsf,
pixmapSize.height, depth,
&bbox, -bbox.x, -bbox.y,
pixelsperpoint, True, False, True, &doneFlag);
switch(retval) {
case dps_status_success:
break;
case dps_status_no_extension:
case dps_status_unregistered_context:
case dps_status_illegal_value:
case dps_status_postscript_error:
case dps_status_imaging_incomplete:
fprintf(stderr, "XDPSImageFileIntoDrawable failed\n");
}
XtAppMainLoop(app);
}
/* The Redisplay procedure is called whenever the */
/* contents of the window needs to be repainted. */
void Redisplay(w, event, params, num)
Widget w;
XEvent *event;
String *params;
Cardinal *num;
{
XCopyArea(XtDisplay(w),
pixmap, window, gc, 0, 0,
pixmapSize.width, pixmapSize.height, 0, 0);
}
double
PixelsPerPoint(Screen *screen)
{
return (double) ((double)WidthOfScreen(screen) *
(double)(25.4 / 72.0) /
(double)(WidthMMOfScreen(screen)));
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.