📄 pdfcore.cc
字号:
void PDFCore::scrollToTopEdge() { int y; y = continuousMode ? pageY[topPage - 1] : 0; update(topPage, scrollX, y, zoom, rotate, gFalse, gFalse);}void PDFCore::scrollToBottomEdge() { PDFCorePage *page; int y, i; for (i = pages->getLength() - 1; i > 0; --i) { page = (PDFCorePage *)pages->get(i); if (page->yDest < drawAreaHeight) { break; } } page = (PDFCorePage *)pages->get(i); if (continuousMode) { y = pageY[page->page - 1] + page->h - drawAreaHeight; } else { y = page->h - drawAreaHeight; } update(topPage, scrollX, y, zoom, rotate, gFalse, gFalse);}void PDFCore::scrollToTopLeft() { int y; y = continuousMode ? pageY[topPage - 1] : 0; update(topPage, 0, y, zoom, rotate, gFalse, gFalse);}void PDFCore::scrollToBottomRight() { PDFCorePage *page; int x, y, i; for (i = pages->getLength() - 1; i > 0; --i) { page = (PDFCorePage *)pages->get(i); if (page->yDest < drawAreaHeight) { break; } } page = (PDFCorePage *)pages->get(i); x = page->w - drawAreaWidth; if (continuousMode) { y = pageY[page->page - 1] + page->h - drawAreaHeight; } else { y = page->h - drawAreaHeight; } update(topPage, x, y, zoom, rotate, gFalse, gFalse);}void PDFCore::zoomToRect(int pg, double ulx, double uly, double lrx, double lry) { int x0, y0, x1, y1, u, sx, sy; double rx, ry, newZoom, t; PDFCorePage *p; cvtUserToDev(pg, ulx, uly, &x0, &y0); cvtUserToDev(pg, lrx, lry, &x1, &y1); if (x0 > x1) { u = x0; x0 = x1; x1 = u; } if (y0 > y1) { u = y0; y0 = y1; y1 = u; } rx = (double)drawAreaWidth / (double)(x1 - x0); ry = (double)drawAreaHeight / (double)(y1 - y0); if (rx < ry) { newZoom = rx * (dpi / (0.01 * 72)); sx = (int)(rx * x0); t = (drawAreaHeight * (x1 - x0)) / drawAreaWidth; sy = (int)(rx * (y0 + y1 - t) / 2); if (continuousMode) { if ((p = findPage(pg)) && p->w < maxPageW) { sx += (int)(0.5 * rx * (maxPageW - p->w)); } u = (pg - 1) * continuousModePageSpacing; sy += (int)(rx * (pageY[pg - 1] - u)) + u; } } else { newZoom = ry * (dpi / (0.01 * 72)); t = (drawAreaWidth * (y1 - y0)) / drawAreaHeight; sx = (int)(ry * (x0 + x1 - t) / 2); sy = (int)(ry * y0); if (continuousMode) { if ((p = findPage(pg)) && p->w < maxPageW) { sx += (int)(0.5 * rx * (maxPageW - p->w)); } u = (pg - 1) * continuousModePageSpacing; sy += (int)(ry * (pageY[pg - 1] - u)) + u; } } update(pg, sx, sy, newZoom, rotate, gFalse, gFalse);}void PDFCore::zoomCentered(double zoomA) { int sx, sy, rot, hAdjust, vAdjust, i; double dpi1, dpi2, pageW, pageH; PDFCorePage *page; if (zoomA == zoomPage) { if (continuousMode) { pageW = (rotate == 90 || rotate == 270) ? maxUnscaledPageH : maxUnscaledPageW; pageH = (rotate == 90 || rotate == 270) ? maxUnscaledPageW : maxUnscaledPageH; dpi1 = 72.0 * (double)drawAreaWidth / pageW; dpi2 = 72.0 * (double)(drawAreaHeight - continuousModePageSpacing) / pageH; if (dpi2 < dpi1) { dpi1 = dpi2; } } else { // in single-page mode, sx=sy=0 -- so dpi1 is irrelevant dpi1 = dpi; } sx = 0; } else if (zoomA == zoomWidth) { if (continuousMode) { pageW = (rotate == 90 || rotate == 270) ? maxUnscaledPageH : maxUnscaledPageW; } else { rot = rotate + doc->getPageRotate(topPage); if (rot >= 360) { rot -= 360; } else if (rot < 0) { rot += 360; } pageW = (rot == 90 || rot == 270) ? doc->getPageCropHeight(topPage) : doc->getPageCropWidth(topPage); } dpi1 = 72.0 * (double)drawAreaWidth / pageW; sx = 0; } else if (zoomA <= 0) { return; } else { dpi1 = 72.0 * zoomA / 100.0; if ((page = (PDFCorePage *)pages->get(0)) && page->xDest > 0) { hAdjust = page->xDest; } else { hAdjust = 0; } sx = (int)((scrollX - hAdjust + drawAreaWidth / 2) * (dpi1 / dpi)) - drawAreaWidth / 2; if (sx < 0) { sx = 0; } } if (continuousMode) { // we can't just multiply scrollY by dpi1/dpi -- the rounding // errors add up (because the pageY values are integers) -- so // we compute the pageY values at the new zoom level instead sy = 0; for (i = 1; i < topPage; ++i) { rot = rotate + doc->getPageRotate(i); if (rot >= 360) { rot -= 360; } else if (rot < 0) { rot += 360; } if (rot == 90 || rot == 270) { sy += (int)((doc->getPageCropWidth(i) * dpi1) / 72 + 0.5); } else { sy += (int)((doc->getPageCropHeight(i) * dpi1) / 72 + 0.5); } } vAdjust = (topPage - 1) * continuousModePageSpacing; sy = sy + (int)((scrollY - pageY[topPage - 1] + drawAreaHeight / 2) * (dpi1 / dpi)) + vAdjust - drawAreaHeight / 2; } else { sy = (int)((scrollY + drawAreaHeight / 2) * (dpi1 / dpi)) - drawAreaHeight / 2; } update(topPage, sx, sy, zoomA, rotate, gFalse, gFalse);}// Zoom so that the current page(s) fill the window width. Maintain// the vertical center.void PDFCore::zoomToCurrentWidth() { double w, maxW, dpi1; int sx, sy, vAdjust, rot, i; // compute the maximum page width of visible pages rot = rotate + doc->getPageRotate(topPage); if (rot >= 360) { rot -= 360; } else if (rot < 0) { rot += 360; } if (rot == 90 || rot == 270) { maxW = doc->getPageCropHeight(topPage); } else { maxW = doc->getPageCropWidth(topPage); } if (continuousMode) { for (i = topPage + 1; i < doc->getNumPages() && pageY[i-1] < scrollY + drawAreaHeight; ++i) { rot = rotate + doc->getPageRotate(i); if (rot >= 360) { rot -= 360; } else if (rot < 0) { rot += 360; } if (rot == 90 || rot == 270) { w = doc->getPageCropHeight(i); } else { w = doc->getPageCropWidth(i); } if (w > maxW) { maxW = w; } } } // compute the resolution dpi1 = (drawAreaWidth / maxW) * 72; // compute the horizontal scroll position if (continuousMode) { sx = ((int)(maxPageW * dpi1 / dpi) - drawAreaWidth) / 2; } else { sx = 0; } // compute the vertical scroll position if (continuousMode) { // we can't just multiply scrollY by dpi1/dpi -- the rounding // errors add up (because the pageY values are integers) -- so // we compute the pageY values at the new zoom level instead sy = 0; for (i = 1; i < topPage; ++i) { rot = rotate + doc->getPageRotate(i); if (rot >= 360) { rot -= 360; } else if (rot < 0) { rot += 360; } if (rot == 90 || rot == 270) { sy += (int)((doc->getPageCropWidth(i) * dpi1) / 72 + 0.5); } else { sy += (int)((doc->getPageCropHeight(i) * dpi1) / 72 + 0.5); } } vAdjust = (topPage - 1) * continuousModePageSpacing; sy = sy + (int)((scrollY - pageY[topPage - 1] + drawAreaHeight / 2) * (dpi1 / dpi)) + vAdjust - drawAreaHeight / 2; } else { sy = (int)((scrollY + drawAreaHeight / 2) * (dpi1 / dpi)) - drawAreaHeight / 2; } update(topPage, sx, sy, (dpi1 * 100) / 72, rotate, gFalse, gFalse);}void PDFCore::setContinuousMode(GBool cm) { if (continuousMode != cm) { continuousMode = cm; update(topPage, scrollX, -1, zoom, rotate, gTrue, gFalse); }}void PDFCore::setSelection(int newSelectPage, int newSelectULX, int newSelectULY, int newSelectLRX, int newSelectLRY) { int x0, y0, x1, y1, py; GBool haveSel, newHaveSel; GBool needRedraw, needScroll; GBool moveLeft, moveRight, moveTop, moveBottom; SplashColor xorColor; PDFCorePage *page; haveSel = selectULX != selectLRX && selectULY != selectLRY; newHaveSel = newSelectULX != newSelectLRX && newSelectULY != newSelectLRY; // erase old selection on off-screen bitmap needRedraw = gFalse; if (haveSel) { xorColor[0] = xorColor[1] = xorColor[2] = 0xff; xorRectangle(selectPage, selectULX, selectULY, selectLRX, selectLRY, new SplashSolidColor(xorColor)); needRedraw = gTrue; } // draw new selection on off-screen bitmap if (newHaveSel) { xorColor[0] = xorColor[1] = xorColor[2] = 0xff; xorRectangle(newSelectPage, newSelectULX, newSelectULY, newSelectLRX, newSelectLRY, new SplashSolidColor(xorColor)); needRedraw = gTrue; } // check which edges moved if (!haveSel || newSelectPage != selectPage) { moveLeft = moveTop = moveRight = moveBottom = gTrue; } else { moveLeft = newSelectULX != selectULX; moveTop = newSelectULY != selectULY; moveRight = newSelectLRX != selectLRX; moveBottom = newSelectLRY != selectLRY; } // redraw currently visible part of bitmap if (needRedraw) { if (!haveSel) { page = findPage(newSelectPage); x0 = newSelectULX; y0 = newSelectULY; x1 = newSelectLRX; y1 = newSelectLRY; redrawWindow(page->xDest + x0, page->yDest + y0, x1 - x0 + 1, y1 - y0 + 1, gFalse); } else if (!newHaveSel) { if ((page = findPage(selectPage))) { x0 = selectULX; y0 = selectULY; x1 = selectLRX; y1 = selectLRY; redrawWindow(page->xDest + x0, page->yDest + y0, x1 - x0 + 1, y1 - y0 + 1, gFalse); } } else { page = findPage(newSelectPage); if (moveLeft) { x0 = newSelectULX < selectULX ? newSelectULX : selectULX; y0 = newSelectULY < selectULY ? newSelectULY : selectULY; x1 = newSelectULX > selectULX ? newSelectULX : selectULX; y1 = newSelectLRY > selectLRY ? newSelectLRY : selectLRY; redrawWindow(page->xDest + x0, page->yDest + y0, x1 - x0 + 1, y1 - y0 + 1, gFalse); } if (moveRight) { x0 = newSelectLRX < selectLRX ? newSelectLRX : selectLRX; y0 = newSelectULY < selectULY ? newSelectULY : selectULY; x1 = newSelectLRX > selectLRX ? newSelectLRX : selectLRX; y1 = newSelectLRY > selectLRY ? newSelectLRY : selectLRY; redrawWindow(page->xDest + x0, page->yDest + y0, x1 - x0 + 1, y1 - y0 + 1, gFalse); } if (moveTop) { x0 = newSelectULX < selectULX ? newSelectULX : selectULX; y0 = newSelectULY < selectULY ? newSelectULY : selectULY; x1 = newSelectLRX > selectLRX ? newSelectLRX : selectLRX; y1 = newSelectULY > selectULY ? newSelectULY : selectULY; redrawWindow(page->xDest + x0, page->yDest + y0, x1 - x0 + 1, y1 - y0 + 1, gFalse); } if (moveBottom) { x0 = newSelectULX < selectULX ? newSelectULX : selectULX; y0 = newSelectLRY < selectLRY ? newSelectLRY : selectLRY; x1 = newSelectLRX > selectLRX ? newSelectLRX : selectLRX; y1 = newSelectLRY > selectLRY ? newSelectLRY : selectLRY; redrawWindow(page->xDest + x0, page->yDest + y0, x1 - x0 + 1, y1 - y0 + 1, gFalse); } } } // switch to new selection coords selectPage = newSelectPage; selectULX = newSelectULX; selectULY = newSelectULY; selectLRX = newSelectLRX; selectLRY = newSelectLRY; // scroll if necessary if (newHaveSel) { page = findPage(selectPage); needScroll = gFalse; x0 = scrollX; y0 = scrollY; if (moveLeft && page->xDest + selectULX < 0) { x0 += page->xDest + selectULX; needScroll = gTrue; } else if (moveRight && page->xDest + selectLRX >= drawAreaWidth) { x0 += page->xDest + selectLRX - drawAreaWidth; needScroll = gTrue; } else if (moveLeft && page->xDest + selectULX >= drawAreaWidth) { x0 += page->xDest + selectULX - drawAreaWidth; needScroll = gTrue; } else if (moveRight && page->xDest + selectLRX < 0) { x0 += page->xDest + selectLRX; needScroll = gTrue; } py = continuousMode ? pageY[selectPage - 1] : 0; if (moveTop && py + selectULY < y0) { y0 = py + selectULY; needScroll = gTrue; } else if (moveBottom && py + selectLRY >= y0 + drawAreaHeight) { y0 = py + selectLRY - drawAreaHeight; needScroll = gTrue; } else if (moveTop && py + selectULY >= y0 + drawAreaHeight) { y0 = py + selectULY - drawAreaHeight; needScroll = gTrue; } else if (moveBottom && py + selectLRY < y0) { y0 = py + selectLRY; needScroll = gTrue; } if (needScroll) { scrollTo(x0, y0); } }}void PDFCore::moveSelection(int pg, int x, int y) { int newSelectULX, newSelectULY, newSelectLRX, newSelectLRY; // don't allow selections to span multiple pages if (pg != selectPage) { return; } // move appropriate edges of selection if (lastDragLeft) { if (x < selectLRX) { newSelectULX = x; newSelectLRX = selectLRX; } else { newSelectULX = selectLRX; newSelectLRX = x; lastDragLeft = gFalse; } } else { if (x > selectULX) { newSelectULX = selectULX; newSelectLRX = x; } else { newSelectULX = x; newSelectLRX = selectULX; lastDragLeft = gTrue; } } if (lastDragTop) { if (y < selectLRY) { newSelectULY = y; newSelectLRY = selectLRY; } else { newSelectULY = selectLRY; newSelectLRY = y; lastDragTop = gFalse; } } else { if (y > selectULY) { newSelectULY = selectULY; newSelectLRY = y; } else { newSelectULY = y; newSelectLRY = selectULY; lastDragTop = gTrue; } } // redraw the selection setSelection(selectPage, newSelectULX, newSelectULY, newSelectLRX, newSelectLRY);}void PDFCore::xorRectangle(int pg, int x0, int y0, int x1, int y1, SplashPattern *pattern, PDFCoreTile *oneTile) { Splash *splash; SplashPath *path; PDFCorePage *page; PDFCoreTile *tile; SplashCoord xx0, yy0, xx1, yy1; int xi, yi, wi, hi; int i; if ((page = findPage(pg))) { for (i = 0; i < page->tiles->getLength(); ++i) { tile = (PDFCoreTile *)page->tiles->get(i); if (!oneTile || tile == oneTile) { splash = new Splash(tile->bitmap, gFalse); splash->setFillPattern(pattern->copy()); xx0 = (SplashCoord)(x0 - tile->xMin); yy0 = (SplashCoord)(y0 - tile->yMin); xx1 = (SplashCoord)(x1 - tile->xMin); yy1 = (SplashCoord)(y1 - tile->yMin); path = new SplashPath(); path->moveTo(xx0, yy0); path->lineTo(xx1, yy0); path->lineTo(xx1, yy1); path->lineTo(xx0, yy1); path->close(); splash->xorFill(path, gTrue); delete path; delete splash; xi = x0 - tile->xMin; wi = x1 - x0; if (xi < 0) { wi += xi; xi = 0; } if (xi + wi > tile->bitmap->getWidth()) { wi = tile->bitmap->getWidth() - xi; } yi = y0 - tile->yMin; hi = y1 - y0; if (yi < 0) { hi += yi; yi = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -