1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 #ifndef _SV_SALPRN_H
25 #define _SV_SALPRN_H
26
27 #include "aqua/aquavcltypes.h"
28
29 #include "salprn.hxx"
30
31 #include <boost/shared_array.hpp>
32
33
34 // ---------------------
35 // - AquaSalInfoPrinter -
36 // ---------------------
37
38 class AquaSalGraphics;
39
40 class AquaSalInfoPrinter : public SalInfoPrinter
41 {
42 /// Printer graphics
43 AquaSalGraphics* mpGraphics;
44 /// is Graphics used
45 bool mbGraphics;
46 /// job active ?
47 bool mbJob;
48
49 /// cocoa printer object
50 NSPrinter* mpPrinter;
51 /// cocoa print info object
52 NSPrintInfo* mpPrintInfo;
53
54 /// FIXME: get real printer context for infoprinter if possible
55 /// fake context for info printer
56 /// graphics context for Quartz 2D
57 CGContextRef mrContext;
58 /// memory for graphics bitmap context for querying metrics
59 boost::shared_array< sal_uInt8 > maContextMemory;
60
61 // since changes to NSPrintInfo during a job are ignored
62 // we have to care for some settings ourselves
63 // currently we do this for orientation;
64 // really needed however is a solution for paper formats
65 Orientation mePageOrientation;
66
67 int mnStartPageOffsetX;
68 int mnStartPageOffsetY;
69 sal_Int32 mnCurPageRangeStart;
70 sal_Int32 mnCurPageRangeCount;
71
72 public:
73 AquaSalInfoPrinter( const SalPrinterQueueInfo& pInfo );
74 virtual ~AquaSalInfoPrinter();
75
76 void SetupPrinterGraphics( CGContextRef i_xContext ) const;
77
78 virtual SalGraphics* GetGraphics();
79 virtual void ReleaseGraphics( SalGraphics* i_pGraphics );
80 virtual sal_Bool Setup( SalFrame* i_pFrame, ImplJobSetup* i_pSetupData );
81 virtual sal_Bool SetPrinterData( ImplJobSetup* pSetupData );
82 virtual sal_Bool SetData( sal_uLong i_nFlags, ImplJobSetup* i_pSetupData );
83 virtual void GetPageInfo( const ImplJobSetup* i_pSetupData,
84 long& o_rOutWidth, long& o_rOutHeight,
85 long& o_rPageOffX, long& o_rPageOffY,
86 long& o_rPageWidth, long& o_rPageHeight );
87 virtual sal_uLong GetCapabilities( const ImplJobSetup* i_pSetupData, sal_uInt16 i_nType );
88 virtual sal_uLong GetPaperBinCount( const ImplJobSetup* i_pSetupData );
89 virtual String GetPaperBinName( const ImplJobSetup* i_pSetupData, sal_uLong i_nPaperBin );
90 virtual void InitPaperFormats( const ImplJobSetup* i_pSetupData );
91 virtual int GetLandscapeAngle( const ImplJobSetup* i_pSetupData );
92
93 // the artificial separation between InfoPrinter and Printer
94 // is not really useful for us
95 // so let's make AquaSalPrinter just a forwarder to AquaSalInfoPrinter
96 // and concentrate the real work in one class
97 // implement pull model print system
98 sal_Bool StartJob( const String* i_pFileName,
99 const String& rJobName,
100 const String& i_rAppName,
101 ImplJobSetup* i_pSetupData,
102 vcl::PrinterController& i_rController );
103 sal_Bool EndJob();
104 sal_Bool AbortJob();
105 SalGraphics* StartPage( ImplJobSetup* i_pSetupData, sal_Bool i_bNewJobData );
106 sal_Bool EndPage();
107 sal_uLong GetErrorCode() const;
108
getPrintInfo() const109 NSPrintInfo* getPrintInfo() const { return mpPrintInfo; }
setStartPageOffset(int nOffsetX,int nOffsetY)110 void setStartPageOffset( int nOffsetX, int nOffsetY ) { mnStartPageOffsetX = nOffsetX; mnStartPageOffsetY = nOffsetY; }
getCurPageRangeStart() const111 sal_Int32 getCurPageRangeStart() const { return mnCurPageRangeStart; }
getCurPageRangeCount() const112 sal_Int32 getCurPageRangeCount() const { return mnCurPageRangeCount; }
113
114 // match width/height against known paper formats, possibly switching orientation
115 const PaperInfo* matchPaper( long i_nWidth, long i_nHeight, Orientation& o_rOrientation ) const;
116 void setPaperSize( long i_nWidth, long i_nHeight, Orientation i_eSetOrientation );
117
118 private:
119 AquaSalInfoPrinter( const AquaSalInfoPrinter& );
120 AquaSalInfoPrinter& operator=(const AquaSalInfoPrinter&);
121 };
122
123 // -----------------
124 // - AquaSalPrinter -
125 // -----------------
126
127 class AquaSalPrinter : public SalPrinter
128 {
129 AquaSalInfoPrinter* mpInfoPrinter; // pointer to the compatible InfoPrinter
130 public:
131 AquaSalPrinter( AquaSalInfoPrinter* i_pInfoPrinter );
132 virtual ~AquaSalPrinter();
133
134 virtual sal_Bool StartJob( const XubString* i_pFileName,
135 const XubString& i_rJobName,
136 const XubString& i_rAppName,
137 sal_uLong i_nCopies,
138 bool i_bCollate,
139 bool i_bDirect,
140 ImplJobSetup* i_pSetupData );
141 // implement pull model print system
142 virtual sal_Bool StartJob( const String* i_pFileName,
143 const String& rJobName,
144 const String& i_rAppName,
145 ImplJobSetup* i_pSetupData,
146 vcl::PrinterController& i_rListener );
147
148 virtual sal_Bool EndJob();
149 virtual sal_Bool AbortJob();
150 virtual SalGraphics* StartPage( ImplJobSetup* i_pSetupData, sal_Bool i_bNewJobData );
151 virtual sal_Bool EndPage();
152 virtual sal_uLong GetErrorCode();
153
154 private:
155 AquaSalPrinter( const AquaSalPrinter& );
156 AquaSalPrinter& operator=(const AquaSalPrinter&);
157 };
158
159 const double fPtTo100thMM = 35.27777778;
160
PtTo10Mu(double nPoints)161 inline int PtTo10Mu( double nPoints ) { return (int)(((nPoints)*fPtTo100thMM)+0.5); }
162
TenMuToPt(double nUnits)163 inline double TenMuToPt( double nUnits ) { return floor(((nUnits)/fPtTo100thMM)+0.5); }
164
165
166
167 #endif // _SV_SALPRN_H
168