[poppler] [PATCHES] Support for the NoRotate annotation flag
Albert Astals Cid
aacid at kde.org
Tue Apr 2 10:38:56 PDT 2013
El Dimarts, 2 d'abril de 2013, a les 18:36:48, Adam Reichold va escriure:
> Hello,
>
> Am 31.03.2013 15:16, schrieb Carlos Garcia Campos:
> > Fabio D'Urso <fabiodurso at hotmail.it> writes:
> >> Hi,
> >>
> >> the attached patches implement support for the NoRotate annotation flag,
> >> which tells that the annotation must *not* be rotated according to the
> >> page orientation or requested rendering rotation (more on this later).
> >>
> >> The main reason why I have implemented these patches is
> >> https://bugs.kde.org/show_bug.cgi?id=313177, which consists in free-text
> >> annotations' text being wrongly oriented when the page has a /Rotate
> >> attribute whose value is different than 0. With the NoRotate flag, it
> >> will be possible to create annotations that always face the viewer,
> >> independently from the page's /Rotate attribute.
> >>
> >> NoRotate annotations are somewhat tricky, because they are never rotated,
> >> neither according to the orientation of page, nor according to the
> >> requested *rendering* rotation.
> >> I'm attaching a "orientation-examples.pdf" that shows this very important
> >> aspect. If you open it in acroread and rotate the pages, you'll see that
> >> NoRotate annotations pivot on their top-left corner and always face the
> >> viewer. I want to stress on this aspect: what you get if you render a
> >> page
> >> containing a NoRotate annotation and then apply a rotation *IS NOT* the
> >> same result that you would obtain by directly rendering the page at that
> >> rotation (see attached image for an example). This is the reason why I
> >> had to write patch 0004.
> >>
> >> ~ PATCHES 0001 and 0002
> >>
> >> Patch 0001 changes the Gfx::drawAnnot method so that it "unrotates" the
> >> coordinate system before drawing NoRotate annotations. This is the patch
> >> that actually implements the NoRotate flag, and it works in all cases
> >> but rasterized postscript output, which is addressed in patch 0004.
> >>
> >> Patch 0002 adds rotation control in poppler-qt4's demo application. I've
> >> used this patch to quickly test how NoRotate annotations behave with
> >> different rendering rotations.
> >>
> >> @@ -5144,6 +5157,28 @@ void Gfx::drawAnnot(Object *str, AnnotBorder
> >> *border, AnnotColor *aColor,>>
> >> return;
> >>
> >> }
> >>
> >> + // saves gfx state and automatically restores it on return
> >> + GfxStackStateSaver stackStateSaver(this);
> >> +
> >> + /* If flag NoRotate is set then we need to "unrotate" the coordinate
> >> system */ + if ((flags & Annot::flagNoRotate) && state->getRotate() !=
> >> 0) { + const double angle_rad = state->getRotate() * M_PI / 180;
> >> + const double c = cos(angle_rad);
> >> + const double s = sin(angle_rad);
> >> +
> >> + // Rotation around topleft corner (xMin, yMax)
> >> + const double unrotateMTX[6] = {
> >> + +c, +s,
> >> + -s, +c,
> >> + -c*xMin + s*yMax + xMin, -c*yMax - s*xMin + yMax
> >> + };
> >> +
> >> + state->concatCTM(unrotateMTX[0], unrotateMTX[1], unrotateMTX[2],
> >> + unrotateMTX[3], unrotateMTX[4], unrotateMTX[5]);
> >> + out->updateCTM(state, unrotateMTX[0], unrotateMTX[1],
> >> unrotateMTX[2],
> >> + unrotateMTX[3], unrotateMTX[4],
> >> unrotateMTX[5]);
> >> + }
> >> +
> >>
> >> // draw the appearance stream (if there is one)
> >> if (str->isStream()) {
> >
> > Unfortunately this doesn't work for the cairo backend either, since
> > state->getRotate() will be 0. In cairo the user typically does something
> > like:
> >
> > cairo_create()
> > cairo_translate()
> > cairo_scale()
> > cairo_rotate()
> > poppler_page_render()
> >
> > And we always pass 0 to displaySlice() since the cairo context is
> > already transformed.
>
> When implementing this in qpdfview, I spent most of the time figuring
> out how to correctly transform the annotation boundaries given to me by
> the qt4 frontend. This is of course not problem in itself, but it aligns
> with this observation as the applications is bound to use the internal
> coordinate transformations and needs to correctly recreate their results.
>
> Maybe it would be better to let applications that want to implement this
> draw those annotations by themselves, hiding Poppler's rendition?
What's the benefit of everyone doing the same? Wasn't the repetition of work
why libraries where created?
> (This
> could also solve the problem of the annotations being rotated out of the
> page bounding box.)
I'm sure we can find some other solution for that.
Cheers,
Albert
More information about the poppler
mailing list