]> www.fi.muni.cz Git - evince.git/blobdiff - pdf/xpdf/XOutputDev.h
move here from bonobo-application-x-pdf.cc
[evince.git] / pdf / xpdf / XOutputDev.h
index 48454212e2f95a48a0d66695c3d524b75f42344c..dc6af01e88cd0ea9db9231174a5e41501474d005 100644 (file)
@@ -2,7 +2,7 @@
 //
 // XOutputDev.h
 //
-// Copyright 1996 Derek B. Noonburg
+// Copyright 1996-2002 Glyph & Cog, LLC
 //
 //========================================================================
 
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include "config.h"
+#include "Object.h"
+#include "CharTypes.h"
+#include "GlobalParams.h"
 #include "OutputDev.h"
 
 class GString;
-class GfxColor;
+class GList;
+struct GfxRGB;
 class GfxFont;
 class GfxSubpath;
 class TextPage;
-struct RGBColor;
+class XOutputFontCache;
+struct T3FontCacheTag;
+class T3FontCache;
+struct T3GlyphStack;
+class XOutputDev;
+class Link;
+class Catalog;
+class DisplayFontParam;
+class UnicodeMap;
+class CharCodeToUnicode;
+
+#if HAVE_T1LIB_H
+class T1FontEngine;
+class T1FontFile;
+class T1Font;
+#endif
+
+#if FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
+class FTFontEngine;
+class FTFontFile;
+class FTFont;
+#endif
+
+#if !FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
+class TTFontEngine;
+class TTFontFile;
+class TTFont;
+#endif
 
 //------------------------------------------------------------------------
 // Constants
 //------------------------------------------------------------------------
 
-#define maxRGBCube 8           // max size of RGB color cube
+#define maxRGBCube 7           // max size of RGB color cube
 
 #define numTmpPoints 256       // number of XPoints in temporary array
 #define numTmpSubpaths 16      // number of elements in temporary arrays
@@ -45,85 +76,389 @@ struct BoundingRect {
   short yMin, yMax;            // min/max y values
 };
 
