This is ToyWinSave.m in view mode; [Download] [Up]
#import "ToyWin.h"
#import <appkit/Application.h>
#import <appkit/publicWraps.h>
#import <appkit/SavePanel.h>
#import <appkit/NXImage.h>
#import <appkit/NXBitmapImageRep.h>
#import <appkit/NXEPSImageRep.h>
#import <appkit/Control.h>
#import <objc/NXBundle.h> /* LocalizedString */
#import <appkit/Panel.h>
#import <appkit/tiff.h>
#import <streams/streams.h> // NXStream
#import <stdio.h>
#import <stdlib.h>
#import <string.h>
#import <libc.h>
#import <time.h>
#import "ToyView.h"
#import "TVController.h"
#import "ColorMap.h"
#import "common.h"
#import "getpixel.h"
#define BINFixedLength 120
@implementation ToyWin (Saving)
static void wrFixedLength(NXStream *stream,
const unsigned char *plane, int length,
const unsigned char *alp, int oneisblack)
{
int n, cc;
int idx = 0;
static const char hex[] = "0123456789abcdef";
for (n = 0; n < length; n++) {
cc = oneisblack ? ~plane[n] : plane[n];
if (alp)
cc |= ~alp[n];
cc &= 0xff;
NXPutc(stream, hex[cc >> 4]);
NXPutc(stream, hex[cc & 0x0f]);
if (++idx >= BINFixedLength) {
idx = 0;
NXPutc(stream, '\n');
}
}
if (idx) NXPutc(stream, '\n');
}
/* Local Method */
/* ...... Don't call this method when (cinf->alpha && !cinf->isplanar) */
- writeBitmapAsEPS:(unsigned char **)map
info:(commonInfo *)cinf to:(NXStream *)stream
{
const char *p, *q;
int cc, i, bwid, buflen;
time_t tt;
NXPrintf(stream, "%s\n%s",
"%!PS-Adobe-2.0 EPSF-2.0", "%%Title: ");
for (p = q = [self filename]; *p; p++)
if (*p == '/') q = p + 1;
for (p = q; *p; p++) {
if ((cc = *p & 0xff) <= ' ' || cc == '(' || cc == ')')
break;
NXPutc(stream, cc);
}
(void)time(&tt);
NXPrintf(stream, "\n%s\n%s%s",
"%%Creator: ToyViewer", "%%CreationDate: ", ctime(&tt));
NXPrintf(stream, "%s\n%s 0 0 %d %d\n%s\n\n",
"%%DocumentFonts: (atend)", "%%BoundingBox:",
cinf->width, cinf->height,
"%%EndComments");
bwid = byte_length(cinf->bits, cinf->width);
buflen = bwid;
if (cinf->numcolors == 1)
NXPrintf(stream, "/pictstr %d string def\n", bwid);
else if (!cinf->isplanar) { /* mesh */
buflen = byte_length(cinf->bits, cinf->width * 3);
NXPrintf(stream, "/pictstr %d string def\n", buflen);
}else {
NXPrintf(stream, "/pictstr %d string def\n", bwid * 3);
for (i = 0; i < 3; i++)
NXPrintf(stream,
"/subStr%d pictstr %d %d getinterval def\n",
i, bwid * i, bwid);
}
NXPrintf(stream, "gsave\n0 0 translate\n%d %d %d [1 0 0 -1 0 %d]\n",
cinf->width, cinf->height, cinf->bits, cinf->height);
if (cinf->numcolors == 1 || !cinf->isplanar)
NXPrintf(stream, "{currentfile pictstr readhexstring pop}\n");
else {
for (i = 0; i < 3; i++)
NXPrintf(stream,
"{currentfile subStr%d readhexstring pop}\n", i);
}
if (cinf->numcolors == 1) {
NXPrintf(stream, "image\n");
wrFixedLength(stream, map[0], bwid * cinf->height,
(cinf->alpha ? map[1]: NULL),
(cinf->cspace == NX_OneIsBlackColorSpace) );
}else if (cinf->isplanar) {
int y, idx;
unsigned char *alp;
NXPrintf(stream, "true 3 colorimage\n");
for (y = 0; y < cinf->height; y++) {
idx = y * bwid;
alp = cinf->alpha ? &map[3][idx]: NULL;
for (i = 0; i < 3; i++)
wrFixedLength(stream, &map[i][idx], bwid, alp, NO);
}
}else {
/* IGNORE (cinf->alpha && !cinf->isplanar) */
NXPrintf(stream, "false 3 colorimage\n");
wrFixedLength(stream, map[0], buflen * cinf->height, NULL, NO);
}
NXPrintf(stream, "grestore\n%s\n", "%%Trailer");
return self;
}
- (NXStream *)openEPSStream
{
NXStream *stream;
id tv;
commonInfo *cinf;
if ((stream = NXOpenMemory(NULL, 0, NX_READWRITE)) == NULL)
return NULL;
tv = [self toyView];
cinf = [tv commonInfo];
if (cinf->type == Type_eps || cinf->cspace == NX_CMYKColorSpace
|| (cinf->alpha && !cinf->isplanar)) {
/* This code may be no use */
NXRect rect;
[tv getFrame:&rect];
[tv copyPSCodeInside:&rect to:stream];
}else {
unsigned char *map[MAXPLANE];
[self getBitmap: map info: &cinf];
[self writeBitmapAsEPS: map info: cinf to: stream];
[self freeTempBitmap];
}
NXFlush(stream);
NXSeek(stream, 0L, NX_FROMSTART);
return stream;
}
- (int)getBitmap:(unsigned char **)map info:(commonInfo **)infp
{
NXImageRep *rep;
rep = [[[self toyView] image] bestRepresentation];
[(NXBitmapImageRep *)rep getDataPlanes: map];
return 0;
}
- freeTempBitmap
{
return self;
}
- print: sender
{
[[self toyView] printPSCode:sender];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.