~ubuntu-branches/ubuntu/raring/luatex/raring

« back to all changes in this revision

Viewing changes to source/libs/xpdf/xpdf-3.02/xpdf/TextOutputDev.h

  • Committer: Package Import Robot
  • Author(s): Norbert Preining
  • Date: 2011-05-20 09:40:39 UTC
  • mfrom: (0.8.1) (1.8.1) (19.2.3 oneiric)
  • Revision ID: package-import@ubuntu.com-20110520094039-7sezr4kqonjqxqz6
Tags: 0.70.1-1
* new upstream release (probably) matching TeX Live 2011
* deactivate fix-luatex-build-with-old-libpng patch, included upstream

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
//========================================================================
2
 
//
3
 
// TextOutputDev.h
4
 
//
5
 
// Copyright 1997-2003 Glyph & Cog, LLC
6
 
//
7
 
//========================================================================
8
 
 
9
 
#ifndef TEXTOUTPUTDEV_H
10
 
#define TEXTOUTPUTDEV_H
11
 
 
12
 
#include <aconf.h>
13
 
 
14
 
#ifdef USE_GCC_PRAGMAS
15
 
#pragma interface
16
 
#endif
17
 
 
18
 
#include <stdio.h>
19
 
#include "gtypes.h"
20
 
#include "GfxFont.h"
21
 
#include "OutputDev.h"
22
 
 
23
 
class GString;
24
 
class GList;
25
 
class GfxFont;
26
 
class GfxState;
27
 
class UnicodeMap;
28
 
class Link;
29
 
 
30
 
class TextWord;
31
 
class TextPool;
32
 
class TextLine;
33
 
class TextLineFrag;
34
 
class TextBlock;
35
 
class TextFlow;
36
 
class TextWordList;
37
 
class TextPage;
38
 
 
39
 
//------------------------------------------------------------------------
40
 
 
41
 
typedef void (*TextOutputFunc)(void *stream, char *text, int len);
42
 
 
43
 
//------------------------------------------------------------------------
44
 
// TextFontInfo
45
 
//------------------------------------------------------------------------
46
 
 
47
 
class TextFontInfo {
48
 
public:
49
 
 
50
 
  TextFontInfo(GfxState *state);
51
 
  ~TextFontInfo();
52
 
 
53
 
  GBool matches(GfxState *state);
54
 
 
55
 
#if TEXTOUT_WORD_LIST
56
 
  // Get the font name (which may be NULL).
57
 
  GString *getFontName() { return fontName; }
58
 
 
59
 
  // Get font descriptor flags.
60
 
  GBool isFixedWidth() { return flags & fontFixedWidth; }
61
 
  GBool isSerif() { return flags & fontSerif; }
62
 
  GBool isSymbolic() { return flags & fontSymbolic; }
63
 
  GBool isItalic() { return flags & fontItalic; }
64
 
  GBool isBold() { return flags & fontBold; }
65
 
#endif
66
 
 
67
 
private:
68
 
 
69
 
  GfxFont *gfxFont;
70
 
#if TEXTOUT_WORD_LIST
71
 
  GString *fontName;
72
 
  int flags;
73
 
#endif
74
 
 
75
 
  friend class TextWord;
76
 
  friend class TextPage;
77
 
};
78
 
 
79
 
//------------------------------------------------------------------------
80
 
// TextWord
81
 
//------------------------------------------------------------------------
82
 
 
83
 
class TextWord {
84
 
public:
85
 
 
86
 
  // Constructor.
87
 
  TextWord(GfxState *state, int rotA, double x0, double y0,
88
 
           int charPosA, TextFontInfo *fontA, double fontSize);
89
 
 
90
 
  // Destructor.
91
 
  ~TextWord();
92
 
 
93
 
  // Add a character to the word.
94
 
  void addChar(GfxState *state, double x, double y,
95
 
               double dx, double dy, Unicode u);
96
 
 
97
 
  // Merge <word> onto the end of <this>.
98
 
  void merge(TextWord *word);
99
 
 
100
 
