]> granicus.if.org Git - handbrake/commitdiff
MacGui: set the appropriate colorspace for preview images, and use a gamma value...
authorDamiano Galassi <damiog@gmail.com>
Thu, 10 Nov 2016 19:57:11 +0000 (20:57 +0100)
committerDamiano Galassi <damiog@gmail.com>
Thu, 10 Nov 2016 19:57:11 +0000 (20:57 +0100)
macosx/HBCore.m

index eae767060fdfa8ebf4a1101df87bbd5493e4874c..a0f3e5811b0989d3d66796e00d3beeefc51884fe 100644 (file)
@@ -284,7 +284,7 @@ static void hb_error_handler(const char *errmsg)
     CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians);
     CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform);
 
-    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
+    CGColorSpaceRef colorSpace = CGImageGetColorSpace(imgRef);
     CGContextRef bmContext = CGBitmapContextCreate(NULL,
                                                    (size_t)rotatedRect.size.width,
                                                    (size_t)rotatedRect.size.height,
@@ -294,7 +294,6 @@ static void hb_error_handler(const char *errmsg)
                                                    kCGImageAlphaPremultipliedFirst);
     CGContextSetAllowsAntialiasing(bmContext, FALSE);
     CGContextSetInterpolationQuality(bmContext, kCGInterpolationNone);
-    CGColorSpaceRelease(colorSpace);
 
     // Rotate
     CGContextTranslateCTM(bmContext,
@@ -325,6 +324,44 @@ static void hb_error_handler(const char *errmsg)
     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_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);
+        }
+    }
+}
+
 - (CGImageRef)copyImageAtIndex:(NSUInteger)index
                       forTitle:(HBTitle *)title
                   pictureFrame:(HBPicture *)frame
@@ -354,7 +391,8 @@ static void hb_error_handler(const char *errmsg)
         CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaNone;
         CFMutableDataRef imgData = CFDataCreateMutable(kCFAllocatorDefault, 3 * image->width * image->height);
         CGDataProviderRef provider = CGDataProviderCreateWithCFData(imgData);
-        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
+        CGColorSpaceRef colorSpace = [self copyColorSpaceWithColorPrimaries:title.hb_title->color_prim];
+
         img = CGImageCreate(image->width,
                             image->height,
                             8,