diff options
author | dynaflash <[email protected]> | 2009-05-04 05:29:45 +0000 |
---|---|---|
committer | dynaflash <[email protected]> | 2009-05-04 05:29:45 +0000 |
commit | 13cb29614cdd0dd317b82548fa712a2e26852632 (patch) | |
tree | 380b30be2d1949b00b484f7739941affef563ccb /macosx/HBPreviewController.mm | |
parent | 11317ace31dcd579f353d26849b24d2250f45abf (diff) |
MacGui: preview changes to coincide with rev 2376
- as per the LinGui changes to hb_get_preview (thanks jstebbins)
- also restores the gray crop border color
- consolidates some macgui preview code
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@2377 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'macosx/HBPreviewController.mm')
-rw-r--r-- | macosx/HBPreviewController.mm | 243 |
1 files changed, 65 insertions, 178 deletions
diff --git a/macosx/HBPreviewController.mm b/macosx/HBPreviewController.mm index 46522db60..f6ab2ac45 100644 --- a/macosx/HBPreviewController.mm +++ b/macosx/HBPreviewController.mm @@ -238,7 +238,7 @@ return YES; NSImage *fPreviewImage = [self imageForPicture: fPicture]; NSSize imageScaledSize = [fPreviewImage size]; - + [fPictureView setImage: fPreviewImage]; NSSize displaySize = NSMakeSize( ( CGFloat )fTitle->width, ( CGFloat )fTitle->height ); NSString *sizeInfoString; @@ -298,9 +298,19 @@ return YES; NSSize viewSize = [self optimalViewSizeForImageSize:displaySize]; /* Initially set our preview image here */ - - [fPreviewImage setSize: imageScaledSize]; - [fPictureView setFrameSize: imageScaledSize]; + /* + if (scaleToScreen == YES) + { + viewSize.width = viewSize.width - (viewSize.width - imageScaledSize.width); + viewSize.height = viewSize.height - (viewSize.height - imageScaledSize.height); + [fPreviewImage setSize: viewSize]; + [fPictureView setFrameSize: viewSize]; + } + else + { + [fPreviewImage setSize: imageScaledSize]; + [fPictureView setFrameSize: imageScaledSize]; + } [fPictureView setImage: fPreviewImage]; // center it vertically and horizontally NSPoint origin = [fPictureViewArea frame].origin; @@ -309,41 +319,23 @@ return YES; origin.x += ([fPictureViewArea frame].size.width - [fPictureView frame].size.width) / 2.0; - [fPictureView setFrameOrigin:origin]; - + */ /* we also need to take into account scaling to full screen to activate switching the view size */ if( [self viewNeedsToResizeToSize:viewSize]) { - /* if we have no anamorphic. */ - if (!fTitle->job->anamorphic.mode || fTitle->job->anamorphic.mode == 0) + if (fTitle->job->anamorphic.mode != 2 || (fTitle->job->anamorphic.mode == 2 && fTitle->width == fTitle->job->width)) { [self resizeSheetForViewSize:viewSize]; - [self setViewSize:viewSize]; - } - /* Strict anamorphic. */ - else if (fTitle->job->anamorphic.mode == 1) - { - [self resizeSheetForViewSize:viewSize]; - [self setViewSize:viewSize]; - } - /* In the case of loose anamorphic, do not resize the window when scaling down */ - else if (fTitle->job->anamorphic.mode == 2 && fTitle->width == fTitle->job->width) - { - [self resizeSheetForViewSize:viewSize]; - [self setViewSize:viewSize]; - } - - /* custom anamorphic */ - else if (fTitle->job->anamorphic.mode == 3) - { - [self resizeSheetForViewSize:viewSize]; - [self setViewSize:viewSize]; + //[self setViewSize:viewSize]; + } } - // Show the scaled text (use the height to check since the width can vary - // with anamorphic video). + viewSize.width = viewSize.width - (viewSize.width - imageScaledSize.width); + viewSize.height = viewSize.height - (viewSize.height - imageScaledSize.height); + [self setViewSize:viewSize]; + NSString *scaleString; if( imageScaledSize.height > [fPictureView frame].size.height) @@ -576,14 +568,6 @@ return YES; [self pictureSliderChanged:nil]; [fScaleToScreenToggleButton setTitle:@">-<"]; } - - /* Actually perform the scaling */ - /* - NSSize displaySize = NSMakeSize( ( CGFloat )fTitle->width, ( CGFloat )fTitle->height ); - NSSize viewSize = [self optimalViewSizeForImageSize:displaySize]; - [self resizeSheetForViewSize:viewSize]; - [self setViewSize:viewSize]; - */ } - (BOOL)fullScreen @@ -766,160 +750,63 @@ return YES; + (NSImage *) makeImageForPicture: (int)pictureIndex libhb:(hb_handle_t*)handle title:(hb_title_t*)title - removeBorders:(BOOL)removeBorders { - if (removeBorders) - { - // |<---------- title->width ----------->| - // | |<---- title->job->width ---->| | - // | | | | - // ....................................... - // ....+-----------------------------+.... - // ....| |....<-- gray border - // ....| |.... - // ....| |.... - // ....| |<------- image - // ....| |.... - // ....| |.... - // ....| |.... - // ....| |.... - // ....| |.... - // ....+-----------------------------+.... - // ....................................... - - static uint8_t * buffer; - static int bufferSize; - - // Make sure we have a big enough buffer to receive the image from libhb. libhb - // creates images with a one-pixel border around the original content. Hence we - // add 2 pixels horizontally and vertically to the buffer size. - int srcWidth; - int srcHeight; - if (title->width > title->job->width) - { - srcWidth = title->width + 2; - } - else - { - srcWidth = title->job->width + 2; - } - - if (title->height > title->job->height) - { - srcHeight = title->height + 2; - } - else - { - srcHeight = title->job->height + 2; - } + static uint8_t * buffer; + static int bufferSize; + + // Make sure we have a big enough buffer to receive the image from libhb. libhb + int dstWidth = title->job->width; + int dstHeight = title->job->height; - int newSize; - newSize = srcWidth * srcHeight * 4; - if( bufferSize < newSize ) - { - bufferSize = newSize; - buffer = (uint8_t *) realloc( buffer, bufferSize ); - } + int newSize; + newSize = dstWidth * dstHeight * 4; + if( bufferSize < newSize ) + { + bufferSize = newSize; + buffer = (uint8_t *) realloc( buffer, bufferSize ); + } - hb_get_preview( handle, title, pictureIndex, buffer ); + hb_get_preview( handle, title, pictureIndex, buffer ); - // Create an NSBitmapImageRep and copy the libhb image into it, converting it from - // libhb's format to one suitable for NSImage. Along the way, we'll strip off the - // border around libhb's image. - - // The image data returned by hb_get_preview is 4 bytes per pixel, BGRA format. - // Alpha is ignored. + // Create an NSBitmapImageRep and copy the libhb image into it, converting it from + // libhb's format to one suitable for NSImage. Along the way, we'll strip off the + // border around libhb's image. - int dstWidth = title->job->width; - int dstHeight = title->job->height; - NSBitmapFormat bitmapFormat = (NSBitmapFormat)NSAlphaFirstBitmapFormat; - NSBitmapImageRep * imgrep = [[[NSBitmapImageRep alloc] - initWithBitmapDataPlanes:nil - pixelsWide:dstWidth - pixelsHigh:dstHeight - bitsPerSample:8 - samplesPerPixel:3 // ignore alpha - hasAlpha:NO - isPlanar:NO - colorSpaceName:NSCalibratedRGBColorSpace - bitmapFormat:bitmapFormat - bytesPerRow:dstWidth * 4 - bitsPerPixel:32] autorelease]; - - int borderTop = (srcHeight - dstHeight) / 2; - int borderLeft = (srcWidth - dstWidth) / 2; + // The image data returned by hb_get_preview is 4 bytes per pixel, BGRA format. + // Alpha is ignored. - UInt32 * src = (UInt32 *)buffer; - UInt32 * dst = (UInt32 *)[imgrep bitmapData]; - src += borderTop * srcWidth; // skip top rows in src to get to first row of dst - src += borderLeft; // skip left pixels in src to get to first pixel of dst - for (int r = 0; r < dstHeight; r++) - { - for (int c = 0; c < dstWidth; c++) -#if TARGET_RT_LITTLE_ENDIAN - *dst++ = Endian32_Swap(*src++); -#else - *dst++ = *src++; -#endif - src += (srcWidth - dstWidth); // skip to next row in src - } - - NSImage * img = [[[NSImage alloc] initWithSize: NSMakeSize(dstWidth, dstHeight)] autorelease]; - [img addRepresentation:imgrep]; - - return img; - } - else + NSBitmapFormat bitmapFormat = (NSBitmapFormat)NSAlphaFirstBitmapFormat; + NSBitmapImageRep * imgrep = [[[NSBitmapImageRep alloc] + initWithBitmapDataPlanes:nil + pixelsWide:dstWidth + pixelsHigh:dstHeight + bitsPerSample:8 + samplesPerPixel:3 // ignore alpha + hasAlpha:NO + isPlanar:NO + colorSpaceName:NSCalibratedRGBColorSpace + bitmapFormat:bitmapFormat + bytesPerRow:dstWidth * 4 + bitsPerPixel:32] autorelease]; + + UInt32 * src = (UInt32 *)buffer; + UInt32 * dst = (UInt32 *)[imgrep bitmapData]; + for (int r = 0; r < dstHeight; r++) { - // Make sure we have big enough buffer - static uint8_t * buffer; - static int bufferSize; - - int newSize; - newSize = ( title->width + 2 ) * (title->height + 2 ) * 4; - if( bufferSize < newSize ) - { - bufferSize = newSize; - buffer = (uint8_t *) realloc( buffer, bufferSize ); - } - - hb_get_preview( handle, title, pictureIndex, buffer ); - - // The image data returned by hb_get_preview is 4 bytes per pixel, BGRA format. - // We'll copy that into an NSImage swapping it to ARGB in the process. Alpha is - // ignored. - int width = title->width + 2; // hblib adds a one-pixel border to the image - int height = title->height + 2; - int numPixels = width * height; - NSBitmapFormat bitmapFormat = (NSBitmapFormat)NSAlphaFirstBitmapFormat; - NSBitmapImageRep * imgrep = [[[NSBitmapImageRep alloc] - initWithBitmapDataPlanes:nil - pixelsWide:width - pixelsHigh:height - bitsPerSample:8 - samplesPerPixel:3 // ignore alpha - hasAlpha:NO - isPlanar:NO - colorSpaceName:NSCalibratedRGBColorSpace - bitmapFormat:bitmapFormat - bytesPerRow:width * 4 - bitsPerPixel:32] autorelease]; - - UInt32 * src = (UInt32 *)buffer; - UInt32 * dst = (UInt32 *)[imgrep bitmapData]; - for (int i = 0; i < numPixels; i++) + for (int c = 0; c < dstWidth; c++) #if TARGET_RT_LITTLE_ENDIAN *dst++ = Endian32_Swap(*src++); #else *dst++ = *src++; #endif + } - NSImage * img = [[[NSImage alloc] initWithSize: NSMakeSize(width, height)] autorelease]; - [img addRepresentation:imgrep]; + NSImage * img = [[[NSImage alloc] initWithSize: NSMakeSize(dstWidth, dstHeight)] autorelease]; + [img addRepresentation:imgrep]; - return img; - } + return img; } + // Returns the preview image for the specified index, retrieving it from its internal // cache or by calling makeImageForPicture if it is not cached. Generally, you should // use imageForPicture so that images are cached. Calling makeImageForPicture will @@ -932,7 +819,7 @@ return YES; NSImage * theImage = [fPicturePreviews objectForKey:key]; if (!theImage) { - theImage = [PreviewController makeImageForPicture:pictureIndex libhb:fHandle title:fTitle removeBorders: YES]; + theImage = [PreviewController makeImageForPicture:pictureIndex libhb:fHandle title:fTitle]; [fPicturePreviews setObject:theImage forKey:key]; } return theImage; |