| /************************************************************** |
| * |
| * 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 _PSPRINT_PRINTERGFX_HXX_ |
| #define _PSPRINT_PRINTERGFX_HXX_ |
| |
| #include "vcl/helper.hxx" |
| #include "sallayout.hxx" |
| #include "osl/file.hxx" |
| #include "tools/gen.hxx" |
| |
| #include <list> |
| #include <hash_map> |
| |
| namespace psp { |
| |
| // forwards |
| struct JobData; |
| |
| /* |
| * lightweight container to handle RGB values |
| */ |
| |
| class PrinterColor |
| { |
| public: |
| |
| enum ColorSpace { eInvalid, eRGB }; |
| |
| private: |
| |
| sal_uInt8 mnRed; |
| sal_uInt8 mnGreen; |
| sal_uInt8 mnBlue; |
| ColorSpace meColorspace; |
| |
| public: |
| |
| PrinterColor () : |
| meColorspace(eInvalid) |
| {} |
| PrinterColor (sal_uInt16 nRed, sal_uInt16 nGreen, |
| sal_uInt16 nBlue) : |
| mnRed (nRed), |
| mnGreen (nGreen), |
| mnBlue (nBlue), |
| meColorspace (eRGB) |
| {} |
| PrinterColor (sal_uInt32 nRGB) : |
| mnRed ((nRGB & 0x00ff0000) >> 16), |
| mnGreen ((nRGB & 0x0000ff00) >> 8), |
| mnBlue ((nRGB & 0x000000ff) ), |
| meColorspace (eRGB) |
| {} |
| ~PrinterColor () |
| {} |
| |
| sal_Bool Is () const |
| { return meColorspace != eInvalid; } |
| |
| ColorSpace GetColorSpace () const |
| { return meColorspace; } |
| sal_uInt16 GetRed () const |
| { return mnRed; } |
| sal_uInt16 GetGreen () const |
| { return mnGreen; } |
| sal_uInt16 GetBlue () const |
| { return mnBlue; } |
| sal_Bool operator== (const PrinterColor& aColor) const |
| { |
| return aColor.Is() && this->Is() |
| && mnRed == aColor.mnRed |
| && mnGreen == aColor.mnGreen |
| && mnBlue == aColor.mnBlue; |
| } |
| sal_Bool operator!= (const PrinterColor& aColor) const |
| { return ! (aColor==*this); } |
| PrinterColor& operator= (const PrinterColor& aColor) |
| { |
| meColorspace = aColor.meColorspace; |
| mnRed = aColor.mnRed; |
| mnGreen = aColor.mnGreen; |
| mnBlue = aColor.mnBlue; |
| |
| return *this; |
| } |
| |
| PrinterColor& operator= (sal_uInt32 nRGB) |
| { |
| meColorspace = eRGB; |
| mnBlue = (nRGB & 0x000000ff); |
| mnGreen = (nRGB & 0x0000ff00) >> 8; |
| mnRed = (nRGB & 0x00ff0000) >> 16; |
| |
| return *this; |
| } |
| }; |
| |
| /* |
| * forward declarations |
| */ |
| |
| class Font3; |
| class GlyphSet; |
| class PrinterJob; |
| class PrintFontManager; |
| struct KernPair; |
| struct CharacterMetric; |
| |
| /* |
| * Bitmap Interface, this has to be filled with your actual bitmap implementation |
| * sample implementations can be found in: |
| * psprint/workben/cui/pspdem.cxx |
| * vcl/unx/source/gdi/salgdi2.cxx |
| */ |
| |
| class PrinterBmp |
| { |
| public: |
| |
| virtual ~PrinterBmp () = 0; |
| virtual sal_uInt32 GetPaletteColor (sal_uInt32 nIdx) const = 0; |
| virtual sal_uInt32 GetPaletteEntryCount () const = 0; |
| virtual sal_uInt32 GetPixelRGB (sal_uInt32 nRow, sal_uInt32 nColumn) const = 0; |
| virtual sal_uInt8 GetPixelGray (sal_uInt32 nRow, sal_uInt32 nColumn) const = 0; |
| virtual sal_uInt8 GetPixelIdx (sal_uInt32 nRow, sal_uInt32 nColumn) const = 0; |
| virtual sal_uInt32 GetWidth () const = 0; |
| virtual sal_uInt32 GetHeight () const = 0; |
| virtual sal_uInt32 GetDepth () const = 0; |
| }; |
| |
| typedef enum { |
| InvalidType = 0, |
| TrueColorImage, |
| MonochromeImage, |
| PaletteImage, |
| GrayScaleImage |
| } ImageType; |
| |
| /* |
| * printer raster operations |
| */ |
| |
| struct GraphicsStatus |
| { |
| rtl::OString maFont; |
| rtl_TextEncoding maEncoding; |
| bool mbArtItalic; |
| bool mbArtBold; |
| sal_Int32 mnTextHeight; |
| sal_Int32 mnTextWidth; |
| PrinterColor maColor; |
| double mfLineWidth; |
| |
| GraphicsStatus(); |
| }; |
| |
| class Font3; |
| |
| class PrinterGfx |
| { |
| private: |
| |
| /* common settings */ |
| |
| double mfScaleX; |
| double mfScaleY; |
| |
| sal_uInt32 mnDpi; |
| sal_uInt16 mnDepth; |
| |
| sal_uInt16 mnPSLevel; |
| sal_Bool mbColor; |
| sal_Bool mbUploadPS42Fonts; |
| |
| osl::File* mpPageHeader; |
| osl::File* mpPageBody; |
| |
| void TranslateCoordinates (sal_Int32 &rXOut, sal_Int32 &rYOut, |
| sal_Int32 nXIn, sal_Int32 nYIn ) |
| { rXOut = nXIn; rYOut = nYIn; } |
| void TranslateCoordinates (Point& rOut, const Point& rIn) |
| { rOut = rIn; } |
| |
| /* text/font related data, for a type1 font it has to be checked |
| whether this font has already been downloaded. A TrueType font |
| will be converted into one or more Type3 fonts, containing glyphs |
| in no particular order. In addition to the existence of the |
| glyph in one of the subfonts, the mapping from unicode to the |
| glyph has to be remembered */ |
| |
| std::list< sal_Int32 > maPS1Font; |
| std::list< GlyphSet > maPS3Font; |
| |
| sal_Int32 mnFontID; |
| sal_Int32 mnFallbackID; |
| sal_Int32 mnTextAngle; |
| bool mbTextVertical; |
| PrintFontManager& mrFontMgr; |
| |
| /* bitmap drawing implementation */ |
| |
| sal_Bool mbCompressBmp; |
| |
| void DrawPS1GrayImage (const PrinterBmp& rBitmap, const Rectangle& rArea); |
| void writePS2ImageHeader (const Rectangle& rArea, psp::ImageType nType); |
| void writePS2Colorspace (const PrinterBmp& rBitmap, psp::ImageType nType); |
| void DrawPS2GrayImage (const PrinterBmp& rBitmap, const Rectangle& rArea); |
| void DrawPS2PaletteImage (const PrinterBmp& rBitmap, const Rectangle& rArea); |
| void DrawPS2TrueColorImage (const PrinterBmp& rBitmap, const Rectangle& rArea); |
| void DrawPS2MonoImage (const PrinterBmp& rBitmap, const Rectangle& rArea); |
| |
| /* clip region */ |
| |
| std::list< Rectangle > maClipRegion; |
| sal_Bool JoinVerticalClipRectangles( std::list< Rectangle >::iterator& it, |
| Point& aOldPoint, sal_Int32& nColumn ); |
| |
| /* color settings */ |
| PrinterColor maFillColor; |
| PrinterColor maTextColor; |
| PrinterColor maLineColor; |
| |
| /* graphics state */ |
| GraphicsStatus maVirtualStatus; |
| std::list< GraphicsStatus > maGraphicsStack; |
| GraphicsStatus& currentState() { return maGraphicsStack.front(); } |
| |
| /* font / font substitution */ |
| friend class Font3; |
| const ::std::hash_map< fontID, fontID >* mpFontSubstitutes; |
| int getCharWidth (sal_Bool b_vert, sal_Unicode n_char, |
| CharacterMetric *p_bbox); |
| fontID getCharMetric (const Font3 &rFont, sal_Unicode n_char, |
| CharacterMetric *p_bbox); |
| fontID getFontSubstitute () const; |
| fontID getFallbackID () const { return mnFallbackID; } |
| |
| bool mbStrictSO52Compatibility; |
| public: |
| /* grahics status update */ |
| void PSSetColor (); |
| void PSSetLineWidth (); |
| void PSSetFont (); |
| |
| /* graphics status functions */ |
| void PSSetColor (const PrinterColor& rColor) |
| { maVirtualStatus.maColor = rColor; } |
| |
| void PSUploadPS1Font (sal_Int32 nFontID); |
| void PSSetFont (const rtl::OString& rName, |
| rtl_TextEncoding nEncoding = RTL_TEXTENCODING_DONTKNOW) |
| { maVirtualStatus.maFont = rName; maVirtualStatus.maEncoding = nEncoding; } |
| |
| /* graphics status stack */ |
| void PSGSave (); |
| void PSGRestore (); |
| |
| |
| /* PS helpers */ |
| enum pspath_t { moveto = 0, lineto = 1 }; |
| void PSBinLineTo (const Point& rCurrent, Point& rOld, |
| sal_Int32& nColumn); |
| void PSBinMoveTo (const Point& rCurrent, Point& rOld, |
| sal_Int32& nColumn); |
| void PSBinStartPath (); |
| void PSBinEndPath (); |
| void PSBinCurrentPath (sal_uInt32 nPoints, const Point* pPath); |
| void PSBinPath (const Point& rCurrent, Point& rOld, |
| pspath_t eType, sal_Int32& nColumn); |
| |
| void PSRotate (sal_Int32 nAngle); |
| void PSTranslate (const Point& rPoint); |
| void PSMoveTo (const Point& rPoint); |
| void PSRMoveTo (sal_Int32 nDx, sal_Int32 nDy = 0); |
| void PSScale (double fScaleX, double fScaleY); |
| void PSLineTo(const Point& rPoint ); |
| void PSPointOp (const Point& rPoint, const sal_Char* pOperator); |
| void PSHexString (const sal_uChar* pString, sal_Int16 nLen); |
| void PSDeltaArray (const sal_Int32 *pArray, sal_Int16 nEntries); |
| void PSShowText (const sal_uChar* pString, |
| sal_Int16 nGlyphs, sal_Int16 nBytes, |
| const sal_Int32* pDeltaArray = NULL); |
| void PSComment (const sal_Char* pComment ); |
| void LicenseWarning (const Point& rPoint, const sal_Unicode* pStr, |
| sal_Int16 nLen, const sal_Int32* pDeltaArray); |
| |
| void OnEndPage (); |
| void OnEndJob (); |
| void writeResources( osl::File* pFile, std::list< rtl::OString >& rSuppliedFonts, std::list< rtl::OString >& rNeededFonts ); |
| PrintFontManager& GetFontMgr () { return mrFontMgr; } |
| |
| void drawVerticalizedText (const Point& rPoint, |
| const sal_Unicode* pStr, |
| sal_Int16 nLen, |
| const sal_Int32* pDeltaArray ); |
| void drawText (const Point& rPoint, |
| const sal_Unicode* pStr, sal_Int16 nLen, |
| const sal_Int32* pDeltaArray = NULL); |
| |
| void drawGlyphs( const Point& rPoint, |
| sal_GlyphId* pGlyphIds, |
| sal_Unicode* pUnicodes, |
| sal_Int16 nLen, |
| sal_Int32* pDeltaArray ); |
| public: |
| PrinterGfx(); |
| ~PrinterGfx(); |
| sal_Bool Init (PrinterJob &rPrinterSpec); |
| sal_Bool Init (const JobData& rData); |
| void Clear(); |
| |
| // query depth and size |
| void GetResolution (sal_Int32 &rDpiX, sal_Int32 &rDpiY) const; |
| sal_uInt16 GetBitCount (); |
| |
| // clip region |
| void ResetClipRegion (); |
| void BeginSetClipRegion (sal_uInt32); |
| sal_Bool UnionClipRegion (sal_Int32 nX, sal_Int32 nY, |
| sal_Int32 nDX, sal_Int32 nDY); |
| void EndSetClipRegion (); |
| |
| // set xy color |
| void SetLineColor (const PrinterColor& rLineColor = PrinterColor()) |
| { maLineColor = rLineColor; } |
| void SetFillColor (const PrinterColor& rFillColor = PrinterColor()) |
| { maFillColor = rFillColor; } |
| |
| // drawing primitives |
| void DrawPixel (const Point& rPoint, const PrinterColor& rPixelColor); |
| void DrawPixel (const Point& rPoint) |
| { DrawPixel (rPoint, maLineColor); } |
| void DrawLine (const Point& rFrom, const Point& rTo); |
| void DrawRect (const Rectangle& rRectangle); |
| void DrawPolyLine (sal_uInt32 nPoints, const Point* pPath ); |
| void DrawPolygon (sal_uInt32 nPoints, const Point* pPath); |
| void DrawPolyPolygon (sal_uInt32 nPoly, |
| const sal_uInt32 *pPolygonSize, |
| const Point** pPolygonList); |
| void DrawPolyLineBezier (sal_uInt32 nPoints, |
| const Point* pPath, |
| const sal_uInt8* pFlgAry ); |
| void DrawPolygonBezier (sal_uInt32 nPoints, |
| const Point* pPath, |
| const sal_uInt8* pFlgAry); |
| void DrawPolyPolygonBezier (sal_uInt32 nPoly, |
| const sal_uInt32* pPoints, |
| const Point* const* pPtAry, |
| const sal_uInt8* const* pFlgAry); |
| |
| // eps |
| sal_Bool DrawEPS ( const Rectangle& rBoundingBox, void* pPtr, sal_uInt32 nSize); |
| |
| // image drawing |
| void DrawBitmap (const Rectangle& rDest, const Rectangle& rSrc, |
| const PrinterBmp& rBitmap); |
| void DrawBitmap (const Rectangle& rDest, const Rectangle& rSrc, |
| const PrinterBmp& rBitmap, |
| const PrinterBmp& rTransBitmap); |
| void DrawMask (const Rectangle& rDest, const Rectangle& rSrc, |
| const PrinterBmp &rBitmap, PrinterColor& rMaskColor); |
| |
| // font and text handling |
| sal_uInt16 SetFont ( |
| sal_Int32 nFontID, |
| sal_Int32 nPointHeight, |
| sal_Int32 nPointWidth, |
| sal_Int32 nAngle, |
| bool bVertical, |
| bool bArtItalic, |
| bool bArtBold |
| ); |
| sal_uInt16 SetFallbackFont ( sal_Int32 nFontID ); |
| sal_Int32 GetFontAngle () const |
| { return mnTextAngle; } |
| sal_Int32 GetFontID () const |
| { return mnFontID; } |
| bool GetFontVertical() const |
| { return mbTextVertical; } |
| sal_Int32 GetFontHeight () const |
| { return maVirtualStatus.mnTextHeight; } |
| sal_Int32 GetFontWidth () const |
| { return maVirtualStatus.mnTextWidth; } |
| bool GetArtificialItalic() const |
| { return maVirtualStatus.mbArtItalic; } |
| bool GetArtificialBold() const |
| { return maVirtualStatus.mbArtBold; } |
| void DrawText (const Point& rPoint, |
| const sal_Unicode* pStr, sal_Int16 nLen, |
| const sal_Int32* pDeltaArray = NULL); |
| void SetTextColor (PrinterColor& rTextColor) |
| { maTextColor = rTextColor; } |
| sal_Int32 GetCharWidth (sal_uInt16 nFrom, sal_uInt16 nTo, |
| long *pWidthArray); |
| const ::std::list< KernPair >& getKernPairs( bool bVertical = false ) const; |
| // advanced font handling |
| sal_Bool GetGlyphBoundRect (sal_Unicode c, Rectangle& rOutRect); |
| sal_uInt32 GetGlyphOutline (sal_Unicode c, |
| sal_uInt16 **ppPolySizes, Point **ppPoints, |
| sal_uInt8 **ppFlags); |
| |
| // for CTL |
| void DrawGlyphs( const Point& rPoint, |
| sal_GlyphId* pGlyphIds, |
| sal_Unicode* pUnicodes, |
| sal_Int16 nLen, |
| sal_Int32* pDeltaArray ); |
| |
| bool getStrictSO52Compatibility() const; |
| void setStrictSO52Compatibility( bool ); |
| }; |
| |
| } /* namespace psp */ |
| |
| |
| #endif /* _PSPRINT_PRINTERGFX_HXX_ */ |
| |