"Fossies" - the Fresh Open Source Software Archive

Member "xpdf-4.04/xpdf/Gfx.h" (18 Apr 2022, 11911 Bytes) of package /linux/misc/xpdf-4.04.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 //========================================================================
    2 //
    3 // Gfx.h
    4 //
    5 // Copyright 1996-2016 Glyph & Cog, LLC
    6 //
    7 //========================================================================
    8 
    9 #ifndef GFX_H
   10 #define GFX_H
   11 
   12 #include <aconf.h>
   13 
   14 #ifdef USE_GCC_PRAGMAS
   15 #pragma interface
   16 #endif
   17 
   18 #include "gtypes.h"
   19 #include "gfile.h"
   20 #include "GfxState.h"
   21 
   22 class GString;
   23 class GList;
   24 class PDFDoc;
   25 class XRef;
   26 class Array;
   27 class Stream;
   28 class Parser;
   29 class Dict;
   30 class Function;
   31 class OutputDev;
   32 class GfxFontDict;
   33 class GfxFont;
   34 class Gfx;
   35 class PDFRectangle;
   36 class AnnotBorderStyle;
   37 
   38 //------------------------------------------------------------------------
   39 
   40 enum GfxClipType {
   41   clipNone,
   42   clipNormal,
   43   clipEO
   44 };
   45 
   46 enum TchkType {
   47   tchkBool,         // boolean
   48   tchkInt,          // integer
   49   tchkNum,          // number (integer or real)
   50   tchkString,           // string
   51   tchkName,         // name
   52   tchkArray,            // array
   53   tchkProps,            // properties (dictionary or name)
   54   tchkSCN,          // scn/SCN args (number of name)
   55   tchkNone          // used to avoid empty initializer lists
   56 };
   57 
   58 #define maxArgs 33
   59 
   60 struct Operator {
   61   char name[4];
   62   int numArgs;
   63   TchkType tchk[maxArgs];
   64   void (Gfx::*func)(Object args[], int numArgs);
   65 };
   66 
   67 //------------------------------------------------------------------------
   68 
   69 class GfxResources {
   70 public:
   71 
   72   GfxResources(XRef *xref, Dict *resDict, GfxResources *nextA);
   73   ~GfxResources();
   74 
   75   GfxFont *lookupFont(char *name);
   76   GfxFont *lookupFontByRef(Ref ref);
   77   GBool lookupXObject(const char *name, Object *obj);
   78   GBool lookupXObjectNF(const char *name, Object *obj);
   79   void lookupColorSpace(const char *name, Object *obj, GBool inherit = gTrue);
   80   GfxPattern *lookupPattern(const char *name
   81                 );
   82   GfxShading *lookupShading(const char *name
   83                 );
   84   GBool lookupGState(const char *name, Object *obj);
   85   GBool lookupPropertiesNF(const char *name, Object *obj);
   86 
   87   GfxResources *getNext() { return next; }
   88 
   89 private:
   90 
   91   GBool valid;
   92   GfxFontDict *fonts;
   93   Object xObjDict;
   94   Object colorSpaceDict;
   95   Object patternDict;
   96   Object shadingDict;
   97   Object gStateDict;
   98   Object propsDict;
   99   GfxResources *next;
  100 };
  101 
  102 //------------------------------------------------------------------------
  103 // GfxMarkedContent
  104 //------------------------------------------------------------------------
  105 
  106 enum GfxMarkedContentKind {
  107   gfxMCOptionalContent,
  108   gfxMCActualText,
  109   gfxMCOther
  110 };
  111 
  112 class GfxMarkedContent {
  113 public:
  114 
  115   GfxMarkedContent(GfxMarkedContentKind kindA, GBool ocStateA) {
  116     kind = kindA;
  117     ocState = ocStateA;
  118   }
  119   ~GfxMarkedContent() {}
  120 
  121   GfxMarkedContentKind kind;
  122   GBool ocState;        // true if drawing is enabled, false if
  123                 //   disabled
  124 };
  125 
  126 //------------------------------------------------------------------------
  127 // Gfx
  128 //------------------------------------------------------------------------
  129 
  130 class Gfx {
  131 public:
  132 
  133   // Constructor for regular output.
  134   Gfx(PDFDoc *docA, OutputDev *outA, int pageNum, Dict *resDict,
  135       double hDPI, double vDPI, PDFRectangle *box,
  136       PDFRectangle *cropBox, int rotate,
  137       GBool (*abortCheckCbkA)(void *data) = NULL,
  138       void *abortCheckCbkDataA = NULL);
  139 
  140   // Constructor for a sub-page object.
  141   Gfx(PDFDoc *docA, OutputDev *outA, Dict *resDict,
  142       PDFRectangle *box, PDFRectangle *cropBox,
  143       GBool (*abortCheckCbkA)(void *data) = NULL,
  144       void *abortCheckCbkDataA = NULL);
  145 
  146   ~Gfx();
  147 
  148   // Interpret a stream or array of streams.  <objRef> should be a
  149   // reference wherever possible (for loop-checking).
  150   void display(Object *objRef, GBool topLevel = gTrue);
  151 
  152   // Display an annotation, given its appearance (a Form XObject),
  153   // border style, and bounding box (in default user space).
  154   void drawAnnot(Object *strRef, AnnotBorderStyle *borderStyle,
  155          double xMin, double yMin, double xMax, double yMax);
  156 
  157   // Save graphics state.
  158   void saveState();
  159 
  160   // Restore graphics state.
  161   void restoreState();
  162 
  163   // Get the current graphics state object.
  164   GfxState *getState() { return state; }
  165 
  166   void drawForm(Object *strRef, Dict *resDict, double *matrix, double *bbox,
  167         GBool transpGroup = gFalse, GBool softMask = gFalse,
  168         GBool isolated = gFalse, GBool knockout = gFalse,
  169         GBool alpha = gFalse, Function *transferFunc = NULL,
  170         Object *backdropColorObj = NULL);
  171 
  172   // Take all of the content stream stack entries from <oldGfx>.  This
  173   // is useful when creating a new Gfx object to handle a pattern,
  174   // etc., where it's useful to check for loops that span both Gfx
  175   // objects.  This function should be called immediately after the
  176   // Gfx constructor, i.e., before processing any content streams with
  177   // the new Gfx object.
  178   void takeContentStreamStack(Gfx *oldGfx);
  179 
  180   // Clear the state stack and the marked content stack.
  181   void endOfPage();
  182 
  183 private:
  184 
  185   PDFDoc *doc;
  186   XRef *xref;           // the xref table for this PDF file
  187   OutputDev *out;       // output device
  188   GBool subPage;        // is this a sub-page object?
  189   GBool printCommands;      // print the drawing commands (for debugging)
  190   GfxResources *res;        // resource stack
  191   GfxFont *defaultFont;     // font substituted for undefined fonts
  192   int opCounter;        // operation counter (used to decide when
  193                 //   to check for an abort)
  194 
  195   GfxState *state;      // current graphics state
  196   GBool fontChanged;        // set if font or text matrix has changed
  197   GfxClipType clip;     // do a clip?
  198   int ignoreUndef;      // current BX/EX nesting level
  199   double baseMatrix[6];     // default matrix for most recent
  200                 //   page/form/pattern
  201   int formDepth;
  202   GBool ocState;        // true if drawing is enabled, false if
  203                 //   disabled
  204   GList *markedContentStack;    // BMC/BDC/EMC stack [GfxMarkedContent]
  205 
  206   Parser *parser;       // parser for page content stream(s)
  207   GList *contentStreamStack;    // stack of open content streams, used
  208                 //   for loop-checking
  209 
  210   GBool             // callback to check for an abort
  211     (*abortCheckCbk)(void *data);
  212   void *abortCheckCbkData;
  213 
  214   static Operator opTab[];  // table of operators
  215 
  216   GBool checkForContentStreamLoop(Object *ref);
  217   void go(GBool topLevel);
  218   void getContentObj(Object *obj);
  219   GBool execOp(Object *cmd, Object args[], int numArgs);
  220   Operator *findOp(char *name);
  221   GBool checkArg(Object *arg, TchkType type);
  222   GFileOffset getPos();
  223 
  224   // graphics state operators
  225   void opSave(Object args[], int numArgs);
  226   void opRestore(Object args[], int numArgs);
  227   void opConcat(Object args[], int numArgs);
  228   void opSetDash(Object args[], int numArgs);
  229   void opSetFlat(Object args[], int numArgs);
  230   void opSetLineJoin(Object args[], int numArgs);
  231   void opSetLineCap(Object args[], int numArgs);
  232   void opSetMiterLimit(Object args[], int numArgs);
  233   void opSetLineWidth(Object args[], int numArgs);
  234   void opSetExtGState(Object args[], int numArgs);
  235   void doSoftMask(Object *str, Object *strRef, GBool alpha,
  236           GBool isolated, GBool knockout,
  237           Function *transferFunc, Object *backdropColorObj);
  238   void opSetRenderingIntent(Object args[], int numArgs);
  239   GfxRenderingIntent parseRenderingIntent(const char *name);
  240 
  241   // color operators
  242   void opSetFillGray(Object args[], int numArgs);
  243   void opSetStrokeGray(Object args[], int numArgs);
  244   void opSetFillCMYKColor(Object args[], int numArgs);
  245   void opSetStrokeCMYKColor(Object args[], int numArgs);
  246   void opSetFillRGBColor(Object args[], int numArgs);
  247   void opSetStrokeRGBColor(Object args[], int numArgs);
  248   void opSetFillColorSpace(Object args[], int numArgs);
  249   void opSetStrokeColorSpace(Object args[], int numArgs);
  250   void opSetFillColor(Object args[], int numArgs);
  251   void opSetStrokeColor(Object args[], int numArgs);
  252   void opSetFillColorN(Object args[], int numArgs);
  253   void opSetStrokeColorN(Object args[], int numArgs);
  254 
  255   // path segment operators
  256   void opMoveTo(Object args[], int numArgs);
  257   void opLineTo(Object args[], int numArgs);
  258   void opCurveTo(Object args[], int numArgs);
  259   void opCurveTo1(Object args[], int numArgs);
  260   void opCurveTo2(Object args[], int numArgs);
  261   void opRectangle(Object args[], int numArgs);
  262   void opClosePath(Object args[], int numArgs);
  263 
  264   // path painting operators
  265   void opEndPath(Object args[], int numArgs);
  266   void opStroke(Object args[], int numArgs);
  267   void opCloseStroke(Object args[], int numArgs);
  268   void opFill(Object args[], int numArgs);
  269   void opEOFill(Object args[], int numArgs);
  270   void opFillStroke(Object args[], int numArgs);
  271   void opCloseFillStroke(Object args[], int numArgs);
  272   void opEOFillStroke(Object args[], int numArgs);
  273   void opCloseEOFillStroke(Object args[], int numArgs);
  274   void doPatternFill(GBool eoFill);
  275   void doPatternStroke();
  276   void doPatternText();
  277   void doPatternImageMask(Object *ref, Stream *str, int width, int height,
  278               GBool invert, GBool inlineImg, GBool interpolate);
  279   void doTilingPatternFill(GfxTilingPattern *tPat,
  280                GBool stroke, GBool eoFill, GBool text);
  281   void doShadingPatternFill(GfxShadingPattern *sPat,
  282                 GBool stroke, GBool eoFill, GBool text);
  283   void opShFill(Object args[], int numArgs);
  284   void doShFill(GfxShading *shading);
  285   void doFunctionShFill(GfxFunctionShading *shading);
  286   void doFunctionShFill1(GfxFunctionShading *shading,
  287              double x0, double y0,
  288              double x1, double y1,
  289              GfxColor *colors, int depth);
  290   void doAxialShFill(GfxAxialShading *shading);
  291   void doRadialShFill(GfxRadialShading *shading);
  292   void doGouraudTriangleShFill(GfxGouraudTriangleShading *shading);
  293   void gouraudFillTriangle(double x0, double y0, double *color0,
  294                double x1, double y1, double *color1,
  295                double x2, double y2, double *color2,
  296                GfxGouraudTriangleShading *shading, int depth);
  297   void doPatchMeshShFill(GfxPatchMeshShading *shading);
  298   void fillPatch(GfxPatch *patch, GfxPatchMeshShading *shading, int depth);
  299   void doEndPath();
  300 
  301   // path clipping operators
  302   void opClip(Object args[], int numArgs);
  303   void opEOClip(Object args[], int numArgs);
  304 
  305   // text object operators
  306   void opBeginText(Object args[], int numArgs);
  307   void opEndText(Object args[], int numArgs);
  308 
  309   // text state operators
  310   void opSetCharSpacing(Object args[], int numArgs);
  311   void opSetFont(Object args[], int numArgs);
  312   void doSetFont(GfxFont *font, double size);
  313   void opSetTextLeading(Object args[], int numArgs);
  314   void opSetTextRender(Object args[], int numArgs);
  315   void opSetTextRise(Object args[], int numArgs);
  316   void opSetWordSpacing(Object args[], int numArgs);
  317   void opSetHorizScaling(Object args[], int numArgs);
  318 
  319   // text positioning operators
  320   void opTextMove(Object args[], int numArgs);
  321   void opTextMoveSet(Object args[], int numArgs);
  322   void opSetTextMatrix(Object args[], int numArgs);
  323   void opTextNextLine(Object args[], int numArgs);
  324 
  325   // text string operators
  326   void opShowText(Object args[], int numArgs);
  327   void opMoveShowText(Object args[], int numArgs);
  328   void opMoveSetShowText(Object args[], int numArgs);
  329   void opShowSpaceText(Object args[], int numArgs);
  330   void doShowText(GString *s);
  331   void doIncCharCount(GString *s);
  332 
  333   // XObject operators
  334   void opXObject(Object args[], int numArgs);
  335   GBool doImage(Object *ref, Stream *str, GBool inlineImg);
  336   void doForm(Object *strRef, Object *str);
  337 
  338   // in-line image operators
  339   void opBeginImage(Object args[], int numArgs);
  340   Stream *buildImageStream(GBool *haveLength);
  341   void opImageData(Object args[], int numArgs);
  342   void opEndImage(Object args[], int numArgs);
  343 
  344   // type 3 font operators
  345   void opSetCharWidth(Object args[], int numArgs);
  346   void opSetCacheDevice(Object args[], int numArgs);
  347 
  348   // compatibility operators
  349   void opBeginIgnoreUndef(Object args[], int numArgs);
  350   void opEndIgnoreUndef(Object args[], int numArgs);
  351 
  352   // marked content operators
  353   void opBeginMarkedContent(Object args[], int numArgs);
  354   void opEndMarkedContent(Object args[], int numArgs);
  355   void opMarkPoint(Object args[], int numArgs);
  356 
  357   GfxState *saveStateStack();
  358   void restoreStateStack(GfxState *oldState);
  359   void pushResources(Dict *resDict);
  360   void popResources();
  361 };
  362 
  363 #endif