  // Compares <this> to <word>, returning -1 (<), 0 (=), or +1 (>),
101
 
  // based on a primary-axis comparison, e.g., x ordering if rot=0.
102
 
  int primaryCmp(TextWord *word);
103
 
 
104
 
  // Return the distance along the primary axis between <this> and
105
 
  // <word>.
106
 
  double primaryDelta(TextWord *word);
107
 
 
108
 
  static int cmpYX(const void *p1, const void *p2);
109
 
 
110
 
  // Get the TextFontInfo object associated with this word.
111
 
  TextFontInfo *getFontInfo() { return font; }
112
 
 
113
 
  // Get the next TextWord on the linked list.
114
 
  TextWord *getNext() { return next; }
115
 
 
116
 
#if TEXTOUT_WORD_LIST
117
 
  int getLength() { return len; }
118
 
  Unicode getChar(int idx) { return text[idx]; }
119
 
  GString *getText();
120
 
  GString *getFontName() { return font->fontName; }
121
 
  void getColor(double *r, double *g, double *b)
122
 
    { *r = colorR; *g = colorG; *b = colorB; }
123
 
  void getBBox(double *xMinA, double *yMinA, double *xMaxA, double *yMaxA)
124
 
    { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; }
125
 
  void getCharBBox(int charIdx, double *xMinA, double *yMinA,
126
 
                   double *xMaxA, double *yMaxA);
127
 
  double getFontSize() { return fontSize; }
128
 
  int getRotation() { return rot; }
129
 
  int getCharPos() { return charPos; }
130
 
  int getCharLen() { return charLen; }
131
 
  GBool getSpaceAfter() { return spaceAfter; }
132
 
#endif
133
 
 
134
 
  GBool isUnderlined() { return underlined; }
135
 
  Link *getLink() { return link; }
136
 
 
137
 
private:
138
 
 
139
 
  int rot;                      // rotation, multiple of 90 degrees
140
 
                                //   (0, 1, 2, or 3)
141
 
  double xMin, xMax;            // bounding box x coordinates
142
 
  double yMin, yMax;            // bounding box y coordinates
143
 
  double base;                  // baseline x or y coordinate
144
 
  Unicode *text;                // the text
145
 
  double *edge;                 // "near" edge x or y coord of each char
146
 
                                //   (plus one extra entry for the last char)
147
 
  int len;                      // length of text and edge arrays
148
 
  int size;                     // size of text and edge arrays
149
 
  int charPos;                  // character position (within content stream)
150
 
  int charLen;                  // number of content stream characters in
151
 
                                //   this word
152
 
  TextFontInfo *font;           // font information
153
 
  double fontSize;              // font size
154
 
  GBool spaceAfter;             // set if there is a space between this
155
 
                                //   word and the next word on the line
156
 
  TextWord *next;               // next word in line
157
 
 
158
 
#if TEXTOUT_WORD_LIST
159
 
  double colorR,                // word color
160
 
         colorG,
161
 
         colorB;
162
 
#endif
163
 
 
164
 
  GBool underlined;
165
 
  Link *link;
166
 
 
167
 
  friend class TextPool;
168
 
  friend class TextLine;
169
 
  friend class TextBlock;
170
 
  friend class TextFlow;
171
 
  friend class TextWordList;
172
 
  friend class TextPage;
173
 
};
174
 
 
175
 
//------------------------------------------------------------------------
176
 
// TextPool
177
 
//------------------------------------------------------------------------
178
 
 
179
 
class TextPool {
180
 
public:
181
 
 
182
 
  TextPool();
183
 
  ~TextPool();
184
 
 
185
 
  TextWord *getPool(int baseIdx) { return pool[baseIdx - minBaseIdx]; }
186
 
  void setPool(int baseIdx, TextWord *p) { pool[baseIdx - minBaseIdx] = p; }
187
 
 
188
 
  int getBaseIdx(double base);
189
 
 
190
 
  void addWord(TextWord *word);
191
 
 
192
 
private:
193
 
 
194
 
