Skip to content

Commit 3141502

Browse files
committed
fix: lerp colors in current color mode
1 parent ea185ca commit 3141502

2 files changed

Lines changed: 30 additions & 29 deletions

File tree

src/color/p5.Color.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -302,15 +302,18 @@ class Color {
302302
}
303303

304304
lerp(color, amt, mode){
305+
const source = mode ? this.#toColorMode(mode)._color : this._color;
306+
const target = mode ? color.#toColorMode(mode)._color : color._color;
307+
305308
// Find the closest common ancestor color space
306309
let spaceIndex = -1;
307310
while(
308311
(
309-
spaceIndex+1 < this._color.space.path.length ||
310-
spaceIndex+1 < color._color.space.path.length
312+
spaceIndex+1 < source.space.path.length ||
313+
spaceIndex+1 < target.space.path.length
311314
) &&
312-
this._color.space.path[spaceIndex+1] ===
313-
color._color.space.path[spaceIndex+1]
315+
source.space.path[spaceIndex+1] ===
316+
target.space.path[spaceIndex+1]
314317
){
315318
spaceIndex += 1;
316319
}
@@ -320,8 +323,8 @@ class Color {
320323
throw new Error('Cannot lerp colors. No common color space found');
321324
}
322325

323-
const obj = range(this._color, color._color, {
324-
space: this._color.space.path[spaceIndex].id
326+
const obj = range(source, target, {
327+
space: source.space.path[spaceIndex].id
325328
})(amt);
326329

327330
return new Color(obj, mode || this.mode);

test/unit/color/creating_reading.js

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -71,33 +71,31 @@ suite('color/CreatingReading', function() {
7171
});
7272

7373
test('should correctly get lerp colors in HSL', function() {
74-
// NOTE: This is equivalent to RGB case so is testing nothing new
7574
mockP5Prototype.colorMode(mockP5Prototype.HSL);
7675
var interA = mockP5Prototype.lerpColor(fromColor, toColor, 0.33);
7776
var interB = mockP5Prototype.lerpColor(fromColor, toColor, 0.66);
7877

79-
assert.closeTo(interA._color.coords[0], 37, 1);
80-
assert.closeTo(interA._color.coords[1], 43, 1);
78+
assert.closeTo(interA._color.coords[0], 352, 1);
79+
assert.closeTo(interA._color.coords[1], 63, 1);
8180
assert.closeTo(interA._color.coords[2], 46, 1);
8281

83-
assert.closeTo(interB._color.coords[0], 345, 1);
84-
assert.closeTo(interB._color.coords[1], 12, 1);
82+
assert.closeTo(interB._color.coords[0], 301, 1);
83+
assert.closeTo(interB._color.coords[1], 51, 1);
8584
assert.closeTo(interB._color.coords[2], 43, 1);
8685
});
8786

8887
test('should correctly get lerp colors in HSB', function() {
89-
// NOTE: This is equivalent to RGB case so is testing nothing new
9088
mockP5Prototype.colorMode(mockP5Prototype.HSB);
9189
var interA = mockP5Prototype.lerpColor(fromColor, toColor, 0.33);
9290
var interB = mockP5Prototype.lerpColor(fromColor, toColor, 0.66);
9391

94-
assert.closeTo(interA._color.coords[0], 37, 1);
95-
assert.closeTo(interA._color.coords[1], 60, 1);
96-
assert.closeTo(interA._color.coords[2], 66, 1);
92+
assert.closeTo(interA._color.coords[0], 352, 1);
93+
assert.closeTo(interA._color.coords[1], 76, 1);
94+
assert.closeTo(interA._color.coords[2], 75, 1);
9795

98-
assert.closeTo(interB._color.coords[0], 345, 1);
99-
assert.closeTo(interB._color.coords[1], 20, 1);
100-
assert.closeTo(interB._color.coords[2], 47, 1);
96+
assert.closeTo(interB._color.coords[0], 301, 1);
97+
assert.closeTo(interB._color.coords[1], 66, 1);
98+
assert.closeTo(interB._color.coords[2], 65, 1);
10199
});
102100

103101
test.todo('should not extrapolate', function() {
@@ -136,14 +134,14 @@ suite('color/CreatingReading', function() {
136134
var interA = mockP5Prototype.lerpColor(fromColor, toColor, 0.33);
137135
var interB = mockP5Prototype.lerpColor(fromColor, toColor, 0.66);
138136

139-
assert.closeTo(interA._color.coords[0], 37, 1);
140-
assert.closeTo(interA._color.coords[1], 43, 1);
137+
assert.closeTo(interA._color.coords[0], 352, 1);
138+
assert.closeTo(interA._color.coords[1], 63, 1);
141139
assert.closeTo(interA._color.coords[2], 46, 1);
142140
assert.closeTo(interA._color.alpha, 0.38, 0.01);
143141

144-
assert.closeTo(interB._color.coords[0], 345, 1);
145-
assert.closeTo(interB._color.coords[1], 11, 1);
146-
assert.closeTo(interB._color.coords[2], 42, 1);
142+
assert.closeTo(interB._color.coords[0], 301, 1);
143+
assert.closeTo(interB._color.coords[1], 51, 1);
144+
assert.closeTo(interB._color.coords[2], 43, 1);
147145
assert.closeTo(interB._color.alpha, 0.58, 0.01);
148146
});
149147

@@ -152,14 +150,14 @@ suite('color/CreatingReading', function() {
152150
var interA = mockP5Prototype.lerpColor(fromColor, toColor, 0.33);
153151
var interB = mockP5Prototype.lerpColor(fromColor, toColor, 0.66);
154152

155-
assert.closeTo(interA._color.coords[0], 37, 1);
156-
assert.closeTo(interA._color.coords[1], 60, 1);
157-
assert.closeTo(interA._color.coords[2], 66, 1);
153+
assert.closeTo(interA._color.coords[0], 352, 1);
154+
assert.closeTo(interA._color.coords[1], 76, 1);
155+
assert.closeTo(interA._color.coords[2], 75, 1);
158156
assert.closeTo(interA._color.alpha, 0.38, 0.01);
159157

160-
assert.closeTo(interB._color.coords[0], 345, 1);
161-
assert.closeTo(interB._color.coords[1], 20, 1);
162-
assert.closeTo(interB._color.coords[2], 47, 1);
158+
assert.closeTo(interB._color.coords[0], 301, 1);
159+
assert.closeTo(interB._color.coords[1], 66, 1);
160+
assert.closeTo(interB._color.coords[2], 65, 1);
163161
assert.closeTo(interB._color.alpha, 0.58, 0.01);
164162
});
165163

0 commit comments

Comments
 (0)