📄 xpdfcore.cc
字号:
} } else { // do Floyd-Steinberg dithering on the whole bitmap errDownR = (int *)gmallocn(width + 2, sizeof(int)); errDownG = (int *)gmallocn(width + 2, sizeof(int)); errDownB = (int *)gmallocn(width + 2, sizeof(int)); errRightR = errRightG = errRightB = 0; errDownRightR = errDownRightG = errDownRightB = 0; memset(errDownR, 0, (width + 2) * sizeof(int)); memset(errDownG, 0, (width + 2) * sizeof(int)); memset(errDownB, 0, (width + 2) * sizeof(int)); 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); } r0 = r + errRightR + errDownR[x+1]; g0 = g + errRightG + errDownG[x+1]; b0 = b + errRightB + errDownB[x+1]; if (r0 < 0) { r = 0; } else if (r0 >= 255) { r = rgbCubeSize - 1; } else { r = div255(r0 * (rgbCubeSize - 1)); } if (g0 < 0) { g = 0; } else if (g0 >= 255) { g = rgbCubeSize - 1; } else { g = div255(g0 * (rgbCubeSize - 1)); } if (b0 < 0) { b = 0; } else if (b0 >= 255) { b = rgbCubeSize - 1; } else { b = div255(b0 * (rgbCubeSize - 1)); } re = r0 - ((r << 8) - r) / (rgbCubeSize - 1); ge = g0 - ((g << 8) - g) / (rgbCubeSize - 1); be = b0 - ((b << 8) - b) / (rgbCubeSize - 1); errRightR = (re * 7) >> 4; errRightG = (ge * 7) >> 4; errRightB = (be * 7) >> 4; errDownR[x] += (re * 3) >> 4; errDownG[x] += (ge * 3) >> 4; errDownB[x] += (be * 3) >> 4; errDownR[x+1] = ((re * 5) >> 4) + errDownRightR; errDownG[x+1] = ((ge * 5) >> 4) + errDownRightG; errDownB[x+1] = ((be * 5) >> 4) + errDownRightB; errDownRightR = re >> 4; errDownRightG = ge >> 4; errDownRightB = be >> 4; pixel = colors[(r * rgbCubeSize + g) * rgbCubeSize + b]; XPutPixel(image, xSrc + x, ySrc + y, pixel); p += 3; } } gfree(errDownR); gfree(errDownG); gfree(errDownB); }}void XPDFCore::redrawRect(PDFCoreTile *tileA, int xSrc, int ySrc, int xDest, int yDest, int width, int height, GBool composited) { XPDFCoreTile *tile = (XPDFCoreTile *)tileA; Window drawAreaWin; XGCValues gcValues; // create a GC for the drawing area drawAreaWin = XtWindow(drawArea); if (!drawAreaGC) { gcValues.foreground = mattePixel; drawAreaGC = XCreateGC(display, drawAreaWin, GCForeground, &gcValues); } // draw the document if (tile) { XPutImage(display, drawAreaWin, drawAreaGC, tile->image, xSrc, ySrc, xDest, yDest, width, height); // draw the background } else { XFillRectangle(display, drawAreaWin, drawAreaGC, xDest, yDest, width, height); }}void XPDFCore::updateScrollbars() { Arg args[20]; int n; int maxPos; if (pages->getLength() > 0) { if (continuousMode) { maxPos = maxPageW; } else { maxPos = ((PDFCorePage *)pages->get(0))->w; } } else { maxPos = 1; } if (maxPos < drawAreaWidth) { maxPos = drawAreaWidth; } n = 0; XtSetArg(args[n], XmNvalue, scrollX); ++n; XtSetArg(args[n], XmNmaximum, maxPos); ++n; XtSetArg(args[n], XmNsliderSize, drawAreaWidth); ++n; XtSetArg(args[n], XmNincrement, 16); ++n; XtSetArg(args[n], XmNpageIncrement, drawAreaWidth); ++n; XtSetValues(hScrollBar, args, n); if (pages->getLength() > 0) { if (continuousMode) { maxPos = totalDocH; } else { maxPos = ((PDFCorePage *)pages->get(0))->h; } } else { maxPos = 1; } if (maxPos < drawAreaHeight) { maxPos = drawAreaHeight; } n = 0; XtSetArg(args[n], XmNvalue, scrollY); ++n; XtSetArg(args[n], XmNmaximum, maxPos); ++n; XtSetArg(args[n], XmNsliderSize, drawAreaHeight); ++n; XtSetArg(args[n], XmNincrement, 16); ++n; XtSetArg(args[n], XmNpageIncrement, drawAreaHeight); ++n; XtSetValues(vScrollBar, args, n);}void XPDFCore::setCursor(Cursor cursor) { Window topWin; if (cursor == currentCursor) { return; } if (!(topWin = XtWindow(shell))) { return; } if (cursor == None) { XUndefineCursor(display, topWin); } else { XDefineCursor(display, topWin, cursor); } XFlush(display); currentCursor = cursor;}GBool XPDFCore::doQuestionDialog(char *title, GString *msg) { return doDialog(XmDIALOG_QUESTION, gTrue, title, msg);}void XPDFCore::doInfoDialog(char *title, GString *msg) { doDialog(XmDIALOG_INFORMATION, gFalse, title, msg);}void XPDFCore::doErrorDialog(char *title, GString *msg) { doDialog(XmDIALOG_ERROR, gFalse, title, msg);}GBool XPDFCore::doDialog(int type, GBool hasCancel, char *title, GString *msg) { Widget dialog, scroll, text; XtAppContext appContext; Arg args[20]; int n; XmString s1, s2; XEvent event; n = 0; XtSetArg(args[n], XmNdialogType, type); ++n; XtSetArg(args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL); ++n; s1 = XmStringCreateLocalized(title); XtSetArg(args[n], XmNdialogTitle, s1); ++n; s2 = NULL; // make gcc happy if (msg->getLength() <= 80) { s2 = XmStringCreateLocalized(msg->getCString()); XtSetArg(args[n], XmNmessageString, s2); ++n; } dialog = XmCreateMessageDialog(drawArea, "questionDialog", args, n); XmStringFree(s1); if (msg->getLength() <= 80) { XmStringFree(s2); } else { n = 0; XtSetArg(args[n], XmNscrollingPolicy, XmAUTOMATIC); ++n; if (drawAreaWidth > 300) { XtSetArg(args[n], XmNwidth, drawAreaWidth - 100); ++n; } scroll = XmCreateScrolledWindow(dialog, "scroll", args, n); XtManageChild(scroll); n = 0; XtSetArg(args[n], XmNeditable, False); ++n; XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); ++n; XtSetArg(args[n], XmNvalue, msg->getCString()); ++n; XtSetArg(args[n], XmNshadowThickness, 0); ++n; text = XmCreateText(scroll, "text", args, n); XtManageChild(text); } XtUnmanageChild(XmMessageBoxGetChild(dialog, XmDIALOG_HELP_BUTTON)); XtAddCallback(dialog, XmNokCallback, &dialogOkCbk, (XtPointer)this); if (hasCancel) { XtAddCallback(dialog, XmNcancelCallback, &dialogCancelCbk, (XtPointer)this); } else { XtUnmanageChild(XmMessageBoxGetChild(dialog, XmDIALOG_CANCEL_BUTTON)); } XtManageChild(dialog); appContext = XtWidgetToApplicationContext(dialog); dialogDone = 0; do { XtAppNextEvent(appContext, &event); XtDispatchEvent(&event); } while (!dialogDone); XtUnmanageChild(dialog); XtDestroyWidget(dialog); return dialogDone > 0;}void XPDFCore::dialogOkCbk(Widget widget, XtPointer ptr, XtPointer callData) { XPDFCore *core = (XPDFCore *)ptr; core->dialogDone = 1;}void XPDFCore::dialogCancelCbk(Widget widget, XtPointer ptr, XtPointer callData) { XPDFCore *core = (XPDFCore *)ptr; core->dialogDone = -1;}//------------------------------------------------------------------------// password dialog//------------------------------------------------------------------------void XPDFCore::initPasswordDialog() { Widget row, label, okBtn, cancelBtn; Arg args[20]; int n; XmString s; //----- dialog n = 0; s = XmStringCreateLocalized(xpdfAppName ": Password"); XtSetArg(args[n], XmNdialogTitle, s); ++n; XtSetArg(args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL); ++n; passwordDialog = XmCreateFormDialog(drawArea, "passwordDialog", args, n); XmStringFree(s); //----- message n = 0; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n; XtSetArg(args[n], XmNtopOffset, 4); ++n; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; XtSetArg(args[n], XmNleftOffset, 4); ++n; s = XmStringCreateLocalized("This document requires a password."); XtSetArg(args[n], XmNlabelString, s); ++n; label = XmCreateLabel(passwordDialog, "msg", args, n); XmStringFree(s); XtManageChild(label); //----- label and password entry n = 0; XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n; XtSetArg(args[n], XmNtopWidget, label); ++n; XtSetArg(args[n], XmNtopOffset, 4); ++n; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; XtSetArg(args[n], XmNleftOffset, 4); ++n; XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n; XtSetArg(args[n], XmNleftOffset, 4); ++n; XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n; XtSetArg(args[n], XmNpacking, XmPACK_TIGHT); ++n; row = XmCreateRowColumn(passwordDialog, "row", args, n); XtManageChild(row); n = 0; s = XmStringCreateLocalized("Password: "); XtSetArg(args[n], XmNlabelString, s); ++n; label = XmCreateLabel(row, "label", args, n); XmStringFree(s); XtManageChild(label); n = 0; XtSetArg(args[n], XmNcolumns, 16); ++n; passwordText = XmCreateTextField(row, "text", args, n); XtManageChild(passwordText); XtAddCallback(passwordText, XmNmodifyVerifyCallback, &passwordTextVerifyCbk, this); //----- "Ok" and "Cancel" buttons n = 0; XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n; XtSetArg(args[n], XmNtopWidget, row); ++n; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n; XtSetArg(args[n], XmNleftOffset, 4); ++n; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; XtSetArg(args[n], XmNbottomOffset, 4); ++n; XtSetArg(args[n], XmNnavigationType, XmEXCLUSIVE_TAB_GROUP); ++n; okBtn = XmCreatePushButton(passwordDialog, "Ok", args, n); XtManageChild(okBtn); XtAddCallback(okBtn, XmNactivateCallback, &passwordOkCbk, (XtPointer)this); n = 0; XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n; XtSetArg(args[n], XmNtopWidget, row); ++n; XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n; XtSetArg(args[n], XmNrightOffset, 4); ++n; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n; XtSetArg(args[n], XmNbottomOffset, 4); ++n; XtSetArg(args[n], XmNnavigationType, XmEXCLUSIVE_TAB_GROUP); ++n; cancelBtn = XmCreatePushButton(passwordDialog, "Cancel", args, n); XtManageChild(cancelBtn); XtAddCallback(cancelBtn, XmNactivateCallback, &passwordCancelCbk, (XtPointer)this); n = 0; XtSetArg(args[n], XmNdefaultButton, okBtn); ++n; XtSetArg(args[n], XmNcancelButton, cancelBtn); ++n;#if XmVersion > 1001 XtSetArg(args[n], XmNinitialFocus, passwordText); ++n;#endif XtSetValues(passwordDialog, args, n);}void XPDFCore::passwordTextVerifyCbk(Widget widget, XtPointer ptr, XtPointer callData) { XPDFCore *core = (XPDFCore *)ptr; XmTextVerifyCallbackStruct *data = (XmTextVerifyCallbackStruct *)callData; int i, n; i = (int)data->startPos; n = (int)data->endPos - i; if (i > core->password->getLength()) { i = core->password->getLength(); } if (i + n > core->password->getLength()) { n = core->password->getLength() - i; } core->password->del(i, n); core->password->insert(i, data->text->ptr, data->text->length); for (i = 0; i < data->text->length; ++i) { data->text->ptr[i] = '*'; } data->doit = True;}void XPDFCore::passwordOkCbk(Widget widget, XtPointer ptr, XtPointer callData) { XPDFCore *core = (XPDFCore *)ptr; core->dialogDone = 1;}void XPDFCore::passwordCancelCbk(Widget widget, XtPointer ptr, XtPointer callData) { XPDFCore *core = (XPDFCore *)ptr; core->dialogDone = -1;}GString *XPDFCore::getPassword() { XtAppContext appContext; XEvent event; // NB: set <password> before calling XmTextFieldSetString, because // SetString will trigger a call to passwordTextVerifyCbk, which // expects <password> to be valid password = new GString(); XmTextFieldSetString(passwordText, ""); XtManageChild(passwordDialog); appContext = XtWidgetToApplicationContext(passwordDialog); dialogDone = 0; do { XtAppNextEvent(appContext, &event); XtDispatchEvent(&event); } while (!dialogDone); XtUnmanageChild(passwordDialog); if (dialogDone < 0) { delete password; return NULL; } return password;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -