ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/MacOSX/EmulatorView.mm
(Generate patch)

Comparing BasiliskII/src/MacOSX/EmulatorView.mm (file contents):
Revision 1.7 by nigel, 2002-12-18T11:53:11Z vs.
Revision 1.9 by nigel, 2003-03-21T06:41:04Z

# Line 1 | Line 1
1   /*
2 < *      EmulatorView.mm - Custom NSView for Basilisk II graphics output
2 > *      EmulatorView.mm - Custom NSView for Basilisk II windowed graphics output
3   *
4   *      $Id$
5   *
6 < *  Basilisk II (C) 1997-2002 Christian Bauer
6 > *  Basilisk II (C) 1997-2003 Christian Bauer
7   *
8   *  This program is free software; you can redistribute it and/or modify
9   *  it under the terms of the GNU General Public License as published by
# Line 52 | Line 52
52          return self;
53   }
54  
55 + - (void) awakeFromNib
56 + {
57 +        // Here we store the height of the screen which the app was opened on.
58 +        // NSApplication's sendEvent: always uses that screen for its mouse co-ords
59 +        screen_height = (int) [[NSScreen mainScreen] frame].size.height;
60 + }
61 +
62 +
63   // Mouse click in this window. If window is not active,
64   // should the click be passed to this view?
65   - (BOOL) acceptsFirstMouse: (NSEvent *) event
# Line 60 | Line 68
68   }
69  
70  
71 + //
72 + // Key event processing.
73 + // OS X doesn't send us separate events for the modifier keys
74 + // (shift/control/command), so we need to monitor them separately
75 + //
76 +
77   #include <adb.h>
78  
79   static int prevFlags;
# Line 101 | Line 115 | static int prevFlags;
115          prevFlags = flags;
116   }
117  
118 + //
119 + // Windowed mode. We only send mouse/key events
120 + // if the OS X mouse is within the little screen
121 + //
122   - (BOOL) mouseInView: (NSEvent *) event
123   {
124          NSRect  box;
# Line 139 | Line 157 | static int prevFlags;
157          int                     i;
158          float           seconds;
159          NSDate          *startDate;
160 +        char            *method;
161  
162          if ( ! drawView )
163 +        {
164 +                WarningSheet (@"The emulator has not been setup yet.",
165 +                                          @"Try to run, then pause the emulator, first.", nil, [self window]);
166                  return;
167 +        }
168  
169          drawView = NO;
170          [self lockFocus];
# Line 160 | Line 183 | static int prevFlags;
183          [self unlockFocus];
184          drawView = YES;
185  
186 <        InfoSheet(@"Benchmark run. 300 frames.",
186 > #ifdef NSBITMAP
187 >        method = "NSBITMAP";
188 > #endif
189 > #ifdef CGIMAGEREF
190 >        method = "CGIMAGEREF";
191 > #endif
192 > #ifdef CGDRAWBITMAP
193 >        method = "CGDRAWBITMAP";
194 > #endif
195 >
196 >        InfoSheet(@"Ran benchmark (300 screen redraws)",
197                            [NSString stringWithFormat:
198 <                                @"%.2f seconds, %.3f frames per second", seconds, i/seconds],
198 >                                @"%.2f seconds, %.3f frames per second (using %s implementation)",
199 >                                seconds, i/seconds, method],
200                            @"Thanks", [self window]);
201   }
202  
# Line 172 | Line 206 | static int prevFlags;
206   #ifdef NSBITMAP
207          return [bitmap TIFFRepresentation];
208   #else
209 <        WarningAlert("How do I get a TIFF from a CGImageRef?");
209 >        NSBitmapImageRep        *b = [NSBitmapImageRep alloc];
210 >
211 >        b = [b initWithBitmapDataPlanes: (unsigned char **) &bitmap
212 >                                                 pixelsWide: x
213 >                                                 pixelsHigh: y
214 >  #ifdef CGIMAGEREF
215 >                                          bitsPerSample: CGImageGetBitsPerComponent(cgImgRep)
216 >                                        samplesPerPixel: 3
217 >                                                   hasAlpha: NO
218 >                                                   isPlanar: NO
219 >                                         colorSpaceName: NSCalibratedRGBColorSpace
220 >                                                bytesPerRow: CGImageGetBytesPerRow(cgImgRep)
221 >                                           bitsPerPixel: CGImageGetBitsPerPixel(cgImgRep)];
222 >  #endif
223 >  #ifdef CGDRAWBITMAP
224 >                                          bitsPerSample: bps
225 >                                        samplesPerPixel: spp
226 >                                                   hasAlpha: hasAlpha
227 >                                                   isPlanar: isPlanar
228 >                                         colorSpaceName: NSCalibratedRGBColorSpace
229 >                                                bytesPerRow: bytesPerRow
230 >                                           bitsPerPixel: bpp];
231 >  #endif
232 >
233 >    if ( ! b )
234 >        {
235 >                ErrorAlert("Could not allocate an NSBitmapImageRep for the TIFF");
236 >                return nil;
237 >        }
238 >
239 >        return [b TIFFRepresentation];
240   #endif
177        return nil;
241   }
242  
243   // Enable display of, and drawing into, the view
# Line 183 | Line 246 | static int prevFlags;
246                    imageWidth: (short) width
247                   imageHeight: (short) height
248   {
186        bitmap = theBitmap;
249          numBytes = [theBitmap bytesPerRow] * height;
250   #endif
251   #ifdef CGIMAGEREF
252   - (void) readyToDraw: (CGImageRef) image
253 +                          bitmap: (void *) theBitmap
254                    imageWidth: (short) width
255                   imageHeight: (short) height
256   {
257          cgImgRep = image;
258 <        numBytes = CGImageGetBytesPerRow(image);
258 >        numBytes = CGImageGetBytesPerRow(image) * height;
259   #endif
260   #ifdef CGDRAWBITMAP
261   - (void) readyToDraw: (void *) theBitmap
# Line 205 | Line 268 | static int prevFlags;
268                          isPlanar: (BOOL)  planar
269                          hasAlpha: (BOOL)  alpha
270   {
208        bitmap = theBitmap;
271          bps = bitsPerSample;
272          spp = samplesPerPixel;
273          bpp = bitsPerPixel;
# Line 214 | Line 276 | static int prevFlags;
276          hasAlpha = alpha;
277          numBytes = bpr * height;
278   #endif
279 +        D(NSLog(@"readyToDraw: theBitmap=%lx\n", theBitmap));
280 +
281 +        bitmap = theBitmap;
282          x = width, y = height;
283          drawView = YES;
219
284          [[self window] setAcceptsMouseMovedEvents:      YES];
285   //      [[self window] setInitialFirstResponder:        self];
286          [[self window] makeFirstResponder:                      self];
# Line 233 | Line 297 | static int prevFlags;
297  
298          fullScreen = YES;
299          memcpy(&displayBox, &displayBounds, sizeof(displayBox));
236        screen_height = (int)displayBounds.size.height;
300   }
301  
302   - (short) width
# Line 298 | Line 361 | static int prevFlags;
361          }
362   }
363  
364 +
365 + - (void) fullscreenMouseMove
366 + {
367 +        NSPoint location = [NSEvent mouseLocation];
368 +
369 +        D(NSLog (@"%s - loc.x=%f, loc.y=%f",
370 +                                __PRETTY_FUNCTION__, location.x, location.y));
371 +        D(NSLog (@"%s - Sending ADBMouseMoved(%d,%d). (%d-%d)",
372 +                                        __PRETTY_FUNCTION__, (int)location.x,
373 +                                        screen_height - (int)location.y, screen_height, (int)location.y));
374 +        ADBMouseMoved((int)location.x, screen_height - (int)location.y);
375 + }
376 +
377   static NSPoint  mouse;                  // Previous/current mouse location
378  
379   - (BOOL) processMouseMove: (NSEvent *) event
# Line 305 | Line 381 | static NSPoint mouse;                  // Previous/curr
381          NSPoint location;
382  
383          if ( fullScreen )
384 <                location = [NSEvent mouseLocation];
385 <        else
386 <                location = [self convertPoint: [event locationInWindow] fromView:nil];
384 >        {
385 >                [self fullscreenMouseMove];
386 >                return YES;
387 >        }
388 >
389 >        location = [self convertPoint: [event locationInWindow] fromView:nil];
390 >
391 >        D(NSLog (@"%s - loc.x=%f, loc.y=%f",
392 >                                __PRETTY_FUNCTION__, location.x, location.y));
393  
394          if ( NSEqualPoints(location, mouse) )
395                  return NO;
396  
397          mouse = location;
398  
317        if ( fullScreen )
318        {
319                ADBMouseMoved((int)mouse.x, screen_height - (int)mouse.y);
320                return YES;
321        }
322
399   #ifdef CAN_RESIZE_VIEW
400          int     mouseY = y - y * mouse.y / [self height];
401          int     mouseX =         x * mouse.x / [self width];
# Line 361 | Line 437 | static NSPoint mouse;                  // Previous/curr
437          ADBMouseUp(0);
438   }
439  
440 < #if DEBUG && ! defined(CGIMAGEREF)
440 > #if DEBUG
441   - (void) randomise              // Draw some coloured snow in the bitmap
442   {
443          unsigned char   *data,
444                                          *pixel;
445  
370  #ifdef CGDRAWBITMAP
371        data = bitmap;
372  #endif
446    #ifdef NSBITMAP
447          data = [bitmap bitmapData];
448 +  #else
449 +        data = bitmap;
450    #endif
451  
452          for ( int i = 0; i < 1000; ++i )
# Line 389 | Line 464 | static NSPoint mouse;                  // Previous/curr
464  
465   #if DEBUG
466          NSLog(@"In drawRect");
392 # ifndef CGIMAGEREF
467          [self randomise];
394 # endif
468   #endif
469  
470   #ifdef NSBITMAP

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines