1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
#ifndef _SV_SALGDI_H
#define _SV_SALGDI_H
#include "basegfx/polygon/b2dpolypolygon.hxx"
#include "ios/iosvcltypes.h"
#include <vcl/fontcapabilities.hxx>
#include "outfont.hxx"
#include "salgdi.hxx"
#include <vector>
class IosSalFrame;
class IosSalBitmap;
class ImplDevFontAttributes;
class CGRect;
// mac specific physically available font face
class ImplIosFontData : public ImplFontData
{
public:
ImplIosFontData( const ImplDevFontAttributes&, CTFontRef );
virtual ~ImplIosFontData();
virtual ImplFontData* Clone() const;
virtual ImplFontEntry* CreateFontInstance( FontSelectPattern& ) const;
virtual sal_IntPtr GetFontId() const;
const ImplFontCharMap* GetImplFontCharMap() const;
bool GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const;
bool HasChar( sal_uInt32 cChar ) const;
void ReadOs2Table() const;
void ReadIosCmapEncoding() const;
bool HasCJKSupport() const;
protected:
friend class IosSalGraphics;
const CTFontRef mpFontRef;
private:
mutable const ImplFontCharMap* mpCharMap;
mutable vcl::FontCapabilities maFontCapabilities;
mutable bool mbOs2Read; // true if OS2-table related info is valid
mutable bool mbHasOs2Table;
mutable bool mbCmapEncodingRead; // true if cmap encoding of Ios font is read
mutable bool mbHasCJKSupport; // #i78970# CJK fonts need extra leading
mutable bool mbFontCapabilitiesRead;
};
// abstracting quartz color instead of having to use an CGFloat[] array
class RGBAColor
{
public:
RGBAColor( SalColor );
RGBAColor( float fRed, float fGreen, float fBlue, float fAlpha ); //NOTUSEDYET
const float* AsArray() const { return &mfRed; }
bool IsVisible() const { return (mfAlpha > 0); }
void SetAlpha( float fAlpha ) { mfAlpha = fAlpha; }
private:
float mfRed, mfGreen, mfBlue, mfAlpha;
};
// -------------------
// - IosSalGraphics -
// -------------------
class IosSalGraphics : public SalGraphics
{
protected:
IosSalFrame* mpFrame;
CGLayerRef mxLayer; // Quartz graphics layer
CGContextRef mrContext; // Quartz drawing context
class XorEmulation* mpXorEmulation;
int mnXorMode; // 0: off 1: on 2: invert only
int mnWidth;
int mnHeight;
int mnBitmapDepth; // zero unless bitmap
/// device resolution of this graphics
long mnRealDPIX;
long mnRealDPIY;
/// some graphics implementations (e.g. IosSalInfoPrinter) scale
/// everything down by a factor (see SetupPrinterGraphics for details)
/// so we have to compensate for it with the inverse factor
double mfFakeDPIScale;
/// path representing current clip region
CGMutablePathRef mxClipPath;
/// Drawing colors
/// pen color RGBA
RGBAColor maLineColor;
/// brush color RGBA
RGBAColor maFillColor;
// Device Font settings
const ImplIosFontData* mpIosFontData;
/// Font attributes ???
NSMutableDictionary* mpAttributes;
// text color
SalColor mnColor;
/// text rotation ???
Fixed mnRotation;
/// <1.0: font is squeezed, >1.0 font is stretched, else 1.0
float mfFontStretch;
/// allows text to be rendered without antialiasing
bool mbNonAntialiasedText;
// Graphics types
/// is this a printer graphics
bool mbPrinter;
/// is this a virtual device graphics
bool mbVirDev;
/// is this a window graphics
bool mbWindow;
public:
IosSalGraphics();
virtual ~IosSalGraphics();
bool IsPenVisible() const { return maLineColor.IsVisible(); }
bool IsBrushVisible() const { return maFillColor.IsVisible(); }
void SetWindowGraphics( IosSalFrame* pFrame );
void SetPrinterGraphics( CGContextRef, long nRealDPIX, long nRealDPIY, double fFakeScale );
void SetVirDevGraphics( CGLayerRef, CGContextRef, int nBitDepth = 0 );
void initResolution( UIWindow* );
void copyResolution( IosSalGraphics& );
void updateResolution();
bool IsWindowGraphics() const { return mbWindow; }
bool IsPrinterGraphics() const { return mbPrinter; }
bool IsVirDevGraphics() const { return mbVirDev; }
IosSalFrame* getGraphicsFrame() const { return mpFrame; }
void setGraphicsFrame( IosSalFrame* pFrame ) { mpFrame = pFrame; }
void ImplDrawPixel( long nX, long nY, const RGBAColor& ); // helper to draw single pixels
bool CheckContext();
void UpdateWindow( CGRect& ); // delivered in NSView coordinates
void RefreshRect( const CGRect& );
void RefreshRect(float lX, float lY, float lWidth, float lHeight);
void SetState();
void UnsetState();
// InvalidateContext does an UnsetState and sets mrContext to 0
void InvalidateContext();
virtual bool setClipRegion( const Region& );
// draw --> LineColor and FillColor and RasterOp and ClipRegion
virtual void drawPixel( long nX, long nY );
virtual void drawPixel( long nX, long nY, SalColor nSalColor );
virtual void drawLine( long nX1, long nY1, long nX2, long nY2 );
virtual void drawRect( long nX, long nY, long nWidth, long nHeight );
virtual void drawPolyLine( sal_uLong nPoints, const SalPoint* pPtAry );
virtual void drawPolygon( sal_uLong nPoints, const SalPoint* pPtAry );
virtual void drawPolyPolygon( sal_uLong nPoly, const sal_uLong* pPoints, PCONSTSALPOINT* pPtAry );
virtual bool drawPolyPolygon( const ::basegfx::B2DPolyPolygon&, double fTransparency );
virtual sal_Bool drawPolyLineBezier( sal_uLong nPoints, const SalPoint* pPtAry, const sal_uInt8* pFlgAry );
virtual sal_Bool drawPolygonBezier( sal_uLong nPoints, const SalPoint* pPtAry, const sal_uInt8* pFlgAry );
virtual sal_Bool drawPolyPolygonBezier( sal_uLong nPoly, const sal_uLong* pPoints, const SalPoint* const* pPtAry, const sal_uInt8* const* pFlgAry );
virtual bool drawPolyLine( const ::basegfx::B2DPolygon&, double fTransparency, const ::basegfx::B2DVector& rLineWidths, basegfx::B2DLineJoin );
// CopyArea --> No RasterOp, but ClipRegion
virtual void copyArea( long nDestX, long nDestY, long nSrcX, long nSrcY, long nSrcWidth,
long nSrcHeight, sal_uInt16 nFlags );
// CopyBits and DrawBitmap --> RasterOp and ClipRegion
// CopyBits() --> pSrcGraphics == NULL, then CopyBits on same Graphics
virtual void copyBits( const SalTwoRect* pPosAry, SalGraphics* pSrcGraphics );
virtual void drawBitmap( const SalTwoRect* pPosAry, const SalBitmap& rSalBitmap );
virtual void drawBitmap( const SalTwoRect* pPosAry,
const SalBitmap& rSalBitmap,
SalColor nTransparentColor );
virtual void drawBitmap( const SalTwoRect* pPosAry,
const SalBitmap& rSalBitmap,
const SalBitmap& rTransparentBitmap );
virtual void drawMask( const SalTwoRect* pPosAry,
const SalBitmap& rSalBitmap,
SalColor nMaskColor );
virtual SalBitmap* getBitmap( long nX, long nY, long nWidth, long nHeight );
virtual SalColor getPixel( long nX, long nY );
// invert --> ClipRegion (only Windows or VirDevs)
virtual void invert( long nX, long nY, long nWidth, long nHeight, SalInvert nFlags);
virtual void invert( sal_uLong nPoints, const SalPoint* pPtAry, SalInvert nFlags );
virtual sal_Bool drawEPS( long nX, long nY, long nWidth, long nHeight, void* pPtr, sal_uLong nSize );
virtual bool drawAlphaBitmap( const SalTwoRect&,
const SalBitmap& rSourceBitmap,
const SalBitmap& rAlphaBitmap );
virtual bool drawAlphaRect( long nX, long nY, long nWidth,
long nHeight, sal_uInt8 nTransparency );
CGPoint* makeCGptArray(sal_uLong nPoints, const SalPoint* pPtAry);
// native widget rendering methods that require mirroring
virtual sal_Bool hitTestNativeControl( ControlType nType, ControlPart nPart, const Rectangle& rControlRegion,
const Point& aPos, sal_Bool& rIsInside );
virtual sal_Bool drawNativeControl( ControlType nType, ControlPart nPart, const Rectangle& rControlRegion,
ControlState nState, const ImplControlValue& aValue,
const rtl::OUString& aCaption );
virtual sal_Bool drawNativeControlText( ControlType nType, ControlPart nPart, const Rectangle& rControlRegion,
ControlState nState, const ImplControlValue& aValue,
const rtl::OUString& aCaption );
virtual sal_Bool getNativeControlRegion( ControlType nType, ControlPart nPart, const Rectangle& rControlRegion, ControlState nState,
const ImplControlValue& aValue, const rtl::OUString& aCaption,
Rectangle &rNativeBoundingRegion, Rectangle &rNativeContentRegion );
// get device resolution
virtual void GetResolution( long& rDPIX, long& rDPIY );
// get the depth of the device
virtual sal_uInt16 GetBitCount() const;
// get the width of the device
virtual long GetGraphicsWidth() const;
// set the clip region to empty
virtual void ResetClipRegion();
// set the line color to transparent (= don't draw lines)
virtual void SetLineColor();
// set the line color to a specific color
virtual void SetLineColor( SalColor nSalColor );
// set the fill color to transparent (= don't fill)
virtual void SetFillColor();
// set the fill color to a specific color, shapes will be
// filled accordingly
virtual void SetFillColor( SalColor nSalColor );
// enable/disable XOR drawing
virtual void SetXORMode( bool bSet, bool bInvertOnly );
// set line color for raster operations
virtual void SetROPLineColor( SalROPColor nROPColor );
// set fill color for raster operations
virtual void SetROPFillColor( SalROPColor nROPColor );
// set the text color to a specific color
virtual void SetTextColor( SalColor nSalColor );
// set the font
virtual sal_uInt16 SetFont( FontSelectPattern*, int nFallbackLevel );
// get the current font's etrics
virtual void GetFontMetric( ImplFontMetricData*, int nFallbackLevel );
// get kernign pairs of the current font
// return only PairCount if (pKernPairs == NULL)
virtual sal_uLong GetKernPairs( sal_uLong nPairs, ImplKernPairData* pKernPairs );
// get the repertoire of the current font
virtual const ImplFontCharMap* GetImplFontCharMap() const;
virtual bool GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const;
// graphics must fill supplied font list
virtual void GetDevFontList( ImplDevFontList* );
// graphics should call ImplAddDevFontSubstitute on supplied
// OutputDevice for all its device specific preferred font substitutions
virtual void GetDevFontSubstList( OutputDevice* );
virtual bool AddTempDevFont( ImplDevFontList*, const String& rFileURL, const String& rFontName );
// CreateFontSubset: a method to get a subset of glyhps of a font
// inside a new valid font file
// returns TRUE if creation of subset was successfull
// parameters: rToFile: contains a osl file URL to write the subset to
// pFont: describes from which font to create a subset
// pGlyphIDs: the glyph ids to be extracted
// pEncoding: the character code corresponding to each glyph
// pWidths: the advance widths of the correspoding glyphs (in PS font units)
// nGlyphs: the number of glyphs
// rInfo: additional outgoing information
// implementation note: encoding 0 with glyph id 0 should be added implicitly
// as "undefined character"
virtual sal_Bool CreateFontSubset( const rtl::OUString& rToFile,
const ImplFontData* pFont,
long* pGlyphIDs,
sal_uInt8* pEncoding,
sal_Int32* pWidths,
int nGlyphs,
FontSubsetInfo& rInfo // out parameter
);
// GetFontEncodingVector: a method to get the encoding map Unicode
// to font encoded character; this is only used for type1 fonts and
// may return NULL in case of unknown encoding vector
// if ppNonEncoded is set and non encoded characters (that is type1
// glyphs with only a name) exist it is set to the corresponding
// map for non encoded glyphs; the encoding vector contains -1
// as encoding for these cases
virtual const Ucs2SIntMap* GetFontEncodingVector( const ImplFontData*, const Ucs2OStrMap** ppNonEncoded );
// GetEmbedFontData: gets the font data for a font marked
// embeddable by GetDevFontList or NULL in case of error
// parameters: pFont: describes the font in question
// pWidths: the widths of all glyphs from char code 0 to 255
// pWidths MUST support at least 256 members;
// rInfo: additional outgoing information
// pDataLen: out parameter, contains the byte length of the returned buffer
virtual const void* GetEmbedFontData( const ImplFontData*,
const sal_Ucs* pUnicodes,
sal_Int32* pWidths,
FontSubsetInfo& rInfo,
long* pDataLen );
// frees the font data again
virtual void FreeEmbedFontData( const void* pData, long nDataLen );
virtual void GetGlyphWidths( const ImplFontData*,
bool bVertical,
Int32Vector& rWidths,
Ucs2UIntMap& rUnicodeEnc );
virtual sal_Bool GetGlyphBoundRect( sal_GlyphId nIndex, Rectangle& );
virtual sal_Bool GetGlyphOutline( sal_GlyphId nIndex, basegfx::B2DPolyPolygon& );
virtual SalLayout* GetTextLayout( ImplLayoutArgs&, int nFallbackLevel );
virtual void DrawServerFontLayout( const ServerFontLayout& );
virtual bool supportsOperation( OutDevSupportType ) const;
// Query the platform layer for control support
virtual sal_Bool IsNativeControlSupported( ControlType nType, ControlPart nPart );
virtual SystemGraphicsData GetGraphicsData() const;
virtual SystemFontData GetSysFontData( int /* nFallbacklevel */ ) const;
private:
// differences between VCL, Quartz and kHiThemeOrientation coordinate systems
// make some graphics seem to be vertically-mirrored from a VCL perspective
bool IsFlipped() const { return mbWindow; }
void ApplyXorContext();
void Pattern50Fill();
UInt32 getState( ControlState nState );
UInt32 getTrackState( ControlState nState );
};
class XorEmulation
{
public:
XorEmulation();
/*final*/ ~XorEmulation();
void SetTarget( int nWidth, int nHeight, int nBitmapDepth, CGContextRef, CGLayerRef );
bool UpdateTarget();
void Enable() { mbIsEnabled = true; }
void Disable() { mbIsEnabled = false; }
bool IsEnabled() const { return mbIsEnabled; }
CGContextRef GetTargetContext() const { return mxTargetContext; }
CGContextRef GetMaskContext() const { return (mbIsEnabled ? mxMaskContext : NULL); }
private:
CGLayerRef mxTargetLayer;
CGContextRef mxTargetContext;
CGContextRef mxMaskContext;
CGContextRef mxTempContext;
sal_uLong* mpMaskBuffer;
sal_uLong* mpTempBuffer;
int mnBufferLongs;
bool mbIsEnabled;
};
// --- some trivial inlines
inline void IosSalGraphics::RefreshRect( const CGRect& rRect )
{
RefreshRect( rRect.origin.x, rRect.origin.y, rRect.size.width, rRect.size.height );
}
inline RGBAColor::RGBAColor( SalColor nSalColor )
: mfRed( SALCOLOR_RED(nSalColor) * (1.0/255))
, mfGreen( SALCOLOR_GREEN(nSalColor) * (1.0/255))
, mfBlue( SALCOLOR_BLUE(nSalColor) * (1.0/255))
, mfAlpha( 1.0 ) // opaque
{}
inline RGBAColor::RGBAColor( float fRed, float fGreen, float fBlue, float fAlpha )
: mfRed( fRed )
, mfGreen( fGreen )
, mfBlue( fBlue )
, mfAlpha( fAlpha )
{}
#endif // _SV_SALGDI_H
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|