new parameter addspacechars
[swftools.git] / lib / pdf / GFXOutputDev.h
index 90c173c..f06dd21 100644 (file)
@@ -3,17 +3,13 @@
 
 #include "../gfxdevice.h"
 #include "../gfxsource.h"
+#include "../gfxtools.h"
 
 #include "config.h"
 #include "InfoOutputDev.h"
 #include "PDFDoc.h"
-
-typedef struct _fontlist
-{
-    char*filename;
-    gfxfont_t*font;
-    _fontlist*next;
-} fontlist_t;
+#include "GlobalParams.h"
+#include "CommonOutputDev.h"
 
 class GFXOutputState {
     public:
@@ -25,48 +21,60 @@ class GFXOutputState {
     char softmask_alpha;
     char isolated;
 
+    gfxbbox_t clipbbox;
+
     GFXOutputState();
 
     gfxresult_t* grouprecording; // for transparency groups
     gfxresult_t* softmaskrecording; // for soft masks
 
     gfxdevice_t* olddevice;
+  
+    double *dashPattern;
+    int dashLength;
+    double dashStart;
+
+    GfxState*state;
 };
 
-typedef struct _parameter
+typedef struct _feature
 {
-    char*name;
-    char*value;
-    struct _parameter*next;
-} parameter_t;
+    char*string;
+    struct _feature*next;
+} feature_t;
 
 void addGlobalFont(const char*filename);
 void addGlobalLanguageDir(const char*dir);
 void addGlobalFontDir(const char*dirname);
 
-class GFXOutputDev:  public OutputDev {
+class GFXOutputGlobals {
 public:
-  gfxdevice_t* device;
+  feature_t*featurewarnings;
 
-  // Constructor.
-  GFXOutputDev(parameter_t*p);
-  void setDevice(gfxdevice_t*dev);
+  int textmodeinfo; // did we write "Text will be rendered as polygon" yet?
+  int jpeginfo; // did we write "File contains jpegs" yet?
+  int pbminfo; // did we write "File contains jpegs" yet?
+  int linkinfo; // did we write "File contains links" yet?
 
-  // Destructor.
-  virtual ~GFXOutputDev() ;
+  GFXOutputGlobals();
+  ~GFXOutputGlobals();
+};
 
-  void setMove(int x,int y);
-  void setClip(int x1,int y1,int x2,int y2);
-  void setParameter(const char*key, const char*value);
+class GFXOutputDev:  public CommonOutputDev {
+public:
+  gfxdevice_t* device;
 
-  void setInfo(InfoOutputDev*info) {this->info = info;}
+  GFXOutputDev(InfoOutputDev*info, PDFDoc*doc);
+  virtual ~GFXOutputDev() ;
+
+  virtual void setDevice(gfxdevice_t*dev);
+  virtual void setMove(int x,int y);
+  virtual void setClip(int x1,int y1,int x2,int y2);
+  virtual void setParameter(const char*key, const char*value);
   
   // Start a page.
-  void startFrame(int width, int height);
-
   virtual void startPage(int pageNum, GfxState *state, double x1, double y1, double x2, double y2) ;
-
-  void endframe();
+  virtual void endPage();
 
   //----- get info about output device
 
@@ -81,10 +89,6 @@ public:
   
   //virtual GBool useShadedFills() { return gTrue; }
 
-  //----- initialization and control
-
-  void setXRef(PDFDoc*doc, XRef *xref);
-
   //----- link borders
   virtual void processLink(Link *link, Catalog *catalog);
 
@@ -94,7 +98,9 @@ public:
 
   //----- update graphics state
 
+  virtual void updateLineDash(GfxState *state);
   virtual void updateFont(GfxState *state);
+  virtual void updateFontMatrix(GfxState *state);
   virtual void updateFillColor(GfxState *state);
   virtual void updateStrokeColor(GfxState *state);
   virtual void updateLineWidth(GfxState *state);
@@ -130,17 +136,23 @@ public:
   virtual GBool useTilingPatternFill();
   virtual GBool useShadedFills();
 
-  /*
+#if (xpdfMajorVersion < 3) || (xpdfMinorVersion < 2) || (xpdfUpdateVersion < 7)
   virtual void tilingPatternFill(GfxState *state, Object *str,
-                                int paintType, Dict *resDict,
-                                double *mat, double *bbox,
-                                int x0, int y0, int x1, int y1,
-                                double xStep, double yStep) {}
-  virtual void functionShadedFill(GfxState *state,
-                                 GfxFunctionShading *shading) {}
-  virtual void axialShadedFill(GfxState *state, GfxAxialShading *shading) {}
-  virtual void radialShadedFill(GfxState *state, GfxRadialShading *shading) {}
-  */
+                            int paintType, Dict *resDict,
+                            double *mat, double *bbox,
+                            int x0, int y0, int x1, int y1,
+                            double xStep, double yStep);
+#else
+  virtual void tilingPatternFill(GfxState *state, Gfx *gfx, Object *str,
+                            int paintType, Dict *resDict,
+                            double *mat, double *bbox,
+                            int x0, int y0, int x1, int y1,
+                            double xStep, double yStep);
+#endif
+  virtual GBool functionShadedFill(GfxState *state,
+                                  GfxFunctionShading *shading);
+  virtual GBool axialShadedFill(GfxState *state, GfxAxialShading *shading);
+  virtual GBool radialShadedFill(GfxState *state, GfxRadialShading *shading);
 
   //----- text drawing
   virtual void beginString(GfxState *state, GString *s) ;
@@ -187,8 +199,6 @@ public:
   virtual void type3D0(GfxState *state, double wx, double wy);
   virtual void type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury);
 