  int minBaseIdx;               // min baseline bucket index
195
 
  int maxBaseIdx;               // max baseline bucket index
196
 
  TextWord **pool;              // array of linked lists, one for each
197
 
                                //   baseline value (multiple of 4 pts)
198
 
  TextWord *cursor;             // pointer to last-accessed word
199
 
  int cursorBaseIdx;            // baseline bucket index of last-accessed word
200
 
 
201
 
  friend class TextBlock;
202
 
  friend class TextPage;
203
 
};
204
 
 
205
 
//------------------------------------------------------------------------
206
 
// TextLine
207
 
//------------------------------------------------------------------------
208
 
 
209
 
class TextLine {
210
 
public:
211
 
 
212
 
  TextLine(TextBlock *blkA, int rotA, double baseA);
213
 
  ~TextLine();
214
 
 
215
 
  void addWord(TextWord *word);
216
 
 
217
 
  // Return the distance along the primary axis between <this> and
218
 
  // <line>.
219
 
  double primaryDelta(TextLine *line);
220
 
 
221
 
  // Compares <this> to <line>, returning -1 (<), 0 (=), or +1 (>),
222
 
  // based on a primary-axis comparison, e.g., x ordering if rot=0.
223
 
  int primaryCmp(TextLine *line);
224
 
 
225
 
  // Compares <this> to <line>, returning -1 (<), 0 (=), or +1 (>),
226
 
  // based on a secondary-axis comparison of the baselines, e.g., y
227
 
  // ordering if rot=0.
228
 
  int secondaryCmp(TextLine *line);
229
 
 
230
 
  int cmpYX(TextLine *line);
231
 
 
232
 
  static int cmpXY(const void *p1, const void *p2);
233
 
 
234
 
  void coalesce(UnicodeMap *uMap);
235
 
 
236
 
  // Get the head of the linked list of TextWords.
237
 
  TextWord *getWords() { return words; }
238
 
 
239
 
  // Get the next TextLine on the linked list.
240
 
  TextLine *getNext() { return next; }
241
 
 
242
 
  // Returns true if the last char of the line is a hyphen.
243
 
  GBool isHyphenated() { return hyphenated; }
244
 
 
245
 
private:
246
 
 
247
 
  TextBlock *blk;               // parent block
248
 
  int rot;                      // text rotation
249
 
  double xMin, xMax;            // bounding box x coordinates
250
 
  double yMin, yMax;            // bounding box y coordinates
251
 
  double base;                  // baseline x or y coordinate
252
 
  TextWord *words;              // words in this line
253
 
  TextWord *lastWord;           // last word in this line
254
 
  Unicode *text;                // Unicode text of the line, including
255
 
                                //   spaces between words
256
 
  double *edge;                 // "near" edge x or y coord of each char
257
 
                                //   (plus one extra entry for the last char)
258
 
  int *col;                     // starting column number of each Unicode char
259
 
  int len;                      // number of Unicode chars
260
 
  int convertedLen;             // total number of converted characters
261
 
  GBool hyphenated;             // set if last char is a hyphen
262
 
  TextLine *next;               // next line in block
263
 
 
264
 
  friend class TextLineFrag;
265
 
  friend class TextBlock;
266
 
  friend class TextFlow;
267
 
  friend class TextWordList;
268
 
  friend class TextPage;
269
 
};
270
 
 
271
 
//------------------------------------------------------------------------
272
 
// TextBlock
273
 
//------------------------------------------------------------------------
274
 
 
275
 
class TextBlock {
276
 
public:
277
 
 
278
 
  TextBlock(TextPage *pageA, int rotA);
279
 
  ~TextBlock();
280
 
 
281
 
  void addWord(TextWord *word);
282
 
 
283
 
  void coalesce(UnicodeMap *uMap);
284
 
 
285
 
  // Update this block's priMin and priMax values, looking at <blk>.
286
 
  void updatePriMinMax(TextBlock *blk);
287
 
 
288
 
