| | 659 | void |
| | 660 | PDFDocument::setTextSelection (DocumentRectangle *rect) |
| | 661 | { |
| | 662 | g_assert(rect); |
| | 663 | |
| | 664 | PopplerPage *page = poppler_document_get_page (m_Document, getCurrentPageNum()-1); |
| | 665 | if(!page) |
| | 666 | return; |
| | 667 | |
| | 668 | gdouble pageWidth, pageHeight; |
| | 669 | poppler_page_get_size(page, &pageWidth, &pageHeight); |
| | 670 | |
| | 671 | //for get text we must exchange y coordinate, don't ask me where logic here. |
| | 672 | PopplerRectangle textRect = { rect->getX1(), |
| | 673 | (pageHeight - rect->getY2()), |
| | 674 | rect->getX2(), |
| | 675 | (pageHeight - rect->getY1())}; |
| | 676 | gchar *text = poppler_page_get_text(page, &textRect); |
| | 677 | if(!text) |
| | 678 | goto cleanup; |
| | 679 | |
| | 680 | for ( GList *obs = g_list_first (m_Observers) ; |
| | 681 | NULL != obs ; |
| | 682 | obs = g_list_next (obs) ) |
| | 683 | { |
| | 684 | IDocumentObserver *observer = (IDocumentObserver*)obs->data; |
| | 685 | observer->notifyTextSelected(text); |
| | 686 | } |
| | 687 | |
| | 688 | cleanup: |
| | 689 | if(page) |
| | 690 | g_object_unref(page); |
| | 691 | if(text) |
| | 692 | g_free(text); |
| | 693 | } |
| | 694 | GdkRegion* |
| | 695 | PDFDocument::getTextRegion (DocumentRectangle *r) |
| | 696 | { |
| | 697 | GdkRegion *res = NULL; |
| | 698 | PopplerPage *page = poppler_document_get_page (m_Document, getCurrentPageNum()-1); |
| | 699 | if(!page) |
| | 700 | return NULL; |
| | 701 | |
| | 702 | //calulate rect |
| | 703 | PopplerRectangle rect; |
| | 704 | rect.x1 = r->getX1() / getZoom(); |
| | 705 | rect.y1 = r->getY1() / getZoom(); |
| | 706 | rect.x2 = r->getX2() / getZoom(); |
| | 707 | rect.y2 = r->getY2() / getZoom(); |
| | 708 | |
| | 709 | //calc selection size |
| | 710 | res = poppler_page_get_selection_region(page, getZoom(), &rect); |
| | 711 | |
| | 712 | //free some local data |
| | 713 | g_object_unref(page); |
| | 714 | |
| | 715 | return res; |
| | 716 | } |
| | 717 | |
| | 718 | |