summaryrefslogtreecommitdiffstats
path: root/macosx
diff options
context:
space:
mode:
Diffstat (limited to 'macosx')
-rw-r--r--macosx/HBCore.m181
-rw-r--r--macosx/HBImageUtilities.h11
-rw-r--r--macosx/HBImageUtilities.m184
-rw-r--r--macosx/HandBrake.xcodeproj/project.pbxproj6
4 files changed, 206 insertions, 176 deletions
diff --git a/macosx/HBCore.m b/macosx/HBCore.m
index 2d2f592bc..acd4c187e 100644
--- a/macosx/HBCore.m
+++ b/macosx/HBCore.m
@@ -9,6 +9,7 @@
#import "HBJob+HBJobConversion.h"
#import "HBDVDDetector.h"
#import "HBUtilities.h"
+#import "HBImageUtilities.h"
#import "HBStateFormatter+Private.h"
#import "HBTitle+Private.h"
@@ -314,178 +315,6 @@ typedef void (^HBCoreCleanupHandler)(void);
}
#pragma mark - Preview images
-
-- (CGImageRef)CGImageRotatedByAngle:(CGImageRef)imgRef angle:(CGFloat)angle flipped:(BOOL)flipped CF_RETURNS_RETAINED
-{
- CGFloat angleInRadians = angle * (M_PI / 180);
- CGFloat width = CGImageGetWidth(imgRef);
- CGFloat height = CGImageGetHeight(imgRef);
-
- CGRect imgRect = CGRectMake(0, 0, width, height);
- CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians);
- CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform);
-
- CGColorSpaceRef colorSpace = CGImageGetColorSpace(imgRef);
- CGContextRef bmContext = CGBitmapContextCreate(NULL,
- (size_t)rotatedRect.size.width,
- (size_t)rotatedRect.size.height,
- 8,
- 0,
- colorSpace,
- kCGImageAlphaPremultipliedFirst);
- CGContextSetAllowsAntialiasing(bmContext, FALSE);
- CGContextSetInterpolationQuality(bmContext, kCGInterpolationNone);
-
- // Rotate
- CGContextTranslateCTM(bmContext,
- + (rotatedRect.size.width / 2),
- + (rotatedRect.size.height / 2));
- CGContextRotateCTM(bmContext, -angleInRadians);
- CGContextTranslateCTM(bmContext,
- - (rotatedRect.size.width / 2),
- - (rotatedRect.size.height / 2));
-
- // Flip
- if (flipped)
- {
- CGAffineTransform flipHorizontal = CGAffineTransformMake(-1, 0, 0, 1, floor(rotatedRect.size.width), 0);
- CGContextConcatCTM(bmContext, flipHorizontal);
- }
-
- CGContextDrawImage(bmContext,
- CGRectMake((rotatedRect.size.width - width)/2.0f,
- (rotatedRect.size.height - height)/2.0f,
- width,
- height),
- imgRef);
-
- CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext);
- CFRelease(bmContext);
-
- return rotatedImage;
-}
-
-- (CGColorSpaceRef)copyColorSpaceWithColorPrimaries:(int)colorPrimaries
-{
- const CGFloat whitePoint[] = {0.95047, 1.0, 1.08883};
- const CGFloat blackPoint[] = {0, 0, 0};
-
- // See https://developer.apple.com/library/content/technotes/tn2257/_index.html
- const CGFloat gamma[] = {1.961, 1.961, 1.961};
-
- // RGB/XYZ Matrices (D65 white point)
- switch (colorPrimaries) {
- case HB_COLR_PRI_EBUTECH:
- {
- // Rec. 601, 625 line
- const CGFloat matrix[] = {0.4305538, 0.2220043, 0.0201822,
- 0.3415498, 0.7066548, 0.1295534,
- 0.1783523, 0.0713409, 0.9393222};
- return CGColorSpaceCreateCalibratedRGB(whitePoint, blackPoint, gamma, matrix);
- }
- case HB_COLR_PRI_SMPTEC:
- {
- // Rec. 601, 525 line
- const CGFloat matrix[] = {0.3935209, 0.2123764, 0.0187391,
- 0.3652581, 0.7010599, 0.1119339,
- 0.1916769, 0.0865638, 0.9583847};
- return CGColorSpaceCreateCalibratedRGB(whitePoint, blackPoint, gamma, matrix);
- }
- case HB_COLR_PRI_BT2020:
- {
- // Rec. 2020
- const CGFloat matrix[] = {0.6369580, 0.2627002, 0.0000000,
- 0.1446169, 0.6779981, 0.0280727,
- 0.1688810, 0.0593017, 1.0609851};
- return CGColorSpaceCreateCalibratedRGB(whitePoint, blackPoint, gamma, matrix);
- }
- case HB_COLR_PRI_BT709:
- default:
- {
- // Rec. 709
- const CGFloat matrix[] = {0.4124564, 0.2126729, 0.0193339,
- 0.3575761, 0.7151522, 0.1191920,
- 0.1804375, 0.0721750, 0.9503041};
- return CGColorSpaceCreateCalibratedRGB(whitePoint, blackPoint, gamma, matrix);
- }
- }
-}
-
-- (CGColorSpaceRef)copyColorSpaceWithPrimaries:(int)primaries transfer:(int)transfer matrix:(int)matrix
-{
- if (NSAppKitVersionNumber < NSAppKitVersionNumber10_11)
- {
- return [self copyColorSpaceWithColorPrimaries:primaries];
- }
-
- CFStringRef primariesKey = NULL;
- switch (primaries)
- {
- case HB_COLR_PRI_EBUTECH:
- primariesKey = kCVImageBufferColorPrimaries_EBU_3213;
- break;
-
- case HB_COLR_PRI_SMPTEC:
- primariesKey = kCVImageBufferColorPrimaries_SMPTE_C;
- break;
-
- case HB_COLR_PRI_BT2020:
- primariesKey = kCVImageBufferColorPrimaries_ITU_R_2020;
- break;
-
- case HB_COLR_PRI_BT709:
- default:
- primariesKey = kCVImageBufferColorPrimaries_ITU_R_709_2;
- }
-
- CFStringRef transferKey = NULL;
- switch (transfer)
- {
- case HB_COLR_TRA_SMPTE240M:
- transferKey = kCVImageBufferTransferFunction_SMPTE_240M_1995;
- break;
-
- case HB_COLR_TRA_BT2020_10:
- case HB_COLR_TRA_BT2020_12:
- transferKey = kCVImageBufferTransferFunction_ITU_R_2020;
- break;
-
- case HB_COLR_TRA_BT709:
- default:
- transferKey = kCVImageBufferTransferFunction_ITU_R_709_2;
- }
-
- CFStringRef matrixKey = NULL;
- switch (matrix)
- {
- case HB_COLR_MAT_SMPTE170M:
- matrixKey = kCVImageBufferYCbCrMatrix_ITU_R_601_4;
- break;
-
- case HB_COLR_MAT_SMPTE240M:
- matrixKey = kCVImageBufferYCbCrMatrix_SMPTE_240M_1995;
- break;
-
- case HB_COLR_MAT_BT2020_NCL:
- case HB_COLR_MAT_BT2020_CL:
- matrixKey = kCVImageBufferYCbCrMatrix_ITU_R_2020;
- break;
-
- case HB_COLR_MAT_BT709:
- default:
- matrixKey = kCVImageBufferYCbCrMatrix_ITU_R_709_2;;
- }
-
- const void *keys[3] = { kCVImageBufferColorPrimariesKey, kCVImageBufferTransferFunctionKey, kCVImageBufferYCbCrMatrixKey };
- const void *values[3] = { primariesKey, transferKey, matrixKey};
- CFDictionaryRef attachments = CFDictionaryCreate(NULL, keys, values, 3, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
-
- CGColorSpaceRef colorSpace = CVImageBufferCreateColorSpaceFromAttachments(attachments);
-
- CFRelease(attachments);
-
- return colorSpace;
-}
- (CGImageRef)copyImageAtIndex:(NSUInteger)index
forTitle:(HBTitle *)title
@@ -516,9 +345,9 @@ typedef void (^HBCoreCleanupHandler)(void);
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaNone;
CFMutableDataRef imgData = CFDataCreateMutable(kCFAllocatorDefault, 3 * image->width * image->height);
CGDataProviderRef provider = CGDataProviderCreateWithCFData(imgData);
- CGColorSpaceRef colorSpace = [self copyColorSpaceWithPrimaries:title.hb_title->color_prim
- transfer:title.hb_title->color_transfer
- matrix:title.hb_title->color_matrix];
+ CGColorSpaceRef colorSpace = copyColorSpace(title.hb_title->color_prim,
+ title.hb_title->color_transfer,
+ title.hb_title->color_matrix);
img = CGImageCreate(image->width,
image->height,
@@ -555,7 +384,7 @@ typedef void (^HBCoreCleanupHandler)(void);
if (angle || flipped)
{
- CGImageRef rotatedImg = [self CGImageRotatedByAngle:img angle:angle flipped:flipped];
+ CGImageRef rotatedImg = CGImageRotated(img, angle, flipped);
CGImageRelease(img);
return rotatedImg;
}
diff --git a/macosx/HBImageUtilities.h b/macosx/HBImageUtilities.h
new file mode 100644
index 000000000..67f8d00e4
--- /dev/null
+++ b/macosx/HBImageUtilities.h
@@ -0,0 +1,11 @@
+/* HBColorUtilities.h $
+
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
+
+#import <Foundation/Foundation.h>
+
+CGImageRef CGImageRotated(CGImageRef imgRef, CGFloat angle, BOOL flipped) CF_RETURNS_RETAINED;
+CGColorSpaceRef copyColorSpace(int primaries, int transfer, int matrix);
+CGImageRef jnw_decompressedImage(CGImageRef CGImage);
diff --git a/macosx/HBImageUtilities.m b/macosx/HBImageUtilities.m
new file mode 100644
index 000000000..1c5f62174
--- /dev/null
+++ b/macosx/HBImageUtilities.m
@@ -0,0 +1,184 @@
+/* HBColorUtilities.m $
+
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
+
+#import "HBImageUtilities.h"
+#import <Cocoa/Cocoa.h>
+#include "hb.h"
+
+CGImageRef CGImageRotated(CGImageRef imgRef, CGFloat angle, BOOL flipped) CF_RETURNS_RETAINED
+{
+ CGFloat angleInRadians = angle * (M_PI / 180);
+ CGFloat width = CGImageGetWidth(imgRef);
+ CGFloat height = CGImageGetHeight(imgRef);
+
+ CGRect imgRect = CGRectMake(0, 0, width, height);
+ CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians);
+ CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform);
+
+ CGColorSpaceRef colorSpace = CGImageGetColorSpace(imgRef);
+ CGContextRef bmContext = CGBitmapContextCreate(NULL,
+ (size_t)rotatedRect.size.width,
+ (size_t)rotatedRect.size.height,
+ 8,
+ 0,
+ colorSpace,
+ kCGImageAlphaPremultipliedFirst);
+ CGContextSetAllowsAntialiasing(bmContext, FALSE);
+ CGContextSetInterpolationQuality(bmContext, kCGInterpolationNone);
+
+ // Rotate
+ CGContextTranslateCTM(bmContext,
+ + (rotatedRect.size.width / 2),
+ + (rotatedRect.size.height / 2));
+ CGContextRotateCTM(bmContext, -angleInRadians);
+ CGContextTranslateCTM(bmContext,
+ - (rotatedRect.size.width / 2),
+ - (rotatedRect.size.height / 2));
+
+ // Flip
+ if (flipped)
+ {
+ CGAffineTransform flipHorizontal = CGAffineTransformMake(-1, 0, 0, 1, floor(rotatedRect.size.width), 0);
+ CGContextConcatCTM(bmContext, flipHorizontal);
+ }
+
+ CGContextDrawImage(bmContext,
+ CGRectMake((rotatedRect.size.width - width)/2.0f,
+ (rotatedRect.size.height - height)/2.0f,
+ width,
+ height),
+ imgRef);
+
+ CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext);
+ CFRelease(bmContext);
+
+ return rotatedImage;
+}
+
+static CGColorSpaceRef copyColorSpaceOld(int colorPrimaries)
+{
+ const CGFloat whitePoint[] = {0.95047, 1.0, 1.08883};
+ const CGFloat blackPoint[] = {0, 0, 0};
+
+ // See https://developer.apple.com/library/content/technotes/tn2257/_index.html
+ const CGFloat gamma[] = {1.961, 1.961, 1.961};
+
+ // RGB/XYZ Matrices (D65 white point)
+ switch (colorPrimaries) {
+ case HB_COLR_PRI_EBUTECH:
+ {
+ // Rec. 601, 625 line
+ const CGFloat matrix[] = {0.4305538, 0.2220043, 0.0201822,
+ 0.3415498, 0.7066548, 0.1295534,
+ 0.1783523, 0.0713409, 0.9393222};
+ return CGColorSpaceCreateCalibratedRGB(whitePoint, blackPoint, gamma, matrix);
+ }
+ case HB_COLR_PRI_SMPTEC:
+ {
+ // Rec. 601, 525 line
+ const CGFloat matrix[] = {0.3935209, 0.2123764, 0.0187391,
+ 0.3652581, 0.7010599, 0.1119339,
+ 0.1916769, 0.0865638, 0.9583847};
+ return CGColorSpaceCreateCalibratedRGB(whitePoint, blackPoint, gamma, matrix);
+ }
+ case HB_COLR_PRI_BT2020:
+ {
+ // Rec. 2020
+ const CGFloat matrix[] = {0.6369580, 0.2627002, 0.0000000,
+ 0.1446169, 0.6779981, 0.0280727,
+ 0.1688810, 0.0593017, 1.0609851};
+ return CGColorSpaceCreateCalibratedRGB(whitePoint, blackPoint, gamma, matrix);
+ }
+ case HB_COLR_PRI_BT709:
+ default:
+ {
+ // Rec. 709
+ const CGFloat matrix[] = {0.4124564, 0.2126729, 0.0193339,
+ 0.3575761, 0.7151522, 0.1191920,
+ 0.1804375, 0.0721750, 0.9503041};
+ return CGColorSpaceCreateCalibratedRGB(whitePoint, blackPoint, gamma, matrix);
+ }
+ }
+}
+
+CGColorSpaceRef copyColorSpace(int primaries, int transfer, int matrix)
+{
+ if (NSAppKitVersionNumber < NSAppKitVersionNumber10_11)
+ {
+ return copyColorSpaceOld(primaries);
+ }
+
+ CFStringRef primariesKey = NULL;
+ switch (primaries)
+ {
+ case HB_COLR_PRI_EBUTECH:
+ primariesKey = kCVImageBufferColorPrimaries_EBU_3213;
+ break;
+
+ case HB_COLR_PRI_SMPTEC:
+ primariesKey = kCVImageBufferColorPrimaries_SMPTE_C;
+ break;
+
+ case HB_COLR_PRI_BT2020:
+ primariesKey = kCVImageBufferColorPrimaries_ITU_R_2020;
+ break;
+
+ case HB_COLR_PRI_BT709:
+ default:
+ primariesKey = kCVImageBufferColorPrimaries_ITU_R_709_2;
+ }
+
+ CFStringRef transferKey = NULL;
+ switch (transfer)
+ {
+ case HB_COLR_TRA_SMPTE240M:
+ transferKey = kCVImageBufferTransferFunction_SMPTE_240M_1995;
+ break;
+
+ case HB_COLR_TRA_BT2020_10:
+ case HB_COLR_TRA_BT2020_12:
+ transferKey = kCVImageBufferTransferFunction_ITU_R_2020;
+ break;
+
+ case HB_COLR_TRA_SMPTEST2084:
+ transferKey = CFSTR("SMPTE_ST_2084_PQ"); //kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ;
+ break;
+
+ case HB_COLR_TRA_BT709:
+ default:
+ transferKey = kCVImageBufferTransferFunction_ITU_R_709_2;
+ }
+
+ CFStringRef matrixKey = NULL;
+ switch (matrix)
+ {
+ case HB_COLR_MAT_SMPTE170M:
+ matrixKey = kCVImageBufferYCbCrMatrix_ITU_R_601_4;
+ break;
+
+ case HB_COLR_MAT_SMPTE240M:
+ matrixKey = kCVImageBufferYCbCrMatrix_SMPTE_240M_1995;
+ break;
+
+ case HB_COLR_MAT_BT2020_NCL:
+ case HB_COLR_MAT_BT2020_CL:
+ matrixKey = kCVImageBufferYCbCrMatrix_ITU_R_2020;
+ break;
+
+ case HB_COLR_MAT_BT709:
+ default:
+ matrixKey = kCVImageBufferYCbCrMatrix_ITU_R_709_2;;
+ }
+
+ const void *keys[3] = { kCVImageBufferColorPrimariesKey, kCVImageBufferTransferFunctionKey, kCVImageBufferYCbCrMatrixKey };
+ const void *values[3] = { primariesKey, transferKey, matrixKey};
+ CFDictionaryRef attachments = CFDictionaryCreate(NULL, keys, values, 3, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+
+ CGColorSpaceRef colorSpace = CVImageBufferCreateColorSpaceFromAttachments(attachments);
+ CFRelease(attachments);
+
+ return colorSpace;
+}
diff --git a/macosx/HandBrake.xcodeproj/project.pbxproj b/macosx/HandBrake.xcodeproj/project.pbxproj
index b206d5182..9f2d9ebfe 100644
--- a/macosx/HandBrake.xcodeproj/project.pbxproj
+++ b/macosx/HandBrake.xcodeproj/project.pbxproj
@@ -218,6 +218,7 @@
A9BC24C91A69293E007DC41A /* HBAttributedStringAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = A9BC24C81A69293E007DC41A /* HBAttributedStringAdditions.m */; };
A9C0DB85197E7B0000DF55B3 /* SubtitlesDefaults.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9C0DB83197E7B0000DF55B3 /* SubtitlesDefaults.xib */; };
A9C1839D1A716BCC00C897C2 /* HBTitleSelection.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9C1839B1A716BCC00C897C2 /* HBTitleSelection.xib */; };
+ A9CE0A921F57EC3400724577 /* HBImageUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = A9CE0A911F57EC3400724577 /* HBImageUtilities.m */; };
A9CF25F11990D62C0023F727 /* Presets.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9CF25EF1990D62C0023F727 /* Presets.xib */; };
A9CF25F71990D6820023F727 /* HBPresetsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A9CF25F61990D6820023F727 /* HBPresetsViewController.m */; };
A9D0FA771C1C284D0003F2A9 /* HBFocusRingView.m in Sources */ = {isa = PBXBuildFile; fileRef = A9D0FA761C1C284D0003F2A9 /* HBFocusRingView.m */; };
@@ -529,6 +530,8 @@
A9C9F88719A733FE00DC8923 /* HBHUDView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBHUDView.h; sourceTree = "<group>"; };
A9C9F88819A733FE00DC8923 /* HBHUDView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBHUDView.m; sourceTree = "<group>"; };
A9CAC26E1CCB6B0F00A39E72 /* HBPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBPlayer.h; sourceTree = "<group>"; };
+ A9CE0A911F57EC3400724577 /* HBImageUtilities.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HBImageUtilities.m; sourceTree = "<group>"; };
+ A9CE0A931F57EC4600724577 /* HBImageUtilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HBImageUtilities.h; sourceTree = "<group>"; };
A9CF25F01990D62C0023F727 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Presets.xib; sourceTree = "<group>"; };
A9CF25F21990D64E0023F727 /* HBPreset.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBPreset.h; sourceTree = "<group>"; };
A9CF25F31990D64E0023F727 /* HBPreset.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBPreset.m; sourceTree = "<group>"; };
@@ -961,6 +964,8 @@
children = (
273F209714ADBE670021BE6D /* HBDVDDetector.h */,
273F209814ADBE670021BE6D /* HBDVDDetector.m */,
+ A9CE0A931F57EC4600724577 /* HBImageUtilities.h */,
+ A9CE0A911F57EC3400724577 /* HBImageUtilities.m */,
A9160A331AE7A165009A7818 /* HBCodingUtilities.h */,
A9160A341AE7A165009A7818 /* HBCodingUtilities.m */,
A997D8EB1A4ABB0900E19B6F /* HBPresetCoding.h */,
@@ -1565,6 +1570,7 @@
A91CE2F81C7DB96D0068F46F /* HBPreset.m in Sources */,
A98F38071C7DCA7E00E469C8 /* HBStateFormatter+Private.m in Sources */,
A91CE2F91C7DB96D0068F46F /* HBMutablePreset.m in Sources */,
+ A9CE0A921F57EC3400724577 /* HBImageUtilities.m in Sources */,
A91CE2FA1C7DB96D0068F46F /* HBTreeNode.m in Sources */,
A91CE2B01C7DA9FB0068F46F /* HBUtilities.m in Sources */,
A91CE27D1C7DA7320068F46F /* HBCore.m in Sources */,