mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Merge pull request #518 from abarth/hsv_color
Elaborate HSVColor interface
This commit is contained in:
commit
5722c96b78
@ -2,45 +2,45 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'dart:ui' show Color;
|
||||
import 'dart:ui' show Color, lerpDouble;
|
||||
|
||||
class HSVColor {
|
||||
const HSVColor.fromAHSV(this.a, this.h, this.s, this.v);
|
||||
const HSVColor.fromAHSV(this.alpha, this.hue, this.saturation, this.value);
|
||||
|
||||
/// Alpha, from 0.0 to 1.0.
|
||||
final double a;
|
||||
final double alpha;
|
||||
|
||||
/// Hue, from 0.0 to 360.0.
|
||||
final double h;
|
||||
final double hue;
|
||||
|
||||
/// Saturation, from 0.0 to 1.0.
|
||||
final double s;
|
||||
final double saturation;
|
||||
|
||||
/// Value, from 0.0 to 1.0.
|
||||
final double v;
|
||||
final double value;
|
||||
|
||||
HSVColor withAlpha(double a) {
|
||||
return new HSVColor.fromAHSV(a, h, s, v);
|
||||
HSVColor withAlpha(double alpha) {
|
||||
return new HSVColor.fromAHSV(alpha, hue, saturation, value);
|
||||
}
|
||||
|
||||
HSVColor withHue(double h) {
|
||||
return new HSVColor.fromAHSV(a, h, s, v);
|
||||
HSVColor withHue(double hue) {
|
||||
return new HSVColor.fromAHSV(alpha, hue, saturation, value);
|
||||
}
|
||||
|
||||
HSVColor withSaturation(double s) {
|
||||
return new HSVColor.fromAHSV(a, h, s, v);
|
||||
HSVColor withSaturation(double saturation) {
|
||||
return new HSVColor.fromAHSV(alpha, hue, saturation, value);
|
||||
}
|
||||
|
||||
HSVColor withValue(double v) {
|
||||
return new HSVColor.fromAHSV(a, h, s, v);
|
||||
HSVColor withValue(double value) {
|
||||
return new HSVColor.fromAHSV(alpha, hue, saturation, value);
|
||||
}
|
||||
|
||||
/// Returns this color in RGB.
|
||||
Color toColor() {
|
||||
final double h = this.h % 360;
|
||||
final double c = s * v;
|
||||
final double h = hue % 360;
|
||||
final double c = saturation * value;
|
||||
final double x = c * (1 - (((h / 60.0) % 2) - 1).abs());
|
||||
final double m = v - c;
|
||||
final double m = value - c;
|
||||
|
||||
double r;
|
||||
double g;
|
||||
@ -71,10 +71,56 @@ class HSVColor {
|
||||
b = x;
|
||||
}
|
||||
return new Color.fromARGB(
|
||||
( a * 0xFF).round(),
|
||||
(alpha * 0xFF).round(),
|
||||
((r + m) * 0xFF).round(),
|
||||
((g + m) * 0xFF).round(),
|
||||
((b + m) * 0xFF).round()
|
||||
);
|
||||
}
|
||||
|
||||
HSVColor _scaleAlpha(double factor) {
|
||||
return withAlpha(alpha * factor);
|
||||
}
|
||||
|
||||
/// Linearly interpolate between two HSVColors.
|
||||
///
|
||||
/// If either color is null, this function linearly interpolates from a
|
||||
/// transparent instance of the other color.
|
||||
static HSVColor lerp(HSVColor a, HSVColor b, double t) {
|
||||
if (a == null && b == null)
|
||||
return null;
|
||||
if (a == null)
|
||||
return b._scaleAlpha(t);
|
||||
if (b == null)
|
||||
return a._scaleAlpha(1.0 - t);
|
||||
return new HSVColor.fromAHSV(
|
||||
lerpDouble(a.alpha, b.alpha, t),
|
||||
lerpDouble(a.hue, b.hue, t),
|
||||
lerpDouble(a.saturation, b.saturation, t),
|
||||
lerpDouble(a.value, b.value, t)
|
||||
);
|
||||
}
|
||||
|
||||
bool operator ==(dynamic other) {
|
||||
if (identical(this, other))
|
||||
return true;
|
||||
if (other is! HSVColor)
|
||||
return false;
|
||||
final HSVColor typedOther = other;
|
||||
return typedOther.alpha == alpha
|
||||
&& typedOther.hue == hue
|
||||
&& typedOther.saturation == saturation
|
||||
&& typedOther.value == value;
|
||||
}
|
||||
|
||||
int get hashCode {
|
||||
int value = 373;
|
||||
value = 37 * value + alpha.hashCode;
|
||||
value = 37 * value + hue.hashCode;
|
||||
value = 37 * value + saturation.hashCode;
|
||||
value = 37 * value + value.hashCode;
|
||||
return value;
|
||||
}
|
||||
|
||||
String toString() => "HSVColor($alpha, $hue, $saturation, $value)";
|
||||
}
|
||||
|
||||
@ -130,7 +130,7 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox>
|
||||
scene.dispose();
|
||||
assert(() {
|
||||
if (debugEnableRepaintRainbox)
|
||||
debugCurrentRepaintColor = debugCurrentRepaintColor.withHue(debugCurrentRepaintColor.h + debugRepaintRainboxHueIncrement);
|
||||
debugCurrentRepaintColor = debugCurrentRepaintColor.withHue(debugCurrentRepaintColor.hue + debugRepaintRainboxHueIncrement);
|
||||
return true;
|
||||
});
|
||||
} finally {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user