This is ToyWinEPS.m in view mode; [Download] [Up]
#import "ToyWinEPS.h"
#import <appkit/TextField.h>
#import <appkit/NXImage.h>
#import <appkit/Window.h>
#import <appkit/NXEPSImageRep.h>
#import <appkit/NXBitmapImageRep.h>
#import <appkit/tiff.h>
#import <stdio.h>
#import <libc.h>
#import <string.h>
#import <math.h>
#import "ToyView.h"
#import "common.h"
#import "strfunc.h"
@implementation ToyWinEPS
/*
EPSをTIFFに変換するため、imageをいったんstreamに書き出して、
新しいNXImageのオブジェクトにスクリーンに依存しない色の表現が可能な
設定を行ってから新たに読み込み、さらに tiffイメージでstreamに書き出す。
一般に用いられている Sharon Zakhour の "TIFFandEPS" の方法、即ち、
[epsimg lockFocus];
tifrep = [[NXBitmapImageRep alloc] initData: NULL fromRect: &rect];
[epsimg unlockFocus];
[tifrep getDataPlanes: map];
では、画面に表示されている色表現のまま書き出されてしまうので、カラー
EPSをモノクロ画面で扱った場合にはtiffがモノクロになってしまう。
*/
- (NXStream *)openTiffStream:(BOOL)compress
{
NXStream *stream, *epsst;
NXImage *img;
NXSize cSize;
BOOL freeflag = NO;
img = [[self toyView] image];
[img getSize: &cSize];
if ((cSize.width >= MAXWidth)
|| (stream = NXOpenMemory(NULL, 0, NX_READWRITE)) == NULL)
return NULL;
if ([Window defaultDepthLimit] != NX_TwentyFourBitRGBDepth) {
/* Need to open EPS stream */
if ((epsst = [self openEPSStream]) == NULL)
return NULL;
img = [NXImage alloc];
freeflag = YES;
[img setScalable: YES];
[img setCacheDepthBounded: NO];
[img useCacheWithDepth: NX_TwentyFourBitRGBDepth];
[img loadFromStream: epsst];
[img setSize: &cSize]; // This order is important.
NXCloseMemory(epsst, NX_FREEBUFFER);
}
[img writeTIFF:stream allRepresentations:NO
usingCompression:(compress ? NX_TIFF_COMPRESSION_LZW
: NX_TIFF_COMPRESSION_NONE) andFactor:0.0];
NXFlush(stream);
NXSeek(stream, 0L, NX_FROMSTART);
if (freeflag) [img free];
return stream;
}
static NXBitmapImageRep *tiffrep = nil;
/* Overload */
- (int)getBitmap:(unsigned char **)map info:(commonInfo **)infp
{
NXStream *stream;
static commonInfo info;
if ((stream = [self openTiffStream:NO]) == NULL)
return Err_MEMORY;
tiffrep = [[NXBitmapImageRep alloc] initFromStream: stream];
NXCloseMemory(stream, NX_FREEBUFFER);
[tiffrep getDataPlanes: map];
info.width = [tiffrep pixelsWide];
info.height = [tiffrep pixelsHigh];
info.xbytes = [tiffrep bytesPerRow];
info.type = Type_tiff;
info.bits = [tiffrep bitsPerSample];
info.numcolors = [tiffrep numColors]; /* without alpha */
info.alpha = [tiffrep hasAlpha];
info.isplanar = [tiffrep isPlanar];
info.cspace = [tiffrep colorSpace];
info.palette = NULL;
info.palsteps = 0;
info.memo[0] = 0;
*infp = &info;
return 0;
}
/* Overload */
- freeTempBitmap /* must be called after getBitmap:info: */
{
if (tiffrep != nil) {
[tiffrep free];
tiffrep = nil;
}
return self;
}
/* Overload */
- (NXStream *)openEPSStream
{
NXStream *stream;
NXEPSImageRep *rep;
char *eps;
int i, n;
stream = NXOpenMemory(NULL, 0, NX_READWRITE);
if (stream == NULL)
return NULL;
rep = (NXEPSImageRep *)[[[self toyView] image] bestRepresentation];
[rep getEPS:&eps length:&n];
for (i = 0; i < n; i++)
NXPutc(stream, *eps++);
NXFlush(stream);
NXSeek(stream, 0L, NX_FROMSTART);
return stream;
}
/* New */
- (NXStream *)rotateEPS:(int)op to:(int)angle width:(int)lx height:(int)ly
name: (const char *)fname error: (int *)err
{
NXStream *stream;
NXEPSImageRep *rep;
NXRect rect;
char *eps;
int i, n, dx, dy;
*err = 0;
rep = (NXEPSImageRep *)[[[self toyView] image] bestRepresentation];
[rep getEPS:&eps length:&n];
[rep getBoundingBox:&rect];
stream = NXOpenMemory(NULL, 0, NX_READWRITE);
if (stream == NULL) {
*err = Err_MEMORY;
return NULL;
}
dx = -(rect.origin.x + rect.size.width);
dy = -(rect.origin.y + rect.size.height);
if (op == Horizontal) {
dy = -rect.origin.y;
}else if (op == Vertical) {
dx = -rect.origin.x;
}else if (angle == 90) {
dx = -rect.origin.x;
}else if (angle == 270) {
dy = -rect.origin.y;
}else if (angle != 180) {
commonInfo *cinf;
double r, s, c;
double th = ((double)angle * 3.14159265) / 180.0;
cinf = [[self toyView] commonInfo];
if (angle > 270) {
r = cinf->width * (s = sin(th));
dx = -r * s;
dy = -r * cos(th);
}else if (angle > 180) {
r = cinf->height * (c = cos(th));
dx = -r * sin(th) - cinf->width;
dy = -r * c;
}else if (angle > 90) {
r = cinf->width * (c = cos(th));
dx = -r * c;
dy = r * sin(th) - cinf->height;
}else {
r = cinf->height * (s = sin(th));
dx = r * cos(th);
dy = -r * s;
}
dx -= rect.origin.x - 0.5;
dy -= rect.origin.y - 0.5;
}
NXPrintf(stream, "%s\n%s: %s\n",
"%!PS-Adobe-2.0 EPSF-2.0", "%%Title", fname);
NXPrintf(stream, "%s: 0 0 %d %d\n%s\n\ngsave\n",
"%%BoundingBox", lx, ly, "%%EndComments");
if (op == Rotation)
NXPrintf(stream, "%d rotate\n", angle);
else
NXPrintf(stream, "%s scale\n",
(op == Horizontal)?"-1 1":"1 -1");
NXPrintf(stream, "%d %d translate\n%s\n", dx, dy, "%%BeginDocument: ");
for (i = 0; i < n; i++)
NXPutc(stream, *eps++);
NXPrintf(stream, "\n%s\ngrestore\n", "%%EndDocument");
NXFlush(stream);
NXSeek(stream, 0L, NX_FROMSTART);
// NXCloseMemory(stream, NX_FREEBUFFER);
return stream;
}
/* New */
- (NXStream *)clipEPS: (NXRect *)select error: (int *)err
{
NXStream *stream;
NXEPSImageRep *rep;
NXRect rect;
char *eps, buf[512];
int i, n, bp;
int loc[4];
*err = 0;
rep = (NXEPSImageRep *)[[[self toyView] image] bestRepresentation];
[rep getEPS:&eps length:&n];
[rep getBoundingBox:&rect];
loc[0] = rect.origin.x + select->origin.x;
loc[1] = rect.origin.y + select->origin.y;
loc[2] = loc[0] + (int)select->size.width;
loc[3] = loc[1] + (int)select->size.height;
stream = NXOpenMemory(NULL, 0, NX_READWRITE);
if (stream == NULL) {
*err = Err_MEMORY;
return NULL;
}
for (i = 0, bp = 0; ; i++) {
if (i >= n) {
NXCloseMemory(stream, NX_FREEBUFFER);
*err = Err_ILLG;
return NULL;
}
if ((buf[bp++] = *eps++) >= ' ')
continue;
if (strncmp(buf, "%%BoundingBox", 13) == 0) {
NXPrintf(stream, "%s: %d %d %d %d\n", "%%BoundingBox",
loc[0], loc[1], loc[2], loc[3]);
for (++i ; i < n; i++)
NXPutc(stream, *eps++);
break;
}else {
buf[bp] = 0;
NXPrintf(stream, "%s", buf);
}
bp = 0;
}
NXFlush(stream);
NXSeek(stream, 0L, NX_FROMSTART);
// NXCloseMemory(stream, NX_FREEBUFFER);
return stream;
}
/* New */
- (NXStream *)resizeEPS:(float)factor name:(const char *)fname error:(int *)err
{
NXStream *stream;
NXEPSImageRep *rep;
NXRect rect;
char *eps;
int i, n, loc[4];
*err = 0;
rep = (NXEPSImageRep *)[[[self toyView] image] bestRepresentation];
[rep getEPS:&eps length:&n];
[rep getBoundingBox:&rect];
loc[0] = rect.origin.x * factor;
loc[1] = rect.origin.y * factor;
loc[2] = loc[0] + rect.size.width * factor;
loc[3] = loc[1] + rect.size.height * factor;
stream = NXOpenMemory(NULL, 0, NX_READWRITE);
if (stream == NULL) {
*err = Err_MEMORY;
return NULL;
}
NXPrintf(stream, "%s\n%s: %s\n",
"%!PS-Adobe-2.0 EPSF-2.0", "%%Title", fname);
NXPrintf(stream, "%s: %d %d %d %d\n%s\n\n", "%%BoundingBox",
loc[0], loc[1], loc[2], loc[3], "%%EndComments");
NXPrintf(stream, "gsave\n%f %f scale\n%s\n",
factor, factor, "%%BeginDocument: ");
for (i = 0; i < n; i++)
NXPutc(stream, *eps++);
NXPrintf(stream, "\n%s\ngrestore\n", "%%EndDocument");
NXFlush(stream);
NXSeek(stream, 0L, NX_FROMSTART);
// NXCloseMemory(stream, NX_FREEBUFFER);
return stream;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.