This is MonoCtr.m in view mode; [Download] [Up]
#import "MonoCtr.h" #import <appkit/Control.h> #import <stdio.h> #import <math.h> #import "../common.h" #import "MonotoneView.h" #import "imageOperation.h" #import "../ImageOpCtr.h" #import "../ImageOpr.h" static void monoScale(unsigned char *buf, float contr, float bright, float *gscale) { float a, b, cn2; int i, v; if (contr == 0.0) a = 1.0; else { cn2 = contr * contr; if (contr > 0.0) a = (contr < 1.0) ? (1.0 / (1.0 - cn2)) : 512.0; else a = 1.0 - cn2; } #ifdef BRIGHT_SQUARE b = bright * bright; if (bright < 0.0) b *= -1.0; #else b = bright * bright * bright; #endif b = (-1.0 - a) * 128.0 * (1.0 - b) + 256.0; for (i = 0; i < 256; i++) { v = (int)(a * gscale[i] + b + 0.5); buf[i] = (v > 255) ? 255 : ((v < 0) ? 0 : v); } } @implementation MonoCtr - init { int i; for (i = 0; i < 256; i++) tone[i] = i; gammaValue = 0.0; [self setGamma: 1.0]; return self; } - setGamma:(float)gamma { int i; char buf[8]; if (gamma == gammaValue) return self; sprintf(buf, "%5.2f", gamma); [gammaText setStringValue: buf]; if (gamma == 1.0) { for (i = 0; i < 256; i++) gammaScale[i] = i; }else { for (i = 0; i < 256; i++) gammaScale[i] = pow(i / 255.0, gamma) * 255.0; } gammaValue = gamma; return self; } - changeValue: sender { [self setGamma: [gammaSlider floatValue]]; monoScale(tone, [contrSlider floatValue], [brightSlider floatValue], gammaScale); [monoView setTone: tone]; [monoView display]; return self; } - reset: sender { int i; [contrSlider setFloatValue: 0.0]; [brightSlider setFloatValue: 0.0]; [gammaSlider setFloatValue: 1.0]; for (i = 0; i < 256; i++) tone[i] = i; [self setGamma: 1.0]; [monoView setTone: tone]; [monoView display]; return self; } - monochrome: sender { static int monokind[] = { Monochrome, Gray2Bits, BiLevel }; [imageOpCtr monochrome: monokind[[sender selectedTag]] tone: tone method:[ditherSW selectedTag]]; /* This message will be delegated to ImageOpr */ return self; } - changeBrightness: sender { [imageOpCtr brightness: tone]; /* This message will be delegated to ImageOpr */ return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.