-struct RGBColor {
-  double r, g, b;
+//------------------------------------------------------------------------
+// XOutputFont
+//------------------------------------------------------------------------
+
+class XOutputFont {
+public:
+
+  XOutputFont(Ref *idA, double m11OrigA, double m12OrigA,
+             double m21OrigA, double m22OrigA,
+             double m11A, double m12A, double m21A, double m22A,
+             Display *displayA, XOutputDev *xOutA);
+
+  virtual ~XOutputFont();
+
+  // Does this font match the ID and transform?
+  GBool matches(Ref *idA, double m11OrigA, double m12OrigA,
+               double m21OrigA, double m22OrigA)
+    { return id.num == idA->num && id.gen == idA->gen &&
+            m11Orig == m11OrigA && m12Orig == m12OrigA &&
+            m21Orig == m21OrigA && m22Orig == m22OrigA; }
+
+  // Was font created successfully?
+  virtual GBool isOk() = 0;
+
+  // Update <gc> with this font.
+  virtual void updateGC(GC gc) = 0;
+
+  // Draw character <c>/<u> at <x>,<y> (in device space).
+  virtual void drawChar(GfxState *state, Pixmap pixmap, int w, int h,
+                       GC gc, GfxRGB *rgb,
+                       double x, double y, double dx, double dy,
+                       CharCode c, Unicode *u, int uLen) = 0;
+
+  // Returns true if this XOutputFont subclass provides the
+  // getCharPath function.
+  virtual GBool hasGetCharPath() { return gFalse; }
+
+  // Add the character outline for <c>/<u> to the current path.
+  virtual void getCharPath(GfxState *state,
+                          CharCode c, Unicode *u, int ulen);
+
+protected:
+
+  Ref id;                      // font ID
+  double m11Orig, m12Orig,     // original transform matrix
+         m21Orig, m22Orig;
+  double m11, m12, m21, m22;   // actual transform matrix (possibly
+                               //   modified for font substitution)
+  Display *display;            // X display
+  XOutputDev *xOut;
 };
 
+#if HAVE_T1LIB_H
 //------------------------------------------------------------------------
-// Parameters
+// XOutputT1Font
 //------------------------------------------------------------------------
 
-// Install a private colormap.
-extern GBool installCmap;
+class XOutputT1Font: public XOutputFont {
+public:
+
+  XOutputT1Font(Ref *idA, T1FontFile *fontFileA,
+               double m11OrigA, double m12OrigA,
+               double m21OrigA, double m22OrigA,
+               double m11A, double m12A,
+               double m21A, double m22A,
+               Display *displayA, XOutputDev *xOutA);
+
+  virtual ~XOutputT1Font();
+
+  // Was font created successfully?
+  virtual GBool isOk();
+
+  // Update <gc> with this font.
+  virtual void updateGC(GC gc);
+
+  // Draw character <c>/<u> at <x>,<y>.
+  virtual void drawChar(GfxState *state, Pixmap pixmap, int w, int h,
+                       GC gc, GfxRGB *rgb,
+                       double x, double y, double dx, double dy,
+                       CharCode c, Unicode *u, int uLen);
 
-// Size of RGB color cube.
-extern int rgbCubeSize;
+  // Returns true if this XOutputFont subclass provides the
+  // getCharPath function.
+  virtual GBool hasGetCharPath() { return gTrue; }
 
+  // Add the character outline for <c>/<u> to the current path.
+  virtual void getCharPath(GfxState *state,
+                          CharCode c, Unicode *u, int ulen);
+
+private:
+
+  T1FontFile *fontFile;
+  T1Font *font;
+};
+#endif // HAVE_T1LIB_H
+
+#if FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
 //------------------------------------------------------------------------
-// XOutputFont
+// XOutputFTFont
 //------------------------------------------------------------------------
 
-class XOutputFont {
+class XOutputFTFont: public XOutputFont {
 public:
 
-  // Constructor.
-  XOutputFont(GfxFont *gfxFont, double m11, double m12,
-             double m21, double m22, Display *display1);
+  XOutputFTFont(Ref *idA, FTFontFile *fontFileA,
+               double m11OrigA, double m12OrigA,
+               double m21OrigA, double m22OrigA,
+               double m11A, double m12A,
+               double m21A, double m22A,
+               Display *displayA, XOutputDev *xOutA);
 
-  // Destructor.
-  ~XOutputFont();
+  virtual ~XOutputFTFont();
 
-  // Does this font match the ID, size, and angle?
-  GBool matches(Ref id1, double m11, double m12, double m21, double m22)
-    { return id.num == id1.num && id.gen == id1.gen &&
-            mat11 == m11 && mat12 == m12 && mat21 == m21 && mat22 == m22; }
+  // Was font created successfully?
+  virtual GBool isOk();
 
-  // Get X font.
-  XFontStruct *getXFont() { return xFont; }
+  // Update <gc> with this font.
+  virtual void updateGC(GC gc);
 
-  // Get character mapping.
-  Gushort mapChar(Guchar c) { return map[c]; }
+  // Draw character <c>/<u> at <x>,<y>.
+  virtual void drawChar(GfxState *state, Pixmap pixmap, int w, int h,
+                       GC gc, GfxRGB *rgb,
+                       double x, double y, double dx, double dy,
+                       CharCode c, Unicode *u, int uLen);
 
-  // Reverse map a character.
-  Guchar revMapChar(Gushort c) { return revMap[c]; }
+  // Returns true if this XOutputFont subclass provides the
+  // getCharPath function.
+  virtual GBool hasGetCharPath() { return gTrue; }
 
-  // Does this font use hex char codes?
-  GBool isHex() { return hex; }
+  // Add the character outline for <c>/<u> to the current path.
+  virtual void getCharPath(GfxState *state,
+                          CharCode c, Unicode *u, int ulen);
 
 private:
 
-  Ref id;
-  double mat11, mat12, mat21, mat22;
-  Display *display;
-  XFontStruct *xFont;
-  GBool hex;                   // subsetted font with hex char codes
-  Gushort map[256];
-  Guchar revMap[256];
+  FTFontFile *fontFile;
+  FTFont *font;
+};
+#endif // FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
+
+#if !FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
+//------------------------------------------------------------------------
+// XOutputTTFont
+//------------------------------------------------------------------------
+
+class XOutputTTFont: public XOutputFont {
+public:
+
+  XOutputTTFont(Ref *idA, TTFontFile *fontFileA,
+               double m11OrigA, double m12OrigA,
+               double m21OrigA, double m22OrigA,
+               double m11A, double m12A,
+               double m21A, double m22A,
+               Display *displayA, XOutputDev *xOutA);
+
+  virtual ~XOutputTTFont();
+
+  // Was font created successfully?
+  virtual GBool isOk();
+
+  // Update <gc> with this font.
+  virtual void updateGC(GC gc);
+
+  // Draw character <c>/<u> at <x>,<y>.
+  virtual void drawChar(GfxState *state, Pixmap pixmap, int w, int h,
+                       GC gc, GfxRGB *rgb,
+                       double x, double y, double dx, double dy,
+                       CharCode c, Unicode *u, int uLen);
+
+private:
+
+  TTFontFile *fontFile;
+  TTFont *font;
+};
+#endif // !FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
+
+//------------------------------------------------------------------------
+// XOutputServer8BitFont
+//------------------------------------------------------------------------
+
+class XOutputServer8BitFont: public XOutputFont {
+public:
+
+  XOutputServer8BitFont(Ref *idA, GString *xlfdFmt,
+                       UnicodeMap *xUMapA, CharCodeToUnicode *fontUMap,
+                       double m11OrigA, double m12OrigA,
+                       double m21OrigA, double m22OrigA,
+                       double m11A, double m12A, double m21A, double m22A,
+                       Display *displayA, XOutputDev *xOutA);
+
+  virtual ~XOutputServer8BitFont();
+
+  // Was font created successfully?
+  virtual GBool isOk();
+
+  // Update <gc> with this font.
+  virtual void updateGC(GC gc);
+
+  // Draw character <c>/<u> at <x>,<y>.
+  virtual void drawChar(GfxState *state, Pixmap pixmap, int w, int h,
+                       GC gc, GfxRGB *rgb,
+                       double x, double y, double dx, double dy,
+                       CharCode c, Unicode *u, int uLen);
+
+private:
+
+  XFontStruct *xFont;          // the X font
+  Gushort map[256];            // forward map (char code -> X font code)
+  UnicodeMap *xUMap;
+};
+
+//------------------------------------------------------------------------
+// XOutputServer16BitFont
+//------------------------------------------------------------------------
+
+class XOutputServer16BitFont: public XOutputFont {
+public:
+
+  XOutputServer16BitFont(Ref *idA, GString *xlfdFmt,
+                        UnicodeMap *xUMapA, CharCodeToUnicode *fontUMap,
+                        double m11OrigA, double m12OrigA,
+                        double m21OrigA, double m22OrigA,
+                        double m11A, double m12A, double m21A, double m22A,
+                        Display *displayA, XOutputDev *xOutA);
+
+  virtual ~XOutputServer16BitFont();
+
+  // Was font created successfully?
+  virtual GBool isOk();
+
+  // Update <gc> with this font.
+  virtual void updateGC(GC gc);
+
+  // Draw character <c>/<u> at <x>,<y>.
+  virtual void drawChar(GfxState *state, Pixmap pixmap, int w, int h,
+                       GC gc, GfxRGB *rgb,
+                       double x, double y, double dx, double dy,
+                       CharCode c, Unicode *u, int uLen);
+
+private:
+
+  XFontStruct *xFont;          // the X font
+  UnicodeMap *xUMap;
 };
 
 //------------------------------------------------------------------------
 // XOutputFontCache
 //------------------------------------------------------------------------
 
+#if HAVE_T1LIB_H
+class XOutputT1FontFile {
+public:
+  XOutputT1FontFile(int numA, int genA, GBool substA, T1FontFile *fontFileA)
+    { num = numA; gen = genA; subst = substA; fontFile = fontFileA; }
+  ~XOutputT1FontFile();
+  int num, gen;
+  GBool subst;
+  T1FontFile *fontFile;
+};
+#endif
+
+#if FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
+class XOutputFTFontFile {
+public:
+  XOutputFTFontFile(int numA, int genA, GBool substA, FTFontFile *fontFileA)
+    { num = numA; gen = genA; subst = substA; fontFile = fontFileA; }
+  ~XOutputFTFontFile();
+  int num, gen;
+  GBool subst;
+  FTFontFile *fontFile;
+};
+#endif
+
+#if !FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
+class XOutputTTFontFile {
+public:
+  XOutputTTFontFile(int numA, int genA, GBool substA, TTFontFile *fontFileA)
+    { num = numA; gen = genA; subst = substA; fontFile = fontFileA; }
+  ~XOutputTTFontFile();
+  int num, gen;
+  GBool subst;
+  TTFontFile *fontFile;
+};
+#endif
+
 class XOutputFontCache {
 public:
 
   // Constructor.
-  XOutputFontCache(Display *display1);
+  XOutputFontCache(Display *displayA, Guint depthA,
+                  XOutputDev *xOutA,
+                  FontRastControl t1libControlA,
+                  FontRastControl freetypeControlA);
 
   // Destructor.
   ~XOutputFontCache();
 
+  // Initialize (or re-initialize) the font cache for a new document.
+  void startDoc(int screenNum, Colormap colormap,
+               GBool trueColor,
+               int rMul, int gMul, int bMul,
+               int rShift, int gShift, int bShift,
+               Gulong *colors, int numColors);
+
   // Get a font.  This creates a new font if necessary.
-  XOutputFont *getFont(GfxFont *gfxFont, double m11, double m12,
+  XOutputFont *getFont(XRef *xref, GfxFont *gfxFont, double m11, double m12,
                       double m21, double m22);
 
 private:
 
+  void delFonts();
+  void clear();
+  XOutputFont *tryGetFont(XRef *xref, DisplayFontParam *dfp, GfxFont *gfxFont,
+                         double m11Orig, double m12Orig,
+                         double m21Orig, double m22Orig,
+                         double m11, double m12, double m21, double m22,
+                         GBool subst);
+#if HAVE_T1LIB_H
+  XOutputFont *tryGetT1Font(XRef *xref, GfxFont *gfxFont,
+                           double m11, double m12, double m21, double m22);
+  XOutputFont *tryGetT1FontFromFile(XRef *xref, GString *fileName,
+                                   GfxFont *gfxFont,
+                                   double m11Orig, double m12Orig,
+                                   double m21Orig, double m22Orig,
+                                   double m11, double m12,
+                                   double m21, double m22, GBool subst);
+#endif
+#if FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
+  XOutputFont *tryGetFTFont(XRef *xref, GfxFont *gfxFont,
+                           double m11, double m12, double m21, double m22);
+  XOutputFont *tryGetFTFontFromFile(XRef *xref, GString *fileName,
+                                   GfxFont *gfxFont,
+                                   double m11Orig, double m12Orig,
+                                   double m21Orig, double m22Orig,
+                                   double m11, double m12,
+                                   double m21, double m22, GBool subst);
+#endif
+#if !FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
+  XOutputFont *tryGetTTFont(XRef *xref, GfxFont *gfxFont,
+                           double m11, double m12, double m21, double m22);
+  XOutputFont *tryGetTTFontFromFile(XRef *xref, GString *fileName,
+                                   GfxFont *gfxFont,
+                                   double m11Orig, double m12Orig,
+                                   double m21Orig, double m22Orig,
+                                   double m11, double m12,
+                                   double m21, double m22, GBool subst);
+#endif
+  XOutputFont *tryGetServerFont(GString *xlfd, GString *encodingName,
+                               GfxFont *gfxFont,
+                               double m11Orig, double m12Orig,
+                               double m21Orig, double m22Orig,
+                               double m11, double m12,
+                               double m21, double m22);
+
   Display *display;            // X display pointer
-  XOutputFont *                        // fonts in reverse-LRU order
-    fonts[fontCacheSize];
-  int numFonts;                        // number of valid entries
+  XOutputDev *xOut;
+  Guint depth;                 // pixmap depth
+
+  XOutputFont *
+    fonts[xOutFontCacheSize];
+  int nFonts;
+
+#if HAVE_T1LIB_H
+  FontRastControl t1libControl;        // t1lib settings
+  T1FontEngine *t1Engine;      // Type 1 font engine
+  GList *t1FontFiles;          // list of Type 1 font files
+                               //   [XOutputT1FontFile]
+#endif
+
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+  FontRastControl              // FreeType settings
+    freetypeControl;
+#endif
+#if FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
+  FTFontEngine *ftEngine;      // FreeType font engine
+  GList *ftFontFiles;          // list of FreeType font files
+                               //   [XOutputFTFontFile]
+#endif
+#if !FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
+  TTFontEngine *ttEngine;      // TrueType font engine
+  GList *ttFontFiles;          // list of TrueType font files
+                               //   [XOutputTTFontFile]
+#endif
 };
 
 //------------------------------------------------------------------------
@@ -145,8 +480,10 @@ class XOutputDev: public OutputDev {
 public:
 
   // Constructor.
-  XOutputDev(Display *display1, Pixmap pixmap1, Guint depth1,
-            Colormap colormap, unsigned long paperColor);
+  XOutputDev(Display *displayA, Pixmap pixmapA, Guint depthA,
+            Colormap colormapA, GBool reverseVideoA,
+            unsigned long paperColor, GBool installCmap,
+            int rgbCubeSize);
 
   // Destructor.
   virtual ~XOutputDev();
@@ -160,6 +497,10 @@ public:
   // Does this device use drawChar() or drawString()?
   virtual GBool useDrawChar() { return gTrue; }
 
+  // Does this device use beginType3Char/endType3Char?  Otherwise,
+  // text in Type 3 fonts will be drawn with drawChar/drawString.
+  virtual GBool interpretType3Chars() { return gTrue; }
+
   //----- initialization and control
 
   // Start a page.
@@ -169,8 +510,7 @@ public:
   virtual void endPage();
 
   //----- link borders
-  virtual void drawLinkBorder(double x1, double y1, double x2, double y2,
-                             double w);
+  virtual void drawLink(Link *link, Catalog *catalog);
 
   //----- save/restore graphics state
   virtual void saveState(GfxState *state);
@@ -205,31 +545,44 @@ public:
   virtual void beginString(GfxState *state, GString *s);
   virtual void endString(GfxState *state);
   virtual void drawChar(GfxState *state, double x, double y,
-                       double dx, double dy, Guchar c);
-  virtual void drawChar16(GfxState *state, double x, double y,
-                         double dx, double dy, int c);
+                       double dx, double dy,
+                       double originX, double originY,
+                       CharCode code, Unicode *u, int uLen);
+  virtual GBool beginType3Char(GfxState *state,
+                              CharCode code, Unicode *u, int uLen);
+  virtual void endType3Char(GfxState *state);
 
   //----- image drawing
-  virtual void drawImageMask(GfxState *state, Stream *str,
+  virtual void drawImageMask(GfxState *state, Object *ref, Stream *str,
                             int width, int height, GBool invert,
                             GBool inlineImg);
-  virtual void drawImage(GfxState *state, Stream *str, int width,
-                        int height, GfxImageColorMap *colorMap,
-                        GBool inlineImg);
+  virtual void drawImage(GfxState *state, Object *ref, Stream *str,
+                        int width, int height, GfxImageColorMap *colorMap,
+                        int *maskColors, GBool inlineImg);
+
+  //----- Type 3 font operators
+  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);
 
   //----- special access
 
+  // Called to indicate that a new PDF document has been loaded.
+  void startDoc(XRef *xrefA);
+
   // Find a string.  If <top> is true, starts looking at <xMin>,<yMin>;
   // otherwise starts looking at top of page.  If <bottom> is true,
   // stops looking at <xMax>,<yMax>; otherwise stops looking at bottom
   // of page.  If found, sets the text bounding rectange and returns
   // true; otherwise returns false.
-  GBool findText(char *s, GBool top, GBool bottom,
+  GBool findText(Unicode *s, int len, GBool top, GBool bottom,
                 int *xMin, int *yMin, int *xMax, int *yMax);
 
   // Get the text which is inside the specified rectangle.
   GString *getText(int xMin, int yMin, int xMax, int yMax);
 
+  GBool isReverseVideo() { return reverseVideo; }
+
 protected:
 
   // Update pixmap ID after a page change.
@@ -238,11 +591,13 @@ protected:
 
 private:
 
+  XRef *xref;                  // the xref table for this PDF file
   Display *display;            // X display pointer
   int screenNum;               // X screen number
   Pixmap pixmap;               // pixmap to draw into
   int pixmapW, pixmapH;                // size of pixmap
   Guint depth;                 // pixmap depth
+  Colormap colormap;           // X colormap
   int flatness;                        // line flatness
   GC paperGC;                  // GC for background
   GC strokeGC;                 // GC with stroke color
@@ -254,6 +609,8 @@ private:
   Gulong                       // color cube
     colors[maxRGBCube * maxRGBCube * maxRGBCube];
   int numColors;               // size of color cube
+  double redMap[256];          // map pixel (from color cube) to red value
+  GBool reverseVideo;          // reverse video mode
   XPoint                       // temporary points array
     tmpPoints[numTmpPoints];
   int                          // temporary arrays for fill/clip
@@ -263,7 +620,12 @@ private:
   GfxFont *gfxFont;            // current PDF font
   XOutputFont *font;           // current font
   XOutputFontCache *fontCache; // font cache
+  T3FontCache *                        // Type 3 font cache
+    t3FontCache[xOutT3FontCacheSize];
+  int nT3Fonts;                        // number of valid entries in t3FontCache
+  T3GlyphStack *t3GlyphStack;  // Type 3 glyph context stack
   XOutputState *save;          // stack of saved states
+
   TextPage *text;              // text from the current page
 
   void updateLineAttrs(GfxState *state, GBool updateDash);
@@ -277,8 +639,11 @@ private:
               double x0, double y0, double x1, double y1,
               double x2, double y2, double x3, double y3);
   void addPoint(XPoint **points, int *size, int *k, int x, int y);
-  Gulong findColor(GfxColor *color);
-  Gulong findColor(RGBColor *x, RGBColor *err);
+  void drawType3Glyph(T3FontCache *t3Font,
+                     T3FontCacheTag *tag, Guchar *data,
+                     double x, double y, GfxRGB *color);
+  Gulong findColor(GfxRGB *rgb);
+  Gulong findColor(GfxRGB *x, GfxRGB *err);
 };
 
 #endif