|
|
1.1 root 1:
2: #import "AnimalView.h"
3: #import <appkit/NXBitmapImageRep.h>
4: #import <appkit/Control.h>
5: #import <sys/param.h>
6:
7: /*
8: * AnimalView.m, a simple view to display an NXBitmapImageRep.
9: * Subclass of view that draws an NXBitmapImageRep. Knows how
10: * to flip and rotate itself in response to IB controls.
11: * NXBitmapImageRep provides the functionality to deal with images
12: * that are stored as bitmaps. The instances of this class are created by
13: * loading TIFF data. In 1.0, I would have read bitmap data (from TIFF
14: * file or Mach-O) and imaged it using NXImageBitmap(). It works out much
15: * cleaner using NXBitmapImageRep.
16: *
17: * Author: Julie Zelenski, NeXT Developer Support
18: * You may freely copy, distribute and reuse the code in this example.
19: * NeXT disclaims any warranty of any kind, expressed or implied, as to
20: * its fitness for any particular use.
21: */
22:
23: @implementation AnimalView:View
24:
25: /* INIT/FREE METHODS */
26:
27: - initFrame:(NXRect *)frameRect;
28: /* Init method for newly created animal view. It initializes the scaling
29: * factors to normal, and then grabs the duck for the initial image.
30: */
31: {
32: [super initFrame:frameRect];
33: scaleFactor.x = scaleFactor.y = 1.0;
34: [self setImageToAnimal:"Duck"];
35: return self;
36: }
37:
38: - free;
39: /* Free the image on our way out.
40: */
41: {
42: [image free];
43: return [super free];
44: }
45:
46:
47: /* TARGET/ACTION METHODS */
48:
49: - rotateLeft:sender
50: /* Rotates the view 90 degrees to the left and redisplays.
51: */
52: {
53: [self rotate:(scaleFactor.x*scaleFactor.y)*90.0];
54: [self display];
55: return self;
56: }
57:
58: - rotateRight:sender
59: /* Rotates the view 90 degrees to the right and redisplays.
60: */
61: {
62: [self rotate:(scaleFactor.x*scaleFactor.y)*-90.0];
63: [self display];
64: return self;
65: }
66:
67: - flipHorizontal:sender
68: /* Mirrors the view across vertical axis, and updates scale factor to
69: * indicate that. Since rotation can change what is currently vertical,
70: * need to rotate to zero, do the scaling, and restore rotation.
71: */
72: {
73: float angle;
74:
75: angle = [self boundsAngle];
76: scaleFactor.x *= -1;
77: [self rotate:-1*angle];
78: [self scale:-1.0 :1.0];
79: [self rotate:angle];
80: [self display];
81: return self;
82: }
83:
84: - flipVertical:sender
85: /* Mirrors the view across horizontal axis, and updates scale factor to
86: * indicate that. Since rotation can change what is currently horizontal,
87: * need to rotate to zero, do the scaling, and restore rotation.
88: */
89: {
90: float angle;
91:
92: angle = [self boundsAngle];
93: scaleFactor.y *= -1;
94: [self rotate:-1*angle];
95: [self scale:1.0 :-1.0];
96: [self rotate:angle];
97: [self display];
98: return self;
99: }
100:
101: - changeAnimal:sender
102: /* Target/Action for IB control. Changes to display image with name of
103: * cell title.
104: */
105: {
106: [self setImageToAnimal:[[sender selectedCell] title]];
107: return self;
108: }
109:
110:
111:
112: /* PRIVATE METHODS */
113:
114: - setImageToAnimal:(const char *)imageName;
115: /* Find the bitmap image rep for the specified name, sets the scaling
116: * and rotation back to "normal" and displays new image.
117: */
118: { char filename[MAXPATHLEN];
119:
120: sprintf(filename,"%s.tiff",imageName);
121: if (image) [image free];
122: image = [[NXBitmapImageRep alloc] initFromSection:filename];
123: [self setDrawRotation:0.0];
124: [self scale:scaleFactor.x :scaleFactor.y];
125: scaleFactor.x = scaleFactor.y = 1.0;
126: [self display];
127: return self;
128: }
129:
130: - drawSelf:(NXRect *)rects :(int)rectCount;
131: /* Clears the background and has the image draw itself
132: */
133: {
134: NXEraseRect(&bounds); /* to be sure to clear background */
135: [image drawIn:&bounds];
136: return self;
137: }
138:
139: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.