source: trunk/poppler/mypoppler/poppler/PreScanOutputDev.cc @ 257

Last change on this file since 257 was 250, checked in by Eugene Romanenko, 13 years ago

PDF plugin: poppler library updated to version 0.8.3

File size: 6.8 KB
Line 
1//========================================================================
2//
3// PreScanOutputDev.cc
4//
5// Copyright 2005 Glyph & Cog, LLC
6//
7//========================================================================
8
9#ifdef USE_GCC_PRAGMAS
10#pragma implementation
11#endif
12
13#include <math.h>
14#include "GlobalParams.h"
15#include "GfxFont.h"
16#include "Link.h"
17#include "PreScanOutputDev.h"
18
19//------------------------------------------------------------------------
20// PreScanOutputDev
21//------------------------------------------------------------------------
22
23PreScanOutputDev::PreScanOutputDev() {
24  clearStats();
25}
26
27PreScanOutputDev::~PreScanOutputDev() {
28}
29
30void PreScanOutputDev::startPage(int /*pageNum*/, GfxState * /*state*/) {
31}
32
33void PreScanOutputDev::endPage() {
34}
35
36void PreScanOutputDev::stroke(GfxState *state) {
37  double *dash;
38  int dashLen;
39  double dashStart;
40
41  check(state->getStrokeColorSpace(), state->getStrokeColor(),
42        state->getStrokeOpacity(), state->getBlendMode());
43  state->getLineDash(&dash, &dashLen, &dashStart);
44  if (dashLen != 0) {
45    gdi = gFalse;
46  }
47}
48
49void PreScanOutputDev::fill(GfxState *state) {
50  check(state->getFillColorSpace(), state->getFillColor(),
51        state->getFillOpacity(), state->getBlendMode());
52}
53
54void PreScanOutputDev::eoFill(GfxState *state) {
55  check(state->getFillColorSpace(), state->getFillColor(),
56        state->getFillOpacity(), state->getBlendMode());
57}
58
59void PreScanOutputDev::clip(GfxState * /*state*/) {
60  //~ check for a rectangle "near" the edge of the page;
61  //~   else set gdi to false
62}
63
64void PreScanOutputDev::eoClip(GfxState * /*state*/) {
65  //~ see clip()
66}
67
68void PreScanOutputDev::beginStringOp(GfxState *state) {
69  int render;
70  GfxFont *font;
71  double m11, m12, m21, m22;
72  Ref embRef;
73  DisplayFontParam *dfp;
74  GBool simpleTTF;
75
76  render = state->getRender();
77  if (!(render & 1)) {
78    check(state->getFillColorSpace(), state->getFillColor(),
79          state->getFillOpacity(), state->getBlendMode());
80  }
81  if ((render & 3) == 1 || (render & 3) == 2) {
82    check(state->getStrokeColorSpace(), state->getStrokeColor(),
83          state->getStrokeOpacity(), state->getBlendMode());
84  }
85
86  font = state->getFont();
87  state->getFontTransMat(&m11, &m12, &m21, &m22);
88  simpleTTF = fabs(m11 + m22) < 0.01 &&
89              m11 > 0 &&
90              fabs(m12) < 0.01 &&
91              fabs(m21) < 0.01 &&
92              fabs(state->getHorizScaling() - 1) < 0.001 &&
93              (font->getType() == fontTrueType ||
94               font->getType() == fontTrueTypeOT) &&
95              (font->getEmbeddedFontID(&embRef) ||
96               font->getExtFontFile() ||
97               (font->getName() &&
98                (dfp = globalParams->getDisplayFont(font)) &&
99                dfp->kind == displayFontTT));
100  if (simpleTTF) {
101    //~ need to create a FoFiTrueType object, and check for a Unicode cmap
102  }
103  if (state->getRender() != 0 || !simpleTTF) {
104    gdi = gFalse;
105  }
106}
107
108void PreScanOutputDev::endStringOp(GfxState * /*state*/) {
109}
110
111GBool PreScanOutputDev::beginType3Char(GfxState * /*state*/, double /*x*/, double /*y*/,
112                                       double /*dx*/, double /*dy*/,
113                                       CharCode /*code*/, Unicode * /*u*/, int /*uLen*/) {
114  // return false so all Type 3 chars get rendered (no caching)
115  return gFalse;
116}
117
118void PreScanOutputDev::endType3Char(GfxState * /*state*/) {
119}
120
121void PreScanOutputDev::drawImageMask(GfxState *state, Object * /*ref*/, Stream *str,
122                                     int width, int height, GBool /*invert*/,
123                                     GBool inlineImg) {
124  int i, j;
125
126  check(state->getFillColorSpace(), state->getFillColor(),
127        state->getFillOpacity(), state->getBlendMode());
128  gdi = gFalse;
129
130  if (inlineImg) {
131    str->reset();
132    j = height * ((width + 7) / 8);
133    for (i = 0; i < j; ++i)
134      str->getChar();
135    str->close();
136  }
137}
138
139void PreScanOutputDev::drawImage(GfxState *state, Object * /*ref*/, Stream *str,
140                                 int width, int height,
141                                 GfxImageColorMap *colorMap,
142                                 int * /*maskColors*/, GBool inlineImg) {
143  GfxColorSpace *colorSpace;
144  int i, j;
145
146  colorSpace = colorMap->getColorSpace();
147  if (colorSpace->getMode() == csIndexed) {
148    colorSpace = ((GfxIndexedColorSpace *)colorSpace)->getBase();
149  }
150  if (colorSpace->getMode() != csDeviceGray &&
151      colorSpace->getMode() != csCalGray) {
152    gray = gFalse;
153  }
154  mono = gFalse;
155  if (state->getBlendMode() != gfxBlendNormal) {
156    transparency = gTrue;
157  }
158  gdi = gFalse;
159
160  if (inlineImg) {
161    str->reset();
162    j = height * ((width * colorMap->getNumPixelComps() *
163                   colorMap->getBits() + 7) / 8);
164    for (i = 0; i < j; ++i)
165      str->getChar();
166    str->close();
167  }
168}
169
170void PreScanOutputDev::drawMaskedImage(GfxState *state, Object * /*ref*/,
171                                       Stream * /*str*/,
172                                       int /*width*/, int /*height*/,
173                                       GfxImageColorMap *colorMap,
174                                       Stream * /*maskStr*/,
175                                       int /*maskWidth*/, int /*maskHeight*/,
176                                       GBool /*maskInvert*/) {
177  GfxColorSpace *colorSpace;
178
179  colorSpace = colorMap->getColorSpace();
180  if (colorSpace->getMode() == csIndexed) {
181    colorSpace = ((GfxIndexedColorSpace *)colorSpace)->getBase();
182  }
183  if (colorSpace->getMode() != csDeviceGray &&
184      colorSpace->getMode() != csCalGray) {
185    gray = gFalse;
186  }
187  mono = gFalse;
188  if (state->getBlendMode() != gfxBlendNormal) {
189    transparency = gTrue;
190  }
191  gdi = gFalse;
192}
193
194void PreScanOutputDev::drawSoftMaskedImage(GfxState * /*state*/, Object * /*ref*/,
195                                           Stream * /*str*/,
196                                           int /*width*/, int /*height*/,
197                                           GfxImageColorMap *colorMap,
198                                           Stream * /*maskStr*/,
199                                           int /*maskWidth*/, int /*maskHeight*/,
200                                           GfxImageColorMap * /*maskColorMap*/) {
201  GfxColorSpace *colorSpace;
202
203  colorSpace = colorMap->getColorSpace();
204  if (colorSpace->getMode() == csIndexed) {
205    colorSpace = ((GfxIndexedColorSpace *)colorSpace)->getBase();
206  }
207  if (colorSpace->getMode() != csDeviceGray &&
208      colorSpace->getMode() != csCalGray) {
209    gray = gFalse;
210  }
211  mono = gFalse;
212  transparency = gTrue;
213  gdi = gFalse;
214}
215
216void PreScanOutputDev::beginTransparencyGroup(
217                           GfxState * /*state*/, double * /*bbox*/,
218                           GfxColorSpace * /*blendingColorSpace*/,
219                           GBool /*isolated*/, GBool /*knockout*/,
220                           GBool /*forSoftMask*/) {
221  transparency = gTrue;
222  gdi = gFalse;
223}
224
225void PreScanOutputDev::check(GfxColorSpace *colorSpace, GfxColor *color,
226                             double opacity, GfxBlendMode blendMode) {
227  GfxRGB rgb;
228
229  if (colorSpace->getMode() == csPattern) {
230    mono = gFalse;
231    gray = gFalse;
232    gdi = gFalse;
233  } else {
234    colorSpace->getRGB(color, &rgb);
235    if (rgb.r != rgb.g || rgb.g != rgb.b || rgb.b != rgb.r) {
236      mono = gFalse;
237      gray = gFalse;
238    } else if (!((rgb.r == 0 && rgb.g == 0 && rgb.b == 0) ||
239                 (rgb.r == gfxColorComp1 &&
240                  rgb.g == gfxColorComp1 &&
241                  rgb.b == gfxColorComp1))) {
242      mono = gFalse;
243    }
244  }
245  if (opacity != 1 || blendMode != gfxBlendNormal) {
246    transparency = gTrue;
247  }
248}
249
250void PreScanOutputDev::clearStats() {
251  mono = gTrue;
252  gray = gTrue;
253  transparency = gFalse;
254  gdi = gTrue;
255}
Note: See TracBrowser for help on using the repository browser.