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

📄 xpdfcore.cc

📁 这是一个做pdf阅读器的源代码文件,是大家学习阅读器资料的很好参考
💻 CC
📖 第 1 页 / 共 4 页
字号:
        gfree(xcolors);      } else {        rgbCubeSize = 1;        colors[0] = BlackPixel(display, screenNum);        colors[1] = WhitePixel(display, screenNum);      }    // allocate colors in shared colormap    } else {      if (rgbCubeSize > xMaxRGBCube) {        rgbCubeSize = xMaxRGBCube;      }      ok = gFalse;      for (rgbCubeSize = rgbCubeSizeA; rgbCubeSize >= 2; --rgbCubeSize) {        ok = gTrue;        n = 0;        for (r = 0; r < rgbCubeSize && ok; ++r) {          for (g = 0; g < rgbCubeSize && ok; ++g) {            for (b = 0; b < rgbCubeSize && ok; ++b) {              if (n == 0) {                colors[n] = BlackPixel(display, screenNum);                ++n;              } else {                xcolor.red = (r * 65535) / (rgbCubeSize - 1);                xcolor.green = (g * 65535) / (rgbCubeSize - 1);                xcolor.blue = (b * 65535) / (rgbCubeSize - 1);                if (XAllocColor(display, colormap, &xcolor)) {                  colors[n++] = xcolor.pixel;                } else {                  ok = gFalse;                }              }            }          }        }        if (ok) {          break;        }        XFreeColors(display, colormap, &colors[1], n-1, 0);      }      if (!ok) {        rgbCubeSize = 1;        colors[0] = BlackPixel(display, screenNum);        colors[1] = WhitePixel(display, screenNum);      }    }  }}void XPDFCore::initWindow() {  Arg args[20];  int n;  // create the cursors  busyCursor = XCreateFontCursor(display, XC_watch);  linkCursor = XCreateFontCursor(display, XC_hand2);  selectCursor = XCreateFontCursor(display, XC_cross);  currentCursor = 0;  // create the scrolled window and scrollbars  n = 0;  XtSetArg(args[n], XmNscrollingPolicy, XmAPPLICATION_DEFINED); ++n;  XtSetArg(args[n], XmNvisualPolicy, XmVARIABLE); ++n;  scrolledWin = XmCreateScrolledWindow(parentWidget, "scroll", args, n);  XtManageChild(scrolledWin);  n = 0;  XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n;  XtSetArg(args[n], XmNminimum, 0); ++n;  XtSetArg(args[n], XmNmaximum, 1); ++n;  XtSetArg(args[n], XmNsliderSize, 1); ++n;  XtSetArg(args[n], XmNvalue, 0); ++n;  XtSetArg(args[n], XmNincrement, 1); ++n;  XtSetArg(args[n], XmNpageIncrement, 1); ++n;  hScrollBar = XmCreateScrollBar(scrolledWin, "hScrollBar", args, n);  if (!fullScreen) {    XtManageChild(hScrollBar);  }  XtAddCallback(hScrollBar, XmNvalueChangedCallback,		&hScrollChangeCbk, (XtPointer)this);#ifndef DISABLE_SMOOTH_SCROLL  XtAddCallback(hScrollBar, XmNdragCallback,		&hScrollDragCbk, (XtPointer)this);#endif  n = 0;  XtSetArg(args[n], XmNorientation, XmVERTICAL); ++n;  XtSetArg(args[n], XmNminimum, 0); ++n;  XtSetArg(args[n], XmNmaximum, 1); ++n;  XtSetArg(args[n], XmNsliderSize, 1); ++n;  XtSetArg(args[n], XmNvalue, 0); ++n;  XtSetArg(args[n], XmNincrement, 1); ++n;  XtSetArg(args[n], XmNpageIncrement, 1); ++n;  vScrollBar = XmCreateScrollBar(scrolledWin, "vScrollBar", args, n);  if (!fullScreen) {    XtManageChild(vScrollBar);  }  XtAddCallback(vScrollBar, XmNvalueChangedCallback,		&vScrollChangeCbk, (XtPointer)this);#ifndef DISABLE_SMOOTH_SCROLL  XtAddCallback(vScrollBar, XmNdragCallback,		&vScrollDragCbk, (XtPointer)this);#endif  // create the drawing area  n = 0;  XtSetArg(args[n], XmNshadowType, XmSHADOW_IN); ++n;  XtSetArg(args[n], XmNmarginWidth, 0); ++n;  XtSetArg(args[n], XmNmarginHeight, 0); ++n;  if (fullScreen) {    XtSetArg(args[n], XmNshadowThickness, 0); ++n;  }  drawAreaFrame = XmCreateFrame(scrolledWin, "drawAreaFrame", args, n);  XtManageChild(drawAreaFrame);  n = 0;  XtSetArg(args[n], XmNresizePolicy, XmRESIZE_ANY); ++n;  XtSetArg(args[n], XmNwidth, 700); ++n;  XtSetArg(args[n], XmNheight, 500); ++n;  drawArea = XmCreateDrawingArea(drawAreaFrame, "drawArea", args, n);  XtManageChild(drawArea);  XtAddCallback(drawArea, XmNresizeCallback, &resizeCbk, (XtPointer)this);  XtAddCallback(drawArea, XmNexposeCallback, &redrawCbk, (XtPointer)this);  XtAddCallback(drawArea, XmNinputCallback, &inputCbk, (XtPointer)this);  resizeCbk(drawArea, this, NULL);  // set up mouse motion translations  XtOverrideTranslations(drawArea, XtParseTranslationTable(      "<Btn1Down>:DrawingAreaInput()\n"      "<Btn1Up>:DrawingAreaInput()\n"      "<Btn1Motion>:DrawingAreaInput()\n"      "<Motion>:DrawingAreaInput()"));  // can't create a GC until the window gets mapped  drawAreaGC = NULL;}void XPDFCore::hScrollChangeCbk(Widget widget, XtPointer ptr,			     XtPointer callData) {  XPDFCore *core = (XPDFCore *)ptr;  XmScrollBarCallbackStruct *data = (XmScrollBarCallbackStruct *)callData;  core->scrollTo(data->value, core->scrollY);}void XPDFCore::hScrollDragCbk(Widget widget, XtPointer ptr,			      XtPointer callData) {  XPDFCore *core = (XPDFCore *)ptr;  XmScrollBarCallbackStruct *data = (XmScrollBarCallbackStruct *)callData;  core->scrollTo(data->value, core->scrollY);}void XPDFCore::vScrollChangeCbk(Widget widget, XtPointer ptr,			     XtPointer callData) {  XPDFCore *core = (XPDFCore *)ptr;  XmScrollBarCallbackStruct *data = (XmScrollBarCallbackStruct *)callData;  core->scrollTo(core->scrollX, data->value);}void XPDFCore::vScrollDragCbk(Widget widget, XtPointer ptr,			      XtPointer callData) {  XPDFCore *core = (XPDFCore *)ptr;  XmScrollBarCallbackStruct *data = (XmScrollBarCallbackStruct *)callData;  core->scrollTo(core->scrollX, data->value);}void XPDFCore::resizeCbk(Widget widget, XtPointer ptr, XtPointer callData) {  XPDFCore *core = (XPDFCore *)ptr;  XEvent event;  Widget top;  Window rootWin;  int x1, y1;  Guint w1, h1, bw1, depth1;  Arg args[2];  int n;  Dimension w, h;  int sx, sy;  // find the top-most widget which has an associated window, and look  // for a pending ConfigureNotify in the event queue -- if there is  // one, and it specifies a different width or height, that means  // we're still resizing, and we want to skip the current event  for (top = core->parentWidget;       XtParent(top) && XtWindow(XtParent(top));       top = XtParent(top)) ;  if (XCheckTypedWindowEvent(core->display, XtWindow(top),			     ConfigureNotify, &event)) {    XPutBackEvent(core->display, &event);    XGetGeometry(core->display, event.xconfigure.window,		 &rootWin, &x1, &y1, &w1, &h1, &bw1, &depth1);    if ((Guint)event.xconfigure.width != w1 ||	(Guint)event.xconfigure.height != h1) {      return;    }  }  n = 0;  XtSetArg(args[n], XmNwidth, &w); ++n;  XtSetArg(args[n], XmNheight, &h); ++n;  XtGetValues(core->drawArea, args, n);  core->drawAreaWidth = (int)w;  core->drawAreaHeight = (int)h;  if (core->zoom == zoomPage || core->zoom == zoomWidth) {    sx = sy = -1;  } else {    sx = core->scrollX;    sy = core->scrollY;  }  core->update(core->topPage, sx, sy, core->zoom, core->rotate, gTrue, gFalse);}void XPDFCore::redrawCbk(Widget widget, XtPointer ptr, XtPointer callData) {  XPDFCore *core = (XPDFCore *)ptr;  XmDrawingAreaCallbackStruct *data = (XmDrawingAreaCallbackStruct *)callData;  int x, y, w, h;  if (data->reason == XmCR_EXPOSE) {    x = data->event->xexpose.x;    y = data->event->xexpose.y;    w = data->event->xexpose.width;    h = data->event->xexpose.height;  } else {    x = 0;    y = 0;    w = core->drawAreaWidth;    h = core->drawAreaHeight;  }  core->redrawWindow(x, y, w, h, gFalse);}void XPDFCore::inputCbk(Widget widget, XtPointer ptr, XtPointer callData) {  XPDFCore *core = (XPDFCore *)ptr;  XmDrawingAreaCallbackStruct *data = (XmDrawingAreaCallbackStruct *)callData;  LinkAction *action;  int pg, x, y;  double xu, yu;  char *s;  KeySym key;  GBool ok;  switch (data->event->type) {  case ButtonPress:    if (*core->mouseCbk) {      (*core->mouseCbk)(core->mouseCbkData, data->event);    }    break;  case ButtonRelease:    if (*core->mouseCbk) {      (*core->mouseCbk)(core->mouseCbkData, data->event);    }    break;  case MotionNotify:    if (core->doc && core->doc->getNumPages() > 0) {      ok = core->cvtWindowToDev(data->event->xmotion.x, data->event->xmotion.y,				&pg, &x, &y);      if (core->dragging) {	if (ok) {	  core->moveSelection(pg, x, y);	}      } else if (core->hyperlinksEnabled) {	core->cvtDevToUser(pg, x, y, &xu, &yu);	if (ok && (action = core->findLink(pg, xu, yu))) {	  core->setCursor(core->linkCursor);	  if (action != core->linkAction) {	    core->linkAction = action;	    if (core->updateCbk) {	      s = "";	      switch (action->getKind()) {	      case actionGoTo:		s = "[internal link]";		break;	      case actionGoToR:		s = ((LinkGoToR *)action)->getFileName()->getCString();		break;	      case actionLaunch:		s = ((LinkLaunch *)action)->getFileName()->getCString();		break;	      case actionURI:		s = ((LinkURI *)action)->getURI()->getCString();		break;	      case actionNamed:		s = ((LinkNamed *)action)->getName()->getCString();		break;	      case actionMovie:		s = "[movie]";		break;	      case actionUnknown:		s = "[unknown link]";		break;	      }	      (*core->updateCbk)(core->updateCbkData, NULL, -1, -1, s);	    }	  }	} else {	  core->setCursor(None);	  if (core->linkAction) {	    core->linkAction = NULL;	    if (core->updateCbk) {	      (*core->updateCbk)(core->updateCbkData, NULL, -1, -1, "");	    }	  }	}      }    }    if (core->panning) {      core->scrollTo(core->scrollX - (data->event->xmotion.x - core->panMX),		     core->scrollY - (data->event->xmotion.y - core->panMY));      core->panMX = data->event->xmotion.x;      core->panMY = data->event->xmotion.y;    }    break;  case KeyPress:    if (core->keyPressCbk) {      key = XLookupKeysym(&data->event->xkey,			  (data->event->xkey.state & ShiftMask) ? 1 : 0);      (*core->keyPressCbk)(core->keyPressCbkData,			   key, data->event->xkey.state, data->event);    }    break;  }}PDFCoreTile *XPDFCore::newTile(int xDestA, int yDestA) {  return new XPDFCoreTile(xDestA, yDestA);}void XPDFCore::updateTileData(PDFCoreTile *tileA, int xSrc, int ySrc,			      int width, int height, GBool composited) {  XPDFCoreTile *tile = (XPDFCoreTile *)tileA;  XImage *image;  SplashColorPtr dataPtr, p;  Gulong pixel;  Guchar *ap;  Guchar alpha, alpha1;  int w, h, bw, x, y, r, g, b, gray;  int *errDownR, *errDownG, *errDownB;  int errRightR, errRightG, errRightB;  int errDownRightR, errDownRightG, errDownRightB;  int r0, g0, b0, re, ge, be;  if (!tile->image) {    w = tile->xMax - tile->xMin;    h = tile->yMax - tile->yMin;    image = XCreateImage(display, visual, depth, ZPixmap, 0, NULL, w, h, 8, 0);    image->data = (char *)gmalloc(h * image->bytes_per_line);    tile->image = image;  } else {    image = (XImage *)tile->image;  }  //~ optimize for known XImage formats  bw = tile->bitmap->getRowSize();  dataPtr = tile->bitmap->getDataPtr();  if (trueColor) {    for (y = 0; y < height; ++y) {      p = dataPtr + (ySrc + y) * bw + xSrc * 3;      if (!composited && tile->bitmap->getAlphaPtr()) {	ap = tile->bitmap->getAlphaPtr() +	       (ySrc + y) * tile->bitmap->getWidth() + xSrc;      } else {	ap = NULL;      }      for (x = 0; x < width; ++x) {	r = splashRGB8R(p);	g = splashRGB8G(p);	b = splashRGB8B(p);	if (ap) {	  alpha = *ap++;	  alpha1 = 255 - alpha;	  r = div255(alpha1 * paperColor[0] + alpha * r);	  g = div255(alpha1 * paperColor[1] + alpha * g);	  b = div255(alpha1 * paperColor[2] + alpha * b);	}	r >>= rDiv;	g >>= gDiv;	b >>= bDiv;	pixel = ((Gulong)r << rShift) +	        ((Gulong)g << gShift) +	        ((Gulong)b << bShift);	XPutPixel(image, xSrc + x, ySrc + y, pixel);	p += 3;      }    }  } else if (rgbCubeSize == 1) {    //~ this should really use splashModeMono, with non-clustered dithering    for (y = 0; y < height; ++y) {      p = dataPtr + (ySrc + y) * bw + xSrc * 3;      if (!composited && tile->bitmap->getAlphaPtr()) {	ap = tile->bitmap->getAlphaPtr() +	       (ySrc + y) * tile->bitmap->getWidth() + xSrc;      } else {	ap = NULL;      }      for (x = 0; x < width; ++x) {	r = splashRGB8R(p);	g = splashRGB8G(p);	b = splashRGB8B(p);	if (ap) {	  alpha = *ap++;	  alpha1 = 255 - alpha;	  r = div255(alpha1 * paperColor[0] + alpha * r);	  g = div255(alpha1 * paperColor[1] + alpha * g);	  b = div255(alpha1 * paperColor[2] + alpha * b);	}	gray = (int)(0.299 * r + 0.587 * g + 0.114 * b + 0.5);	if (gray < 128) {	  pixel = colors[0];	} else {	  pixel = colors[1];	}	XPutPixel(image, xSrc + x, ySrc + y, pixel);	p += 3;      }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -