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 109 NSPrintInfo* getPrintInfo() const { return mpPrintInfo; } 110 void setStartPageOffset( int nOffsetX, int nOffsetY ) { mnStartPageOffsetX = nOffsetX; mnStartPageOffsetY = nOffsetY; } 111 sal_Int32 getCurPageRangeStart() const { return mnCurPageRangeStart; } 112 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 161 inline int PtTo10Mu( double nPoints ) { return (int)(((nPoints)*fPtTo100thMM)+0.5); } 162 163 inline double TenMuToPt( double nUnits ) { return floor(((nUnits)/fPtTo100thMM)+0.5); } 164 165 166 167 #endif // _SV_SALPRN_H 168