d3 / d3-color

Color spaces! RGB, HSL, Cubehelix, CIELAB, and more.
https://d3js.org/d3-color
ISC License
398 stars 91 forks source link

Jzazbz color space #51

Open imkremen opened 5 years ago

imkremen commented 5 years ago

Some new color space: https://www.osapublishing.org/oe/fulltext.cfm?uri=oe-25-13-15131&id=368272 Here python implementation https://github.com/nschloe/colorio

Maybe d3 can support it?

mbostock commented 4 years ago

Yes, that’s a good idea. There’s a nice implementation here by Jacob Rus:

https://observablehq.com/@jrus/jzazbz

danburzo commented 3 years ago

I could make a PR to add support for Jz​az​bz.

One thing that nags me is that the color space operates CIE XYZ absolute values, and I'm not sure how to scale relative XYZ values to meet the authors' intentions and make the best use of Jzazbz (or whether the decision alters the qualities of this color space in significant ways). @jrus uses 200 cd/m2 in his notebook.

DCtheTall commented 3 years ago

@danburzo are you still working on this? If not, would you mind if I attempted a PR?

danburzo commented 3 years ago

@DCtheTall not at all! I have not had the chance to put together the PR, so I'm happy to pass the baton. I have an initial implementation here, if it helps in any way.

DCtheTall commented 3 years ago

I haven't forgotten about this, just been busy at work. I plan on getting to this still 😅

DCtheTall commented 3 years ago

Took a look at this today and I think the best approach is to start by separating the XYZ color space in src/lab.js into its own module and then use that module as a dependency to reimplement src/lab.js. It will save me having to reinvent the wheel for going to Jzazbz and use an XYZ representation that is consistent with the one already in src/lab.js.

If that sounds like the right idea, I have a draft PR up now with this issue tagged. If there's a reason not to do this (like the XYZ space in src/lab.js is not what we want to use here), then I'll defer to the owners on what a better path forward is.

danburzo commented 3 years ago

I think extracting XYZ D50 as its own color space is a useful addition to the API. However, one thing I'm not sure about, is which XYZ space should d3.xyz point to, if any. Here are the conversions needed for Lab and Jzazbz:

In the current implementation of d3.lab, sRGB <-> XYZ (D65) <-> XYZ (D50) is performed in a single step (using a combined matrix).

While XYZ D50 is useful for Lab/LCh and the ProPhoto RGB color space. On the other hand, XYZ D65 is useful for Jzazbz or DIN99.

DCtheTall commented 3 years ago

@danburzo thanks for the clarification between XYZ D65 and D50.

It seems to me that since D65 is actually used by multiple color space conversion methods, it makes sense from a software design perspective to refactor it out to make it reuseable.

As for whether to make XYZ D50 its own module, I'll defer that to the others on this thread. I think it probably does make sense to have it be its own module as well.

DCtheTall commented 3 years ago

@danburzo after thinking on this some, I think it makes sense to have both XYZ spaces as their own module.

As for the name, I was thinking there should be d3.xyzd50 and d3.xyzd65, or possibly just d3.d50 and d3.d65. I think having one be called d3.xyz might be confusing to users?