Skip to content

Commit

Permalink
Added TyphoonNSColorTypeConverter
Browse files Browse the repository at this point in the history
  • Loading branch information
Egor Tolstoy committed Nov 4, 2015
1 parent 16e13dc commit 8fd803a
Show file tree
Hide file tree
Showing 9 changed files with 305 additions and 55 deletions.
27 changes: 27 additions & 0 deletions Source/TypeConversion/Helpers/TyphoonColorConversionUtils.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
////////////////////////////////////////////////////////////////////////////////
//
// TYPHOON FRAMEWORK
// Copyright 2015, Typhoon Framework Contributors
// All Rights Reserved.
//
// NOTICE: The authors permit you to use, modify, and distribute this file
// in accordance with the terms of the license agreement accompanying it.
//
////////////////////////////////////////////////////////////////////////////////

#import <Foundation/Foundation.h>

struct RGBA
{
CGFloat red;
CGFloat green;
CGFloat blue;
CGFloat alpha;
} rgba;

@interface TyphoonColorConversionUtils : NSObject

+ (struct RGBA)colorFromHexString:(NSString *)hexString;
+ (struct RGBA)colorFromCssStyleString:(NSString *)cssString;

@end
64 changes: 64 additions & 0 deletions Source/TypeConversion/Helpers/TyphoonColorConversionUtils.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
////////////////////////////////////////////////////////////////////////////////
//
// TYPHOON FRAMEWORK
// Copyright 2015, Typhoon Framework Contributors
// All Rights Reserved.
//
// NOTICE: The authors permit you to use, modify, and distribute this file
// in accordance with the terms of the license agreement accompanying it.
//
////////////////////////////////////////////////////////////////////////////////

#import "TyphoonColorConversionUtils.h"

@implementation TyphoonColorConversionUtils

+ (struct RGBA)colorFromHexString:(NSString *)hexString {
hexString =
[[hexString stringByReplacingOccurrencesOfString:@"#" withString:@""] stringByReplacingOccurrencesOfString:@"0x" withString:@""];

unsigned int red, green, blue, alpha;
if ([hexString length] == 6) {
sscanf([hexString UTF8String], "%02X%02X%02X", &red, &green, &blue);
alpha = 255;
}
else if ([hexString length] == 8) {
sscanf([hexString UTF8String], "%02X%02X%02X%02X", &alpha, &red, &green, &blue);
}
else {
[NSException raise:NSInvalidArgumentException format:@"%@ requires a six or eight digit hex string.",
NSStringFromClass([self class])];
}
return [self colorFromRed:red green:green blue:blue alpha:(CGFloat)(alpha / 255.0)];
}

+ (struct RGBA)colorFromCssStyleString:(NSString *)cssString {
NSArray *colorComponents = [cssString componentsSeparatedByString:@","];

unsigned int red, green, blue;
float alpha;
if ([colorComponents count] == 3) {
sscanf([cssString UTF8String], "%d,%d,%d", &red, &green, &blue);
alpha = 1.0;
}
else if ([colorComponents count] == 4) {
sscanf([cssString UTF8String], "%d,%d,%d,%f", &red, &green, &blue, &alpha);
}
else {
[NSException raise:NSInvalidArgumentException format:@"%@ requires css style format UIColor(r,g,b) or UIColor(r,g,b,a).",
NSStringFromClass([self class])];
}
return [self colorFromRed:red green:green blue:blue alpha:alpha];
}

+ (struct RGBA)colorFromRed:(NSUInteger)red green:(NSUInteger)green blue:(NSUInteger)blue alpha:(CGFloat)alpha
{
struct RGBA color;
color.red = (CGFloat)red / 255.0;
color.green = (CGFloat)green / 255.0;
color.blue = (CGFloat)blue / 255.0;
color.alpha = (CGFloat)alpha;
return color;
}

@end
3 changes: 2 additions & 1 deletion Source/TypeConversion/TyphoonTypeConverterRegistry.m
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#import "TyphoonNSURLTypeConverter.h"
#import "TyphoonIntrospectionUtils.h"
#import "TyphoonNSNumberTypeConverter.h"
#import "TyphoonNSColorTypeConverter.h"

@interface TyphoonTypeConverterRegistry ()

