#import "GnuView.h" @implementation GnuView static NXCoord xsize= NEXT_XMAX; static NXCoord ysize= NEXT_YMAX; static int printing; static void setprintsize(); - initFrame: (NXRect *)rects { [super initFrame:rects]; PSstring = NULL; [self display]; return self; } /* This is here to fix NeXT bug # 21973: failure to free D.O. memory */ /* Note: personally I don't think this fixes it. */ - free { if (PSstring) free(PSstring); [super free]; return self; } - executePS:(char *) PStext { if (PSstring) free(PSstring); PSstring = PStext; [window makeKeyAndOrderFront:self]; [self display]; return self; } - drawSelf:(const NXRect *) rects : (int) rectCount { DPSContext d; d = DPSGetCurrentContext(); if (!printing) { /* Clear Screen */ PSsetgray(NX_WHITE); NXRectFill(&bounds); /* scale to gnuplot coords */ [self setDrawSize:xsize:ysize]; } else { setprintsize(); } if (PSstring) DPSWritePostScript(d, PSstring, strlen(PSstring)); DPSFlushContext(d); return self; } - printPSCode: sender { printing = 1; [super printPSCode:sender]; printing = 0; return self; } static void setprintsize() { DPSContext d; NXRect *paperRect; float width, height; id prInfo; float xscale, yscale; d = DPSGetCurrentContext(); prInfo = [NXApp printInfo]; paperRect = (NXRect *) [prInfo paperRect]; width = paperRect->size.width; height = paperRect->size.height; /* Leave margins on paper */ DPSPrintf(d, "grestore\ngrestore\ngrestore\n"); if ([prInfo orientation] == NX_LANDSCAPE) { DPSPrintf(d, "-90 rotate\n"); DPSPrintf(d, "%g 0 translate\n", -1 * paperRect->size.width); DPSPrintf(d, "0 %g translate\n", paperRect->size.height/100); xscale = width/NEXT_XMAX*0.95; yscale = height/NEXT_YMAX*0.9; DPSPrintf(d, "%g %g scale\n", xscale, yscale); } else { xscale = width/NEXT_XMAX*0.95; yscale = height/NEXT_YMAX*0.95; DPSPrintf(d, "%g %g scale\n", xscale, yscale); DPSPrintf(d, "0 %g translate\n", paperRect->size.height/100); } DPSPrintf(d, "gsave\ngsave\n"); DPSFlushContext(d); return; } @end