  static int cmpXYPrimaryRot(const void *p1, const void *p2);
289
 
 
290
 
  static int cmpYXPrimaryRot(const void *p1, const void *p2);
291
 
 
292
 
  int primaryCmp(TextBlock *blk);
293
 
 
294
 
  double secondaryDelta(TextBlock *blk);
295
 
 
296
 
  // Returns true if <this> is below <blk>, relative to the page's
297
 
  // primary rotation.
298
 
  GBool isBelow(TextBlock *blk);
299
 
 
300
 
  // Get the head of the linked list of TextLines.
301
 
  TextLine *getLines() { return lines; }
302
 
 
303
 
  // Get the next TextBlock on the linked list.
304
 
  TextBlock *getNext() { return next; }
305
 
 
306
 
private:
307
 
 
308
 
  TextPage *page;               // the parent page
309
 
  int rot;                      // text rotation
310
 
  double xMin, xMax;            // bounding box x coordinates
311
 
  double yMin, yMax;            // bounding box y coordinates
312
 
  double priMin, priMax;        // whitespace bounding box along primary axis
313
 
 
314
 
  TextPool *pool;               // pool of words (used only until lines
315
 
                                //   are built)
316
 
  TextLine *lines;              // linked list of lines
317
 
  TextLine *curLine;            // most recently added line
318
 
  int nLines;                   // number of lines
319
 
  int charCount;                // number of characters in the block
320
 
  int col;                      // starting column
321
 
  int nColumns;                 // number of columns in the block
322
 
 
323
 
  TextBlock *next;
324
 
  TextBlock *stackNext;
325
 
 
326
 
  friend class TextLine;
327
 
  friend class TextLineFrag;
328
 
  friend class TextFlow;
329
 
  friend class TextWordList;
330
 
  friend class TextPage;
331
 
};
332
 
 
333
 
//------------------------------------------------------------------------
334
 
// TextFlow
335
 
//------------------------------------------------------------------------
336
 
 
337
 
class TextFlow {
338
 
public:
339
 
 
340
 
  TextFlow(TextPage *pageA, TextBlock *blk);
341
 
  ~TextFlow();
342
 
 
343
 
  // Add a block to the end of this flow.
344
 
  void addBlock(TextBlock *blk);
345
 
 
346
 
  // Returns true if <blk> fits below <prevBlk> in the flow, i.e., (1)
347
 
  // it uses a font no larger than the last block added to the flow,
348
 
  // and (2) it fits within the flow's [priMin, priMax] along the
349
 
  // primary axis.
350
 
  GBool blockFits(TextBlock *blk, TextBlock *prevBlk);
351
 
 
352
 
  // Get the head of the linked list of TextBlocks.
353
 
  TextBlock *getBlocks() { return blocks; }
354
 
 
355
 
  // Get the next TextFlow on the linked list.
356
 
  TextFlow *getNext() { return next; }
357
 
 
358
 
private:
359
 
 
360
 
  TextPage *page;               // the parent page
361
 
  double xMin, xMax;            // bounding box x coordinates
362
 
  double yMin, yMax;            // bounding box y coordinates
363
 
  double priMin, priMax;        // whitespace bounding box along primary axis
364
 
  TextBlock *blocks;            // blocks in flow
365
 
  TextBlock *lastBlk;           // last block in this flow
366
 
  TextFlow *next;
367
 
 
368
 
  friend class TextWordList;
369
 
  friend class TextPage;
370
 
};
371
 
 
372
 
#if TEXTOUT_WORD_LIST
373
 
 
374
 
//------------------------------------------------------------------------
375
 
// TextWordList
376
 
//------------------------------------------------------------------------
377
 
 
378
 
class TextWordList {
379
 
public:
380
 
 
381
 
  // Build a flat word list, in content stream order (if
382
 
  // text->rawOrder is true), physical layout order (if <physLayout>
383
 
  // is true and text->rawOrder is false), or reading order (if both
384
 
  // flags are false).
385
 
  TextWordList(TextPage *text, GBool physLayout);
386
 
 
387
 
