Article: Functional image processing in D
Jakob Ovrum
jakobovrum at gmail.com
Fri Mar 21 10:24:00 PDT 2014
On Friday, 21 March 2014 at 17:03:17 UTC, Vladimir Panteleev
wrote:
> Where this is done, it is on purpose. For example, the "invert"
> declaration as it appears in the article wouldn't be possible
> with the shorthand function template syntax.
Right, I only skimmed over the various aliases. It looks like
only `parallel` does not use such an alias in the article, but as
a higher order algorithm it's perfectly justified to use the
separated style, especially when all the other higher order
algorithms do it.
> Yes. I've tried using unsigned coordinates in the past. It was
> awful.
>
> My conclusion is that if you ever need to subtract values, you
> should use signed types.
What happens if negative values sneak into the code? Sounds
dangerous.
> Yeah. A lambda would need to receive x, y, w and h, and we
> don't have naryFun in Phobos. (It's there but commented out for
> some reason.)
>
> To a small extent, I made some compromises for the first
> iteration for the sake of code looking good for the article,
> and maybe with the help of feedback improve on that.
Bleh, I hope we can figure out some notion of lambda equality
soon; string lambdas are terrible in so many ways.
> For example, a problem I've struggled with is avoiding having
> two overloads for almost every function in image.d. I've tried
> multiple approaches: default arguments (in the form of *new
> Image!COLOR), templates, string mixins, UDAs, pointers, but
> they all were rather ugly or impractical. Some related compiler
> issues are 8074, 12386, 12425 and 12426 - fixing those might
> make some of those approaches more feasible.
Referring to the overload sets with the `target` parameter?
(Looking at the source I also noticed some `isInputRange` checks
are missing; `ElementType` only checks for a `front` property.)
> That doesn't work if you need two-way communication. Although
> you can pass outer methods as aliases to the inner struct, but
> then you have to use crazy tricks to make methods of the inner
> struct static in respect to the inner struct but bound to the
> outer one via the alias. I've played with this quite a bit for
> ae.utils.serialization, but I don't think it fits here. Unless
> I'm missing something?
Aye, to be a sane hierarchy it would need to be redesigned so
there are no circular dependencies, which does look rather
non-trivial.
> That's what my previous design used. But ultimately, unless
> you're dealing with very narrow images, I don't think there
> will be a noticeable difference in performance. This design is
> more flexible, though (e.g. vjoiner can serve scanlines from
> different sources).
Maybe parallelized blitting makes sense, though it would really
require a use case where blit speed is a bottleneck to matter in
the first place.
More information about the Digitalmars-d-announce
mailing list