This is DrawingView.m in view mode; [Download] [Up]
/* * (a) (C) 1990 by Adobe Systems Incorporated. All rights reserved. * * (b) If this Sample Code is distributed as part of the Display PostScript * System Software Development Kit from Adobe Systems Incorporated, * then this copy is designated as Development Software and its use is * subject to the terms of the License Agreement attached to such Kit. * * (c) If this Sample Code is distributed independently, then the following * terms apply: * * (d) This file may be freely copied and redistributed as long as: * 1) Parts (a), (d), (e) and (f) continue to be included in the file, * 2) If the file has been modified in any way, a notice of such * modification is conspicuously indicated. * * (e) PostScript, Display PostScript, and Adobe are registered trademarks of * Adobe Systems Incorporated. * * (f) THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO * CHANGE WITHOUT NOTICE, AND SHOULD NOT BE CONSTRUED * AS A COMMITMENT BY ADOBE SYSTEMS INCORPORATED. * ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY * OR LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO * WARRANTY OF ANY KIND (EXPRESS, IMPLIED OR STATUTORY) * WITH RESPECT TO THIS INFORMATION, AND EXPRESSLY * DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY, * FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT * OF THIRD PARTY RIGHTS. */ /* * DrawingView.m * * This view represents the page that the image is drawn onto. It is * a subview of the DocView. The DocView is the document view of * the ClipView. This view's real size grows with the scale but the * bounds always stays the same. * * Version: 2.0 * Author: Ken Fromm * History: * 03-07-91 Added this comment. */ #import "DrawingView.h" #import "DrawingViewWraps.h" #import "DocView.h" #import "Graphic.h" #import <appkit/Button.h> #import <appkit/Control.h> #import <appkit/Matrix.h> #import <appkit/SavePanel.h> #import <appkit/nextstd.h> #import <objc/List.h> #import <dpsclient/dpsclient.h> #import <dpsclient/wraps.h> extern void initGparms(); extern void setGraphicState(); static const DPSNameEncoding nameEncoding[4] = {dps_strings, dps_strings, dps_indexed, dps_indexed}; static const DPSProgramEncoding programEncoding[4] = {dps_ascii, dps_ascii, dps_binObjSeq, dps_encodedTokens}; static const char *fileSuffix[4] = {"Asc", "Abbr", "Bos", "Bot"}; @implementation DrawingView /* * Allocate a gstate, set the clipping to NO because it will be clipped * by the clip view. */ +newFrame:(NXRect *) frm { self = [super newFrame:frm]; [[self allocateGState] setClipping:NO]; drawUpath = [NXApp getUpathBuffer]; PSWDefs(); format = BOS; return self; } - free { [self freeGraphics]; return [super free]; } - freeGraphics { if (graphicsListId) [graphicsListId freeObjects]; [graphicsListId free]; return self; } - insertList:listId { [self freeGraphics]; graphicsListId = listId; return self; } - setDrawOrigin:(NXPoint *)origin { drawOrigin = *origin; return self; } /* * Saves the file in encapsulated format. A SavePanel is put up to * ask the user what file name should be used. A suffix is added to * identify the format that has been saved. */ - saveFile:sender { id savepanel, formatmatrix; int count; char tempBuf[MAXPATHLEN+1]; char *fileend; NXStream *stream; DPSContext newContext, oldContext; savepanel = [SavePanel new]; formatmatrix = [NXApp formatMatrix]; getwd(tempBuf); if ([savepanel runModalForDirectory:tempBuf file:NULL]) { strcpy(tempBuf, [savepanel filename]); fileend = strrchr(tempBuf, '.'); if (!fileend) fileend = &tempBuf[strlen(tempBuf)]; oldContext = DPSGetCurrentContext(); count = [formatmatrix cellCount]; for (format = 0; format < count; format++) { if ([[formatmatrix cellAt:format :0] state]) { stream = NXOpenMemory(NULL, 0, NX_WRITEONLY); if (stream) { newContext = DPSCreateStreamContext(stream, 0, programEncoding[format], nameEncoding[format], NULL); DPSSetContext(newContext); [self printPrologue:tempBuf]; [self drawSelf:&bounds :1]; [self printTrailer]; strcpy(fileend, fileSuffix[format]); strcpy(&tempBuf[strlen(tempBuf)], ".eps"); NXSaveToFile(stream, tempBuf); NXCloseMemory(stream, NX_FREEBUFFER); DPSSetContext(oldContext); if (newContext != oldContext); DPSDestroyContext(newContext); } } } format = BOS; } return self; } - printPrologue:(char *) filename { time_t clock; char *printtime; DPSContext ctxt; ctxt = DPSGetCurrentContext(); clock = time(0); printtime = ctime(&clock); DPSPrintf(ctxt, "%%!PS-Adobe-2.0 EPSF-1.2\n"); DPSPrintf(ctxt, "%%%%Creator: %s\n", [NXApp appName]); DPSPrintf(ctxt, "%%%%CreationDate: %s", printtime); DPSPrintf(ctxt, "%%%%Title: %s\n", filename); DPSPrintf(ctxt, "%%%%Origin: %f %f\n", bounds.origin.x, bounds.origin.y); DPSPrintf(ctxt, "%%%%BoundingBox: %f %f %f %f\n", bounds.origin.x, bounds.origin.y, bounds.origin.x + bounds.size.width, bounds.origin.y + bounds.size.height); if (format == ABBR) DPSPrintf(ctxt, "%%%%DocumentProcSets: Abbreviations 1.0 0\n"); DPSPrintf(ctxt, "%%%%EndComments\n\n"); if (format == ABBR) { DPSPrintf(ctxt, "%%%%BeginProcSet: Abbreviations 1.0 0\n"); PSWDefs(); DPSPrintf(ctxt, "%%%%EndProcSet\n"); } else if (format == BOS || format == BOT) DPSPrintf(ctxt, "/defineusername {pop pop} bind def\n"); DPSPrintf(ctxt, "\n%%%%EndProlog\n\n"); DPSPrintf(ctxt, "realtime\n\n"); return self; } - printTrailer { DPSContext ctxt; ctxt = DPSGetCurrentContext(); DPSPrintf(ctxt, "realtime exch sub == flush\n"); DPSFlushContext(ctxt); return self; } /* * Compare the bounds of the object with the rectangle to draw in order to * eliminate unnecessary drawing. The modal session stuff is just to * intercept the selection of the redraw button in the interface during * a trace. (This stops the drawing. It's only check during a trace * because the trace can be quite long.) */ - drawSelf:(NXRect *)r :(int) count { int i, num; GParms parms; GParms *p_parms; NXRect rect; NXRect *p_rect; PSsetgray(NX_WHITE); NXRectFill(r); initGparms(&parms); p_parms = &parms; setGraphicState(NULL, &parms, (format == ABBR)); rect = *r; rect.origin.x += drawOrigin.x; rect.origin.y += drawOrigin.y; p_rect = ▭ PSgsave(); NXRectClip(r); PStranslate(-drawOrigin.x, -drawOrigin.y); num = [graphicsListId count]; for (i = 0; i < num; i++) [[graphicsListId objectAt:i] drawObject:p_rect currentParms:p_parms withFormat:format]; PSgrestore(); return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.