Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: MichaelFenwick/Color
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: master
Choose a base ref
...
head repository: FlyerWebFramework/Color
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: master
Choose a head ref
Able to merge. These branches can be automatically merged.
  • 2 commits
  • 9 files changed
  • 1 contributor

Commits on Dec 29, 2023

  1. Updated pubspec.yaml

    mjablecnik committed Dec 29, 2023
    Copy the full SHA
    42c7074 View commit details
  2. Add rgba color model

    mjablecnik committed Dec 29, 2023
    Copy the full SHA
    7e1329e View commit details
Showing with 154 additions and 7 deletions.
  1. +2 −0 lib/cielab_color.dart
  2. +30 −2 lib/color.dart
  3. +2 −0 lib/hsl_color.dart
  4. +2 −0 lib/hsv_color.dart
  5. +2 −0 lib/rgb_color.dart
  6. +36 −0 lib/rgba_color.dart
  7. +2 −0 lib/xyz_color.dart
  8. +5 −5 pubspec.yaml
  9. +73 −0 test/color_test.dart
2 changes: 2 additions & 0 deletions lib/cielab_color.dart
Original file line number Diff line number Diff line change
@@ -36,6 +36,8 @@ class CielabColor extends Color {
return XyzColor(xyz['x']!, xyz['y']!, xyz['z']!);
}

RgbaColor toRgbaColor() => this.toRgbColor().toRgbaColor();

@override
CielabColor toCielabColor() => this;

32 changes: 30 additions & 2 deletions lib/color.dart
Original file line number Diff line number Diff line change
@@ -7,13 +7,23 @@ library color;
import 'dart:math';

part 'cielab_color.dart';

part 'color_filter.dart';

part 'color_parser.dart';

part 'css_color_space.dart';

part 'hex_color.dart';

part 'hsl_color.dart';

part 'hsv_color.dart';

part 'rgb_color.dart';

part 'rgba_color.dart';

part 'xyz_color.dart';

