|
|
1.1 root 1: #import <appkit/appkit.h>
2: #import "CustomVideoView.h"
3: #import <dpsclient/event.h>
4: #import <dpsclient/psops.h>
5: #import <dpsclient/wraps.h>
6: #import <sys/param.h>
7: #import <stdio.h>
8: #import <strings.h>
9:
10: @implementation CustomVideoView
11:
12: - initFrame:(const NXRect *)theFrame
13: {
14: [super initFrame:theFrame];
15: // Get it to allocate the NXImage ahead of time so it will stop fast.
16: [self setGrabOnStop:YES];
17: theMode = NX_FROMINPUT;
18: actualSize = YES;
19: theImage = [NXImage findImageNamed:"AppIcon"];
20: [theImage setScalable:YES];
21: [theImage getSize:&imageSize];
22: imagePoint.x = bounds.origin.x + (bounds.size.width - imageSize.width)/2.0;
23: imagePoint.y = bounds.origin.y + (bounds.size.height-imageSize.height)/2.0;
24: changed = YES;
25: return self;
26: }
27:
28: - mouseDown:(NXEvent *)theEvent
29: {
30: NXEvent anEvent = *theEvent;
31: NXPoint point1 = theEvent->location,point2;
32: int oldMask;
33: BOOL dragged = NO;
34:
35: oldMask = [window addToEventMask:NX_LMOUSEDRAGGEDMASK];
36: if(theMode==NX_FROMINPUT)
37: {
38: // Set Grab rectangle.
39: while(anEvent.type!=NX_MOUSEUP)
40: {
41: NXGetOrPeekEvent(DPSGetCurrentContext(),
42: &anEvent, NX_MOUSEUPMASK|NX_LMOUSEDRAGGEDMASK,NX_FOREVER,10,0);
43: if(anEvent.type==NX_MOUSEDRAGGED)
44: {
45: dragged = YES;
46: point2 = anEvent.location;
47: if(point1.x<point2.x)
48: {grabRect.origin.x=point1.x;grabRect.size.width=point2.x - point1.x;}
49: else
50: {grabRect.origin.x=point2.x;grabRect.size.width=point1.x - point2.x;}
51: if(point1.y<point2.y)
52: {
53: grabRect.origin.y=point1.y;
54: grabRect.size.height=point2.y - point1.y;
55: }
56: else
57: {
58: grabRect.origin.y=point2.y;
59: grabRect.size.height=point1.y - point2.y;
60: }
61: [self display];
62: }
63:
64: }
65: if(!dragged) grabRect.size.width = 0;
66: [self display];
67: }
68: else
69: {
70: float dx=0,dy=0;
71: if(actualSize) // Move Image around
72: {
73: NXRect imageFrame,oldFrame;
74: imageFrame.origin = imagePoint;imageFrame.size = imageSize;
75: oldFrame = imageFrame;
76: if(NXMouseInRect(&theEvent->location,&imageFrame,NO))
77: {
78: dx = theEvent->location.x - imagePoint.x;
79: dy = theEvent->location.y - imagePoint.y;
80: while(anEvent.type!=NX_MOUSEUP)
81: {
82: NXGetOrPeekEvent(DPSGetCurrentContext(),&anEvent,
83: NX_MOUSEUPMASK|NX_LMOUSEDRAGGEDMASK,NX_FOREVER,10,0);
84: if(anEvent.type==NX_MOUSEDRAGGED)
85: {
86: imagePoint.x = anEvent.location.x -dx;
87: imagePoint.y = anEvent.location.y -dy;
88: imageFrame.origin = imagePoint;
89: NXUnionRect(&imageFrame,&oldFrame);
90: [self display:&oldFrame :1];
91: }
92: }
93: }
94: }
95: }
96: [window setEventMask:oldMask];
97: return self;
98: }
99:
100: - grab:sender
101: {
102: id bitmap;
103: id image;
104:
105: // Read the bits from the window
106: image = [self grab];
107: [image lockFocus];
108: bitmap = [[NXBitmapImageRep alloc] initData:NULL fromRect:(grabRect.size.width == 0) ? &bounds : &grabRect];
109: [image unlockFocus];
110: if (bitmap)
111: {
112: id mySavePanel = [SavePanel new];
113: char filename[MAXPATHLEN+1];
114: [mySavePanel runModal];
115: if([mySavePanel filename])
116: {
117: NXStream *s = NXOpenMemory (NULL, 0, NX_READWRITE);
118: strcpy(filename,[mySavePanel filename]);
119: if(strcmp(&filename[strlen(filename)-5],".tiff"))
120: strcat(filename,".tiff");
121: if (s)
122: {
123: [bitmap writeTIFF:s usingCompression:NX_TIFF_COMPRESSION_JPEG
124: andFactor:10];
125: NXFlush (s);
126: if (NXSaveToFile (s, filename))
127: NXRunAlertPanel("Error Saving File","Filename: %s","OK",
128: NULL,NULL,filename);
129: NXCloseMemory (s, NX_FREEBUFFER);
130: }
131: }
132: [bitmap free];
133: }
134: return self;
135: }
136:
137: - setImage:sender
138: {
139: // Set the graphic for output mode.
140: id myOpenPanel = [OpenPanel new];
141:
142: if([myOpenPanel runModalForTypes:[NXImage imageFileTypes]])
143: {
144: const char *theFileName = [myOpenPanel filename];
145:
146: if(theImage) [theImage free];
147: theImage = [[NXImage alloc] initFromFile:theFileName];
148: [theImage setScalable:YES];
149: [theImage getSize:&imageSize];
150: imagePoint.x = bounds.origin.x + (bounds.size.width - imageSize.width)/2.0;
151: imagePoint.y = bounds.origin.y + (bounds.size.height-imageSize.height)/2.0;
152: changed = YES;
153: }
154: [self display];
155: return self;
156: }
157:
158: - drawSelf:(const NXRect *)rects :(int)rectCount
159: {
160: if(theMode==NX_FROMVIEW)
161: {
162: NXRectClip(rects);
163: NXEraseRect(&rects[0]);
164: if(!theImage) return self;
165: if(actualSize)
166: {
167: if(changed) {[theImage setSize:&imageSize];changed = NO;}
168: [theImage composite:NX_SOVER toPoint:&imagePoint];
169: }
170: else
171: {
172: if(changed) {[theImage setSize:&bounds.size];changed = NO;}
173: [theImage composite:NX_SOVER toPoint:&bounds.origin];
174: }
175: }
176: else
177: {
178: [super drawSelf:rects :rectCount];
179: PSsetgray(NX_WHITE);
180: PSsetalpha(1.0);
181: if(grabRect.size.width!=0) NXFrameRect(&grabRect);
182: }
183: return self;
184: }
185:
186: - setOutputMode:(int)mode
187: {
188: theMode = mode;
189: [super setOutputMode:mode];
190: return self;
191: }
192:
193: - setActualSize:sender
194: {
195: actualSize = [[sender selectedCell] tag];
196: changed = YES;
197: [self display];
198: return self;
199: }
200:
201: - clear:sender
202: {
203: if(theImage) [theImage free];
204: theImage = NULL;
205: [self display];
206: return self;
207: }
208:
209: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.