blob: 19322b206d8291d2894e655e919ebe95559afbee [file] [log] [blame]
/**************************************************************
*
* 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 _SV_SALPRN_H
#define _SV_SALPRN_H
#include "aqua/aquavcltypes.h"
#include "salprn.hxx"
#include <boost/shared_array.hpp>
// ---------------------
// - AquaSalInfoPrinter -
// ---------------------
class AquaSalGraphics;
class AquaSalInfoPrinter : public SalInfoPrinter
{
/// Printer graphics
AquaSalGraphics* mpGraphics;
/// is Graphics used
bool mbGraphics;
/// job active ?
bool mbJob;
/// cocoa printer object
NSPrinter* mpPrinter;
/// cocoa print info object
NSPrintInfo* mpPrintInfo;
/// FIXME: get real printer context for infoprinter if possible
/// fake context for info printer
/// graphics context for Quartz 2D
CGContextRef mrContext;
/// memory for graphics bitmap context for querying metrics
boost::shared_array< sal_uInt8 > maContextMemory;
// since changes to NSPrintInfo during a job are ignored
// we have to care for some settings ourselves
// currently we do this for orientation;
// really needed however is a solution for paper formats
Orientation mePageOrientation;
int mnStartPageOffsetX;
int mnStartPageOffsetY;
sal_Int32 mnCurPageRangeStart;
sal_Int32 mnCurPageRangeCount;
public:
AquaSalInfoPrinter( const SalPrinterQueueInfo& pInfo );
virtual ~AquaSalInfoPrinter();
void SetupPrinterGraphics( CGContextRef i_xContext ) const;
virtual SalGraphics* GetGraphics();
virtual void ReleaseGraphics( SalGraphics* i_pGraphics );
virtual sal_Bool Setup( SalFrame* i_pFrame, ImplJobSetup* i_pSetupData );
virtual sal_Bool SetPrinterData( ImplJobSetup* pSetupData );
virtual sal_Bool SetData( sal_uLong i_nFlags, ImplJobSetup* i_pSetupData );
virtual void GetPageInfo( const ImplJobSetup* i_pSetupData,
long& o_rOutWidth, long& o_rOutHeight,
long& o_rPageOffX, long& o_rPageOffY,
long& o_rPageWidth, long& o_rPageHeight );
virtual sal_uLong GetCapabilities( const ImplJobSetup* i_pSetupData, sal_uInt16 i_nType );
virtual sal_uLong GetPaperBinCount( const ImplJobSetup* i_pSetupData );
virtual String GetPaperBinName( const ImplJobSetup* i_pSetupData, sal_uLong i_nPaperBin );
virtual void InitPaperFormats( const ImplJobSetup* i_pSetupData );
virtual int GetLandscapeAngle( const ImplJobSetup* i_pSetupData );
// the artificial separation between InfoPrinter and Printer
// is not really useful for us
// so let's make AquaSalPrinter just a forwarder to AquaSalInfoPrinter
// and concentrate the real work in one class
// implement pull model print system
sal_Bool StartJob( const String* i_pFileName,
const String& rJobName,
const String& i_rAppName,
ImplJobSetup* i_pSetupData,
vcl::PrinterController& i_rController );
sal_Bool EndJob();
sal_Bool AbortJob();
SalGraphics* StartPage( ImplJobSetup* i_pSetupData, sal_Bool i_bNewJobData );
sal_Bool EndPage();
sal_uLong GetErrorCode() const;
NSPrintInfo* getPrintInfo() const { return mpPrintInfo; }
void setStartPageOffset( int nOffsetX, int nOffsetY ) { mnStartPageOffsetX = nOffsetX; mnStartPageOffsetY = nOffsetY; }
sal_Int32 getCurPageRangeStart() const { return mnCurPageRangeStart; }
sal_Int32 getCurPageRangeCount() const { return mnCurPageRangeCount; }
// match width/height against known paper formats, possibly switching orientation
const PaperInfo* matchPaper( long i_nWidth, long i_nHeight, Orientation& o_rOrientation ) const;
void setPaperSize( long i_nWidth, long i_nHeight, Orientation i_eSetOrientation );
private:
AquaSalInfoPrinter( const AquaSalInfoPrinter& );
AquaSalInfoPrinter& operator=(const AquaSalInfoPrinter&);
};
// -----------------
// - AquaSalPrinter -
// -----------------
class AquaSalPrinter : public SalPrinter
{
AquaSalInfoPrinter* mpInfoPrinter; // pointer to the compatible InfoPrinter
public:
AquaSalPrinter( AquaSalInfoPrinter* i_pInfoPrinter );
virtual ~AquaSalPrinter();
virtual sal_Bool StartJob( const XubString* i_pFileName,
const XubString& i_rJobName,
const XubString& i_rAppName,
sal_uLong i_nCopies,
bool i_bCollate,
bool i_bDirect,
ImplJobSetup* i_pSetupData );
// implement pull model print system
virtual sal_Bool StartJob( const String* i_pFileName,
const String& rJobName,
const String& i_rAppName,
ImplJobSetup* i_pSetupData,
vcl::PrinterController& i_rListener );
virtual sal_Bool EndJob();
virtual sal_Bool AbortJob();
virtual SalGraphics* StartPage( ImplJobSetup* i_pSetupData, sal_Bool i_bNewJobData );
virtual sal_Bool EndPage();
virtual sal_uLong GetErrorCode();
private:
AquaSalPrinter( const AquaSalPrinter& );
AquaSalPrinter& operator=(const AquaSalPrinter&);
};
const double fPtTo100thMM = 35.27777778;
inline int PtTo10Mu( double nPoints ) { return (int)(((nPoints)*fPtTo100thMM)+0.5); }
inline double TenMuToPt( double nUnits ) { return floor(((nUnits)/fPtTo100thMM)+0.5); }
#endif // _SV_SALPRN_H