  ~TextWordList();
388
 
 
389
 
  // Return the number of words on the list.
390
 
  int getLength();
391
 
 
392
 
  // Return the <idx>th word from the list.
393
 
  TextWord *get(int idx);
394
 
 
395
 
private:
396
 
 
397
 
  GList *words;                 // [TextWord]
398
 
};
399
 
 
400
 
#endif // TEXTOUT_WORD_LIST
401
 
 
402
 
//------------------------------------------------------------------------
403
 
// TextPage
404
 
//------------------------------------------------------------------------
405
 
 
406
 
class TextPage {
407
 
public:
408
 
 
409
 
  // Constructor.
410
 
  TextPage(GBool rawOrderA);
411
 
 
412
 
  // Destructor.
413
 
  ~TextPage();
414
 
 
415
 
  // Start a new page.
416
 
  void startPage(GfxState *state);
417
 
 
418
 
  // End the current page.
419
 
  void endPage();
420
 
 
421
 
  // Update the current font.
422
 
  void updateFont(GfxState *state);
423
 
 
424
 
  // Begin a new word.
425
 
  void beginWord(GfxState *state, double x0, double y0);
426
 
 
427
 
  // Add a character to the current word.
428
 
  void addChar(GfxState *state, double x, double y,
429
 
               double dx, double dy,
430
 
               CharCode c, int nBytes, Unicode *u, int uLen);
431
 
 
432
 
  // End the current word, sorting it into the list of words.
433
 
  void endWord();
434
 
 
435
 
  // Add a word, sorting it into the list of words.
436
 
  void addWord(TextWord *word);
437
 
 
438
 
  // Add a (potential) underline.
439
 
  void addUnderline(double x0, double y0, double x1, double y1);
440
 
 
441
 
  // Add a hyperlink.
442
 
  void addLink(int xMin, int yMin, int xMax, int yMax, Link *link);
443
 
 
444
 
  // Coalesce strings that look like parts of the same line.
445
 
  void coalesce(GBool physLayout, GBool doHTML);
446
 
 
447
 
  // Find a string.  If <startAtTop> is true, starts looking at the
448
 
  // top of the page; else if <startAtLast> is true, starts looking
449
 
  // immediately after the last find result; else starts looking at
450
 
  // <xMin>,<yMin>.  If <stopAtBottom> is true, stops looking at the
451
 
  // bottom of the page; else if <stopAtLast> is true, stops looking
452
 
  // just before the last find result; else stops looking at
453
 
  // <xMax>,<yMax>.
454
 
  GBool findText(Unicode *s, int len,
455
 
                 GBool startAtTop, GBool stopAtBottom,
456
 
                 GBool startAtLast, GBool stopAtLast,
457
 
                 GBool caseSensitive, GBool backward,
458
 
                 double *xMin, double *yMin,
459
 
                 double *xMax, double *yMax);
460
 
 
461
 
  // Get the text which is inside the specified rectangle.
462
 
  GString *getText(double xMin, double yMin,
463
 
                   double xMax, double yMax);
464
 
 
465
 
  // Find a string by character position and length.  If found, sets
466
 
  // the text bounding rectangle and returns true; otherwise returns
467
 
  // false.
468
 
  GBool findCharRange(int pos, int length,
469
 
                      double *xMin, double *yMin,
470
 
                      double *xMax, double *yMax);
471
 
 
472
 
  // Dump contents of page to a file.
473
 
  void dump(void *outputStream, TextOutputFunc outputFunc,
474
 
            GBool physLayout);
475
 
 
476
 
  // Get the head of the linked list of TextFlows.
477
 
  TextFlow *getFlows() { return flows; }
478
 
 
479
 
#if TEXTOUT_WORD_LIST
480
 
  // Build a flat word list, in content stream order (if
481
 
  // this->rawOrder is true), physical layout order (if <physLayout>
482
 
  // is true and this->rawOrder is false), or reading order (if both
483
 
  // flags are false).
484
 
