From 80274c26aa329a8a9491ea072aa018f0ecb9312e Mon Sep 17 00:00:00 2001 From: Mitchell Livingston Date: Sat, 10 May 2008 14:02:19 +0000 Subject: [PATCH] revert the upgrade of CTGradient --- macosx/CTGradient/CTGradient.h | 26 ++- macosx/CTGradient/CTGradient.m | 375 ++++++++++++++++++++++++++++++--- 2 files changed, 369 insertions(+), 32 deletions(-) diff --git a/macosx/CTGradient/CTGradient.h b/macosx/CTGradient/CTGradient.h index 4e8605f8e..cfedf1945 100644 --- a/macosx/CTGradient/CTGradient.h +++ b/macosx/CTGradient/CTGradient.h @@ -2,11 +2,10 @@ // CTGradient.h // // Created by Chad Weider on 2/14/07. -// Writtin by Chad Weider. +// Copyright (c) 2007 Chad Weider. +// Some rights reserved: // -// Released into public domain on 4/10/08. -// -// Version: 1.8 +// Version: 1.6 #import @@ -36,8 +35,25 @@ typedef enum _CTBlendingMode + (id)gradientWithBeginningColor:(NSColor *)begin endingColor:(NSColor *)end; ++ (id)aquaSelectedGradient; ++ (id)aquaNormalGradient; ++ (id)aquaPressedGradient; + ++ (id)unifiedSelectedGradient; ++ (id)unifiedNormalGradient; ++ (id)unifiedPressedGradient; ++ (id)unifiedDarkGradient; + ++ (id)sourceListSelectedGradient; ++ (id)sourceListUnselectedGradient; + ++ (id)rainbowGradient; ++ (id)hydrogenSpectrumGradient; + - (CTGradient *)gradientWithAlphaComponent:(float)alpha; +- (void)addElement:(CTGradientElement*)newElement; + - (CTGradient *)addColorStop:(NSColor *)color atPosition:(float)position; //positions given relative to [0,1] - (CTGradient *)removeColorStopAtIndex:(unsigned)index; - (CTGradient *)removeColorStopAtPosition:(float)position; @@ -55,6 +71,4 @@ typedef enum _CTBlendingMode - (void)fillBezierPath:(NSBezierPath *)path angle:(float)angle; - (void)radialFillBezierPath:(NSBezierPath *)path; -- (void)addElement:(CTGradientElement*)newElement; - @end diff --git a/macosx/CTGradient/CTGradient.m b/macosx/CTGradient/CTGradient.m index a62fc555d..7f33f1099 100644 --- a/macosx/CTGradient/CTGradient.m +++ b/macosx/CTGradient/CTGradient.m @@ -2,17 +2,17 @@ // CTGradient.m // // Created by Chad Weider on 2/14/07. -// Writtin by Chad Weider. +// Copyright (c) 2007 Chad Weider. +// Some rights reserved: // -// Released into public domain on 4/10/08. -// -// Version: 1.8 +// Version: 1.6 #import "CTGradient.h" @interface CTGradient (Private) - (void)_commonInit; - (void)setBlendingMode:(CTGradientBlendingMode)mode; +- (void)addElement:(CTGradientElement*)newElement; - (CTGradientElement *)elementAtIndex:(unsigned)index; @@ -156,6 +156,343 @@ static void resolveHSV(float *color1, float *color2); return [newInstance autorelease]; } ++ (id)aquaSelectedGradient + { + id newInstance = [[[self class] alloc] init]; + + CTGradientElement color1; + color1.red = 0.58; + color1.green = 0.86; + color1.blue = 0.98; + color1.alpha = 1.00; + color1.position = 0; + + CTGradientElement color2; + color2.red = 0.42; + color2.green = 0.68; + color2.blue = 0.90; + color2.alpha = 1.00; + color2.position = 11.5/23; + + CTGradientElement color3; + color3.red = 0.64; + color3.green = 0.80; + color3.blue = 0.94; + color3.alpha = 1.00; + color3.position = 11.5/23; + + CTGradientElement color4; + color4.red = 0.56; + color4.green = 0.70; + color4.blue = 0.90; + color4.alpha = 1.00; + color4.position = 1; + + [newInstance addElement:&color1]; + [newInstance addElement:&color2]; + [newInstance addElement:&color3]; + [newInstance addElement:&color4]; + + return [newInstance autorelease]; + } + ++ (id)aquaNormalGradient + { + id newInstance = [[[self class] alloc] init]; + + CTGradientElement color1; + color1.red = color1.green = color1.blue = 0.95; + color1.alpha = 1.00; + color1.position = 0; + + CTGradientElement color2; + color2.red = color2.green = color2.blue = 0.83; + color2.alpha = 1.00; + color2.position = 11.5/23; + + CTGradientElement color3; + color3.red = color3.green = color3.blue = 0.95; + color3.alpha = 1.00; + color3.position = 11.5/23; + + CTGradientElement color4; + color4.red = color4.green = color4.blue = 0.92; + color4.alpha = 1.00; + color4.position = 1; + + [newInstance addElement:&color1]; + [newInstance addElement:&color2]; + [newInstance addElement:&color3]; + [newInstance addElement:&color4]; + + return [newInstance autorelease]; + } + ++ (id)aquaPressedGradient + { + id newInstance = [[[self class] alloc] init]; + + CTGradientElement color1; + color1.red = color1.green = color1.blue = 0.80; + color1.alpha = 1.00; + color1.position = 0; + + CTGradientElement color2; + color2.red = color2.green = color2.blue = 0.64; + color2.alpha = 1.00; + color2.position = 11.5/23; + + CTGradientElement color3; + color3.red = color3.green = color3.blue = 0.80; + color3.alpha = 1.00; + color3.position = 11.5/23; + + CTGradientElement color4; + color4.red = color4.green = color4.blue = 0.77; + color4.alpha = 1.00; + color4.position = 1; + + [newInstance addElement:&color1]; + [newInstance addElement:&color2]; + [newInstance addElement:&color3]; + [newInstance addElement:&color4]; + + return [newInstance autorelease]; + } + ++ (id)unifiedSelectedGradient + { + id newInstance = [[[self class] alloc] init]; + + CTGradientElement color1; + color1.red = color1.green = color1.blue = 0.85; + color1.alpha = 1.00; + color1.position = 0; + + CTGradientElement color2; + color2.red = color2.green = color2.blue = 0.95; + color2.alpha = 1.00; + color2.position = 1; + + [newInstance addElement:&color1]; + [newInstance addElement:&color2]; + + return [newInstance autorelease]; + } + ++ (id)unifiedNormalGradient + { + id newInstance = [[[self class] alloc] init]; + + CTGradientElement color1; + color1.red = color1.green = color1.blue = 0.75; + color1.alpha = 1.00; + color1.position = 0; + + CTGradientElement color2; + color2.red = color2.green = color2.blue = 0.90; + color2.alpha = 1.00; + color2.position = 1; + + [newInstance addElement:&color1]; + [newInstance addElement:&color2]; + + return [newInstance autorelease]; + } + ++ (id)unifiedPressedGradient + { + id newInstance = [[[self class] alloc] init]; + + CTGradientElement color1; + color1.red = color1.green = color1.blue = 0.60; + color1.alpha = 1.00; + color1.position = 0; + + CTGradientElement color2; + color2.red = color2.green = color2.blue = 0.75; + color2.alpha = 1.00; + color2.position = 1; + + [newInstance addElement:&color1]; + [newInstance addElement:&color2]; + + return [newInstance autorelease]; + } + ++ (id)unifiedDarkGradient + { + id newInstance = [[[self class] alloc] init]; + + CTGradientElement color1; + color1.red = color1.green = color1.blue = 0.68; + color1.alpha = 1.00; + color1.position = 0; + + CTGradientElement color2; + color2.red = color2.green = color2.blue = 0.83; + color2.alpha = 1.00; + color2.position = 1; + + [newInstance addElement:&color1]; + [newInstance addElement:&color2]; + + return [newInstance autorelease]; + } + ++ (id)sourceListSelectedGradient + { + id newInstance = [[[self class] alloc] init]; + + CTGradientElement color1; + color1.red = 0.06; + color1.green = 0.37; + color1.blue = 0.85; + color1.alpha = 1.00; + color1.position = 0; + + CTGradientElement color2; + color2.red = 0.30; + color2.green = 0.60; + color2.blue = 0.92; + color2.alpha = 1.00; + color2.position = 1; + + [newInstance addElement:&color1]; + [newInstance addElement:&color2]; + + return [newInstance autorelease]; + } + ++ (id)sourceListUnselectedGradient + { + id newInstance = [[[self class] alloc] init]; + + CTGradientElement color1; + color1.red = 0.43; + color1.green = 0.43; + color1.blue = 0.43; + color1.alpha = 1.00; + color1.position = 0; + + CTGradientElement color2; + color2.red = 0.60; + color2.green = 0.60; + color2.blue = 0.60; + color2.alpha = 1.00; + color2.position = 1; + + [newInstance addElement:&color1]; + [newInstance addElement:&color2]; + + return [newInstance autorelease]; + } + ++ (id)rainbowGradient + { + id newInstance = [[[self class] alloc] init]; + + CTGradientElement color1; + color1.red = 1.00; + color1.green = 0.00; + color1.blue = 0.00; + color1.alpha = 1.00; + color1.position = 0.0; + + CTGradientElement color2; + color2.red = 0.54; + color2.green = 0.00; + color2.blue = 1.00; + color2.alpha = 1.00; + color2.position = 1.0; + + [newInstance addElement:&color1]; + [newInstance addElement:&color2]; + + [newInstance setBlendingMode:CTChromaticBlendingMode]; + + return [newInstance autorelease]; + } + ++ (id)hydrogenSpectrumGradient + { + id newInstance = [[[self class] alloc] init]; + + struct {float hue; float position; float width;} colorBands[4]; + + colorBands[0].hue = 22; + colorBands[0].position = .145; + colorBands[0].width = .01; + + colorBands[1].hue = 200; + colorBands[1].position = .71; + colorBands[1].width = .008; + + colorBands[2].hue = 253; + colorBands[2].position = .885; + colorBands[2].width = .005; + + colorBands[3].hue = 275; + colorBands[3].position = .965; + colorBands[3].width = .003; + + int i; + ///////////////////////////// + for(i = 0; i < 4; i++) + { + float color[4]; + color[0] = colorBands[i].hue - 180*colorBands[i].width; + color[1] = 1; + color[2] = 0.001; + color[3] = 1; + transformHSV_RGB(color); + CTGradientElement fadeIn; + fadeIn.red = color[0]; + fadeIn.green = color[1]; + fadeIn.blue = color[2]; + fadeIn.alpha = color[3]; + fadeIn.position = colorBands[i].position - colorBands[i].width; + + + color[0] = colorBands[i].hue; + color[1] = 1; + color[2] = 1; + color[3] = 1; + transformHSV_RGB(color); + CTGradientElement band; + band.red = color[0]; + band.green = color[1]; + band.blue = color[2]; + band.alpha = color[3]; + band.position = colorBands[i].position; + + color[0] = colorBands[i].hue + 180*colorBands[i].width; + color[1] = 1; + color[2] = 0.001; + color[3] = 1; + transformHSV_RGB(color); + CTGradientElement fadeOut; + fadeOut.red = color[0]; + fadeOut.green = color[1]; + fadeOut.blue = color[2]; + fadeOut.alpha = color[3]; + fadeOut.position = colorBands[i].position + colorBands[i].width; + + + [newInstance addElement:&fadeIn]; + [newInstance addElement:&band]; + [newInstance addElement:&fadeOut]; + } + + [newInstance setBlendingMode:CTChromaticBlendingMode]; + + return [newInstance autorelease]; + } + +#pragma mark - + + + #pragma mark Modification - (CTGradient *)gradientWithAlphaComponent:(float)alpha { @@ -270,9 +607,9 @@ static void resolveHSV(float *color1, float *color2); } - return [NSColor colorWithCalibratedRed:components[0]/components[3] //undo premultiplication that CG requires - green:components[1]/components[3] - blue:components[2]/components[3] + return [NSColor colorWithCalibratedRed:components[0] + green:components[1] + blue:components[2] alpha:components[3]]; } #pragma mark - @@ -348,7 +685,7 @@ static void resolveHSV(float *color1, float *color2); //Calls to CoreGraphics CGContextRef currentContext = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort]; CGContextSaveGState(currentContext); - #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4 + #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); #else CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); @@ -365,7 +702,7 @@ static void resolveHSV(float *color1, float *color2); - (void)radialFillRect:(NSRect)rect { - CGPoint startPoint, endPoint; + CGPoint startPoint , endPoint; float startRadius, endRadius; float scalex, scaley, transx, transy; @@ -471,7 +808,7 @@ static void resolveHSV(float *color1, float *color2); } - (void)addElement:(CTGradientElement *)newElement - { +{ if(elementList == nil || newElement->position < elementList->position) //inserting at beginning of list { CTGradientElement *tmpNext = elementList; @@ -670,12 +1007,7 @@ void linearEvaluation (void *info, const float *in, float *out) out[1] = (color2->green - color1->green)*position + color1->green; out[2] = (color2->blue - color1->blue )*position + color1->blue; out[3] = (color2->alpha - color1->alpha)*position + color1->alpha; - } - - //Premultiply the color by the alpha. - out[0] *= out[3]; - out[1] *= out[3]; - out[2] *= out[3]; + } } @@ -764,11 +1096,6 @@ void chromaticEvaluation(void *info, const float *in, float *out) } transformHSV_RGB(out); - - //Premultiply the color by the alpha. - out[0] *= out[3]; - out[1] *= out[3]; - out[2] *= out[3]; } @@ -851,14 +1178,10 @@ void inverseChromaticEvaluation(void *info, const float *in, float *out) } transformHSV_RGB(out); - - //Premultiply the color by the alpha. - out[0] *= out[3]; - out[1] *= out[3]; - out[2] *= out[3]; } + void transformRGB_HSV(float *components) //H,S,B -> R,G,B { float H, S, V; -- 2.40.0