Expand Down Expand Up @@ -96,7 +97,7 @@ - (void)registerPlatformConverters
}
#else
{

[self registerTypeConverter:[[TyphoonClassFromString(@"TyphoonNSColorTypeConverter") alloc] init]];
}
#endif
}
Expand Down
65 changes: 13 additions & 52 deletions Source/ios/TypeConversion/Converters/TyphoonUIColorTypeConverter.m
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

#import "TyphoonUIColorTypeConverter.h"

#import "TyphoonColorConversionUtils.h"

#import <UIKit/UIKit.h>


Expand All @@ -22,66 +24,25 @@ - (id)supportedType
return @"UIColor";
}

- (UIColor *)colorFromRed:(NSUInteger)red green:(NSUInteger)green blue:(NSUInteger)blue alpha:(CGFloat)alpha
{
return [UIColor colorWithRed:(CGFloat)(red / 255.0) green:(CGFloat)(green / 255.0) blue:(CGFloat)(blue / 255.0)
alpha:alpha];
}

- (UIColor *)colorFromHexString:(NSString *)hexString
{
hexString =
[[hexString stringByReplacingOccurrencesOfString:@"#" withString:@""] stringByReplacingOccurrencesOfString:@"0x" withString:@""];

unsigned int red, green, blue, alpha;
if ([hexString length] == 6) {
sscanf([hexString UTF8String], "%02X%02X%02X", &red, &green, &blue);
alpha = 255;
}
else if ([hexString length] == 8) {
sscanf([hexString UTF8String], "%02X%02X%02X%02X", &alpha, &red, &green, &blue);
}
else {
[NSException raise:NSInvalidArgumentException format:@"%@ requires a six or eight digit hex string.",
NSStringFromClass([self class])];
}
return [self colorFromRed:red green:green blue:blue alpha:(CGFloat)(alpha / 255.0)];
}

- (UIColor *)colorFromCssStyleString:(NSString *)cssString
{
NSArray *colorComponents = [cssString componentsSeparatedByString:@","];

unsigned int red, green, blue;
float alpha;
if ([colorComponents count] == 3) {
sscanf([cssString UTF8String], "%d,%d,%d", &red, &green, &blue);
alpha = 1.0;
}
else if ([colorComponents count] == 4) {
sscanf([cssString UTF8String], "%d,%d,%d,%f", &red, &green, &blue, &alpha);
}
else {
[NSException raise:NSInvalidArgumentException format:@"%@ requires css style format UIColor(r,g,b) or UIColor(r,g,b,a).",
NSStringFromClass([self class])];
}
return [self colorFromRed:red green:green blue:blue alpha:alpha];
}

- (id)convert:(NSString *)stringValue
{
stringValue = [TyphoonTypeConversionUtils textWithoutTypeFromTextValue:stringValue];

UIColor *color = nil;

struct RGBA color;
if ([stringValue hasPrefix:@"#"] || [stringValue hasPrefix:@"0x"]) {
color = [self colorFromHexString:stringValue];
color = [TyphoonColorConversionUtils colorFromHexString:stringValue];
}
else {
color = [self colorFromCssStyleString:stringValue];
color = [TyphoonColorConversionUtils colorFromCssStyleString:stringValue];
}

return color;
return [self colorFromRGBA:color];
}

- (UIColor *)colorFromRGBA:(struct RGBA)rgba
{
return [UIColor colorWithRed:rgba.red green:rgba.green blue:rgba.blue alpha:rgba.alpha];
}

@end
24 changes: 24 additions & 0 deletions Source/osx/TypeConversion/Converters/TyphoonNSColorTypeConverter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
////////////////////////////////////////////////////////////////////////////////
//
// TYPHOON FRAMEWORK
// Copyright 2015, Typhoon Framework Contributors
// All Rights Reserved.
//
// NOTICE: The authors permit you to use, modify, and distribute this file
// in accordance with the terms of the license agreement accompanying it.
//
////////////////////////////////////////////////////////////////////////////////

#import "TyphoonTypeConverter.h"

/**
* A type converter for NSColor.
*
* The formats supported are:
* Hexadecimal, #RRGGBB or #AARRGGBB
* Css-style, rgb(r,g,b) or rgba(r,g,b,a)
*
*/
@interface TyphoonNSColorTypeConverter : NSObject <TyphoonTypeConverter>

@end
44 changes: 44 additions & 0 deletions Source/osx/TypeConversion/Converters/TyphoonNSColorTypeConverter.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
////////////////////////////////////////////////////////////////////////////////
//
// TYPHOON FRAMEWORK
// Copyright 2015, Typhoon Framework Contributors
// All Rights Reserved.
//
// NOTICE: The authors permit you to use, modify, and distribute this file
// in accordance with the terms of the license agreement accompanying it.
//
////////////////////////////////////////////////////////////////////////////////

#import "TyphoonNSColorTypeConverter.h"

#import "TyphoonColorConversionUtils.h"

@implementation TyphoonNSColorTypeConverter

- (id)supportedType
{
return @"NSColor";
}

- (id)convert:(NSString *)stringValue
{
stringValue = [TyphoonTypeConversionUtils textWithoutTypeFromTextValue:stringValue];

struct RGBA color;

if ([stringValue hasPrefix:@"#"] || [stringValue hasPrefix:@"0x"]) {
color = [TyphoonColorConversionUtils colorFromHexString:stringValue];
}
else {
color = [TyphoonColorConversionUtils colorFromCssStyleString:stringValue];
}

return [self colorFromRGBA:color];
}

- (NSColor *)colorFromRGBA:(struct RGBA)rgba
{
return [NSColor colorWithRed:rgba.red green:rgba.green blue:rgba.blue alpha:rgba.alpha];
}

@end
76 changes: 76 additions & 0 deletions Tests/OSX/TypeConversion/TyphoonNSColorTypeConverterTests.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
////////////////////////////////////////////////////////////////////////////////
//
// TYPHOON FRAMEWORK
// Copyright 2015, Typhoon Framework Contributors
// All Rights Reserved.
//
// NOTICE: The authors permit you to use, modify, and distribute this file
// in accordance with the terms of the license agreement accompanying it.
//
////////////////////////////////////////////////////////////////////////////////

#import <XCTest/XCTest.h>

#import "TyphoonTypeConverterRegistry.h"
#import "TyphoonTypeConverter.h"

@interface TyphoonNSColorTypeConverterTests : XCTestCase

@property(nonatomic, strong, readonly) NSColor *color;
@property(nonatomic, strong) id <TyphoonTypeConverter> converter;

@end

@implementation TyphoonNSColorTypeConverterTests

- (void)setUp {
[super setUp];

TyphoonTypeConverterRegistry *registry = [[TyphoonTypeConverterRegistry alloc] init];
self.converter = [registry converterForType:@"NSColor"];
}

- (void)tearDown {
self.converter = nil;

[super tearDown];
}

- (void)assertColor:(NSColor *)color red:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha
{
XCTAssertNotNil(color);

CGFloat redComponent, greenComponent, blueComponent, alphaComponent;
[color getRed:&redComponent green:&greenComponent blue:&blueComponent alpha:&alphaComponent];

XCTAssertEqual(redComponent, red);
XCTAssertEqual(greenComponent, green);
XCTAssertEqual(blueComponent, blue);
XCTAssertEqual(alphaComponent, alpha);
}

- (void)test_converts_hex_string
{
NSColor *color = [self.converter convert:@"NSColor(#ffffff)"];
[self assertColor:color red:1.0f green:1.0f blue:1.0f alpha:1.0f];
}

- (void)test_converts_hex_string_with_alpha
{
NSColor *color = [self.converter convert:@"NSColor(#00ffffff)"];
[self assertColor:color red:1.0f green:1.0f blue:1.0f alpha:0.0f];
}

- (void)test_converts_css_style_rgb
{
NSColor *color = [self.converter convert:@"NSColor(255,255,255)"];
[self assertColor:color red:1.0f green:1.0f blue:1.0f alpha:1.0f];
}

- (void)test_converts_css_style_rgba
{
NSColor *color = [self.converter convert:@"NSColor(255,255,255,0.5)"];
[self assertColor:color red:1.0f green:1.0f blue:1.0f alpha:0.5f];
}

@end
3 changes: 1 addition & 2 deletions Tests/iOS/TypeConversion/TyphoonUIColorConverterTests.m
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,12 @@ - (void)setUp
[super setUp];
TyphoonTypeConverterRegistry *registry = [[TyphoonTypeConverterRegistry alloc] init];
self.converter = [registry converterForType:@"UIColor"];

}

- (void)tearDown
{
[super tearDown];
self.converter = nil;
[super tearDown];
}

- (void)assertColor:(UIColor *)color red:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha
Expand Down
Loading

0 comments on commit 8fd803a

Please sign in to comment.