⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pdfcore.cc

📁 这是一个做pdf阅读器的源代码文件,是大家学习阅读器资料的很好参考
💻 CC
📖 第 1 页 / 共 4 页
字号:
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 + -