This is CustomVideoView.m in view mode; [Download] [Up]
#import "CustomVideoView.h"
#import <dpsclient/event.h>
#import <appkit/Application.h>
#import <appkit/OpenPanel.h>
#import <appkit/NXImage.h>
#import <appkit/NXBitmapImageRep.h>
#import <appkit/Button.h>
#import <appkit/Control.h>
#import <appkit/SavePanel.h>
#import <appkit/tiff.h>
#import <dpsclient/psops.h>
#import <dpsclient/wraps.h>
#import <sys/param.h>
#import <stdio.h>
#import <strings.h>
#include <sys/time_stamp.h>
#include "libc.h"
#define MAXGRABS 100
#define MAXHEIGHT 200
#define MAXWIDTH 320
id myGrabImage[MAXGRABS];
@implementation CustomVideoView
- setVideoSize:sender {
[msizeField setIntValue:(int) (frames*
myGrabSize.height*
myGrabSize.width*3/1000)];
return self;
}
- setWidth:sender {
myGrabSize.width=[sender intValue];
[widthField setIntValue:myGrabSize.width];
[self setVideoSize:self];
return self;
}
- setHeight:sender {
myGrabSize.height=[sender intValue];
[heightField setIntValue:myGrabSize.height];
[self setVideoSize:self];
return self;
}
- setFrames:sender {
frames=[sender intValue];
[frameField setIntValue:frames];
[self setVideoSize:self];
return self;
}
- initFrame:(NXRect *)theFrame
{
int i;
[super initFrame:theFrame];
// Get it to allocate the NXImage ahead of time so it will stop fast.
[self setGrabOnStop:YES];
theMode = NX_FROMINPUT;
actualSize = YES;
frames=20;
myGrabSize.width=120;
myGrabSize.height=100;
[self setVideoSize:self];
for(i=0;i<MAXGRABS;i++) {
myGrabImage[i]=nil;
}
theImage = [NXImage findImageNamed:"AppIcon"];
[theImage setScalable:YES];
[theImage getSize:&imageSize];
imagePoint.x = bounds.origin.x + (bounds.size.width - imageSize.width)/2.0;
imagePoint.y = bounds.origin.y + (bounds.size.height-imageSize.height)/2.0;
changed = YES;
return self;
}
- mouseDown:(NXEvent *)theEvent
{
NXEvent anEvent = *theEvent;
NXPoint point1 = theEvent->location,point2;
int oldMask;
BOOL dragged = NO;
oldMask = [window addToEventMask:NX_LMOUSEDRAGGEDMASK];
if(theMode==NX_FROMINPUT)
{
// Set Grab rectangle.
while(anEvent.type!=NX_MOUSEUP)
{
NXGetOrPeekEvent(DPSGetCurrentContext(),
&anEvent, NX_MOUSEUPMASK|NX_LMOUSEDRAGGEDMASK,NX_FOREVER,10,0);
if(anEvent.type==NX_MOUSEDRAGGED)
{
dragged = YES;
point2 = anEvent.location;
if(point1.x<point2.x)
{grabRect.origin.x=point1.x;grabRect.size.width=point2.x - point1.x;}
else
{grabRect.origin.x=point2.x;grabRect.size.width=point1.x - point2.x;}
if(point1.y<point2.y)
{
grabRect.origin.y=point1.y;
grabRect.size.height=point2.y - point1.y;
}
else
{
grabRect.origin.y=point2.y;
grabRect.size.height=point1.y - point2.y;
}
if(grabRect.size.width>myGrabSize.width)
grabRect.size.width=myGrabSize.width;
if(grabRect.size.height>myGrabSize.height)
grabRect.size.height=myGrabSize.height;
[self display];
}
}
if(!dragged) grabRect.size.width = 0;
[self display];
}
else
{
float dx=0,dy=0;
// if(actualSize) // Move Image around
{
NXRect imageFrame,oldFrame;
imageFrame.origin = imagePoint;imageFrame.size = imageSize;
oldFrame = imageFrame;
if(NXMouseInRect(&theEvent->location,&imageFrame,NO))
{
dx = theEvent->location.x - imagePoint.x;
dy = theEvent->location.y - imagePoint.y;
while(anEvent.type!=NX_MOUSEUP)
{
NXGetOrPeekEvent(DPSGetCurrentContext(),&anEvent,
NX_MOUSEUPMASK|NX_LMOUSEDRAGGEDMASK,NX_FOREVER,10,0);
if(anEvent.type==NX_MOUSEDRAGGED)
{
imagePoint.x = anEvent.location.x -dx;
imagePoint.y = anEvent.location.y -dy;
imageFrame.origin = imagePoint;
NXUnionRect(&imageFrame,&oldFrame);
[self display:&oldFrame :1];
}
}
}
}
}
[window setEventMask:oldMask];
return self;
}
- grab:sender
{
NXRect myGrabDest;
int i,res;
id mySavePanel = [SavePanel new];
char filename[MAXPATHLEN+1];
char dirname[MAXPATHLEN+1];
char *cp;
NXSetRect(&myGrabDest, 0.0, 0.0, myGrabSize.width,myGrabSize.height);
for(i=0;i<frames;i++) {
if(myGrabImage[i]!=nil)
[myGrabImage[i] free];
myGrabImage[i]=[[NXImage alloc] initSize:
(NXSize *)&myGrabSize];
}
for(i=0;i<frames;i++) {
[myGrabImage[i] setSize:&grabRect.size];
[self grabIn:myGrabImage[i]
fromRect:&grabRect toRect:&myGrabDest];
}
res=[mySavePanel runModal];
if(res==1) {
sprintf(dirname,"%s.anim",[mySavePanel filename]);
mkdir(dirname,0777);
cp=rindex(dirname,'.');
*cp='\0';
if((cp=rindex(dirname,'/'))==NULL)
cp=dirname;
else
cp=cp+1;
}
for(i=0;i<frames;i++) {
if((res==1)&&([mySavePanel filename])) {
NXStream *s=NXOpenMemory(NULL,0,NX_READWRITE);
cp=rindex(dirname,'/');
cp=cp+1;
sprintf(filename,"%s.anim/%s.%d.tiff",
dirname,cp,i+1);
if (s) {
[myGrabImage[i] writeTIFF:s];
NXFlush (s);
if (NXSaveToFile(s,filename))
NXRunAlertPanel(
"Error Saving File",
"Filename: %s","OK",
NULL,NULL,filename);
NXCloseMemory (s, NX_FREEBUFFER);
}
}
if(myGrabImage[i]!=nil) {
[myGrabImage[i] free];
myGrabImage[i]=nil;
}
}
return self;
}
- drawSelf:(const NXRect *)rects :(int)rectCount
{
if(theMode==NX_FROMVIEW)
{
NXRectClip(rects);
NXEraseRect(&rects[0]);
if(!theImage) return self;
if(actualSize)
{
if(changed) {[theImage setSize:&imageSize];changed = NO;}
[theImage composite:NX_SOVER toPoint:&imagePoint];
}
else
{
if(changed) {[theImage setSize:&bounds.size];changed = NO;}
[theImage composite:NX_SOVER toPoint:&bounds.origin];
}
}
else
{
[super drawSelf:rects :rectCount];
PSsetgray(NX_WHITE);
PSsetalpha(1.0);
if(grabRect.size.width!=0) NXFrameRect(&grabRect);
}
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.