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

📄 xpdfcore.cc

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