/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #ifndef INCLUDED_PDFI_OUTDEV_HXX #define INCLUDED_PDFI_OUTDEV_HXX #if defined __GNUC__ #pragma GCC system_header #elif defined __SUNPRO_CC #pragma disable_warn #elif defined _MSC_VER #pragma warning(push, 1) #endif #include "GfxState.h" #include "GfxFont.h" #include "UnicodeMap.h" #include "Link.h" #include "Object.h" #include "OutputDev.h" #include "Stream.h" #include "GlobalParams.h" #include "PDFDoc.h" #if defined __SUNPRO_CC #pragma enable_warn #elif defined _MSC_VER #pragma warning(pop) #endif #include #include class GfxPath; class GfxFont; class PDFDoc; namespace pdfi { struct FontAttributes { FontAttributes( const GooString& familyName_, bool isEmbedded_, bool isBold_, bool isItalic_, bool isUnderline_, double size_ ) : familyName(), isEmbedded(isEmbedded_), isBold(isBold_), isItalic(isItalic_), isUnderline(isUnderline_), size(size_) { familyName.append(const_cast(&familyName_)); } FontAttributes() : familyName(), isEmbedded(false), isBold(false), isItalic(false), isUnderline(false), size(0.0) {} // xdpf goo stuff is so totally borked... // ...need to hand-code assignment FontAttributes( const FontAttributes& rSrc ) : familyName(), isEmbedded(rSrc.isEmbedded), isBold(rSrc.isBold), isItalic(rSrc.isItalic), isUnderline(rSrc.isUnderline), size(rSrc.size) { familyName.append(const_cast(&rSrc.familyName)); } FontAttributes& operator=( const FontAttributes& rSrc ) { familyName.clear(); familyName.append(const_cast(&rSrc.familyName)); isEmbedded = rSrc.isEmbedded; isBold = rSrc.isBold; isItalic = rSrc.isItalic; isUnderline = rSrc.isUnderline; size = rSrc.size; return *this; } bool operator==(const FontAttributes& rFont) const { return const_cast(&familyName)->cmp( const_cast(&rFont.familyName))==0 && isEmbedded == rFont.isEmbedded && isBold == rFont.isBold && isItalic == rFont.isItalic && isUnderline == rFont.isUnderline && size == rFont.size; } GooString familyName; bool isEmbedded; bool isBold; bool isItalic; bool isUnderline; double size; }; class PDFOutDev : public OutputDev { // not owned by this class PDFDoc* m_pDoc; mutable std::hash_map< long long, FontAttributes > m_aFontMap; UnicodeMap* m_pUtf8Map; int parseFont( long long nNewId, GfxFont* pFont, GfxState* state ) const; void writeFontFile( GfxFont* gfxFont ) const; void printPath( GfxPath* pPath ) const; public: explicit PDFOutDev( PDFDoc* pDoc ); //----- get info about output device // Does this device use upside-down coordinates? // (Upside-down means (0,0) is the top left corner of the page.) virtual GBool upsideDown() { return gTrue; } // 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 gFalse; } // Does this device need non-text content? virtual GBool needNonText() { return gTrue; } //----- initialization and control // Set default transform matrix. virtual void setDefaultCTM(double *ctm); // Start a page. virtual void startPage(int pageNum, GfxState *state, XRef *xref); // End a page. virtual void endPage(); // Dump page contents to display. // virtual void dump() {} //----- coordinate conversion // Convert between device and user coordinates. // virtual void cvtDevToUser(double dx, double dy, double *ux, double *uy); // virtual void cvtUserToDev(double ux, double uy, int *dx, int *dy); //----- link borders virtual void processLink(AnnotLink *link); //----- save/restore graphics state virtual void saveState(GfxState *state); virtual void restoreState(GfxState *state); //----- update graphics state // virtual void updateAll(GfxState *state); virtual void updateCTM(GfxState *state, double m11, double m12, double m21, double m22, double m31, double m32); virtual void updateLineDash(GfxState *state); virtual void updateFlatness(GfxState *state); virtual void updateLineJoin(GfxState *state); virtual void updateLineCap(GfxState *state); virtual void updateMiterLimit(GfxState *state); virtual void updateLineWidth(GfxState *state); virtual void updateFillColor(GfxState *state); virtual void updateStrokeColor(GfxState *state); virtual void updateFillOpacity(GfxState *state); virtual void updateStrokeOpacity(GfxState *state); virtual void updateBlendMode(GfxState *state); //----- update text state virtual void updateFont(GfxState *state); // virtual void updateTextMat(GfxState *state); // virtual void updateCharSpace(GfxState *state) {} virtual void updateRender(GfxState *state); // virtual void updateRise(GfxState *state) {} // virtual void updateWordSpace(GfxState *state) {} // virtual void updateHorizScaling(GfxState *state) {} // virtual void updateTextPos(GfxState *state) {} // virtual void updateTextShift(GfxState *state, double shift) {} //----- path painting virtual void stroke(GfxState *state); virtual void fill(GfxState *state); virtual void eoFill(GfxState *state); //----- path clipping virtual void clip(GfxState *state); virtual void eoClip(GfxState *state); //----- text drawing virtual void drawChar(GfxState *state, double x, double y, double dx, double dy, double originX, double originY, CharCode code, int nBytes, Unicode *u, int uLen); virtual void drawString(GfxState *state, GooString *s); virtual void endTextObject(GfxState *state); //----- image drawing virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, int width, int height, GBool invert, GBool inlineImg); virtual void drawImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap *colorMap, int *maskColors, GBool inlineImg); virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap *colorMap, Stream *maskStr, int maskWidth, int maskHeight, GBool maskInvert); virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap *colorMap, Stream *maskStr, int maskWidth, int maskHeight, GfxImageColorMap *maskColorMap); //----- OPI functions // virtual void opiBegin(GfxState *state, Dict *opiDict); // virtual void opiEnd(GfxState *state, Dict *opiDict); //----- 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) {} //----- PostScript XObjects // virtual void psXObject(Stream *psStream, Stream *level1Stream) {} void setPageNum( int nNumPages ); }; } extern FILE* g_binary_out; // note: if you ever hcange Output_t, please keep in mind that the current code // relies on it being of 8 bit size typedef char Output_t; typedef std::vector< Output_t > OutputBuffer; #endif /* INCLUDED_PDFI_OUTDEV_HXX */