Index: src/OFColor.m ================================================================== --- src/OFColor.m +++ src/OFColor.m @@ -12,10 +12,12 @@ * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" + +#include #import "OFColor.h" #import "OFOnce.h" #import "OFString.h" @@ -32,10 +34,12 @@ @end #ifdef OF_OBJFW_RUNTIME @interface OFTaggedPointerColor: OFColorSingleton @end + +static const float allowedImprecision = 0.0000001; #endif static struct { Class isa; } placeholder; @@ -70,16 +74,17 @@ green: (float)green blue: (float)blue alpha: (float)alpha { #ifdef OF_OBJFW_RUNTIME - uint8_t redInt = red * 255; - uint8_t greenInt = green * 255; - uint8_t blueInt = blue * 255; + uint8_t redInt = nearbyintf(red * 255); + uint8_t greenInt = nearbyintf(green * 255); + uint8_t blueInt = nearbyintf(blue * 255); - if (red * 255 == redInt && green * 255 == greenInt && - blue * 255 == blueInt && alpha == 1) { + if (fabsf(red * 255 - redInt) < allowedImprecision && + fabsf(green * 255 - greenInt) < allowedImprecision && + fabsf(blue * 255 - blueInt) < allowedImprecision && alpha == 1) { id ret = objc_createTaggedPointer(colorTag, (uintptr_t)redInt << 16 | (uintptr_t)greenInt << 8 | (uintptr_t)blueInt); if (ret != nil) @@ -284,9 +289,9 @@ float red, green, blue, alpha; [self getRed: &red green: &green blue: &blue alpha: &alpha]; return [OFString stringWithFormat: - @"", - red, green, blue, alpha]; + @"<%@ red=%f green=%f blue=%f alpha=%f>", + self.class, red, green, blue, alpha]; } @end