[cairo] PDF Blend modes

Soeren Sandmann sandmann at daimi.au.dk
Wed Jun 17 09:02:18 PDT 2009


> > > I'm trying to implement the missing features in poppler cairo backend
> > > (specially those that are present in splash backend). When I asked ickle
> > > about blend mode operators in cairo, he told me that Company had started
> > > to implement it some time ago[1]. So, I have taken Company's repos in
> > > order to update them and try to use the new cairo operators in poppler. 
> > > 
> > > First I tried to rebase blend-mode pixman branch from current master,
> > > but it was quite painful, too many conflicts, so I finally merged it as
> > > a single patch. I've set up a public repository for this [2].
> > 
> > This looks great; thanks for doing this!
> > 
> > I can definitely understand why you decided to merge it as one big
> > patch, but I'd really like to see it broken down a bit if
> > possible. Benjamin's tree had a lot of small commits; if we can
> > preserve at least some of them, that would be nice.
> 
> I finally rebased your repo to current master, see the new repo here:
> 
> http://cgit.freedesktop.org/~carlosgc/pixman/log/?h=blend-mode

Excellent. I merged it into my branch, with an additional commit to
enlarge the default size of the composite test window.

> > * Review that what I did makes sense (both the code and the math in
> >   the comment I added).

This is not likely to ever happen, I guess.

> > * Use floating point in the HSL modes
> > 
> >   Because I'm not sure that the overflow protection we have right now
> >   is correct.

I'd still like to see this done. For reference:

        > >>  if (min < 0) {
        > >>    tmp[0] = l + (tmp[0] - l) / 4 * l / (l - min) * 4;
        > >>    tmp[1] = l + (tmp[1] - l) / 4 * l / (l - min) * 4;
        > >>    tmp[2] = l + (tmp[2] - l) / 4 * l / (l - min) * 4;
        > >>  }
        > >>  if (max > a) {
        > >>    tmp[0] = l + (tmp[0] - l) / 4 * (a - l) / (max - l) * 4;
        > >>    tmp[1] = l + (tmp[1] - l) / 4 * (a - l) / (max - l) * 4;
        > >>    tmp[2] = l + (tmp[2] - l) / 4 * (a - l) / (max - l) * 4;
        > >>  }
        > >
        > > Where do those 4s come from?
        > >
        > Overflow protection. The tmp value can range from -COMP2_T_MAX .. 2
        > *
        > COMP2_T_MAX (I think), so I took the shortcut to just divide by a
        > high
        > enough number to avoid it. Also, this code will break on 64bit cases
        > as I'm using ints there for lack of a signed comp4_t type.
        > It's one of the cases I asked about previously on IRC I think as I
        > was
        > unsure if this is a case for doubles or how it should best be
        > handled.

        I would be more comfortable with floating points, yes.

> > * Getting rid of component alpha versions of HSL and
> >   return_if_fail()ing if you to use them with a component alpha
> >   mask. [1]

And this should be a trivial change.



Thanks,
Soren


More information about the cairo mailing list