Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions src/color/p5.Color.js
Original file line number Diff line number Diff line change
Expand Up @@ -302,15 +302,18 @@ class Color {
}

lerp(color, amt, mode){
const source = mode ? this.#toColorMode(mode)._color : this._color;
const target = mode ? color.#toColorMode(mode)._color : color._color;

// Find the closest common ancestor color space
let spaceIndex = -1;
while(
(
spaceIndex+1 < this._color.space.path.length ||
spaceIndex+1 < color._color.space.path.length
spaceIndex+1 < source.space.path.length ||
spaceIndex+1 < target.space.path.length
) &&
this._color.space.path[spaceIndex+1] ===
color._color.space.path[spaceIndex+1]
source.space.path[spaceIndex+1] ===
target.space.path[spaceIndex+1]
){
spaceIndex += 1;
}
Expand All @@ -320,8 +323,8 @@ class Color {
throw new Error('Cannot lerp colors. No common color space found');
}

const obj = range(this._color, color._color, {
space: this._color.space.path[spaceIndex].id
const obj = range(source, target, {
space: source.space.path[spaceIndex].id
})(amt);

return new Color(obj, mode || this.mode);
Expand Down
44 changes: 21 additions & 23 deletions test/unit/color/creating_reading.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,33 +71,31 @@ suite('color/CreatingReading', function() {
});

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

assert.closeTo(interA._color.coords[0], 37, 1);
assert.closeTo(interA._color.coords[1], 43, 1);
assert.closeTo(interA._color.coords[0], 352, 1);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why have the RGB test cases changed?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like it's just HSL tests that have modifications here, and the one RGB test in between these if you expand some of the code diffs is unmodified. So it might be ok!

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for checking this.

The RGB test between these cases was not changed. The changed expectations are for the HSL/HSB lerpColor() cases, because those existing assertions were encoding the old behavior where interpolation still happened through RGB space.

After the fix, those cases now interpolate in the active color mode, so the expected channel values changed. I agree the diff can look confusing because the unchanged RGB case sits between the modified cases.

assert.closeTo(interA._color.coords[1], 63, 1);
assert.closeTo(interA._color.coords[2], 46, 1);

assert.closeTo(interB._color.coords[0], 345, 1);
assert.closeTo(interB._color.coords[1], 12, 1);
assert.closeTo(interB._color.coords[0], 301, 1);
assert.closeTo(interB._color.coords[1], 51, 1);
assert.closeTo(interB._color.coords[2], 43, 1);
});

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

assert.closeTo(interA._color.coords[0], 37, 1);
assert.closeTo(interA._color.coords[1], 60, 1);
assert.closeTo(interA._color.coords[2], 66, 1);
assert.closeTo(interA._color.coords[0], 352, 1);
assert.closeTo(interA._color.coords[1], 76, 1);
assert.closeTo(interA._color.coords[2], 75, 1);

assert.closeTo(interB._color.coords[0], 345, 1);
assert.closeTo(interB._color.coords[1], 20, 1);
assert.closeTo(interB._color.coords[2], 47, 1);
assert.closeTo(interB._color.coords[0], 301, 1);
assert.closeTo(interB._color.coords[1], 66, 1);
assert.closeTo(interB._color.coords[2], 65, 1);
});

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

assert.closeTo(interA._color.coords[0], 37, 1);
assert.closeTo(interA._color.coords[1], 43, 1);
assert.closeTo(interA._color.coords[0], 352, 1);
assert.closeTo(interA._color.coords[1], 63, 1);
assert.closeTo(interA._color.coords[2], 46, 1);
assert.closeTo(interA._color.alpha, 0.38, 0.01);

assert.closeTo(interB._color.coords[0], 345, 1);
assert.closeTo(interB._color.coords[1], 11, 1);
assert.closeTo(interB._color.coords[2], 42, 1);
assert.closeTo(interB._color.coords[0], 301, 1);
assert.closeTo(interB._color.coords[1], 51, 1);
assert.closeTo(interB._color.coords[2], 43, 1);
assert.closeTo(interB._color.alpha, 0.58, 0.01);
});

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

assert.closeTo(interA._color.coords[0], 37, 1);
assert.closeTo(interA._color.coords[1], 60, 1);
assert.closeTo(interA._color.coords[2], 66, 1);
assert.closeTo(interA._color.coords[0], 352, 1);
assert.closeTo(interA._color.coords[1], 76, 1);
assert.closeTo(interA._color.coords[2], 75, 1);
assert.closeTo(interA._color.alpha, 0.38, 0.01);

assert.closeTo(interB._color.coords[0], 345, 1);
assert.closeTo(interB._color.coords[1], 20, 1);
assert.closeTo(interB._color.coords[2], 47, 1);
assert.closeTo(interB._color.coords[0], 301, 1);
assert.closeTo(interB._color.coords[1], 66, 1);
assert.closeTo(interB._color.coords[2], 65, 1);
assert.closeTo(interB._color.alpha, 0.58, 0.01);
});

Expand Down