1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #ifndef INCLUDED_VCL_INC_GENERIC_PRINTERGFX_HXX
21 #define INCLUDED_VCL_INC_GENERIC_PRINTERGFX_HXX
23 #include <osl/file.hxx>
24 #include <tools/gen.hxx>
25 #include <vcl/dllapi.h>
26 #include <vcl/glyphitem.hxx>
28 #include <impglyphitem.hxx>
33 enum class PolyFlags
: sal_uInt8
;
40 * lightweight container to handle RGB values
47 enum class ColorSpace
{ eInvalid
, eRGB
};
54 ColorSpace meColorspace
;
62 , meColorspace(ColorSpace::eInvalid
)
64 PrinterColor (sal_uInt16 nRed
, sal_uInt16 nGreen
,
69 meColorspace (ColorSpace::eRGB
)
71 PrinterColor (sal_uInt32 nRGB
) :
72 mnRed ((nRGB
& 0x00ff0000) >> 16),
73 mnGreen ((nRGB
& 0x0000ff00) >> 8),
74 mnBlue ((nRGB
& 0x000000ff) ),
75 meColorspace (ColorSpace::eRGB
)
79 { return meColorspace
!= ColorSpace::eInvalid
; }
81 sal_uInt16
GetRed () const
83 sal_uInt16
GetGreen () const
85 sal_uInt16
GetBlue () const
87 bool operator== (const PrinterColor
& aColor
) const
89 return aColor
.Is() && Is()
90 && mnRed
== aColor
.mnRed
91 && mnGreen
== aColor
.mnGreen
92 && mnBlue
== aColor
.mnBlue
;
94 bool operator!= (const PrinterColor
& aColor
) const
95 { return ! (aColor
==*this); }
97 PrinterColor
& operator= (sal_uInt32 nRGB
)
99 meColorspace
= ColorSpace::eRGB
;
100 mnBlue
= (nRGB
& 0x000000ff);
101 mnGreen
= (nRGB
& 0x0000ff00) >> 8;
102 mnRed
= (nRGB
& 0x00ff0000) >> 16;
110 class PrintFontManager
;
111 struct CharacterMetric
;
114 * Bitmap Interface, this has to be filled with your actual bitmap implementation
115 * sample implementations can be found in:
116 * psprint/workben/cui/pspdem.cxx
117 * vcl/unx/source/gdi/salgdi2.cxx
124 virtual ~PrinterBmp () = 0;
125 virtual sal_uInt32
GetPaletteColor (sal_uInt32 nIdx
) const = 0;
126 virtual sal_uInt32
GetPaletteEntryCount () const = 0;
127 virtual sal_uInt32
GetPixelRGB (sal_uInt32 nRow
, sal_uInt32 nColumn
) const = 0;
128 virtual sal_uInt8
GetPixelGray (sal_uInt32 nRow
, sal_uInt32 nColumn
) const = 0;
129 virtual sal_uInt8
GetPixelIdx (sal_uInt32 nRow
, sal_uInt32 nColumn
) const = 0;
130 virtual sal_uInt32
GetDepth () const = 0;
133 enum class ImageType
{
141 * printer raster operations
144 struct GraphicsStatus
147 rtl_TextEncoding maEncoding
;
150 sal_Int32 mnTextHeight
;
151 sal_Int32 mnTextWidth
;
152 PrinterColor maColor
;
162 /* common settings */
170 sal_uInt16 mnPSLevel
;
172 bool mbUploadPS42Fonts
;
174 osl::File
* mpPageBody
;
176 /* text/font related data, for a type1 font it has to be checked
177 whether this font has already been downloaded. A TrueType font
178 will be converted into one or more Type3 fonts, containing glyphs
179 in no particular order. In addition to the existence of the
180 glyph in one of the subfonts, the mapping from unicode to the
181 glyph has to be remembered */
183 std::vector
< GlyphSet
> maPS3Font
;
186 Degree10 mnTextAngle
;
188 PrintFontManager
& mrFontMgr
;
190 /* bitmap drawing implementation */
192 void DrawPS1GrayImage (const PrinterBmp
& rBitmap
, const tools::Rectangle
& rArea
);
193 void writePS2ImageHeader (const tools::Rectangle
& rArea
, psp::ImageType nType
);
194 void writePS2Colorspace (const PrinterBmp
& rBitmap
, psp::ImageType nType
);
195 void DrawPS2GrayImage (const PrinterBmp
& rBitmap
, const tools::Rectangle
& rArea
);
196 void DrawPS2PaletteImage (const PrinterBmp
& rBitmap
, const tools::Rectangle
& rArea
);
197 void DrawPS2TrueColorImage (const PrinterBmp
& rBitmap
, const tools::Rectangle
& rArea
);
198 void DrawPS2MonoImage (const PrinterBmp
& rBitmap
, const tools::Rectangle
& rArea
);
202 std::list
< tools::Rectangle
> maClipRegion
;
203 bool JoinVerticalClipRectangles( std::list
< tools::Rectangle
>::iterator
& it
,
204 Point
& aOldPoint
, sal_Int32
& nColumn
);
207 PrinterColor maFillColor
;
208 PrinterColor maTextColor
;
209 PrinterColor maLineColor
;
212 GraphicsStatus maVirtualStatus
;
213 std::list
< GraphicsStatus
> maGraphicsStack
;
214 GraphicsStatus
& currentState() { return maGraphicsStack
.front(); }
217 /* graphics status update */
219 void PSSetLineWidth ();
222 /* graphics status functions */
223 void PSSetColor (const PrinterColor
& rColor
)
224 { maVirtualStatus
.maColor
= rColor
; }
226 void PSSetFont (const OString
& rName
,
227 rtl_TextEncoding nEncoding
)
228 { maVirtualStatus
.maFont
= rName
; maVirtualStatus
.maEncoding
= nEncoding
; }
230 /* graphics status stack */
235 enum pspath_t
{ moveto
= 0, lineto
= 1 };
236 void PSBinLineTo (const Point
& rCurrent
, Point
& rOld
,
238 void PSBinMoveTo (const Point
& rCurrent
, Point
& rOld
,
240 void PSBinStartPath ();
241 void PSBinEndPath ();
242 void PSBinCurrentPath (sal_uInt32 nPoints
, const Point
* pPath
);
243 void PSBinPath (const Point
& rCurrent
, Point
& rOld
,
244 pspath_t eType
, sal_Int32
& nColumn
);
246 void PSRotate (Degree10 nAngle
);
247 void PSTranslate (const Point
& rPoint
);
248 void PSMoveTo (const Point
& rPoint
);
249 void PSScale (double fScaleX
, double fScaleY
);
250 void PSLineTo(const Point
& rPoint
);
251 void PSPointOp (const Point
& rPoint
, const char* pOperator
);
252 void PSHexString (const unsigned char* pString
, sal_Int16 nLen
);
253 void PSShowGlyph (const unsigned char nGlyphId
);
256 void writeResources( osl::File
* pFile
, std::vector
< OString
>& rSuppliedFonts
);
257 PrintFontManager
& GetFontMgr () { return mrFontMgr
; }
259 void drawGlyph(const Point
& rPoint
,
260 sal_GlyphId aGlyphId
);
264 void Init (PrinterJob
&rPrinterSpec
);
265 void Init (const JobData
& rData
);
269 sal_uInt16
GetBitCount () const { return mnDepth
;}
272 void ResetClipRegion ();
273 void BeginSetClipRegion();
274 void UnionClipRegion (sal_Int32 nX
, sal_Int32 nY
,
275 sal_Int32 nDX
, sal_Int32 nDY
);
276 void EndSetClipRegion ();
279 void SetLineColor (const PrinterColor
& rLineColor
= PrinterColor())
280 { maLineColor
= rLineColor
; }
281 void SetFillColor (const PrinterColor
& rFillColor
= PrinterColor())
282 { maFillColor
= rFillColor
; }
284 // drawing primitives
285 void DrawPixel (const Point
& rPoint
, const PrinterColor
& rPixelColor
);
286 void DrawPixel (const Point
& rPoint
)
287 { DrawPixel (rPoint
, maLineColor
); }
288 void DrawLine (const Point
& rFrom
, const Point
& rTo
);
289 void DrawRect (const tools::Rectangle
& rRectangle
);
290 void DrawPolyLine (sal_uInt32 nPoints
, const Point
* pPath
);
291 void DrawPolygon (sal_uInt32 nPoints
, const Point
* pPath
);
292 void DrawPolyPolygon (sal_uInt32 nPoly
,
293 const sal_uInt32
*pPolygonSize
,
294 const Point
** pPolygonList
);
295 void DrawPolyLineBezier (sal_uInt32 nPoints
,
297 const PolyFlags
* pFlgAry
);
298 void DrawPolygonBezier (sal_uInt32 nPoints
,
300 const PolyFlags
* pFlgAry
);
301 void DrawPolyPolygonBezier (sal_uInt32 nPoly
,
302 const sal_uInt32
* pPoints
,
303 const Point
* const* pPtAry
,
304 const PolyFlags
* const* pFlgAry
);
307 bool DrawEPS ( const tools::Rectangle
& rBoundingBox
, void* pPtr
, sal_uInt32 nSize
);
310 void DrawBitmap (const tools::Rectangle
& rDest
, const tools::Rectangle
& rSrc
,
311 const PrinterBmp
& rBitmap
);
313 // font and text handling
316 sal_Int32 nPointHeight
,
317 sal_Int32 nPointWidth
,
323 sal_Int32
GetFontID () const
325 bool GetFontVertical() const
326 { return mbTextVertical
; }
327 sal_Int32
GetFontHeight () const
328 { return maVirtualStatus
.mnTextHeight
; }
329 sal_Int32
GetFontWidth () const
330 { return maVirtualStatus
.mnTextWidth
; }
331 bool GetArtificialItalic() const
332 { return maVirtualStatus
.mbArtItalic
; }
333 bool GetArtificialBold() const
334 { return maVirtualStatus
.mbArtBold
; }
335 void SetTextColor (PrinterColor
const & rTextColor
)
336 { maTextColor
= rTextColor
; }
338 void DrawGlyph(const Point
& rPoint
,
339 const GlyphItem
& rGlyph
);
343 } /* namespace psp */
345 #endif // INCLUDED_VCL_INC_GENERIC_PRINTERGFX_HXX
347 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */