protected void vOnTimer(Object obj) { int cur = m_prange_start; int cnt = m_prange_end; if (m_drawbmp) { while (cur < cnt) { if (m_pages[cur].NeedBmp()) break; cur++; } if (cur >= cnt) { m_drawbmp = false; cur = 0; while (cur < cnt) { m_pages[cur].DeleteBmp(); cur++; } if (m_listener != null) m_listener.OnPDFInvalidate(false); } } else { while (cur < cnt) { if (!m_pages[cur].IsFinished()) { if (m_listener != null) m_listener.OnPDFInvalidate(false); break; } cur++; } } }
@Override public void handleMessage(Message msg) { switch (msg.what) // render finished. { case 0: if (m_listener != null) m_listener.OnPDFInvalidate(false); break; case 1: // find operation returned. { if (msg.arg1 == 1) // succeeded { PDFView.this.vFindGoto(); if (m_listener != null) m_listener.OnPDFFound(true); } else { if (m_listener != null) m_listener.OnPDFFound(false); } } break; case 100: // timer if (m_scroller.isFinished() && m_pages != null && m_status != STA_ZOOM) vOnTimer(msg.obj); break; } super.handleMessage(msg); }
public int vFind(int dir) { if (m_pages == null) return -1; int ret = m_finder.find_prepare(dir); if (ret == 1) { if (m_listener != null) m_listener.OnPDFFound(true); vFindGoto(); return 0; // succeeded } if (ret == 0) { if (m_listener != null) m_listener.OnPDFFound(false); return -1; // failed } m_thread.start_find(m_finder); // need thread operation. return 1; }
public void vRenderSync(PDFVPage page) { if (m_pages == null || page == null) return; m_thread.end_render(page); page.RenderPrepare(); page.m_cache.Render(); if (m_listener != null) m_listener.OnPDFInvalidate(false); }
protected void vFindGoto() { if (m_pages == null) return; int pg = m_finder.find_get_page(); if (pg < 0 || pg >= m_doc.GetPageCount()) return; float pos[] = m_finder.find_get_pos(); if (pos == null) return; pos[0] = m_pages[pg].ToDIBX(pos[0]) + m_pages[pg].GetX(); pos[1] = m_pages[pg].ToDIBY(pos[1]) + m_pages[pg].GetY(); pos[2] = m_pages[pg].ToDIBX(pos[2]) + m_pages[pg].GetX(); pos[3] = m_pages[pg].ToDIBY(pos[3]) + m_pages[pg].GetY(); float x = m_scroller.getCurrX(); float y = m_scroller.getCurrY(); if (x > pos[0] - m_w / 8) x = pos[0] - m_w / 8; if (x < pos[2] - m_w * 7 / 8) x = pos[2] - m_w * 7 / 8; if (y > pos[1] - m_h / 8) y = pos[1] - m_h / 8; if (y < pos[3] - m_h * 7 / 8) y = pos[3] - m_h * 7 / 8; if (x > m_docw - m_w) x = m_docw - m_w; if (x < 0) x = 0; if (y > m_doch - m_h) y = m_doch - m_h; if (y < 0) y = 0; m_scroller.forceFinished(true); m_scroller.abortAnimation(); m_scroller.setFinalX((int) x); m_scroller.setFinalY((int) y); m_scroller.computeScrollOffset(); if (m_listener != null) m_listener.OnPDFInvalidate(false); }
public void vSetPageGap(int gap) { m_page_gap = gap; PDFPos pos = vGetPos(0, 0); vLayout(); vSetPos(pos, 0, 0); if (m_listener != null) m_listener.OnPDFInvalidate(false); }
public void vSetBmpFormat(Config format) { if (m_bmp_format == format || format == Config.ALPHA_8) return; m_bmp_format = format; if (m_bmp != null) { m_bmp.recycle(); m_bmp = Bitmap.createBitmap(m_w, m_h, format); m_listener.OnPDFInvalidate(false); } }
public void vClearSel() { if (m_pages == null) return; int pcur = 0; int pcnt = m_pages.length; while (pcur < pcnt) { m_pages[pcur].ClearSel(); pcur++; } if (m_listener != null) m_listener.OnPDFInvalidate(false); }
public void vResize(int w, int h) { if (w == 0 || h == 0 || m_lock == 4) return; if (m_bmp != null) m_bmp.recycle(); m_bmp = Bitmap.createBitmap(w, h, m_bmp_format); m_w = w; m_h = h; vLayout(); if (m_listener != null) { m_listener.OnPDFInvalidate(false); } }
public void vOpen(Document doc, int page_gap, int back_color, PDFViewListener listener) { vClose(); m_doc = doc; m_thread = new PDFVThread(m_hand_ui); m_thread.start(); m_page_gap = page_gap; m_back = back_color; m_finder = new PDFVFinder(); m_listener = listener; vLayout(); if (m_listener != null) m_listener.OnPDFInvalidate(false); }
private boolean motionZoom(MotionEvent event) { switch (event.getActionMasked()) { case MotionEvent.ACTION_MOVE: if (m_status == STA_ZOOM) { float dx = event.getX(0) - event.getX(1); float dy = event.getY(0) - event.getY(1); m_zoom_dis2 = Global.sqrtf(dx * dx + dy * dy); float scale = m_zoom_scale * m_zoom_dis2 / m_zoom_dis1; if (m_scale / scale > 1.0001 || m_scale / scale < 0.999) { m_scale = scale; vLayout(); vSetPos(m_zoom_pos, (int) m_holdx, (int) m_holdy); } } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: case MotionEvent.ACTION_CANCEL: if (m_status == STA_ZOOM) { m_status = STA_NONE; float dx = event.getX(0) - event.getX(1); float dy = event.getY(0) - event.getY(1); m_zoom_dis2 = Global.sqrtf(dx * dx + dy * dy); float scale = m_zoom_scale * m_zoom_dis2 / m_zoom_dis1; if (m_scale / scale > 1.0001 || m_scale / scale < 0.999) { m_scale = scale; vLayout(); vSetPos(m_zoom_pos, (int) m_holdx, (int) m_holdy); } if (m_listener != null) { m_listener.OnPDFInvalidate(false); m_listener.OnPDFZoomEnd(); } vOnZoomEnd(); } break; } return true; }
public void vSetSel(float x1, float y1, float x2, float y2) { if (m_pages == null) return; int pcur = 0; int pcnt = m_pages.length; while (pcur < pcnt) { m_pages[pcur].ClearSel(); pcur++; } PDFPos pos = vGetPos((int) x1, (int) y1); PDFVPage vpage = m_pages[pos.pageno]; vpage.SetSel(x1, y1, x2, y2, m_scroller.getCurrX(), m_scroller.getCurrY()); if (m_listener != null) m_listener.OnPDFInvalidate(false); }
protected void vFlushRange() { if (m_status == STA_ZOOM) return; int pageno1 = vGetPage(0, 0); int pageno2 = vGetPage(m_w, m_h); if (pageno1 >= 0 && pageno2 >= 0) { if (pageno1 > pageno2) { int tmp = pageno1; pageno1 = pageno2; pageno2 = tmp; } pageno2++; if (m_prange_start < pageno1) { int start = m_prange_start; int end = pageno1; if (end > m_prange_end) end = m_prange_end; while (start < end) { PDFVPage vpage = m_pages[start]; m_thread.end_render(vpage); vpage.DeleteBmp(); start++; } } if (m_prange_end > pageno2) { int start = pageno2; int end = m_prange_end; if (start < m_prange_start) start = m_prange_start; while (start < end) { PDFVPage vpage = m_pages[start]; m_thread.end_render(vpage); vpage.DeleteBmp(); start++; } } } else { int start = m_prange_start; int end = m_prange_end; while (start < end) { PDFVPage vpage = m_pages[start]; m_thread.end_render(vpage); vpage.DeleteBmp(); start++; } } m_prange_start = pageno1; m_prange_end = pageno2; pageno1 = vGetPage(m_w / 4, m_h / 4); if (m_listener != null && pageno1 != m_pageno) { m_listener.OnPDFPageChanged(m_pageno = pageno1); } }
public void vGotoPage(int pageno) { if (m_pages == null || pageno < 0 || pageno >= m_pages.length) return; float x = m_pages[pageno].GetX(); float y = m_pages[pageno].GetY(); if (x > m_docw - m_w) x = m_docw - m_w; if (x < 0) x = 0; if (y > m_doch - m_h) y = m_doch - m_h; if (y < 0) y = 0; m_scroller.forceFinished(true); m_scroller.abortAnimation(); m_scroller.setFinalX((int) x); m_scroller.setFinalY((int) y); m_scroller.computeScrollOffset(); if (m_listener != null) m_listener.OnPDFInvalidate(false); }
/** * zoom operations * * @param scale absolute scale value apply to View * @param fx fixed point * @param fy fixed point */ public void vSetScale(float scale, float fx, float fy) { if (m_pages == null) return; PDFPos pos = vGetPos((int) fx, (int) fy); int cur = 0; int cnt = m_pages.length; while (cur < cnt) { m_pages[cur].CreateBmp(m_bmp_format); m_thread.end_render(m_pages[cur]); cur++; } m_drawbmp = true; m_scale = scale; vLayout(); vSetPos(pos, (int) fx, (int) fy); if (m_listener != null) m_listener.OnPDFInvalidate(false); }
/** * set Position to point in view coordinate, implement in derived class.<br> * pass (0,0) to set position to left-top corner. * * @param pos position in PDF coordinate. * @param vx * @param vy */ public void vSetPos(PDFPos pos, int vx, int vy) { if (pos == null || m_pages == null || pos.pageno < 0 || pos.pageno >= m_pages.length) return; float x = m_pages[pos.pageno].GetX() + pos.x * m_scale - vx; float y = m_pages[pos.pageno].GetY() + ((m_doc.GetPageHeight(pos.pageno) - pos.y) * m_scale) - vy; if (x > m_docw - m_w) x = m_docw - m_w; if (x < 0) x = 0; if (y > m_doch - m_h) y = m_doch - m_h; if (y < 0) y = 0; m_scroller.forceFinished(true); m_scroller.abortAnimation(); m_scroller.setFinalX((int) x); m_scroller.setFinalY((int) y); m_scroller.computeScrollOffset(); if (m_listener != null) m_listener.OnPDFInvalidate(false); }
private boolean motionSelect(MotionEvent event) { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: m_holdx = event.getX(); m_holdy = event.getY(); vClearSel(); break; case MotionEvent.ACTION_MOVE: m_movex = event.getX(); m_movey = event.getY(); vSetSel(m_holdx, m_holdy, m_movex, m_movey); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: m_movex = event.getX(); m_movey = event.getY(); vSetSel(m_holdx, m_holdy, m_movex, m_movey); if (m_listener != null) m_listener.OnPDFSelectEnd(); break; } return true; }
public void vComputeScroll() { if (m_scroller.computeScrollOffset()) { if (m_listener != null) m_listener.OnPDFInvalidate(true); } }
public void vDraw(Canvas canvas) { if (m_pages == null) return; // long rec_time = System.currentTimeMillis(); int left = m_scroller.getCurrX(); int top = m_scroller.getCurrY(); int left1 = left; int top1 = top; if (left1 > m_docw - m_w) left1 = m_docw - m_w; if (left1 < 0) left1 = 0; if (top1 > m_doch - m_h) top1 = m_doch - m_h; if (top1 < 0) top1 = 0; if (left1 != left) { m_scroller.setFinalX(left1); left = left1; } if (top1 != top) { m_scroller.setFinalY(top1); top = top1; } vFlushRange(); int cur = m_prange_start; int end = m_prange_end; int sel_rect1[] = null; int sel_rect2[] = null; if (m_drawbmp) { if (Global.dark_mode) { m_bmp.eraseColor(m_back); Canvas bcan = new Canvas(m_bmp); while (cur < end) { PDFVPage vpage = m_pages[cur]; if (m_status != STA_ZOOM) m_thread.start_render(vpage); vpage.Draw(bcan, left, top); if (sel_rect1 == null || sel_rect2 == null) { sel_rect1 = vpage.GetSelRect1(left, top); sel_rect2 = vpage.GetSelRect2(left, top); } if (m_finder.find_get_page() == cur) m_finder.find_draw(bcan, vpage, left, top); cur++; } m_draw_bmp.Create(m_bmp); m_draw_bmp.Invert(); m_draw_bmp.Free(m_bmp); // Log.i("time_d1", String.valueOf(System.currentTimeMillis() - rec_time)); canvas.drawBitmap(m_bmp, 0, 0, null); // Log.i("time_d2", String.valueOf(System.currentTimeMillis() - rec_time)); } else { canvas.drawColor(m_back); while (cur < end) { PDFVPage vpage = m_pages[cur]; if (m_status != STA_ZOOM) m_thread.start_render(vpage); if (sel_rect1 == null || sel_rect2 == null) { sel_rect1 = vpage.GetSelRect1(left, top); sel_rect2 = vpage.GetSelRect2(left, top); } vpage.Draw(canvas, left, top); if (m_finder.find_get_page() == cur) m_finder.find_draw(canvas, vpage, left, top); cur++; } } } else { m_bmp.eraseColor(m_back); // Log.i("time_d0", String.valueOf(System.currentTimeMillis() - rec_time)); m_draw_bmp.Create(m_bmp); while (cur < end) { PDFVPage vpage = m_pages[cur]; m_thread.start_render(vpage); if (sel_rect1 == null || sel_rect2 == null) { sel_rect1 = vpage.GetSelRect1(left, top); sel_rect2 = vpage.GetSelRect2(left, top); } vpage.Draw(m_draw_bmp, left, top); if (m_finder.find_get_page() == cur) m_finder.find_draw(m_draw_bmp, vpage, left, top); cur++; } if (Global.dark_mode) m_draw_bmp.Invert(); m_draw_bmp.Free(m_bmp); // Log.i("time_d1", String.valueOf(System.currentTimeMillis() - rec_time)); canvas.drawBitmap(m_bmp, 0, 0, null); // Log.i("time_d2", String.valueOf(System.currentTimeMillis() - rec_time)); } if (m_listener != null) { cur = m_prange_start; end = m_prange_end; while (cur < end) { m_listener.OnPDFPageDisplayed(canvas, m_pages[cur]); cur++; } if (sel_rect1 != null && sel_rect2 != null) m_listener.OnPDFSelecting(canvas, sel_rect1, sel_rect2); } // Log.i("time_draw", String.valueOf(System.currentTimeMillis() - rec_time)); }
public void vSetBackColor(int color) { m_back = color; if (m_listener != null) m_listener.OnPDFInvalidate(false); }
protected boolean motionNormal(MotionEvent event) { if (m_gesture.onTouchEvent(event)) return true; switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: if (m_status == STA_NONE) { m_scroller.forceFinished(true); m_scroller.abortAnimation(); m_holdsx = m_scroller.getCurrX(); m_holdsy = m_scroller.getCurrY(); m_holdx = event.getX(); m_holdy = event.getY(); m_status = STA_MOVING; } break; case MotionEvent.ACTION_MOVE: if (m_status == STA_MOVING) { m_movex = event.getX(); m_movey = event.getY(); int x = (int) (m_holdsx + m_holdx - m_movex); int y = (int) (m_holdsy + m_holdy - m_movey); if (m_lock == 1 || m_lock == 3) x = (int) m_holdsx; if (m_lock == 2 || m_lock == 3) y = (int) m_holdsy; if (x + m_w > m_docw) x = m_docw - m_w; if (x < 0) x = 0; if (y + m_h > m_doch) y = m_doch - m_h; if (y < 0) y = 0; m_scroller.setFinalX(x); m_scroller.setFinalY(y); if (m_listener != null) m_listener.OnPDFInvalidate(false); } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: if (m_status == STA_MOVING) { m_movex = event.getX(); m_movey = event.getY(); int x = (int) (m_holdsx + m_holdx - m_movex); int y = (int) (m_holdsy + m_holdy - m_movey); if (m_lock == 1 || m_lock == 3) x = (int) m_holdsx; if (m_lock == 2 || m_lock == 3) y = (int) m_holdsy; if (x + m_w > m_docw) x = m_docw - m_w; if (x < 0) x = 0; if (y + m_h > m_doch) y = m_doch - m_h; if (y < 0) y = 0; m_scroller.setFinalX(x); m_scroller.setFinalY(y); m_status = STA_NONE; vOnMoveEnd(x, y); if (m_listener != null) m_listener.OnPDFInvalidate(false); } break; case MotionEvent.ACTION_POINTER_DOWN: if (event.getPointerCount() == 2 && m_status == STA_MOVING && m_lock != 5) { m_scroller.forceFinished(true); m_scroller.abortAnimation(); m_holdx = (event.getX(0) + event.getX(1)) / 2; m_holdy = (event.getY(0) + event.getY(1)) / 2; float dx = event.getX(0) - event.getX(1); float dy = event.getY(0) - event.getY(1); m_zoom_pos = vGetPos((int) m_holdx, (int) m_holdy); m_zoom_dis1 = Global.sqrtf(dx * dx + dy * dy); m_zoom_dis2 = m_zoom_dis1; m_zoom_scale = m_scale; int cur = m_prange_start; int cnt = m_prange_end; while (cur < cnt) { m_pages[cur].CreateBmp(m_bmp_format); m_thread.end_render(m_pages[cur]); cur++; } m_drawbmp = true; m_status = STA_ZOOM; if (m_listener != null) m_listener.OnPDFZoomStart(); } break; } return true; }