-  void preparePage(int pdfpage, int outputpage);
-
   char* searchForSuitableFont(GfxFont*gfxFont);
 
   void finish();
@@ -196,7 +206,6 @@ public:
   virtual GBool useDrawForm();
   virtual void drawForm(Ref id);
   virtual GBool needNonText();
-  virtual void endPage();
 
   //virtual void dump();
   //virtual void beginStringOp(GfxState *state);
@@ -206,52 +215,50 @@ public:
   //virtual void setVectorAntialias(GBool vaa) {}
   //virtual void psXObject(Stream *psStream, Stream *level1Stream) {}
 
+  virtual void setPageMap(int*pagemap, int pagemap_len);
+
   private:
+  gfxline_t* gfxPath_to_gfxline(GfxState*state, GfxPath*path, int closed, int user_movex, int user_movey);
+
+  void transformXY(GfxState*state, double x, double y, double*nx, double*ny);
+
   void drawGeneralImage(GfxState *state, Object *ref, Stream *str,
                                   int width, int height, GfxImageColorMap*colorMap, GBool invert,
                                   GBool inlineImg, int mask, int *maskColors,
                                   Stream *maskStr, int maskWidth, int maskHeight, GBool maskInvert, GfxImageColorMap*maskColorMap);
-  int setGfxFont(char*id, char*name, char*filename, double maxSize, CharCodeToUnicode*ctu);
+
   void strokeGfxline(GfxState *state, gfxline_t*line, int flags);
-  void clipToGfxLine(GfxState *state, gfxline_t*line);
-  void fillGfxLine(GfxState *state, gfxline_t*line);
+  void clipToGfxLine(GfxState *state, gfxline_t*line, char evenodd);
+  void fillGfxLine(GfxState *state, gfxline_t*line, char evenodd);
+
+  gfxfont_t* createGfxFont(GfxFont*xpdffont, FontInfo*src);
 
   void showfeature(const char*feature,char fully, char warn);
   void warnfeature(const char*feature,char fully);
   void infofeature(const char*feature);
-
-  char outer_clip_box; //whether the page clip box is still on
   
-  GBool do_interpretType3Chars;
+  char* searchFont(const char*name);
+  char* substituteFont(GfxFont*gfxFont, char*oldname);
+  char* writeEmbeddedFontToFile(XRef*ref, GfxFont*font);
+
+  /* for page mapping */
+  int* page2page;
+  int num_pages;
 
+
+  int currentpage;
+  char outer_clip_box; //whether the page clip box is still on
   InfoOutputDev*info;
   GFXOutputState states[64];
   int statepos;
 
-  int currentpage;
-
   PDFDoc*doc;
   XRef*xref;
 
-  char* searchFont(const char*name);
-  char* substituteFont(GfxFont*gfxFont, char*oldname);
-  char* writeEmbeddedFontToFile(XRef*ref, GfxFont*font);
-  int t1id;
-  int textmodeinfo; // did we write "Text will be rendered as polygon" yet?
-  int jpeginfo; // did we write "File contains jpegs" yet?
-  int pbminfo; // did we write "File contains jpegs" yet?
-  int linkinfo; // did we write "File contains links" yet?
-
   int type3active; // are we between beginType3()/endType3()?
 
   GfxState *laststate;
 
-  char type3Warning;
-
-  const char* substitutetarget[256];
-  const char* substitutesource[256];
-  int substitutepos;
-
   int user_movex,user_movey;
   int user_clipx1,user_clipx2,user_clipy1,user_clipy2;
 
@@ -261,27 +268,39 @@ public:
   int clipmovex;
   int clipmovey;
 
-  double width,height;
-
   gfxline_t* current_text_stroke;
   gfxline_t* current_text_clip;
-  char* current_font_id;
   gfxfont_t* current_gfxfont;
+  FontInfo*current_fontinfo;
   gfxmatrix_t current_font_matrix;
 
-  fontlist_t* fontlist;
-
-  int*pages;
-  int pagebuflen;
-  int pagepos;
+  gfxfont_t* last_char_gfxfont;
+  int last_char;
+  double last_char_x;
+  double last_char_y;
+  char last_char_was_space;
 
   /* config */
   int config_use_fontconfig;
   int config_break_on_warning;
   int config_remapunicode;
   int config_transparent;
+  int config_extrafontdata;
+  int config_convertgradients;
+  int config_disable_polygon_conversion;
+  int config_multiply;
+  int config_bigchar;
+  int config_drawonlyshapes;
+  int config_detectspaces;
+  char* config_linkdatafile;
+  double config_fontquality;
+};
 
-  parameter_t*parameters;
+class GFXGlobalParams:  public GlobalParams {
+    public:
+    GFXGlobalParams();
+    ~GFXGlobalParams();
+    virtual DisplayFontParam *getDisplayFont(GString *fontName);
 };
 
 #endif //__gfxoutputdev_h__