Annotation of Examples/AppKit/VideoApp/CustomVideoView.m, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.