/// An object representing a color.
@@ -23,28 +33,44 @@ part 'xyz_color.dart';
/// [Color]s can be directly compared using the `==` operator, which will return true if the two [Color] objects represent the same RGB color.
abstract class Color {
const Color();

const factory Color.rgb(num r, num g, num b) = RgbColor;

const factory Color.rgba(num r, num g, num b, num a) = RgbaColor;

factory Color.hex(String hexCode) = HexColor;

const factory Color.hsl(num h, num s, num l) = HslColor;

const factory Color.hsv(num h, num s, num v) = HsvColor;

const factory Color.xyz(num x, num y, num z) = XyzColor;

const factory Color.cielab(num l, num a, num b) = CielabColor;

RgbColor toRgbColor();

RgbaColor toRgbaColor();

HexColor toHexColor() => toRgbColor().toHexColor();

HslColor toHslColor();

HsvColor toHsvColor();

XyzColor toXyzColor();

CielabColor toCielabColor();

@override
String toString();

Map<String, num> toMap();

@override
int get hashCode {
var rgb = toRgbColor();
return 256 * 256 * rgb.r.toInt() + 256 * rgb.g.toInt() + rgb.b.toInt();
RgbaColor rgba = this.toRgbaColor();
return (pow(2, 30) * rgba.a).round() + 256 * 256 * rgba.r.toInt() + 256 * rgba.g.toInt() + rgba.b.toInt();
}

@override
@@ -71,6 +97,8 @@ abstract class Color {
return toXyzColor();
} else if (colorType is CielabColor) {
return toCielabColor();
} else if (colorType is RgbaColor) {
return toRgbaColor();
} else {
return this;
}
2 changes: 2 additions & 0 deletions lib/hsl_color.dart
Original file line number Diff line number Diff line change
@@ -64,6 +64,8 @@ class HslColor extends Color implements CssColorSpace {
return RgbColor(rgb[0], rgb[1], rgb[2]);
}

RgbaColor toRgbaColor() => this.toRgbColor().toRgbaColor();

@override
HslColor toHslColor() => this;

2 changes: 2 additions & 0 deletions lib/hsv_color.dart
Original file line number Diff line number Diff line change
@@ -28,6 +28,8 @@ class HsvColor extends Color {
@override
RgbColor toRgbColor() => toHslColor().toRgbColor();

RgbaColor toRgbaColor() => this.toRgbColor().toRgbaColor();

@override
HslColor toHslColor() {
num hsvSaturation = s / 100;
2 changes: 2 additions & 0 deletions lib/rgb_color.dart
Original file line number Diff line number Diff line change
@@ -30,6 +30,8 @@ class RgbColor extends Color implements CssColorSpace {
@override
RgbColor toRgbColor() => this;

RgbaColor toRgbaColor() => RgbaColor(r, g, b, 1);

@override
HslColor toHslColor() {
var rf = r / 255;
36 changes: 36 additions & 0 deletions lib/rgba_color.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
part of color;

class RgbaColor extends RgbColor {
static const int aMin = 0;
static const int aMax = 1;

final num a;

/**
* Creates a [Color] using a vector describing its red, green, blue and alpha
* values.
*
* The value for [r], [g], and [b] should be in the range between 0 and
* 255 (inclusive). Values above this range will be assumed to be a value
* of 255, and values below this range will be assumed to be a value of 0.
* The value for [a] should be between 0 and 1 (1 means
* opaque).
*
* Note that when converting an [RgbaColor] to a different color model that
* doesn't provide alpha information, the alpha data [a] will be dropped.
*/
const RgbaColor(num r, num g, num b, this.a) : super(r, g, b);


RgbaColor toRgbaColor() => this;

String toString() => "r: $r, g: $g, b: $b, a: $a";

String toCssString() => 'rgba($r, $g, $b, $a)';

Map<String, int> toMap() {
return {'r': r.toInt(), 'g': g.toInt(), 'b': b.toInt(), 'a': a.toInt()};
}

RgbaColor clone() => RgbaColor(this.r, this.g, this.b, this.a);
}
2 changes: 2 additions & 0 deletions lib/xyz_color.dart
Original file line number Diff line number Diff line change
@@ -33,6 +33,8 @@ class XyzColor extends Color {
return RgbColor(rgb['r']!, rgb['g']!, rgb['b']!);
}

RgbaColor toRgbaColor() => this.toRgbColor().toRgbaColor();

@override
HslColor toHslColor() => toRgbColor().toHslColor();

10 changes: 5 additions & 5 deletions pubspec.yaml
Original file line number Diff line number Diff line change
@@ -8,9 +8,9 @@ authors:
homepage: https://github.com/MichaelFenwick/Color

environment:
sdk: '>=2.12.0 <3.0.0'
sdk: '>=2.12.0 <4.0.0'
dev_dependencies:
build_runner: ^1.6.2
build_web_compilers: ^2.12.0
pedantic: ^1.11.0
test: ^1.16.5
build_runner:
build_web_compilers:
lints: ^2.0.0
test: ^1.21.0
73 changes: 73 additions & 0 deletions test/color_test.dart
Original file line number Diff line number Diff line change
@@ -10,6 +10,14 @@ void main() {
expect(color.g, equals(255));
expect(color.b, equals(238));
});
test("through the Color.rgba constructor", () {
var color = Color.rgba(192, 255, 238, 0.5) as RgbaColor;
expect(color is Color, isTrue);
expect(color.r, equals(192));
expect(color.g, equals(255));
expect(color.b, equals(238));
expect(color.a, equals(0.5));
});
test('through the Color.hex constructor', () {
var color = Color.hex('c0ffee') as HexColor;
expect(color is Color, isTrue);
@@ -52,6 +60,14 @@ void main() {
expect(color.g, equals(255));
expect(color.b, equals(238));
});
test("as an RgbaColor", () {
var color = RgbaColor(192, 255, 238, 0.5);
expect(color is Color, isTrue);
expect(color.r, equals(192));
expect(color.g, equals(255));
expect(color.b, equals(238));
expect(color.a, equals(0.5));
});
test('as a HexColor', () {
var color = HexColor('c0ffee');
expect(color is Color, isTrue);
@@ -101,6 +117,11 @@ void main() {
var string = color.toString();
expect(string, equals('r: 192, g: 255, b: 238'));
});
test("from an RgbaColor", () {
var color = const Color.rgba(192, 255, 238, 0.5);
String string = color.toString();
expect(string, equals('r: 192, g: 255, b: 238, a: 0.5'));
});
test('from a HexColor', () {
var color = Color.hex('c0ffee');
var string = color.toString();
@@ -139,6 +160,11 @@ void main() {
var string = color.toCssString();
expect(string, equals('rgb(192, 255, 238)'));
});
test("from an RgbaColor", () {
var color = const Color.rgba(192, 255, 238, 0.5) as RgbColor;
String string = color.toCssString();
expect(string, equals('rgba(192, 255, 238, 0.5)'));
});
test('from a HexColor', () {
var color = Color.hex('c0ffee') as HexColor;
var string = color.toCssString();
@@ -176,13 +202,15 @@ void main() {
});
group('Colors can be converted', () {
late RgbColor rgb;
late RgbaColor rgba;
late HexColor hex;
late HslColor hsl;
late HsvColor hsv;
late XyzColor xyz;
late CielabColor cielab;
setUp(() {
rgb = const RgbColor(192, 255, 238);
rgba = const RgbaColor(192, 255, 238, 1);
hex = HexColor('c0ffee');
hsl = const HslColor(163.8, 100, 87.6);
hsv = const HsvColor(163.8, 24.7, 100);
@@ -194,6 +222,10 @@ void main() {
var conversion = rgb.toHexColor();
expect(conversion, equals(hex));
});
test('from rgb to rgba', () {
var conversion = rgb.toRgbaColor();
expect(conversion, equals(rgba));
});
test('from rgb to hsl', () {
var conversion = rgb.toHslColor();
expect(conversion, equals(hsl));
@@ -211,10 +243,35 @@ void main() {
expect(conversion, equals(cielab));
});

test("from rgba to rgb", () {
RgbColor conversion = rgba.toRgbColor();
expect(conversion, equals(rgb));
});
test("from rgba to hex", () {
HexColor conversion = rgba.toHexColor();
expect(conversion, equals(hex));
});
test("from rgba to hsl", () {
HslColor conversion = rgba.toHslColor();
expect(conversion, equals(hsl));
});
test("from rgba to xyz", () {
XyzColor conversion = rgba.toXyzColor();
expect(conversion, equals(xyz));
});
test("from rgba to cielab", () {
CielabColor conversion = rgba.toCielabColor();
expect(conversion, equals(cielab));
});

test('from hex to rgb', () {
var conversion = hex.toRgbColor();
expect(conversion, equals(rgb));
});
test('from hex to rgba', () {
var conversion = hex.toRgbaColor();
expect(conversion, equals(rgba));
});
test('from hex to hsl', () {
var conversion = hex.toHslColor();
expect(conversion, equals(hsl));
@@ -236,6 +293,10 @@ void main() {
var conversion = hsl.toRgbColor();
expect(conversion, equals(rgb));
});
test('from hsl to rgba', () {
var conversion = hsl.toRgbaColor();
expect(conversion, equals(rgba));
});
test('from hsl to hsv', () {
var conversion = hsl.toHsvColor();
expect(conversion, equals(hsv));
@@ -253,6 +314,10 @@ void main() {
var conversion = hsv.toRgbColor();
expect(conversion, equals(rgb));
});
test('from hsv to rgba', () {
var conversion = hsv.toRgbaColor();
expect(conversion, equals(rgba));
});
test('from hsv to hsl', () {
var conversion = hsv.toHslColor();
expect(conversion, equals(hsl));
@@ -270,6 +335,10 @@ void main() {
var conversion = xyz.toRgbColor();
expect(conversion, equals(rgb));
});
test('from xyz to rgba', () {
var conversion = xyz.toRgbaColor();
expect(conversion, equals(rgba));
});
test('from xyz to hsl', () {
var conversion = xyz.toHslColor();
expect(conversion, equals(hsl));
@@ -287,6 +356,10 @@ void main() {
var conversion = cielab.toRgbColor();
expect(conversion, equals(rgb));
});
test('from cielab to rgba', () {
var conversion = cielab.toRgbaColor();
expect(conversion, equals(rgba));
});
test('from cielab to hsl', () {
var conversion = cielab.toHslColor();
expect(conversion, equals(hsl));