📄 xpdfcore.cc
字号:
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 + -