Germán Póo-Caamaño <[email protected]> writes: > On Wed, 2013-12-04 at 10:53 -0300, Germán Póo-Caamaño wrote: >> On Wed, 2013-12-04 at 13:34 +0000, Peter Waller wrote: >> > On 28 November 2013 07:22, Germán Póo-Caamaño <[email protected]> wrote: >> > FWIW, I tried to use poppler_page_get_text_layout_for_area() >> > for >> > implementing the text annotation markup in glib (in the demo), >> > but it is >> > notoriously slower than the deprecated >> > poppler_page_get_selection_region(). >> > >> > What are your timings? I tested it and see that >> > poppler_page_get_text_layout_for_area and >> > poppler_page_get_text_for_area are ~30% slower for emptyish pages and >> > <~5% slower for more populated pages. Absolutely it is O(1ms) so >> > doesn't seem a concern to me, but I'm curious what problem you're >> > encountering. >> >> For highlighting text interactively (or any other text markup), it calls >> poppler_page_get_text_layout_for_area every time the selection region >> changes. That is, to get the rectangles and set/update the annotation. >> >> So, the delay is multiplied for the number of updates required. > > To make it clear, see the following screencast: > > http://calcifer.org/tmp/evince/poppler-get-rectangles-comparison.ogv > > On the left, the one that uses poppler_page_get_selection_region() to > get the rectangles in the selection region, and to the right the one > that uses poppler_page_get_text_layout_for_area(). > > See how the highlight follows the cursor on the left one. In the other > one, the interaction with the mouse finished (the cursor changes once > the button is released) and after some seconds, the computation ends and > the text markup is updated.
The problem is not that get_text_layout is slower then get_selection_region (which could be, but not that much). The actual problem is the way you are using both APIs. poppler_page_get_text_layout returns a rectangle for every character in the text, so you are adding a quadrilateral to the annotation for every character selected while poppler_page_get_selection_region returns a list of lines blocks. So, what takes a lot more time is rendering the page itself, not getting the region/layout. You should iterate the characters until the end of the selection or until a new line is found, you can detect new lines because the rectangle is empty x1 == x2 && y1 == y2. > -- > Germán Poo-Caamaño > http://calcifer.org/ -- Carlos Garcia Campos PGP key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x523E6462
pgp6FUv9WOV5x.pgp
Description: PGP signature
_______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
