This is ImageOpCtr.m in view mode; [Download] [Up]
#import "ImageOpCtr.h"
#import "ImageOpr.h"
#import <appkit/Application.h>
#import <appkit/publicWraps.h>
#import <appkit/Control.h>
#import <appkit/Panel.h>
#import <appkit/MenuCell.h>
#import <appkit/PopUpList.h>
#import <appkit/TextField.h>
#import <objc/NXBundle.h>
#import <defaults/defaults.h>
#import <stdio.h>
#import <stdlib.h>
#import <string.h>
#import <streams/streams.h>
#import "TVController.h"
#import "ToyWin.h"
#import "ToyWinEPS.h"
#import "ToyView.h"
#import "common.h"
#import "getpixel.h"
#import "strfunc.h"
#import "ImageOpr.bproj/MonoCtr.h"
@implementation ImageOpCtr
/* Local Method */
- loadBundle
{
char bdir[MAXFILENAMELEN];
id bundle;
int n;
static id classImgOp = nil;
if (classImgOp && imageOpr)
return self;
n = dircopy(bdir, NXArgv[0], YES);
strcpy(&bdir[n], "ImageOpr.bundle");
bundle = [[NXBundle alloc] initForDirectory: bdir];
if (bundle == nil) /* ERROR */
return nil;
classImgOp = [bundle classNamed:"ImageOpr"];
if (classImgOp == nil) /* ERROR */
return nil;
imageOpr = [[classImgOp alloc] init];
return self;
}
/* Local Method */
- loadNib:(int)op
{
int tag = 0;
id cview = nil;
static id currentView;
if (monoPanel == nil) {
[NXApp loadNibSection:"ImageOpr.nib" owner:self];
currentView = nil;
}
if (op == NoOperation && currentView == nil)
op = Monochrome;
switch (op) {
case NoOperation:
cview = currentView;
break;
case Rotation:
cview = [rotatePanel contentView];
[angleText selectText:self];
tag = 0;
break;
case Monochrome:
case Gray2Bits:
case BiLevel:
case Brightness:
cview = [monoPanel contentView];
tag = 1;
break;
case ColorTone:
cview = [clrTonePanel contentView];
tag = 2;
break;
case Enhance:
case Emboss:
cview = [enhancePanel contentView];
tag = 3;
break;
case ColorChange:
cview = [clrChangePanel contentView];
tag = 4;
break;
case RandomPttn:
cview = [randomPanel contentView];
tag = 5;
break;
case SoftFrame:
cview = [sframePanel contentView];
tag = 6;
break;
case Posterize:
cview = [posterizePanel contentView];
tag = 7;
break;
default:
return self;
}
if (currentView != cview) {
id tg;
if (currentView == nil)
[toolView addSubview:cview];
else
[toolView replaceSubview:currentView with:cview];
currentView = cview;
[cview windowChanged: toolPanel];
tg = [[toolButton target] findCellWithTag:tag];
[toolButton setTitleNoCopy: [tg title]];
[toolPanel display];
}
[toolPanel makeKeyAndOrderFront: self];
[toolPanel setFloatingPanel: YES];
return self;
}
- loadNewTool: sender
{
static unsigned char tab[] = {
Rotation, Monochrome, ColorTone,
Enhance, ColorChange, RandomPttn,
SoftFrame, Posterize };
return [self loadNib: tab[ [sender selectedTag] ]];
}
- forward:(SEL)aSelector :(marg_list)argFrame
{
[self loadBundle];
if ( [imageOpr respondsTo:aSelector] )
return [imageOpr performv:aSelector :argFrame];
[self doesNotRecognize:aSelector];
return self; /* never */
}
- activateToolPanel: sender
{
static int ops[] = {
NoOperation, Monochrome, ColorTone,
Enhance, ColorChange, RandomPttn, SoftFrame, Posterize };
int tag = [sender selectedTag];
[self loadBundle];
[self loadNib: ops[tag]];
return self;
}
- rotate: sender
{
static int tagAngles[] = { 0, 90, 270, 180 };
int tag;
[self loadBundle];
tag = [sender selectedTag];
if (tag == 0) {
[self loadNib: Rotation];
return self;
}
return [imageOpr doRotateFlipClip:Rotation to:tagAngles[tag]];
}
- rotateAngle: sender
{
int angle = [angleText intValue];
[angleText selectText:self];
if (angle == 0) {
NXBeep();
return self;
}else if (angle < 0)
angle += 360;
return [imageOpr doRotateFlipClip:Rotation to:angle];
}
- flip: sender
{
static int flipkind[] = { Horizontal, Vertical, Clip, Negative };
[self loadBundle];
return [imageOpr doRotateFlipClip:
flipkind[[sender selectedTag]] to:0];
}
- randomize: sender
{
[imageOpr setRandom:[randomFreqSlider floatValue]
:[randomMagSlider floatValue]];
[imageOpr doRotateFlipClip:RandomPttn to:0];
return self;
}
- newBitmap: sender
{
[self loadBundle];
[imageOpr newBitmap: sender];
return self;
}
- EPSResize: sender
{
[self loadBundle];
[imageOpr EPSResize: sender];
return self;
}
- reduce: sender
{
[self loadBundle];
[imageOpr reduceUsing: 0];
return self;
}
- reduceSelect: sender
{
[self loadBundle];
[imageOpr reduceUsing: [sender selectedTag]];
return self;
}
- cutDownBits: sender
{
[self loadBundle];
[imageOpr cutDownBitsTo: [sender selectedTag]];
return self;
}
- colorHalftone: sender
{
int n;
static int cols[] = { 256, 64, 8 };
[self loadBundle];
n = [sender selectedTag];
[imageOpr colorHalftoneWith: cols[n % 3] method:(n < 3)];
return self;
}
- changeEnhance: sender
{
char buf[16];
float v = [enhanceSlider floatValue];
sprintf(buf, "%4.1f", v);
[enhanceText setStringValue:buf];
return self;
}
- enhance: sender
{
return [imageOpr enhanceWith: [enhanceSlider floatValue]];
}
- changeEmboss: sender
{
char buf[16];
float v = [embossSlider floatValue];
sprintf(buf, "%4.2f", v);
[embossText setStringValue:buf];
return self;
}
- emboss: sender
{
return [imageOpr embossWith: [enhanceSlider floatValue]
and:[embossSlider floatValue]];
}
- posterize: sender
{
return [imageOpr posterizeWith: [posterDiffSlider floatValue]
and:[posterCtrlSlider floatValue]];
}
static ToyWin *commWin = nil;
- editComment: sender
{
int i, x;
commonInfo *cinf;
const char *p;
char commmsg[MAX_COMMENT];
if ((commWin = [theController keyWindow]) == nil) {
NXBeep();
return self;
}
cinf = [[commWin toyView] commonInfo];
for (p = [commWin filename], i = x = 0; p[i]; i++)
if (p[i] == '/') x = i + 1;
sprintf(commmsg, "%s: ", &p[x]);
for (p = cinf->memo, i = 0; p[i] && p[i] != ':'; i++) ;
strncat(commmsg, p, i);
[commentMsg setStringValue:commmsg];
if (p[i] == ':') {
while (p[++i] == ' ') ;
[commentText setStringValue: &p[i]];
}else
[commentText setStringValue: ""];
[commentPanel makeKeyAndOrderFront: self];
return self;
}
- writeComment: sender
{
commonInfo *cinf;
int i, last;
char *p;
const char *q;
id tv;
if ([sender selectedTag] == 0) { /* OK */
if ([theController checkWindow: commWin delete:NO] == nil) {
NXBeep();
return self;
}
cinf = [(tv = [commWin toyView]) commonInfo];
last = 0;
for (p = cinf->memo, i = 0; p[i] && p[i] != ':'; i++)
if (p[i] != ' ') last = i;
if ((q =[commentText stringValue]) != NULL && *q) {
strcpy(&p[last + 1], " : ");
comm_cat(p, q);
}else
p[last + 1] = 0;
[tv rewriteComment];
}
[commentPanel performClose: self];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.