  TextWordList *makeWordList(GBool physLayout);
485
 
#endif
486
 
 
487
 
private:
488
 
 
489
 
  void clear();
490
 
  void assignColumns(TextLineFrag *frags, int nFrags, int rot);
491
 
  int dumpFragment(Unicode *text, int len, UnicodeMap *uMap, GString *s);
492
 
 
493
 
  GBool rawOrder;               // keep text in content stream order
494
 
 
495
 
  double pageWidth, pageHeight; // width and height of current page
496
 
  TextWord *curWord;            // currently active string
497
 
  int charPos;                  // next character position (within content
498
 
                                //   stream)
499
 
  TextFontInfo *curFont;        // current font
500
 
  double curFontSize;           // current font size
501
 
  int nest;                     // current nesting level (for Type 3 fonts)
502
 
  int nTinyChars;               // number of "tiny" chars seen so far
503
 
  GBool lastCharOverlap;        // set if the last added char overlapped the
504
 
                                //   previous char
505
 
 
506
 
  TextPool *pools[4];           // a "pool" of TextWords for each rotation
507
 
  TextFlow *flows;              // linked list of flows
508
 
  TextBlock **blocks;           // array of blocks, in yx order
509
 
  int nBlocks;                  // number of blocks
510
 
  int primaryRot;               // primary rotation
511
 
  GBool primaryLR;              // primary direction (true means L-to-R,
512
 
                                //   false means R-to-L)
513
 
  TextWord *rawWords;           // list of words, in raw order (only if
514
 
                                //   rawOrder is set)
515
 
  TextWord *rawLastWord;        // last word on rawWords list
516
 
 
517
 
  GList *fonts;                 // all font info objects used on this
518
 
                                //   page [TextFontInfo]
519
 
 
520
 
  double lastFindXMin,          // coordinates of the last "find" result
521
 
         lastFindYMin;
522
 
  GBool haveLastFind;
523
 
 
524
 
  GList *underlines;            // [TextUnderline]
525
 
  GList *links;                 // [TextLink]
526
 
 
527
 
  friend class TextLine;
528
 
  friend class TextLineFrag;
529
 
  friend class TextBlock;
530
 
  friend class TextFlow;
531
 
  friend class TextWordList;
532
 
};
533
 
 
534
 
//------------------------------------------------------------------------
535
 
// TextOutputDev
536
 
//------------------------------------------------------------------------
537
 
 
538
 
class TextOutputDev: public OutputDev {
539
 
public:
540
 
 
541
 
  // Open a text output file.  If <fileName> is NULL, no file is
542
 
  // written (this is useful, e.g., for searching text).  If
543
 
  // <physLayoutA> is true, the original physical layout of the text
544
 
  // is maintained.  If <rawOrder> is true, the text is kept in
545
 
  // content stream order.
546
 
  TextOutputDev(char *fileName, GBool physLayoutA,
547
 
                GBool rawOrderA, GBool append);
548
 
 
549
 
  // Create a TextOutputDev which will write to a generic stream.  If
550
 
  // <physLayoutA> is true, the original physical layout of the text
551
 
  // is maintained.  If <rawOrder> is true, the text is kept in
552
 
  // content stream order.
553
 
  TextOutputDev(TextOutputFunc func, void *stream,
554
 
                GBool physLayoutA, GBool rawOrderA);
555
 
 
556
 
  // Destructor.
557
 
  virtual ~TextOutputDev();
558
 
 
559
 
  // Check if file was successfully created.
560
 
  virtual GBool isOk() { return ok; }
561
 
 
562
 
  //---- get info about output device
563
 
 
564
 
  // Does this device use upside-down coordinates?
565
 
  // (Upside-down means (0,0) is the top left corner of the page.)
566
 
  virtual GBool upsideDown() { return gTrue; }
567
 
 
568
 
  // Does this device use drawChar() or drawString()?
569
 
  virtual GBool useDrawChar() { return gTrue; }
570
 
 
571
 
  // Does this device use beginType3Char/endType3Char?  Otherwise,
572
 
