digitalmars.D - std.experimental.color, request reviews
- Manu via Digitalmars-d (4/4) Jun 23 2015 https://github.com/D-Programming-Language/phobos/pull/2845
- Adam D. Ruppe (4/4) Jun 23 2015 Just a quick concern, I don't think a package.d should ever have
- John Colvin (3/7) Jun 23 2015 std/range/package.d and std/regex/package.d both have a bunch of
- Adam D. Ruppe (9/11) Jun 23 2015 Those are also mistakes (well, probably just semi-migrated from
- Rikki Cattermole (2/8) Jun 23 2015 I use a file called defs for this. Works brilliantly.
- "Marc =?UTF-8?B?U2Now7x0eiI=?= <schuetzm gmx.net> (5/16) Jun 23 2015 But that's more an argument against putting anything _except_ the
- Adam D. Ruppe (31/35) Jun 23 2015 What if you want the basic definitions alone to build something
- John Colvin (7/42) Jun 23 2015 Isn't this what selective imports are for? Admittedly it's not
- Meta (2/9) Jun 23 2015 Unfortunately, selective imports have been broken for 9 years.
- John Colvin (3/13) Jun 23 2015 There is hope:
- Steven Schveighoffer (7/15) Jun 23 2015 Even selective imports being fixed, the benefits in terms of separate
- Adam D. Ruppe (10/11) Jun 23 2015 Not quite the same thing: selective imports control which symbols
- Manu via Digitalmars-d (32/64) Jun 23 2015 Right, and this was what I had in mind.
- Adam D. Ruppe (22/36) Jun 24 2015 Even if it doesn't actually import everything, I'd still prefer
- Manu via Digitalmars-d (17/51) Jun 24 2015 Bugger! So an instantiation of the struct is one thing, will it also
- "Marc =?UTF-8?B?U2Now7x0eiI=?= <schuetzm gmx.net> (12/12) Jun 24 2015 I probably didn't express myself very clearly, with the double
- Dmitry Olshansky (7/14) Jun 23 2015 Speaking of regex - it's temporary situation. The idea is to both expose...
- H. S. Teoh via Digitalmars-d (8/16) Jun 23 2015 That's a temporary situation. When those packages were broken up, we
- =?UTF-8?B?U8O2bmtlIEx1ZHdpZw==?= (8/12) Jun 23 2015 From a quick glance, looks very nice! If there was channel swizzling
- Tofu Ninja (2/7) Jun 23 2015 Swizzels would be a nice addition.
- Manu via Digitalmars-d (6/15) Jun 23 2015 They work fine. Just cast between color structs with different component...
- Tofu Ninja (6/25) Jun 24 2015 Ahh, I was thinking more about swizzling the color channels
- Manu via Digitalmars-d (13/45) Jun 24 2015 Ah okay.
- Tofu Ninja (4/19) Jun 24 2015 Ahh yes, I didn't think of that. I think for the 99% of people
- Manu via Digitalmars-d (5/21) Jun 24 2015 Sadly not, windows used BGR in basically all OS api's.
- Mike (4/5) Jun 23 2015 I would like to see the packed implementatiin finished before
- Manu via Digitalmars-d (4/8) Jun 23 2015 I just don't want to write all the others which will mirror this set
- Mike (2/5) Jun 23 2015 A wise decision. I understand.
- Andrea Fontana (11/16) Jun 24 2015 Some points about blend/lerp:
- Manu via Digitalmars-d (16/33) Jun 24 2015 Cast your input to a linear type (or whatever colourspace you prefer)
- Guillaume Chatelet (43/48) Jun 24 2015 My experience (my previous job involved designing a GPU based
- Manu via Digitalmars-d (52/98) Jun 24 2015 Indeed, it's a very deep hole ;)
- Guillaume Chatelet (12/13) Jun 24 2015 Well I can tell by reading the PR already ;)
- Manu via Digitalmars-d (10/10) Jun 24 2015 On a tangent, I need a name for the struct that will represent HSL/HSV/H...
- Fool (10/24) Jun 24 2015 Since H(ue) seems to be the only shared property of all those RGB
- Guillaume Chatelet (3/17) Jun 24 2015 I don't like PolarRGB since it doesn't have a lot to do with RGB.
- Guillaume Chatelet (4/24) Jun 24 2015 OK I take that back. HSL expresses color in the RGB space you're
- Manu via Digitalmars-d (9/32) Jun 24 2015 They're not cylindrical, they each represent a different shape;
- Danni Coy via Digitalmars-d (3/37) Jun 24 2015 Wikipedia at least refer to these as cylindrical colour spaces
- Danni Coy via Digitalmars-d (2/40) Jun 24 2015
- Manu via Digitalmars-d (3/6) Jun 24 2015 That sounds like you're talking about Lab or CAM.
- Manu via Digitalmars-d (2/8) Jun 25 2015
- Kagamin (2/3) Jun 25 2015 HueBased?
- Guillaume Chatelet (7/8) Jun 25 2015 Not too bad :-)
- Guillaume Chatelet (4/12) Jun 25 2015 Or just an obscure struct and some aliases :
- Danni Coy via Digitalmars-d (4/21) Jun 29 2015 Huey (pronounced with an Australian Twang)?
- Tofu Ninja (3/8) Aug 03 2015 Whats the status on this? This really should be easy to move into
- Manu via Digitalmars-d (4/14) Aug 04 2015 I beg to differ; colour is VERY hard to mess up ;) .. I've never seen
- Suliman (2/20) Aug 04 2015 Where is this lib can be helpful?
- Manu via Digitalmars-d (4/28) Aug 04 2015 There's a mirror here: https://github.com/TurkeyMan/color
- Manu via Digitalmars-d (2/17) Aug 04 2015 *** I mean, VERY hard to _get right_!
- Guillaume Chatelet (2/21) Aug 04 2015 +1
https://github.com/D-Programming-Language/phobos/pull/2845 I'm getting quite happy with it. I think it's a good and fairly minimal but useful starting point. It'd be great to get some reviews from here.
Jun 23 2015
Just a quick concern, I don't think a package.d should ever have anything except imports in it. Put all the actual aliases and color lists in some other submodule that can be imported independently with minimal dependencies.
Jun 23 2015
On Tuesday, 23 June 2015 at 15:01:59 UTC, Adam D. Ruppe wrote:Just a quick concern, I don't think a package.d should ever have anything except imports in it. Put all the actual aliases and color lists in some other submodule that can be imported independently with minimal dependencies.std/range/package.d and std/regex/package.d both have a bunch of stuff in. Why not?
Jun 23 2015
On Tuesday, 23 June 2015 at 15:24:44 UTC, John Colvin wrote:std/range/package.d and std/regex/package.d both have a bunch of stuff in. Why not?Those are also mistakes (well, probably just semi-migrated from the old big module). Suppose you want some of that stuff without the rest of the package. How do you get to it? The biggest benefit of breaking up the big modules is so you can access some of it without requiring all of it. But when the part you want is in the package.d, you can't get it independently anymore; importing that also imports everything else, negating the reason it was split up in the first place.
Jun 23 2015
On 24/06/2015 3:29 a.m., Adam D. Ruppe wrote:On Tuesday, 23 June 2015 at 15:24:44 UTC, John Colvin wrote:I use a file called defs for this. Works brilliantly.std/range/package.d and std/regex/package.d both have a bunch of stuff in. Why not?Those are also mistakes (well, probably just semi-migrated from the old big module). Suppose you want some of that stuff without the rest of the package. How do you get to it?
Jun 23 2015
On Tuesday, 23 June 2015 at 15:29:42 UTC, Adam D. Ruppe wrote:On Tuesday, 23 June 2015 at 15:24:44 UTC, John Colvin wrote:But that's more an argument against putting anything _except_ the basic definitions into package.d, no? Then you can always exclude the more specific stuff whenever you need it, and those modules themselves can publicly import package.d.std/range/package.d and std/regex/package.d both have a bunch of stuff in. Why not?Those are also mistakes (well, probably just semi-migrated from the old big module). Suppose you want some of that stuff without the rest of the package. How do you get to it? The biggest benefit of breaking up the big modules is so you can access some of it without requiring all of it. But when the part you want is in the package.d, you can't get it independently anymore; importing that also imports everything else, negating the reason it was split up in the first place.
Jun 23 2015
On Tuesday, 23 June 2015 at 16:14:59 UTC, Marc Schütz wrote:But that's more an argument against putting anything _except_ the basic definitions into package.d, no? Then you can always exclude the more specific stuff whenever you need it, and those modules themselves can publicly import package.d.What if you want the basic definitions alone to build something off of? If I want to write an image library that can share pixels with your image library, I might import std.color just to get the pixel format. I don't need the list of colors nor any algorithms, I just want to share the basic type so our two libraries can pass data back and forth. So I write like RGBA8[] readImage() {} With the std.color functions, some other library can now take that pixel array and convert it or whatever they need to do. Great, you can use my thing pretty easily. But I don't need any conversions myself. I don't do transformations. I don't use named colors, blending functions, or anything else. (Maybe my image format is extremely simple.) So pulling the rest of the library would waste compile time and binary space. Especially if a user wanted my extremely simple image format exactly because they were short on time and space. So ideally, my module would ONLY import std.color.basic_types or something like that.... but alas, RGBA8 is defined in package.d, so if I want it, whether I like it or not, I just pulled half the std.color library.... which just pulled std.traits and std.typecons, which, thankfully, didn't import anything else, but that's not the case for so many Phobos modules. This layout isn't bad today, the std.color in the PR is pretty small and pretty lazy thanks to the templates and local imports in them, but I still want to set a precedent in Phobos of untangling the web of dependencies by moving as much independent code as reasonably possible to independent modules.
Jun 23 2015
On Tuesday, 23 June 2015 at 17:11:57 UTC, Adam D. Ruppe wrote:On Tuesday, 23 June 2015 at 16:14:59 UTC, Marc Schütz wrote:Isn't this what selective imports are for? Admittedly it's not quite as convenient, but it does let you choose exactly what you want. You can even make a module that wraps a manually selected set of imports, e.g. you do your own basic_types module. In the end, if you have specific requirements, you have to be specific.But that's more an argument against putting anything _except_ the basic definitions into package.d, no? Then you can always exclude the more specific stuff whenever you need it, and those modules themselves can publicly import package.d.What if you want the basic definitions alone to build something off of? If I want to write an image library that can share pixels with your image library, I might import std.color just to get the pixel format. I don't need the list of colors nor any algorithms, I just want to share the basic type so our two libraries can pass data back and forth. So I write like RGBA8[] readImage() {} With the std.color functions, some other library can now take that pixel array and convert it or whatever they need to do. Great, you can use my thing pretty easily. But I don't need any conversions myself. I don't do transformations. I don't use named colors, blending functions, or anything else. (Maybe my image format is extremely simple.) So pulling the rest of the library would waste compile time and binary space. Especially if a user wanted my extremely simple image format exactly because they were short on time and space. So ideally, my module would ONLY import std.color.basic_types or something like that.... but alas, RGBA8 is defined in package.d, so if I want it, whether I like it or not, I just pulled half the std.color library.... which just pulled std.traits and std.typecons, which, thankfully, didn't import anything else, but that's not the case for so many Phobos modules. This layout isn't bad today, the std.color in the PR is pretty small and pretty lazy thanks to the templates and local imports in them, but I still want to set a precedent in Phobos of untangling the web of dependencies by moving as much independent code as reasonably possible to independent modules.
Jun 23 2015
On Tuesday, 23 June 2015 at 17:53:43 UTC, John Colvin wrote:Isn't this what selective imports are for? Admittedly it's not quite as convenient, but it does let you choose exactly what you want. You can even make a module that wraps a manually selected set of imports, e.g. you do your own basic_types module. In the end, if you have specific requirements, you have to be specific.Unfortunately, selective imports have been broken for 9 years.
Jun 23 2015
On Tuesday, 23 June 2015 at 17:59:48 UTC, Meta wrote:On Tuesday, 23 June 2015 at 17:53:43 UTC, John Colvin wrote:There is hope: https://github.com/D-Programming-Language/dmd/pull/3407Isn't this what selective imports are for? Admittedly it's not quite as convenient, but it does let you choose exactly what you want. You can even make a module that wraps a manually selected set of imports, e.g. you do your own basic_types module. In the end, if you have specific requirements, you have to be specific.Unfortunately, selective imports have been broken for 9 years.
Jun 23 2015
On 6/23/15 1:59 PM, Meta wrote:On Tuesday, 23 June 2015 at 17:53:43 UTC, John Colvin wrote:Even selective imports being fixed, the benefits in terms of separate compilation and encapsulation are worth it. I agree with the idea to limit package.d to just public imports. I don't think it should be enforced by the compiler, but it should be something Phobos strives for and that we recommend. -SteveIsn't this what selective imports are for? Admittedly it's not quite as convenient, but it does let you choose exactly what you want. You can even make a module that wraps a manually selected set of imports, e.g. you do your own basic_types module. In the end, if you have specific requirements, you have to be specific.Unfortunately, selective imports have been broken for 9 years.
Jun 23 2015
On Tuesday, 23 June 2015 at 17:53:43 UTC, John Colvin wrote:Isn't this what selective imports are for?Not quite the same thing: selective imports control which symbols you pull into the current namespace, but not which code gets pulled into the binary. If you do `import foo : bar;`, the compiler processes all of foo (consider that it has to, just to find the name), generating the object file for it, but only exposes the name `bar` to you. With smaller basic modules, if you only import the foundation, the compiler only has to look at that small file and only has to include its contents in the object file.
Jun 23 2015
On 24 June 2015 at 03:11, Adam D. Ruppe via Digitalmars-d <digitalmars-d puremagic.com> wrote:On Tuesday, 23 June 2015 at 16:14:59 UTC, Marc Schütz wrote:Right, and this was what I had in mind. I think the average user would want to: import std.color, and that's it. They will probably want RGB8 or RGBA8. Most users will never touch anything else in the API, so using package.d as an "import absolutely everything" doesn't seem useful at all to me. Also, a use cases involving the Lab colour space almost certianly has absolutely nothing to do with an application involving Y'UV. I think those advanced colour space users will happily import the package they care about.But that's more an argument against putting anything _except_ the basic definitions into package.d, no? Then you can always exclude the more specific stuff whenever you need it, and those modules themselves can publicly import package.d.What if you want the basic definitions alone to build something off of? If I want to write an image library that can share pixels with your image library, I might import std.color just to get the pixel format. I don't need the list of colors nor any algorithms, I just want to share the basic type so our two libraries can pass data back and forth. So I write like RGBA8[] readImage() {} With the std.color functions, some other library can now take that pixel array and convert it or whatever they need to do. Great, you can use my thing pretty easily.But I don't need any conversions myself. I don't do transformations. I don't use named colors, blending functions, or anything else. (Maybe my image format is extremely simple.) So pulling the rest of the library would waste compile time and binary space. Especially if a user wanted my extremely simple image format exactly because they were short on time and space. So ideally, my module would ONLY import std.color.basic_types or something like that.... but alas, RGBA8 is defined in package.d, so if I want it, whether I like it or not, I just pulled half the std.color library....Well, 'half' is a bit of an exaggeration. There will be a lot more that's not visible now, and I don't expect package.d will ever do anything more than it does now. I'm in favour of trimming package.d though. What do you suggest? Will those aliases for common colour types cause a significant compiler performance hit if they are unreferenced? Surely the compiler won't eagerly resolve those aliases and instantiate all those colour types in the event they are never referenced? RGB is the common case, and it could be that that's the only one that's present in package.d... but RGB is tricky though; it's the one that people will almost certainly want 95% of the time, but it's also the most complicated by far, and has the most associated detail. I don't know how to effectively trim that for the common use case, but I was banking on the compiler not eagerly resolving all the conversion stuff in the event the case operator is never actually invoked? Am I wrong about the compiler? Is it more eager than I expect?which just pulled std.traits and std.typecons, which, thankfully, didn't import anything else, but that's not the case for so many Phobos modules.I was very careful to limit run-away phobos dependencies. I really care about this, and I've tried to limit import scope in all locations.This layout isn't bad today, the std.color in the PR is pretty small and pretty lazy thanks to the templates and local imports in them, but I still want to set a precedent in Phobos of untangling the web of dependencies by moving as much independent code as reasonably possible to independent modules.I think I've (deliberately) done this to the best extent I am able. If you can suggest improvements, I'm all ears.
Jun 23 2015
On Wednesday, 24 June 2015 at 05:30:50 UTC, Manu wrote:Right, and this was what I had in mind. I think the average user would want to: import std.color, and that's it. They will probably want RGB8 or RGBA8. Most users will never touch anything else in the API, so using package.d as an "import absolutely everything" doesn't seem useful at all to me.Hmm, yes, that's an interesting point.I'm in favour of trimming package.d though. What do you suggest?Even if it doesn't actually import everything, I'd still prefer to keep the package.d pretty clear. Maybe move those bits out to std.color.common or std.color.foundation and public import that from the package? On the other hand, if everybody is ok with the package.d itself being a minimal import, this isn't necessary, I am just really worried about it growing too big in the future.Surely the compiler won't eagerly resolve those aliases and instantiate all those colour types in the event they are never referenced?It does: struct Foo(T) { pragma(msg, T.stringof); } alias foo = Foo!int; dmd test.d int It printed the thing meaning the template did in fact get instantiated when the alias mentioned it. Templates inside the type won't be instantiated, but regular methods will be - along with any templates *they* reference. In the case of the color package, this is all pretty small and probably not a big deal, but I'm just trying to set expectations that others can follow too.I was very careful to limit run-away phobos dependencies. I really care about this, and I've tried to limit import scope in all locations.Indeed, you did well.
Jun 24 2015
On 25 June 2015 at 05:59, Adam D. Ruppe via Digitalmars-d <digitalmars-d puremagic.com> wrote:On Wednesday, 24 June 2015 at 05:30:50 UTC, Manu wrote:Bugger! So an instantiation of the struct is one thing, will it also instantiate all the members and functions too? If it leads to an instantiation of the cast operator, then at that point, that's basically everything... the whole library is pulled. What selective imports? Do selective imports of a single symbol from a module lead to the whole module being parsed and top level instantiations?Right, and this was what I had in mind. I think the average user would want to: import std.color, and that's it. They will probably want RGB8 or RGBA8. Most users will never touch anything else in the API, so using package.d as an "import absolutely everything" doesn't seem useful at all to me.Hmm, yes, that's an interesting point.I'm in favour of trimming package.d though. What do you suggest?Even if it doesn't actually import everything, I'd still prefer to keep the package.d pretty clear. Maybe move those bits out to std.color.common or std.color.foundation and public import that from the package? On the other hand, if everybody is ok with the package.d itself being a minimal import, this isn't necessary, I am just really worried about it growing too big in the future.Surely the compiler won't eagerly resolve those aliases and instantiate all those colour types in the event they are never referenced?It does: struct Foo(T) { pragma(msg, T.stringof); } alias foo = Foo!int; dmd test.d int It printed the thing meaning the template did in fact get instantiated when the alias mentioned it.Templates inside the type won't be instantiated, but regular methods will be - along with any templates *they* reference.Regular methods will be, but not template methods? Good, that means the cast operator will not be instantiated until it is referenced. This is critical, that's the point that leads to basically everything. Ideally conv.d would only have selective imports at the top (if there's an advantage to that) and proper imports scoped within the various cast functions. Would that be a win, or will the selective imports from each module at the top negate the advantage?In the case of the color package, this is all pretty small and probably not a big deal, but I'm just trying to set expectations that others can follow too.I was very careful to limit run-away phobos dependencies. I really care about this, and I've tried to limit import scope in all locations.Indeed, you did well.
Jun 24 2015
I probably didn't express myself very clearly, with the double negation... What I wanted to suggest is to put into package.d _only_ the very minimum that you will always need, e.g. the basic structures. Example: std/ color/
Jun 24 2015
On 23-Jun-2015 18:24, John Colvin wrote:On Tuesday, 23 June 2015 at 15:01:59 UTC, Adam D. Ruppe wrote:Speaking of regex - it's temporary situation. The idea is to both expose more submodules and keep less cruft in package.d. I'm not for public imports only but for minimizing the amount of code in package.d -- Dmitry OlshanskyJust a quick concern, I don't think a package.d should ever have anything except imports in it. Put all the actual aliases and color lists in some other submodule that can be imported independently with minimal dependencies.std/range/package.d and std/regex/package.d both have a bunch of stuff in. Why not?
Jun 23 2015
On Tue, Jun 23, 2015 at 03:24:41PM +0000, John Colvin via Digitalmars-d wrote:On Tuesday, 23 June 2015 at 15:01:59 UTC, Adam D. Ruppe wrote:That's a temporary situation. When those packages were broken up, we didn't want to make too extensive a change, so we left the less important bits in package.d. Ideally, however, they should be moved into their own subpackages. T -- EMACS = Extremely Massive And Cumbersome SystemJust a quick concern, I don't think a package.d should ever have anything except imports in it. Put all the actual aliases and color lists in some other submodule that can be imported independently with minimal dependencies.std/range/package.d and std/regex/package.d both have a bunch of stuff in. Why not?
Jun 23 2015
Am 23.06.2015 um 16:58 schrieb Manu via Digitalmars-d:https://github.com/D-Programming-Language/phobos/pull/2845 I'm getting quite happy with it. I think it's a good and fairly minimal but useful starting point. It'd be great to get some reviews from here.From a quick glance, looks very nice! If there was channel swizzling and an underlying (low dimensional) vector type, I could use it more or less as a drop-in replacement in my code. One thing that I was wondering if it wouldn't make more sense overall for the color string representation to use RGBA instead of ARGB. The former is a lot more common outside of 3D APIs/hardware and arguably more intuitive.
Jun 23 2015
On Tuesday, 23 June 2015 at 14:58:35 UTC, Manu wrote:https://github.com/D-Programming-Language/phobos/pull/2845 I'm getting quite happy with it. I think it's a good and fairly minimal but useful starting point. It'd be great to get some reviews from here.Swizzels would be a nice addition.
Jun 23 2015
They work fine. Just cast between color structs with different component orders: BGR8 a = Color.white; RGB8 b = a; // <- did swizzle Is there a specific api you miss? On 24 June 2015 at 05:34, Tofu Ninja via Digitalmars-d <digitalmars-d puremagic.com> wrote:On Tuesday, 23 June 2015 at 14:58:35 UTC, Manu wrote:https://github.com/D-Programming-Language/phobos/pull/2845 I'm getting quite happy with it. I think it's a good and fairly minimal but useful starting point. It'd be great to get some reviews from here.Swizzels would be a nice addition.
Jun 23 2015
On Wednesday, 24 June 2015 at 04:47:35 UTC, Manu wrote:They work fine. Just cast between color structs with different component orders: BGR8 a = Color.white; RGB8 b = a; // <- did swizzle Is there a specific api you miss? On 24 June 2015 at 05:34, Tofu Ninja via Digitalmars-d <digitalmars-d puremagic.com> wrote:Ahh, I was thinking more about swizzling the color channels themselves, not just conversion to different color layouts. RGB8 a = RGB8(0,1,2); RGB8 b = a.rbg; assert(b == RGB8(0,2,1));On Tuesday, 23 June 2015 at 14:58:35 UTC, Manu wrote:https://github.com/D-Programming-Language/phobos/pull/2845 I'm getting quite happy with it. I think it's a good and fairly minimal but useful starting point. It'd be great to get some reviews from here.Swizzels would be a nice addition.
Jun 24 2015
On 24 June 2015 at 17:18, Tofu Ninja via Digitalmars-d <digitalmars-d puremagic.com> wrote:On Wednesday, 24 June 2015 at 04:47:35 UTC, Manu wrote:Ah okay. Yeah, it's an interesting idea. It's only applicable to RGB colours. What's a bit awkward, is it's not entirely clear where the result of the swizzle is assigned? Is the result of the swizzle assigned to the colours present in the order of appearance in the current layout? BGR8 a = Color.white; BGR8 b = a.rbg; is that: b=r, g=b, r=g, or is it r=r, g=b, b=g? Surely it's the former, but that means you need to be conscious of the colour layout whenever you perform a swizzle; ie, it will do different things for different layouts...They work fine. Just cast between color structs with different component orders: BGR8 a = Color.white; RGB8 b = a; // <- did swizzle Is there a specific api you miss? On 24 June 2015 at 05:34, Tofu Ninja via Digitalmars-d <digitalmars-d puremagic.com> wrote:Ahh, I was thinking more about swizzling the color channels themselves, not just conversion to different color layouts. RGB8 a = RGB8(0,1,2); RGB8 b = a.rbg; assert(b == RGB8(0,2,1));On Tuesday, 23 June 2015 at 14:58:35 UTC, Manu wrote:https://github.com/D-Programming-Language/phobos/pull/2845 I'm getting quite happy with it. I think it's a good and fairly minimal but useful starting point. It'd be great to get some reviews from here.Swizzels would be a nice addition.
Jun 24 2015
On Wednesday, 24 June 2015 at 08:47:50 UTC, Manu wrote:Ah okay. Yeah, it's an interesting idea. It's only applicable to RGB colours. What's a bit awkward, is it's not entirely clear where the result of the swizzle is assigned? Is the result of the swizzle assigned to the colours present in the order of appearance in the current layout? BGR8 a = Color.white; BGR8 b = a.rbg; is that: b=r, g=b, r=g, or is it r=r, g=b, b=g? Surely it's the former, but that means you need to be conscious of the colour layout whenever you perform a swizzle; ie, it will do different things for different layouts...Ahh yes, I didn't think of that. I think for the 99% of people who are just using RGBA8 everywhere, it would still be valuable. But if it didn't get in I wouldn't be too disappointed.
Jun 24 2015
On 25 June 2015 at 07:05, Tofu Ninja via Digitalmars-d <digitalmars-d puremagic.com> wrote:On Wednesday, 24 June 2015 at 08:47:50 UTC, Manu wrote:Sadly not, windows used BGR in basically all OS api's. Compatibility support usually required BGR too, since that was the only color format supported by old video hardware for a long time.Ah okay. Yeah, it's an interesting idea. It's only applicable to RGB colours. What's a bit awkward, is it's not entirely clear where the result of the swizzle is assigned? Is the result of the swizzle assigned to the colours present in the order of appearance in the current layout? BGR8 a = Color.white; BGR8 b = a.rbg; is that: b=r, g=b, r=g, or is it r=r, g=b, b=g? Surely it's the former, but that means you need to be conscious of the colour layout whenever you perform a swizzle; ie, it will do different things for different layouts...Ahh yes, I didn't think of that. I think for the 99% of people who are just using RGBA8 everywhere, it would still be valuable. But if it didn't get in I wouldn't be too disappointed.
Jun 24 2015
On Tuesday, 23 June 2015 at 14:58:35 UTC, Manu wrote:It'd be great to get some reviews from here.I would like to see the packed implementatiin finished before this is pulled, but I won't stand in its way. Mike
Jun 23 2015
On 24 June 2015 at 08:46, Mike via Digitalmars-d <digitalmars-d puremagic.com> wrote:On Tuesday, 23 June 2015 at 14:58:35 UTC, Manu wrote:I just don't want to write all the others which will mirror this set of API decisions almost verbatim until the API is stabilised.It'd be great to get some reviews from here.I would like to see the packed implementatiin finished before this is pulled, but I won't stand in its way.
Jun 23 2015
On Wednesday, 24 June 2015 at 04:48:28 UTC, Manu wrote:I just don't want to write all the others which will mirror this set of API decisions almost verbatim until the API is stabilised.A wise decision. I understand.
Jun 23 2015
On Tuesday, 23 June 2015 at 14:58:35 UTC, Manu wrote:https://github.com/D-Programming-Language/phobos/pull/2845 I'm getting quite happy with it. I think it's a good and fairly minimal but useful starting point. It'd be great to get some reviews from here.Some points about blend/lerp: - Using operation on rgb components usually doesn't give the expected result. It should be done, for example, blending hue saturation and brightness, rather than Red, Blue, Green (or at least using toLinear?) - What happens if srcFactor + destFactor != 1? Maybe we should normalize srcFactor and destFactor on 0..1 using something like: normSrcFactor = srcFactor/(srcFactor+DestFactor); normDestFactor = destFactor/(srcFactor+DestFactor); - Does it work with RGB only?
Jun 24 2015
On 24 June 2015 at 17:58, Andrea Fontana via Digitalmars-d <digitalmars-d puremagic.com> wrote:On Tuesday, 23 June 2015 at 14:58:35 UTC, Manu wrote:Cast your input to a linear type (or whatever colourspace you prefer) before lerping. User needs to make the trade-off between efficiency (approximation) and precision (in linear space).https://github.com/D-Programming-Language/phobos/pull/2845 I'm getting quite happy with it. I think it's a good and fairly minimal but useful starting point. It'd be great to get some reviews from here.Some points about blend/lerp: - Using operation on rgb components usually doesn't give the expected result. It should be done, for example, blending hue saturation and brightness, rather than Red, Blue, Green (or at least using toLinear?)- What happens if srcFactor + destFactor != 1? Maybe we should normalize srcFactor and destFactor on 0..1 using something like: normSrcFactor = srcFactor/(srcFactor+DestFactor); normDestFactor = destFactor/(srcFactor+DestFactor);I don't see any reason they should require to add to one. HDR is a thing. Lerp is a mathematical function, and while t=[0..1] is conventional, it's not enforced, or even necessary. I think user should make a decision to require normalisation.- Does it work with RGB only?No, but like, kinda. Lab interpolates very well (by design). Technically, all spaces lerp, just that results should be expected with respect to the colour space you are working in. I was thinking of removing those functions because they're a bit hard to define concretely, for some of the reasons you say, and others. I left them there to gather opinions and comments. Also to identify missing functions if people find them to add value.
Jun 24 2015
On Tuesday, 23 June 2015 at 14:58:35 UTC, Manu wrote:https://github.com/D-Programming-Language/phobos/pull/2845 I'm getting quite happy with it. I think it's a good and fairly minimal but useful starting point. It'd be great to get some reviews from here.My experience (my previous job involved designing a GPU based color grading machine) is that the more you study colors, the more you realize how rich this domain is. To me there are different features corresponding to different domains : - spectral/multispectral colors (Satellite imagery, Medical imagery, Spectrometry), also useful for monitor calibration. - vfx industry will want - sRGB, Adobe RGB with non linear gradation law (piecewise linear+gamma for sRGB) - camera colorspaces (Alexa, PanaLog, Gamma) - film colorspaces (density encoded, cineon / kodak log) - broadcast colorspaces YUV, YCbCr, YPbPr, DCI P3 - physical color space XYZ (CGI rendering) - print industry will want CMYK - game industry will want alpha support with or without premultiplication, HSL - academic will want perceptual colorspace (Lab, L*a*b*), distance expresses how different colors are perceived. ... So to me there are several things to consider : - the number of channels, their semantics, the type they use (8/10/16/32/64 bits, int, unsigned, float...) - some format packs channels, most common form of DPX is RGB10A2 bits packed in a 32 bit word (10bits red, 10bits green, 10 bits blue, 2 bits alpha) the word might be little/bigendian - the gradation law for those channels (linear, sRGB, log, semilog, lookup table, ...) - alpha is a special beast when composing colors - when the signal is captured/displayed the gamut comes into play (space of colors the device can handle) the color value can be correlated with the characteristics of the light : white balance, signal quantification, white point, black point, channel characteristics (spectrum) - moving between colorspaces is not necessary reversible (HSL <-> RGB). It involves non trivial logic (1D LUT, 3D LUT, matrix, piecewise functions, log/pow) that also makes the transformation lossy. Manu, I understand that you don't want this library to handle very possible cases what is your rationale for what's useful / not necessary ? I suppose most users will simply manipulate sRGB jpeg/png.
Jun 24 2015
On 24 June 2015 at 20:11, Guillaume Chatelet via Digitalmars-d <digitalmars-d puremagic.com> wrote:On Tuesday, 23 June 2015 at 14:58:35 UTC, Manu wrote:Indeed, it's a very deep hole ;) This is a library that could easily suffer literally endless feature creep, I just want to keep it reasonable and practical to start with. I've done CG for a decade or so, and some research related colour activity (satelite,medical,thermal imagery; my current job)https://github.com/D-Programming-Language/phobos/pull/2845 I'm getting quite happy with it. I think it's a good and fairly minimal but useful starting point. It'd be great to get some reviews from here.My experience (my previous job involved designing a GPU based color grading machine) is that the more you study colors, the more you realize how rich this domain is.To me there are different features corresponding to different domains : - spectral/multispectral colors (Satellite imagery, Medical imagery, Spectrometry), also useful for monitor calibration. - vfx industry will want - sRGB, Adobe RGB with non linear gradation law (piecewise linear+gamma for sRGB)Check, done.- camera colorspaces (Alexa, PanaLog, Gamma)I don't think this will come up in the near term.- film colorspaces (density encoded, cineon / kodak log)Likewise.- broadcast colorspaces YUV, YCbCr, YPbPr, DCI P3On the short-list.- physical color space XYZ (CGI rendering)Done.- print industry will want CMYKThis requires ICC interaction. There's OS involvement there. It's a fair way down the list.- game industry will want alpha support with or without premultiplication,I don't think pre-multiplied alpha is a detail that the colour itself really needs to know about. I thought about this, but I think it's a niche and unnecessary complexity. Read; over-engineering.HSLEasy, on the short list.- academic will want perceptual colorspace (Lab, L*a*b*), distance expresses how different colors are perceived.On the short-ish list. This requires quite a lot of care, and it takes time to get it just right....I'm aware of all the points on your list. They aren't being overlooked.So to me there are several things to consider : - the number of channels, their semantics, the type they use (8/10/16/32/64 bits, int, unsigned, float...) - some format packs channels, most common form of DPX is RGB10A2 bits packed in a 32 bit word (10bits red, 10bits green, 10 bits blue, 2 bits alpha) the word might be little/bigendianCheck. My background is realtime rendering ;) I know what I'm doing here.- the gradation law for those channels (linear, sRGB, log, semilog, lookup table, ...)All present or planned.- alpha is a special beast when composing colorsThe colour type itself can't reasonably make any useful decision for the user here, this is related to the functions that combine colours.- when the signal is captured/displayed the gamut comes into play (space of colors the device can handle) the color value can be correlated with the characteristics of the light : white balance, signal quantification, white point, black point, channel characteristics (spectrum)On the mid-range-list. Chromatic adaptation is necessary for Lab at least. This is mostly ancillary functionality though, it lives beside the present offering.- moving between colorspaces is not necessary reversible (HSL <-> RGB). It involves non trivial logic (1D LUT, 3D LUT, matrix, piecewise functions, log/pow) that also makes the transformation lossy.Yup. Can only do the best possible for each conversion. People making use of those colour spaces and performing such conversions understand these details.Manu, I understand that you don't want this library to handle very possible cases what is your rationale for what's useful / not necessary ? I suppose most users will simply manipulate sRGB jpeg/png.Nothing is off the table. I start with RGB, since it's the 99% case. That leads to XYZ for RGB conversions, and HSV is also very easy from there. I had planned for that to be the initial offering. I have made a start on Y'UV, Lab, and the compressed colour formats typical in realtime gfx. Advanced features are best driven by demand. There's no point supporting scientific colour analysis if there's nobody to use it, while a video professional sits waiting for broadcast related stuff... I think the overwhelming use will be for loading+displaying images, and rendering using opengl/dx/whatever. Therefore, sRGB with all gamma conventions supported. Other RGB colour spaces are easy from there; just definitions in a table (done, but need tests). PackedRGB is next (numerous requests already), then probably HSV. After that, it's open to request. I'd like to work on some HDR related tools. I can see a pretty clear distinction between what's *necessary* in a standard colour library (ie, to facilitate other libraries), and 'would be nice' for niche or expert use :) Don't worry, I'm an optics nerd!
Jun 24 2015
On Wednesday, 24 June 2015 at 11:02:04 UTC, Manu wrote:Don't worry, I'm an optics nerd!Well I can tell by reading the PR already ;) I just wanted to make sure : - nothing important was overlooked - what was the scope ot the proposal Now I think my main concern is about conversions getting out of control (there's already quite a few static ifs). Also do you plan on adding SIMD specializations ? On a related note, I designed a player a few years ago which relied on GLSL shaders for the colorspace conversions, so it might be good to compare the implementations (https://github.com/mikrosimage/duke/blob/develop/src/duke/engine/ olorSpace.cpp#L38). My secret dream is to reimplement it in D : C++ simply is too slow to develop with and it's a single person project so it's stale basically...
Jun 24 2015
On a tangent, I need a name for the struct that will represent HSL/HSV/HSI/HCY. They're all basically identical, and might as well be a parameter to a shared type... but I can't think of a name for that type! >_< I can't reasonably call it any of those or it would be confused, rather, each of those would be an alias for an instantiation of each type. I'm thinking along the lines of PolarRGB? It's not really that though. I can't think of any other good names. alias HSL = PolarRGB!(Type.HSL); Naming things is so hard!
Jun 24 2015
On Wednesday, 24 June 2015 at 16:05:31 UTC, Manu wrote:On a tangent, I need a name for the struct that will represent HSL/HSV/HSI/HCY. They're all basically identical, and might as well be a parameter to a shared type... but I can't think of a name for that type! >_< I can't reasonably call it any of those or it would be confused, rather, each of those would be an alias for an instantiation of each type. I'm thinking along the lines of PolarRGB? It's not really that though. I can't think of any other good names. alias HSL = PolarRGB!(Type.HSL); Naming things is so hard!Since H(ue) seems to be the only shared property of all those RGB representations one of the following names might be acceptable: HRGB HueRGB HueBasedRGB HueOrientedRGB HueTypeRGB I'm not confident, though. :-( Fool
Jun 24 2015
On Wednesday, 24 June 2015 at 16:05:31 UTC, Manu wrote:On a tangent, I need a name for the struct that will represent HSL/HSV/HSI/HCY. They're all basically identical, and might as well be a parameter to a shared type... but I can't think of a name for that type! >_< I can't reasonably call it any of those or it would be confused, rather, each of those would be an alias for an instantiation of each type. I'm thinking along the lines of PolarRGB? It's not really that though. I can't think of any other good names. alias HSL = PolarRGB!(Type.HSL); Naming things is so hard!I don't like PolarRGB since it doesn't have a lot to do with RGB. HueSpace!(Type.HSL) ?
Jun 24 2015
On Wednesday, 24 June 2015 at 21:08:03 UTC, Guillaume Chatelet wrote:On Wednesday, 24 June 2015 at 16:05:31 UTC, Manu wrote:OK I take that back. HSL expresses color in the RGB space you're right. Maybe CylindricalRGB ? It's a volume after all.On a tangent, I need a name for the struct that will represent HSL/HSV/HSI/HCY. They're all basically identical, and might as well be a parameter to a shared type... but I can't think of a name for that type! >_< I can't reasonably call it any of those or it would be confused, rather, each of those would be an alias for an instantiation of each type. I'm thinking along the lines of PolarRGB? It's not really that though. I can't think of any other good names. alias HSL = PolarRGB!(Type.HSL); Naming things is so hard!I don't like PolarRGB since it doesn't have a lot to do with RGB. HueSpace!(Type.HSL) ?
Jun 24 2015
On 25 June 2015 at 07:14, Guillaume Chatelet via Digitalmars-d <digitalmars-d puremagic.com> wrote:On Wednesday, 24 June 2015 at 21:08:03 UTC, Guillaume Chatelet wrote:They're not cylindrical, they each represent a different shape; cylinder, hexacone, double-hexacone, weird-warped-crooked-cube-on-its-corner ;) They really are polar coordinates of a sort, although even that's not really a good description, since it's a hex rather than a circle. Perhaps the word 'angular' is more fitting than polar in this case... but that doesn't get me any closer to a good name! >_<On Wednesday, 24 June 2015 at 16:05:31 UTC, Manu wrote:OK I take that back. HSL expresses color in the RGB space you're right. Maybe CylindricalRGB ? It's a volume after all.On a tangent, I need a name for the struct that will represent HSL/HSV/HSI/HCY. They're all basically identical, and might as well be a parameter to a shared type... but I can't think of a name for that type! >_< I can't reasonably call it any of those or it would be confused, rather, each of those would be an alias for an instantiation of each type. I'm thinking along the lines of PolarRGB? It's not really that though. I can't think of any other good names. alias HSL = PolarRGB!(Type.HSL); Naming things is so hard!I don't like PolarRGB since it doesn't have a lot to do with RGB. HueSpace!(Type.HSL) ?
Jun 24 2015
Wikipedia at least refer to these as cylindrical colour spaces On Thu, Jun 25, 2015 at 2:05 PM, Manu via Digitalmars-d <digitalmars-d puremagic.com> wrote:On 25 June 2015 at 07:14, Guillaume Chatelet via Digitalmars-d <digitalmars-d puremagic.com> wrote:On Wednesday, 24 June 2015 at 21:08:03 UTC, Guillaume Chatelet wrote:They're not cylindrical, they each represent a different shape; cylinder, hexacone, double-hexacone, weird-warped-crooked-cube-on-its-corner ;) They really are polar coordinates of a sort, although even that's not really a good description, since it's a hex rather than a circle. Perhaps the word 'angular' is more fitting than polar in this case... but that doesn't get me any closer to a good name! >_<On Wednesday, 24 June 2015 at 16:05:31 UTC, Manu wrote:OK I take that back. HSL expresses color in the RGB space you're right. Maybe CylindricalRGB ? It's a volume after all.On a tangent, I need a name for the struct that will represent HSL/HSV/HSI/HCY. They're all basically identical, and might as well be a parameter to a shared type... but I can't think of a name for that type! >_< I can't reasonably call it any of those or it would be confused, rather, each of those would be an alias for an instantiation of each type. I'm thinking along the lines of PolarRGB? It's not really that though. I can't think of any other good names. alias HSL = PolarRGB!(Type.HSL); Naming things is so hard!I don't like PolarRGB since it doesn't have a lot to do with RGB. HueSpace!(Type.HSL) ?
Jun 24 2015
I would probably go with "perceptual" or something like it On Thu, Jun 25, 2015 at 2:39 PM, Danni Coy <danni.coy gmail.com> wrote:Wikipedia at least refer to these as cylindrical colour spaces On Thu, Jun 25, 2015 at 2:05 PM, Manu via Digitalmars-d <digitalmars-d puremagic.com> wrote:On 25 June 2015 at 07:14, Guillaume Chatelet via Digitalmars-d <digitalmars-d puremagic.com> wrote:On Wednesday, 24 June 2015 at 21:08:03 UTC, Guillaume Chatelet wrote:They're not cylindrical, they each represent a different shape; cylinder, hexacone, double-hexacone, weird-warped-crooked-cube-on-its-corner ;) They really are polar coordinates of a sort, although even that's not really a good description, since it's a hex rather than a circle. Perhaps the word 'angular' is more fitting than polar in this case... but that doesn't get me any closer to a good name! >_<On Wednesday, 24 June 2015 at 16:05:31 UTC, Manu wrote:OK I take that back. HSL expresses color in the RGB space you're right. Maybe CylindricalRGB ? It's a volume after all.On a tangent, I need a name for the struct that will represent HSL/HSV/HSI/HCY. They're all basically identical, and might as well be a parameter to a shared type... but I can't think of a name for that type! >_< I can't reasonably call it any of those or it would be confused, rather, each of those would be an alias for an instantiation of each type. I'm thinking along the lines of PolarRGB? It's not really that though. I can't think of any other good names. alias HSL = PolarRGB!(Type.HSL); Naming things is so hard!I don't like PolarRGB since it doesn't have a lot to do with RGB. HueSpace!(Type.HSL) ?
Jun 24 2015
On 25 June 2015 at 15:18, Danni Coy via Digitalmars-d <digitalmars-d puremagic.com> wrote:I would probably go with "perceptual" or something like itThat sounds like you're talking about Lab or CAM.On Thu, Jun 25, 2015 at 2:39 PM, Danni Coy <danni.coy gmail.com> wrote:Wikipedia at least refer to these as cylindrical colour spaces
Jun 24 2015
How about HSx ? That's the best I've got! :P On 25 June 2015 at 15:45, Manu <turkeyman gmail.com> wrote:On 25 June 2015 at 15:18, Danni Coy via Digitalmars-d <digitalmars-d puremagic.com> wrote:I would probably go with "perceptual" or something like itThat sounds like you're talking about Lab or CAM.On Thu, Jun 25, 2015 at 2:39 PM, Danni Coy <danni.coy gmail.com> wrote:Wikipedia at least refer to these as cylindrical colour spaces
Jun 25 2015
On Thursday, 25 June 2015 at 13:36:57 UTC, Manu wrote:How about HSx ? That's the best I've got! :PHueBased?
Jun 25 2015
On Thursday, 25 June 2015 at 13:36:57 UTC, Manu wrote:How about HSx ? That's the best I've got! :PNot too bad :-) I'm not too excited about this but how about : HS!L HS!V .,. It could work with a good documentation.
Jun 25 2015
On Thursday, 25 June 2015 at 21:06:59 UTC, Guillaume Chatelet wrote:On Thursday, 25 June 2015 at 13:36:57 UTC, Manu wrote:Or just an obscure struct and some aliases : alias HueSpace!(Type.xSL) HSLHow about HSx ? That's the best I've got! :PNot too bad :-) I'm not too excited about this but how about : HS!L HS!V .,. It could work with a good documentation.
Jun 25 2015
Huey (pronounced with an Australian Twang)? HSx works On Fri, Jun 26, 2015 at 7:11 AM, Guillaume Chatelet via Digitalmars-d <digitalmars-d puremagic.com> wrote:On Thursday, 25 June 2015 at 21:06:59 UTC, Guillaume Chatelet wrote:On Thursday, 25 June 2015 at 13:36:57 UTC, Manu wrote:Or just an obscure struct and some aliases : alias HueSpace!(Type.xSL) HSLHow about HSx ? That's the best I've got! :PNot too bad :-) I'm not too excited about this but how about : HS!L HS!V .,. It could work with a good documentation.
Jun 29 2015
On Tuesday, 23 June 2015 at 14:58:35 UTC, Manu wrote:https://github.com/D-Programming-Language/phobos/pull/2845 I'm getting quite happy with it. I think it's a good and fairly minimal but useful starting point. It'd be great to get some reviews from here.Whats the status on this? This really should be easy to move into phobos, color is hard to mess up.
Aug 03 2015
On 4 August 2015 at 05:47, Tofu Ninja via Digitalmars-d <digitalmars-d puremagic.com> wrote:On Tuesday, 23 June 2015 at 14:58:35 UTC, Manu wrote:I beg to differ; colour is VERY hard to mess up ;) .. I've never seen an OS library, and even most proper gfx libraries don't get it right.https://github.com/D-Programming-Language/phobos/pull/2845 I'm getting quite happy with it. I think it's a good and fairly minimal but useful starting point. It'd be great to get some reviews from here.Whats the status on this? This really should be easy to move into phobos, color is hard to mess up.
Aug 04 2015
On Tuesday, 4 August 2015 at 11:01:58 UTC, Manu wrote:On 4 August 2015 at 05:47, Tofu Ninja via Digitalmars-d <digitalmars-d puremagic.com> wrote:Where is this lib can be helpful?On Tuesday, 23 June 2015 at 14:58:35 UTC, Manu wrote:I beg to differ; colour is VERY hard to mess up ;) .. I've never seen an OS library, and even most proper gfx libraries don't get it right.https://github.com/D-Programming-Language/phobos/pull/2845 I'm getting quite happy with it. I think it's a good and fairly minimal but useful starting point. It'd be great to get some reviews from here.Whats the status on this? This really should be easy to move into phobos, color is hard to mess up.
Aug 04 2015
On 4 August 2015 at 22:13, Suliman via Digitalmars-d <digitalmars-d puremagic.com> wrote:On Tuesday, 4 August 2015 at 11:01:58 UTC, Manu wrote:There's a mirror here: https://github.com/TurkeyMan/color But it's not up to date. The PR in the OP is the latest code.On 4 August 2015 at 05:47, Tofu Ninja via Digitalmars-d <digitalmars-d puremagic.com> wrote:Where is this lib can be helpful?On Tuesday, 23 June 2015 at 14:58:35 UTC, Manu wrote:I beg to differ; colour is VERY hard to mess up ;) .. I've never seen an OS library, and even most proper gfx libraries don't get it right.https://github.com/D-Programming-Language/phobos/pull/2845 I'm getting quite happy with it. I think it's a good and fairly minimal but useful starting point. It'd be great to get some reviews from here.Whats the status on this? This really should be easy to move into phobos, color is hard to mess up.
Aug 04 2015
On 4 August 2015 at 21:01, Manu <turkeyman gmail.com> wrote:On 4 August 2015 at 05:47, Tofu Ninja via Digitalmars-d <digitalmars-d puremagic.com> wrote:*** I mean, VERY hard to _get right_!On Tuesday, 23 June 2015 at 14:58:35 UTC, Manu wrote:I beg to differ; colour is VERY hard to mess up [...]https://github.com/D-Programming-Language/phobos/pull/2845 I'm getting quite happy with it. I think it's a good and fairly minimal but useful starting point. It'd be great to get some reviews from here.Whats the status on this? This really should be easy to move into phobos, color is hard to mess up.
Aug 04 2015
On Tuesday, 4 August 2015 at 14:24:47 UTC, Manu wrote:On 4 August 2015 at 21:01, Manu <turkeyman gmail.com> wrote:+1On 4 August 2015 at 05:47, Tofu Ninja via Digitalmars-d <digitalmars-d puremagic.com> wrote:*** I mean, VERY hard to _get right_!On Tuesday, 23 June 2015 at 14:58:35 UTC, Manu wrote:I beg to differ; colour is VERY hard to mess up [...]https://github.com/D-Programming-Language/phobos/pull/2845 I'm getting quite happy with it. I think it's a good and fairly minimal but useful starting point. It'd be great to get some reviews from here.Whats the status on this? This really should be easy to move into phobos, color is hard to mess up.
Aug 04 2015