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

📄 dvirenderer_draw.cpp

📁 okular
💻 CPP
📖 第 1 页 / 共 2 页
字号:
          a = ((long) (a *  current_dimconv));          b = ((long) (b *  current_dimconv));          if (a > 0 && b > 0) {            int h = ((int) ROUNDUP(a, shrinkfactor * 65536));            int w = ((int) ROUNDUP(b, shrinkfactor * 65536));            if (colorStack.isEmpty())              foreGroundPainter->fillRect( ((int) ((currinf.data.dvi_h) / (shrinkfactor * 65536))),                                         currinf.data.pxl_v - h + 1, w?w:1, h?h:1, globalColor );            else              foreGroundPainter->fillRect( ((int) ((currinf.data.dvi_h) / (shrinkfactor * 65536))),                                        currinf.data.pxl_v - h + 1, w?w:1, h?h:1, colorStack.top() );          }          break;        case NOP:          break;        case BOP:          if (is_vfmacro == false) {            word_boundary_encountered = true;            line_boundary_encountered = true;          }          command_pointer += 11 * 4;          currinf.data.dvi_h = 1200 << 16; // Reminder: DVI-coordinates start at (1",1") from top of page          currinf.data.dvi_v = 1200;          currinf.data.pxl_v = int(currinf.data.dvi_v/shrinkfactor);          currinf.data.w = currinf.data.x = currinf.data.y = currinf.data.z = 0;          break;        case EOP:          // Check if we are just at the end of a virtual font macro.          if (is_vfmacro == false) {            // This is really the end of a page, and not just the end            // of a macro. Mark the end of the current word.            word_boundary_encountered = true;            line_boundary_encountered = true;            // Sanity check for the dvi-file: The DVI-standard asserts            // that at the end of a page, the stack should always be            // empty.            if (!stack.isEmpty()) {              kDebug(kvs::dvi) << "DRAW: The stack was not empty when the EOP command was encountered." << endl;              errorMsg = i18n("The stack was not empty when the EOP command was encountered.");              return;            }          }          return;        case PUSH:          stack.push(currinf.data);          break;        case POP:          if (stack.isEmpty()) {            errorMsg = i18n("The stack was empty when a POP command was encountered.");            return;          } else            currinf.data = stack.pop();          word_boundary_encountered = true;          line_boundary_encountered = true;          break;        case RIGHT1:        case RIGHT2:        case RIGHT3:        case RIGHT4:          RRtmp = readINT(ch - RIGHT1 + 1);          // A horizontal motion in the range 4 * font space [f] < h <          // font space [f] will be treated as a kern that is not          // indicated in the printouts that DVItype produces between          // brackets. We allow a larger space in the negative          // direction than in the positive one, because TEX makes          // comparatively large backspaces when it positions          // accents. (comments stolen from the source of dvitype)          if ((is_vfmacro == false) &&              (currinf.fontp != 0) &&              ((RRtmp >= currinf.fontp->scaled_size_in_DVI_units/6) || (RRtmp <= -4*(currinf.fontp->scaled_size_in_DVI_units/6))) &&              (currentlyDrawnPage->textBoxList.size() > 0))            currentlyDrawnPage->textBoxList[currentlyDrawnPage->textBoxList.size()-1].text += ' ';          currinf.data.dvi_h += ((long) (RRtmp *  current_dimconv));          break;        case W1:        case W2:        case W3:        case W4:          WWtmp = readINT(ch - W0);          currinf.data.w = ((long) (WWtmp *  current_dimconv));        case W0:          if ((is_vfmacro == false) &&              (currinf.fontp != 0) &&              ((WWtmp >= currinf.fontp->scaled_size_in_DVI_units/6) || (WWtmp <= -4*(currinf.fontp->scaled_size_in_DVI_units/6))) &&              (currentlyDrawnPage->textBoxList.size() > 0) )            currentlyDrawnPage->textBoxList[currentlyDrawnPage->textBoxList.size()-1].text += ' ';          currinf.data.dvi_h += currinf.data.w;          break;        case X1:        case X2:        case X3:        case X4:          XXtmp = readINT(ch - X0);          currinf.data.x = ((long) (XXtmp *  current_dimconv));        case X0:          if ((is_vfmacro == false)  &&              (currinf.fontp != 0) &&              ((XXtmp >= currinf.fontp->scaled_size_in_DVI_units/6) || (XXtmp <= -4*(currinf.fontp->scaled_size_in_DVI_units/6))) &&              (currentlyDrawnPage->textBoxList.size() > 0))            currentlyDrawnPage->textBoxList[currentlyDrawnPage->textBoxList.size()-1].text += ' ';          currinf.data.dvi_h += currinf.data.x;          break;        case DOWN1:        case DOWN2:        case DOWN3:        case DOWN4:          {            qint32 DDtmp = readINT(ch - DOWN1 + 1);            if ((is_vfmacro == false) &&                (currinf.fontp != 0) &&                (abs(DDtmp) >= 5*(currinf.fontp->scaled_size_in_DVI_units/6)) &&                (currentlyDrawnPage->textBoxList.size() > 0)) {              word_boundary_encountered = true;              line_boundary_encountered = true;              if (abs(DDtmp) >= 10*(currinf.fontp->scaled_size_in_DVI_units/6))                currentlyDrawnPage->textBoxList[currentlyDrawnPage->textBoxList.size()-1].text += '\n';            }            currinf.data.dvi_v += ((long) (DDtmp *  current_dimconv))/65536;            currinf.data.pxl_v  = int(currinf.data.dvi_v/shrinkfactor);          }          break;        case Y1:        case Y2:        case Y3:        case Y4:          YYtmp = readINT(ch - Y0);          currinf.data.y    = ((long) (YYtmp *  current_dimconv));        case Y0:          if ((is_vfmacro == false) &&              (currinf.fontp != 0) &&              (abs(YYtmp) >= 5*(currinf.fontp->scaled_size_in_DVI_units/6)) &&              (currentlyDrawnPage->textBoxList.size() > 0)) {            word_boundary_encountered = true;            line_boundary_encountered = true;            if (abs(YYtmp) >= 10*(currinf.fontp->scaled_size_in_DVI_units/6))              currentlyDrawnPage->textBoxList[currentlyDrawnPage->textBoxList.size()-1].text += '\n';          }          currinf.data.dvi_v += currinf.data.y/65536;          currinf.data.pxl_v = int(currinf.data.dvi_v/shrinkfactor);          break;        case Z1:        case Z2:        case Z3:        case Z4:          ZZtmp = readINT(ch - Z0);          currinf.data.z    = ((long) (ZZtmp *  current_dimconv));        case Z0:          if ((is_vfmacro == false) &&              (currinf.fontp != 0) &&              (abs(ZZtmp) >= 5*(currinf.fontp->scaled_size_in_DVI_units/6)) &&              (currentlyDrawnPage->textBoxList.size() > 0)) {            word_boundary_encountered = true;            line_boundary_encountered = true;            if (abs(ZZtmp) >= 10*(currinf.fontp->scaled_size_in_DVI_units/6))              currentlyDrawnPage->textBoxList[currentlyDrawnPage->textBoxList.size()-1].text += '\n';          }          currinf.data.dvi_v += currinf.data.z/65536;          currinf.data.pxl_v  = int(currinf.data.dvi_v/shrinkfactor);          break;        case FNT1:        case FNT2:        case FNT3:          currinf.fontp = currinf.fonttable->find(readUINT(ch - FNT1 + 1));          if (currinf.fontp == NULL) {            errorMsg = i18n("The DVI code referred to a font which was not previously defined.");            return;          }          currinf.set_char_p = currinf.fontp->set_char_p;          break;        case FNT4:          currinf.fontp = currinf.fonttable->find(readINT(ch - FNT1 + 1));          if (currinf.fontp == NULL) {            errorMsg = i18n("The DVI code referred to a font which was not previously defined.");            return;          }          currinf.set_char_p = currinf.fontp->set_char_p;          break;        case XXX1:        case XXX2:        case XXX3:        case XXX4:          if (is_vfmacro == false) {            word_boundary_encountered = true;            line_boundary_encountered = true;          }          a = readUINT(ch - XXX1 + 1);          if (a > 0) {            char        *cmd        = new char[a+1];            strncpy(cmd, (char *)command_pointer, a);            command_pointer += a;            cmd[a] = '\0';            applicationDoSpecial(cmd);            delete [] cmd;          }          break;        case FNTDEF1:        case FNTDEF2:        case FNTDEF3:        case FNTDEF4:          command_pointer += 12 + ch - FNTDEF1 + 1;          {            quint8 tempa = readUINT8();            quint8 tempb = readUINT8();            command_pointer += tempa + tempb;          }          break;        case PRE:        case POST:        case POSTPOST:          errorMsg = i18n("An illegal command was encountered.");          return;          break;        default:          errorMsg = i18n("The unknown op-code %1 was encountered.", ch);          return;        } /* end switch*/      } /* end else (ch not a SETCHAR or FNTNUM) */  } /* end for */}void dviRenderer::draw_page(){  // Reset a couple of variables  HTML_href         = 0;  source_href       = 0;  penWidth_in_mInch = 0.0;  // Calling resize() here rather than clear() means that the memory  // taken up by the vector is not freed. This is faster than  // constantly allocating/freeing memory.  currentlyDrawnPage->textBoxList.resize(0);  RenderedDviPagePixmap* currentDVIPage = dynamic_cast<RenderedDviPagePixmap*>(currentlyDrawnPage);  if (currentDVIPage)  {    currentDVIPage->sourceHyperLinkList.resize(0);  }#ifdef PERFORMANCE_MEASUREMENT  // If this is the first time a page is drawn, take the time that is  // elapsed till the kdvi_multipage was constructed, and print  // it. Set the flag so that is message will not be printed again.  if (performanceFlag == 0) {    kDebug(kvs::dvi) << "Time elapsed till the first page is drawn: " << performanceTimer.restart() << "ms" << endl;    performanceFlag = 1;  }#endif#ifdef DEBUG_RENDER  kDebug(kvs::dvi) <<"draw_page" << endl;#endif#if 0  if (!accessibilityBackground)  {#endif    foreGroundPainter->fillRect( foreGroundPainter->viewport(), PS_interface->getBackgroundColor(current_page) );#if 0  }  else  {    // In accessiblity mode use the custom background color    foreGroundPainter->fillRect( foreGroundPainter->viewport(), accessibilityBackgroundColor );  }#endif  // Render the PostScript background, if there is one.  if (_postscript)  {#if 0    // In accessiblity mode use the custom background color    if (accessibilityBackground)    {      // Flag permanent is set to false because otherwise we would not be able to restore      // the original background color.      PS_interface->setBackgroundColor(current_page, accessibilityBackgroundColor, false);    }    else#endif      PS_interface->restoreBackgroundColor(current_page);    PS_interface->graphics(current_page, resolutionInDPI, dviFile->getMagnification(), foreGroundPainter);  }  // Now really write the text  if (dviFile->page_offset.isEmpty() == true)    return;  if (current_page < dviFile->total_pages) {    command_pointer = dviFile->dvi_Data() + dviFile->page_offset[int(current_page)];    end_pointer     = dviFile->dvi_Data() + dviFile->page_offset[int(current_page+1)];  } else    command_pointer = end_pointer = 0;  memset((char *) &currinf.data, 0, sizeof(currinf.data));  currinf.fonttable      = &(dviFile->tn_table);  currinf._virtual       = 0;  double fontPixelPerDVIunit = dviFile->getCmPerDVIunit() * 1200.0/2.54;  draw_part(65536.0*fontPixelPerDVIunit, false);  if (HTML_href != 0) {    delete HTML_href;    HTML_href = 0;  }  if (source_href != 0) {    delete source_href;    source_href = 0;  }}

⌨️ 快捷键说明

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