Initial feedback for std.experimental.image

rikki cattermole via Digitalmars-d digitalmars-d at puremagic.com
Thu Jul 9 22:11:45 PDT 2015


On Friday, 10 July 2015 at 04:52:54 UTC, Vladimir Panteleev wrote:
> On Friday, 10 July 2015 at 04:35:51 UTC, rikki cattermole wrote:
>> write("output.png", image
>> .flipHorizontalRange
>> .flipVerticalRange
>> .rotate90Range
>> .copyInto(new TheImage!RGB8(2, 2))
>>
>> .asPNG().toBytes);
>
> Why the "Range" suffix for functions? Aren't most functions 
> going to be lazy, and thus have a "Range" suffix?

There are three kinds of mutation functions per functionality.

1) Modifies an image in place and returns it
2) image.rangeOf.function
3) Takes in a PixelPoint input range

Range suffix seemed like a good way to separate out which return 
a range and which don't.

> Does copyInto do resizing / colorspace conversion? Such 
> operations should be explicit. If it doesn't, then most of that 
> sub-expression is redundant...

Nope. It just copies a PixelPoint input range into an image 
storage type.

> Have you looked at ae.utils.graphics.image.copy? If a second 
> argument is not provided, an appropriate image is allocated 
> automatically (on the heap though).
>
>> I have an idea similar to copyInto except:
>> .copyIntoTemporary!TheImage(allocator) // return 
>> SwappableImage!(ImageColor!TheImage)(allocator.make!TheImage, 
>> allocator); // auto ref return type
>
> It took me a while to understand what SwappableImage does. The 
> documentation could be improved.
>
> I think you should not be adding runtime polymorphism 
> implicitly anywhere. There are virtual range interfaces in 
> Phobos, yes, but wrapping is only done explicitly, as it should 
> be here.

In this case the only reason SwappableImage would be used is to 
use its lifetime management facilities. But hey you can manage it 
yourself if you want too...

>> Basically SwappableImage can already deallocate the original 
>> storage instance when it's destructor gets called. If provided 
>> with the allocator. Same with RangeOf.
>
> I suggest to avoid conflating Phobos range terminology with 2D 
> image views. The current naming scheme makes me think that it 
> returns a range of rows, or some other range which is directly 
> pluggable into std.algorith. What's wrong with "View"?

As far as I am aware the range capabilities could be used with 
std.algorithm. There is nothing stopping you. It just uses 
PixelPoint!Color to represent a single pixel instead an instance 
of the color.
http://cattermole.co.nz/phobosImage/docs/html/std_experimental_image_interfaces.html#.PixelPoint

> I'd also like to ask why you decided to write a library from 
> scratch instead of reusing existing ones. I've spent days 
> solving certain design issues of ae.utils.graphics, it seems 
> wasteful to me to discard that and duplicate the effort. If the 
> license is the issue, I'd be happy to relicence it.

Licensing isn't an issue. I choose to write a new one to take 
advantage of std.experimental.color. It originally was meant to 
just test it. In fact I've been taking a lot of queues from 
ae.utils.graphics for this very reason. It is a very good piece 
of code and it already has solved may of the issues already.
Although now it is also pretty much testing e.g. 
std.experimental.allocators too.

I chose against reusing ae.utils.graphics as a base (same as e.g. 
dlib's and Devisualization.Image) because it would take a lot of 
work to get working with the newer Phobos to be modules. Almost 
as much as a new library would take.

You were the only person I was really interested in opinion wise. 
Manu's is great, but you have already done this. You know what 
works and doesn't.


More information about the Digitalmars-d mailing list