|
|
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.