react-native-navigation的迁移库

UIColor+RNNUtils.m 2.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #import "UIColor+RNNUtils.h"
  2. // Observer 2°, D65 Illuminant
  3. #define REFX_O2_D65 95.047
  4. #define REFY_O2_D65 100.0
  5. #define REFZ_O2_D65 108.883
  6. @implementation UIColor (RNNUtils)
  7. #pragma mark Public
  8. - (BOOL)isTransparent {
  9. return (CGColorGetAlpha(self.CGColor) == 0.0);
  10. }
  11. - (NSString *)toHex {
  12. const CGFloat *components = CGColorGetComponents([self CGColor]);
  13. CGFloat r = components[0];
  14. CGFloat g = components[1];
  15. CGFloat b = components[2];
  16. return [NSString stringWithFormat:@"#%02lX%02lX%02lX",
  17. lroundf((float) (r * 255)),
  18. lroundf((float) (g * 255)),
  19. lroundf((float) (b * 255))];
  20. }
  21. + (void)rgbToLabx:(CGFloat)r g:(CGFloat)g b:(CGFloat)b l:(CGFloat *)outL a:(CGFloat *)outA b:(CGFloat *)outB {
  22. CGFloat x,y,z;
  23. [UIColor rgbToXYZr:r g:g b:b x:&x y:&y z:&z];
  24. [UIColor xyzToLabx:x y:y z:z l:outL a:outA b:outB];
  25. }
  26. #pragma mark Private
  27. + (void)rgbToXYZr:(CGFloat)r g:(CGFloat)g b:(CGFloat)b x:(CGFloat *)outX y:(CGFloat *)outY z:(CGFloat *)outZ {
  28. if(r > 0.04045) { r = pow(((r + 0.055) / 1.055),2.4); }
  29. else { r = r / 12.92; }
  30. if(g > 0.04045) { g = pow(((g + 0.055) / 1.055),2.4); }
  31. else { g = g / 12.92; }
  32. if(b > 0.04045) { b = pow(((b + 0.055) / 1.055),2.4); }
  33. else { b = b / 12.92; }
  34. r *= 100.0;
  35. g *= 100.0;
  36. b *= 100.0;
  37. *outX = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
  38. *outY = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
  39. *outZ = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);
  40. }
  41. + (void)xyzToLabx:(CGFloat)x y:(CGFloat)y z:(CGFloat)z l:(CGFloat *)outL a:(CGFloat *)outA b:(CGFloat *)outB {
  42. x /= REFX_O2_D65;
  43. y /= REFY_O2_D65;
  44. z /= REFZ_O2_D65;
  45. if(x > 0.008856) { x = pow(x, 1.0/3.0);} else {x = (7.787 * x) +(16.0/116.0);}
  46. if(y > 0.008856) { y = pow(y, 1.0/3.0);} else {y = (7.787 * y) +(16.0/116.0);}
  47. if(z > 0.008856) { z = pow(z, 1.0/3.0);} else {z = (7.787 * z) +(16.0/116.0);}
  48. *outL = (116.0 * y) - 16.0;
  49. *outA = 500.0 * (x - y);
  50. *outB = 200.0 * (y - z);
  51. }
  52. @end