Revision: 16419
          http://sourceforge.net/p/skim-app/code/16419
Author:   hofman
Date:     2026-09-05 17:43:00 +0000 (Sat, 05 Sep 2026)
Log Message:
-----------
static function for color invert function with custom map of white and black

Modified Paths:
--------------
    trunk/NSGraphics_SKExtensions.m

Modified: trunk/NSGraphics_SKExtensions.m
===================================================================
--- trunk/NSGraphics_SKExtensions.m     2026-09-05 16:14:15 UTC (rev 16418)
+++ trunk/NSGraphics_SKExtensions.m     2026-09-05 17:43:00 UTC (rev 16419)
@@ -188,16 +188,33 @@
 
 static inline CGFloat sRGBToGamma16(CGFloat c) { return c <= 0.04045 ? pow(c / 
12.92, 0.625) : pow((c + 0.055) / 1.055, 1.5); }
 
-static CGFloat invertedColorsFilterFactor() {
-    static CGFloat customFactor = -1.0;
-    if (customFactor < 0.0) {
+static CGFloat invertedColorsBackgroundWhite() {
+    static CGFloat backgroundWhite = -2.0;
+    if (backgroundWhite < -1.0) {
         NSNumber *bgw = [[NSUserDefaults standardUserDefaults] 
objectForKey:SKInvertedColorsBackgroundWhiteKey];
-        customFactor = bgw ? 2.0 - sRGBToGamma16(fmax(0.0, fmin(1.0, [bgw  
doubleValue]))) : 0.0;
+        backgroundWhite = bgw ? sRGBToGamma16(fmax(0.0, fmin(1.0, [bgw  
doubleValue]))) : -1.0;
     }
     // map the white page background to 40/255, or 30/255 with high contrast
-    return customFactor ?: [[NSWorkspace sharedWorkspace] 
accessibilityDisplayShouldIncreaseContrast] ? 1.9338 : 1.9100;
+    return backgroundWhite >= 0.0 ? backgroundWhite : [[NSWorkspace 
sharedWorkspace] accessibilityDisplayShouldIncreaseContrast] ? 0.0662 : 0.0900;
 }
 
+static NSArray *colorInvertFilters(CGFloat b, CGFloat w) {
+    NSMutableArray *filters = [NSMutableArray array];
+    CIFilter *filter;
+    CGFloat f = 1.0 + b - w;
+    CGFloat lrf = LR * f, lgf = LG * f, lbf = LB * f;
+    // This is like CIColorInvert + CIHueAdjust, modified to map white to w 
rather than black and black to b rather than white
+    // Inverts a linear luminocity with weights from the CIE standards
+    // see 
https://wiki.preterhuman.net/Matrix_Operations_for_Image_Processingand 
https://beesbuzz.biz/code/16-hsv-color-transforms
+    if ((filter = [CIFilter filterWithName:@"CIGammaAdjust" 
keysAndValues:@"inputPower", @0.625, nil]))
+        [filters addObject:filter];
+    if ((filter = [CIFilter filterWithName:@"CIColorMatrix" 
keysAndValues:@"inputRVector", [CIVector vectorWithX:1.0-lrf Y:-lgf Z:-lbf 
W:0.0], @"inputGVector", [CIVector vectorWithX:-lrf Y:1.0-lgf Z:-lbf W:0.0], 
@"inputBVector", [CIVector vectorWithX:-lrf Y:-lgf Z:1.0-lbf W:0.0], 
@"inputAVector", [CIVector vectorWithX:0.0 Y:0.0 Z:0.0 W:1.0], 
@"inputBiasVector", [CIVector vectorWithX:b Y:b Z:b W:0.0], nil]))
+        [filters addObject:filter];
+    if ((filter = [CIFilter filterWithName:@"CIGammaAdjust" 
keysAndValues:@"inputPower", @1.6, nil]))
+        [filters addObject:filter];
+    return filters;
+}
+
 NSArray *SKColorEffectFilters(void) {
     NSMutableArray *filters = [NSMutableArray array];
     CIFilter *filter;
@@ -213,35 +230,16 @@
             [filters addObject:filter];
     }
     if (SKHasDarkAppearance() && [sud boolForKey:SKInvertColorsInDarkModeKey]) 
{
-        CGFloat f = invertedColorsFilterFactor();
-        CGFloat lrf = LR * f, lgf = LG * f, lbf = LB * f;
-        // This is like CIColorInvert + CIHueAdjust, modified to map white to 
dark gray rather than black
-        // Inverts a linear luminocity with weights from the CIE standards
-        // see 
https://wiki.preterhuman.net/Matrix_Operations_for_Image_Processingand 
https://beesbuzz.biz/code/16-hsv-color-transforms
-        if ((filter = [CIFilter filterWithName:@"CIGammaAdjust" 
keysAndValues:@"inputPower", @0.625, nil]))
-            [filters addObject:filter];
-        if ((filter = [CIFilter filterWithName:@"CIColorMatrix" 
keysAndValues:@"inputRVector", [CIVector vectorWithX:1.0-lrf Y:-lgf Z:-lbf 
W:0.0], @"inputGVector", [CIVector vectorWithX:-lrf Y:1.0-lgf Z:-lbf W:0.0], 
@"inputBVector", [CIVector vectorWithX:-lrf Y:-lgf Z:1.0-lbf W:0.0], 
@"inputAVector", [CIVector vectorWithX:0.0 Y:0.0 Z:0.0 W:1.0], 
@"inputBiasVector", [CIVector vectorWithX:1.0 Y:1.0 Z:1.0 W:0.0], nil]))
-            [filters addObject:filter];
-        if ((filter = [CIFilter filterWithName:@"CIGammaAdjust" 
keysAndValues:@"inputPower", @1.6, nil]))
-            [filters addObject:filter];
+        [filters addObjectsFromArray:colorInvertFilters(1.0, 
invertedColorsBackgroundWhite())];
     }
     return filters;
 }
 
 NSArray *SKInvertedColorEffectFilters(void) {
-    NSMutableArray *filters = [NSMutableArray array];
-    CIFilter *filter;
     if (SKHasDarkAppearance() && [[NSUserDefaults standardUserDefaults] 
boolForKey:SKInvertColorsInDarkModeKey]) {
         // this is roughly the inverse of the color inversion filter above
-        CGFloat f = 2.0;//fmax(1.0001, invertedColorsFilterFactor());
-        CGFloat fi = 1.0 / (f - 1.0);
-        CGFloat lrf = LR * f * fi, lgf = LG * f * fi, lbf = LB * f * fi;
-        if ((filter = [CIFilter filterWithName:@"CIGammaAdjust" 
keysAndValues:@"inputPower", @0.625, nil]))
-            [filters addObject:filter];
-        if ((filter = [CIFilter filterWithName:@"CIColorMatrix" 
keysAndValues:@"inputRVector", [CIVector vectorWithX:1.0-lrf Y:-lgf Z:-lbf 
W:0.0], @"inputGVector", [CIVector vectorWithX:-lrf Y:1.0-lgf Z:-lbf W:0.0], 
@"inputBVector", [CIVector vectorWithX:-lrf Y:-lgf Z:1.0-lbf W:0.0], 
@"inputAVector", [CIVector vectorWithX:0.0 Y:0.0 Z:0.0 W:1.0], 
@"inputBiasVector", [CIVector vectorWithX:fi Y:fi Z:fi W:0.0], nil]))
-            [filters addObject:filter];
-        if ((filter = [CIFilter filterWithName:@"CIGammaAdjust" 
keysAndValues:@"inputPower", @1.6, nil]))
-            [filters addObject:filter];
+        // return colorInvertFilters(1.0/fmax(0.0001, 
invertedColorsBackgroundWhite()), 0.0);
+        return colorInvertFilters(1.0, 0.0);
     }
-    return filters;
+    return @[];
 }

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit

Reply via email to