  // text in Type 3 fonts will be drawn with drawChar/drawString.
573
 
  virtual GBool interpretType3Chars() { return gFalse; }
574
 
 
575
 
  // Does this device need non-text content?
576
 
  virtual GBool needNonText() { return gFalse; }
577
 
 
578
 
  //----- initialization and control
579
 
 
580
 
  // Start a page.
581
 
  virtual void startPage(int pageNum, GfxState *state);
582
 
 
583
 
  // End a page.
584
 
  virtual void endPage();
585
 
 
586
 
  //----- update text state
587
 
  virtual void updateFont(GfxState *state);
588
 
 
589
 
  //----- text drawing
590
 
  virtual void beginString(GfxState *state, GString *s);
591
 
  virtual void endString(GfxState *state);
592
 
  virtual void drawChar(GfxState *state, double x, double y,
593
 
                        double dx, double dy,
594
 
                        double originX, double originY,
595
 
                        CharCode c, int nBytes, Unicode *u, int uLen);
596
 
 
597
 
  //----- path painting
598
 
  virtual void stroke(GfxState *state);
599
 
  virtual void fill(GfxState *state);
600
 
  virtual void eoFill(GfxState *state);
601
 
 
602
 
  //----- link borders
603
 
  virtual void processLink(Link *link, Catalog *catalog);
604
 
 
605
 
  //----- special access
606
 
 
607
 
  // Find a string.  If <startAtTop> is true, starts looking at the
608
 
  // top of the page; else if <startAtLast> is true, starts looking
609
 
  // immediately after the last find result; else starts looking at
610
 
  // <xMin>,<yMin>.  If <stopAtBottom> is true, stops looking at the
611
 
  // bottom of the page; else if <stopAtLast> is true, stops looking
612
 
  // just before the last find result; else stops looking at
613
 
  // <xMax>,<yMax>.
614
 
  GBool findText(Unicode *s, int len,
615
 
                 GBool startAtTop, GBool stopAtBottom,
616
 
                 GBool startAtLast, GBool stopAtLast,
617
 
                 GBool caseSensitive, GBool backward,
618
 
                 double *xMin, double *yMin,
619
 
                 double *xMax, double *yMax);
620
 
 
621
 
  // Get the text which is inside the specified rectangle.
622
 
  GString *getText(double xMin, double yMin,
623
 
                   double xMax, double yMax);
624
 
 
625
 
  // Find a string by character position and length.  If found, sets
626
 
  // the text bounding rectangle and returns true; otherwise returns
627
 
  // false.
628
 
  GBool findCharRange(int pos, int length,
629
 
                      double *xMin, double *yMin,
630
 
                      double *xMax, double *yMax);
631
 
 
632
 
#if TEXTOUT_WORD_LIST
633
 
  // Build a flat word list, in content stream order (if
634
 
  // this->rawOrder is true), physical layout order (if
635
 
  // this->physLayout is true and this->rawOrder is false), or reading
636
 
  // order (if both flags are false).
637
 
  TextWordList *makeWordList();
638
 
#endif
639
 
 
640
 
  // Returns the TextPage object for the last rasterized page,
641
 
  // transferring ownership to the caller.
642
 
  TextPage *takeText();
643
 
 
644
 
  // Turn extra processing for HTML conversion on or off.
645
 
  void enableHTMLExtras(GBool doHTMLA) { doHTML = doHTMLA; }
646
 
 
647
 
private:
648
 
 
649
 
  TextOutputFunc outputFunc;    // output function
650
 
  void *outputStream;           // output stream
651
 
  GBool needClose;              // need to close the output file?
652
 
                                //   (only if outputStream is a FILE*)
653
 
  TextPage *text;               // text for the current page
654
 
  GBool physLayout;             // maintain original physical layout when
655
 
                                //   dumping text
656
 
  GBool rawOrder;               // keep text in content stream order
657
 
  GBool doHTML;                 // extra processing for HTML conversion
658
 
  GBool ok;                     // set up ok?
659
 
};
660
 
 
661
 
#endif