diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2015-02-23 10:04:38 +0000 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2015-02-23 10:05:45 +0000 |
commit | 74a9840a51d734568e4f7ba13f1b4a819215acba (patch) | |
tree | 0f251567a06d75a621919d25c2f39df8153cfcbc /libreofficekit | |
parent | 94c9206399954d018aae8a1bd4e4b33354b9cdaf (diff) |
lokdocview: scale selection rendering / cursor handling with zoom.
Change-Id: I2e3b86fd7f9eb2da0bcd36afd5a735a2815d70cd
Diffstat (limited to 'libreofficekit')
-rw-r--r-- | libreofficekit/source/gtk/lokdocview.c | 58 |
1 files changed, 41 insertions, 17 deletions
diff --git a/libreofficekit/source/gtk/lokdocview.c b/libreofficekit/source/gtk/lokdocview.c index 31d9430ac331..ce81eb802ccd 100644 --- a/libreofficekit/source/gtk/lokdocview.c +++ b/libreofficekit/source/gtk/lokdocview.c @@ -74,19 +74,25 @@ gboolean lcl_signalMotion(GtkWidget* pEventBox, GdkEventButton* pEvent, LOKDocVi { g_info("lcl_signalMotion: dragging the middle handle"); lcl_getDragPoint(&pDocView->m_aHandleMiddleRect, pEvent, &aPoint); - pDocView->pDocument->pClass->setTextSelection(pDocView->pDocument, LOK_SETTEXTSELECTION_RESET, pixelToTwip(aPoint.x), pixelToTwip(aPoint.y)); + pDocView->pDocument->pClass->setTextSelection( + pDocView->pDocument, LOK_SETTEXTSELECTION_RESET, + pixelToTwip(aPoint.x) / pDocView->fZoom, pixelToTwip(aPoint.y) / pDocView->fZoom); } else if (pDocView->m_bInDragStartHandle) { g_info("lcl_signalMotion: dragging the start handle"); lcl_getDragPoint(&pDocView->m_aHandleStartRect, pEvent, &aPoint); - pDocView->pDocument->pClass->setTextSelection(pDocView->pDocument, LOK_SETTEXTSELECTION_START, pixelToTwip(aPoint.x), pixelToTwip(aPoint.y)); + pDocView->pDocument->pClass->setTextSelection( + pDocView->pDocument, LOK_SETTEXTSELECTION_START, + pixelToTwip(aPoint.x) / pDocView->fZoom, pixelToTwip(aPoint.y) / pDocView->fZoom); } else if (pDocView->m_bInDragEndHandle) { g_info("lcl_signalMotion: dragging the end handle"); lcl_getDragPoint(&pDocView->m_aHandleEndRect, pEvent, &aPoint); - pDocView->pDocument->pClass->setTextSelection(pDocView->pDocument, LOK_SETTEXTSELECTION_END, pixelToTwip(aPoint.x), pixelToTwip(aPoint.y)); + pDocView->pDocument->pClass->setTextSelection( + pDocView->pDocument, LOK_SETTEXTSELECTION_END, + pixelToTwip(aPoint.x) / pDocView->fZoom, pixelToTwip(aPoint.y) / pDocView->fZoom); } return FALSE; } @@ -159,7 +165,10 @@ gboolean lcl_signalButton(GtkWidget* pEventBox, GdkEventButton* pEvent, LOKDocVi if ((pEvent->time - pDocView->m_nLastButtonPressTime) < 250) nCount++; pDocView->m_nLastButtonPressTime = pEvent->time; - pDocView->pDocument->pClass->postMouseEvent(pDocView->pDocument, LOK_MOUSEEVENT_MOUSEBUTTONDOWN, pixelToTwip(pEvent->x), pixelToTwip(pEvent->y), nCount); + pDocView->pDocument->pClass->postMouseEvent( + pDocView->pDocument, LOK_MOUSEEVENT_MOUSEBUTTONDOWN, + pixelToTwip(pEvent->x) / pDocView->fZoom, + pixelToTwip(pEvent->y) / pDocView->fZoom, nCount); break; } case GDK_BUTTON_RELEASE: @@ -168,7 +177,10 @@ gboolean lcl_signalButton(GtkWidget* pEventBox, GdkEventButton* pEvent, LOKDocVi if ((pEvent->time - pDocView->m_nLastButtonReleaseTime) < 250) nCount++; pDocView->m_nLastButtonReleaseTime = pEvent->time; - pDocView->pDocument->pClass->postMouseEvent(pDocView->pDocument, LOK_MOUSEEVENT_MOUSEBUTTONUP, pixelToTwip(pEvent->x), pixelToTwip(pEvent->y), nCount); + pDocView->pDocument->pClass->postMouseEvent( + pDocView->pDocument, LOK_MOUSEEVENT_MOUSEBUTTONUP, + pixelToTwip(pEvent->x) / pDocView->fZoom, + pixelToTwip(pEvent->y) / pDocView->fZoom, nCount); break; } default: @@ -303,7 +315,8 @@ static gboolean lcl_handleTimeout(gpointer pData) } /// Renders pHandle below a pCursor rectangle on pCairo. -static void lcl_renderHandle(cairo_t* pCairo, GdkRectangle* pCursor, cairo_surface_t* pHandle, GdkRectangle* pRectangle) +static void lcl_renderHandle(cairo_t* pCairo, GdkRectangle* pCursor, cairo_surface_t* pHandle, + GdkRectangle* pRectangle, float fZoom) { GdkPoint aCursorBottom; int nHandleWidth, nHandleHeight; @@ -312,10 +325,10 @@ static void lcl_renderHandle(cairo_t* pCairo, GdkRectangle* pCursor, cairo_surfa nHandleWidth = cairo_image_surface_get_width(pHandle); nHandleHeight = cairo_image_surface_get_height(pHandle); // We want to scale down the handle, so that its height is the same as the cursor caret. - fHandleScale = twipToPixel(pCursor->height) / nHandleHeight; + fHandleScale = twipToPixel(pCursor->height) * fZoom / nHandleHeight; // We want the top center of the handle bitmap to be at the bottom center of the cursor rectangle. - aCursorBottom.x = twipToPixel(pCursor->x) + twipToPixel(pCursor->width) / 2 - (nHandleWidth * fHandleScale) / 2; - aCursorBottom.y = twipToPixel(pCursor->y) + twipToPixel(pCursor->height); + aCursorBottom.x = twipToPixel(pCursor->x) * fZoom + twipToPixel(pCursor->width) * fZoom / 2 - (nHandleWidth * fHandleScale) / 2; + aCursorBottom.y = twipToPixel(pCursor->y) * fZoom + twipToPixel(pCursor->height) * fZoom; cairo_save(pCairo); cairo_translate(pCairo, aCursorBottom.x, aCursorBottom.y); cairo_scale(pCairo, fHandleScale, fHandleScale); @@ -350,10 +363,10 @@ static gboolean renderOverlay(GtkWidget* pWidget, GdkEventExpose* pEvent, gpoint cairo_set_source_rgb(pCairo, 0, 0, 0); cairo_rectangle(pCairo, - twipToPixel(pDocView->m_aVisibleCursor.x), - twipToPixel(pDocView->m_aVisibleCursor.y), - twipToPixel(pDocView->m_aVisibleCursor.width), - twipToPixel(pDocView->m_aVisibleCursor.height)); + twipToPixel(pDocView->m_aVisibleCursor.x) * pDocView->fZoom, + twipToPixel(pDocView->m_aVisibleCursor.y) * pDocView->fZoom, + twipToPixel(pDocView->m_aVisibleCursor.width) * pDocView->fZoom, + twipToPixel(pDocView->m_aVisibleCursor.height) * pDocView->fZoom); cairo_fill(pCairo); } @@ -363,7 +376,9 @@ static gboolean renderOverlay(GtkWidget* pWidget, GdkEventExpose* pEvent, gpoint // Have a cursor, but no selection: we need the middle handle. if (!pDocView->m_pHandleMiddle) pDocView->m_pHandleMiddle = cairo_image_surface_create_from_png(CURSOR_HANDLE_DIR "handle_middle.png"); - lcl_renderHandle(pCairo, &pDocView->m_aVisibleCursor, pDocView->m_pHandleMiddle, &pDocView->m_aHandleMiddleRect); + lcl_renderHandle(pCairo, &pDocView->m_aVisibleCursor, + pDocView->m_pHandleMiddle, &pDocView->m_aHandleMiddleRect, + pDocView->fZoom); } if (pDocView->m_pTextSelectionRectangles) @@ -375,7 +390,11 @@ static gboolean renderOverlay(GtkWidget* pWidget, GdkEventExpose* pEvent, gpoint GdkRectangle* pRectangle = i->data; // Blue with 75% transparency. cairo_set_source_rgba(pCairo, ((double)0x43)/255, ((double)0xac)/255, ((double)0xe8)/255, 0.25); - cairo_rectangle(pCairo, twipToPixel(pRectangle->x), twipToPixel(pRectangle->y), twipToPixel(pRectangle->width), twipToPixel(pRectangle->height)); + cairo_rectangle(pCairo, + twipToPixel(pRectangle->x) * pDocView->fZoom, + twipToPixel(pRectangle->y) * pDocView->fZoom, + twipToPixel(pRectangle->width) * pDocView->fZoom, + twipToPixel(pRectangle->height) * pDocView->fZoom); cairo_fill(pCairo); } @@ -385,14 +404,18 @@ static gboolean renderOverlay(GtkWidget* pWidget, GdkEventExpose* pEvent, gpoint // Have a start position: we need a start handle. if (!pDocView->m_pHandleStart) pDocView->m_pHandleStart = cairo_image_surface_create_from_png(CURSOR_HANDLE_DIR "handle_start.png"); - lcl_renderHandle(pCairo, &pDocView->m_aTextSelectionStart, pDocView->m_pHandleStart, &pDocView->m_aHandleStartRect); + lcl_renderHandle(pCairo, &pDocView->m_aTextSelectionStart, + pDocView->m_pHandleStart, &pDocView->m_aHandleStartRect, + pDocView->fZoom); } if (!lcl_isEmptyRectangle(&pDocView->m_aTextSelectionEnd)) { // Have a start position: we need an end handle. if (!pDocView->m_pHandleEnd) pDocView->m_pHandleEnd = cairo_image_surface_create_from_png(CURSOR_HANDLE_DIR "handle_end.png"); - lcl_renderHandle(pCairo, &pDocView->m_aTextSelectionEnd, pDocView->m_pHandleEnd, &pDocView->m_aHandleEndRect); + lcl_renderHandle(pCairo, &pDocView->m_aTextSelectionEnd, + pDocView->m_pHandleEnd, &pDocView->m_aHandleEndRect, + pDocView->fZoom); } } @@ -565,6 +588,7 @@ static GList* lcl_payloadToRectangles(const char* pPayload) g_strfreev(ppRectangles); return pRet; } + /// Invoked on the main thread if lok_docview_callback_worker() requests so. static gboolean lok_docview_callback(gpointer pData) { |