[Libreoffice-commits] core.git: ios/experimental ios/MobileLibreOffice sw/source vcl/headless vcl/inc vcl/ios vcl/Library_vcl.mk vcl/osx vcl/quartz
Tor Lillqvist
tml at collabora.com
Fri Dec 13 15:43:41 PST 2013
ios/MobileLibreOffice/MobileLibreOffice.xcodeproj/project.pbxproj | 2
ios/experimental/LibreOffice/LibreOffice.xcodeproj/project.pbxproj | 6
sw/source/core/view/viewsh.cxx | 27
vcl/Library_vcl.mk | 4
vcl/headless/svpgdi.cxx | 8
vcl/headless/svpinst.cxx | 28
vcl/inc/headless/svpframe.hxx | 1
vcl/inc/headless/svpgdi.hxx | 75 ++
vcl/inc/headless/svpinst.hxx | 4
vcl/inc/osx/saldata.hxx | 6
vcl/inc/osx/salinst.h | 3
vcl/inc/osx/salvd.h | 85 --
vcl/inc/quartz/salbmp.h | 2
vcl/inc/quartz/salvd.h | 69 ++
vcl/inc/saldatabasic.hxx | 3
vcl/ios/iosinst.cxx | 4
vcl/osx/salinst.cxx | 2
vcl/osx/salvd.cxx | 261 ---------
vcl/quartz/salbmp.cxx | 6
vcl/quartz/salgdi.cxx | 33 -
vcl/quartz/salgdicommon.cxx | 92 ++-
vcl/quartz/salvd.cxx | 284 ++++++++++
22 files changed, 562 insertions(+), 443 deletions(-)
New commits:
commit 6265876ae9f1bb862440182d2d2c9b9b5b322668
Author: Tor Lillqvist <tml at collabora.com>
Date: Mon Dec 9 21:53:23 2013 +0200
iOS tiled rendering work
Possibly quite broken intermediate commit. But anyway, now it is
possible to render the tile diretly to a CGContext. Can be seen in
the MobileLibreOffice app when build in the Debug_tile_tester
configuration. See touch_lo_draw_tile() in viewsh.cxx. Unfortunately
the old plain LibreOffice test app is now broken, though, and
displays nothing at all.
This refactoring and hacking in vcl was done in a quite ugly fashion,
with ifdefs etc. But trust me, I did try, several times, for many
days, to get where I wanted in an elegant and clean fashion. But doing
it cleanly meant not being able to actually build it for days while
trying to figure ut which bits go where and which class should be
split into what base and derived class(es), and it was too much for my
limited brain capacity. I just couldn't juggle all the vcl class
structure in my head, especially as I don't have any good
understanding of the general design of it all.
Change-Id: Ia59d6a9cce15a63e63f94e8d8574bef21993fb1f
diff --git a/ios/MobileLibreOffice/MobileLibreOffice.xcodeproj/project.pbxproj b/ios/MobileLibreOffice/MobileLibreOffice.xcodeproj/project.pbxproj
index 858beb7..ce34006 100644
--- a/ios/MobileLibreOffice/MobileLibreOffice.xcodeproj/project.pbxproj
+++ b/ios/MobileLibreOffice/MobileLibreOffice.xcodeproj/project.pbxproj
@@ -268,6 +268,7 @@
BE82BE4D1822D10F00A447B5 /* ctlayout.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ctlayout.cxx; path = ../../vcl/quartz/ctlayout.cxx; sourceTree = "<group>"; };
BE82BE4E1822D10F00A447B5 /* salgdi.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = salgdi.cxx; path = ../../vcl/quartz/salgdi.cxx; sourceTree = "<group>"; };
BEC9DABC1858BA39009CCCB3 /* svdpagv.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = svdpagv.cxx; path = ../../svx/source/svdraw/svdpagv.cxx; sourceTree = "<group>"; };
+ BEDB0EFB185A05BE009A6F26 /* salvd.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = salvd.cxx; path = ../../vcl/quartz/salvd.cxx; sourceTree = "<group>"; };
BEE68B5D185715EE0049ECE0 /* salbmp.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = salbmp.cxx; path = ../../vcl/quartz/salbmp.cxx; sourceTree = "<group>"; };
BEE68B5E185715EE0049ECE0 /* salgdicommon.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = salgdicommon.cxx; path = ../../vcl/quartz/salgdicommon.cxx; sourceTree = "<group>"; };
BEE68B5F185715EE0049ECE0 /* salgdiutils.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = salgdiutils.cxx; path = ../../vcl/quartz/salgdiutils.cxx; sourceTree = "<group>"; };
@@ -700,6 +701,7 @@
BEE68B5E185715EE0049ECE0 /* salgdicommon.cxx */,
BEE68B5F185715EE0049ECE0 /* salgdiutils.cxx */,
BEE68B60185715EE0049ECE0 /* salmathutils.cxx */,
+ BEDB0EFB185A05BE009A6F26 /* salvd.cxx */,
BEE68B61185715EE0049ECE0 /* utils.cxx */,
);
name = quartz;
diff --git a/ios/experimental/LibreOffice/LibreOffice.xcodeproj/project.pbxproj b/ios/experimental/LibreOffice/LibreOffice.xcodeproj/project.pbxproj
index 8108649..26b1df6 100644
--- a/ios/experimental/LibreOffice/LibreOffice.xcodeproj/project.pbxproj
+++ b/ios/experimental/LibreOffice/LibreOffice.xcodeproj/project.pbxproj
@@ -99,6 +99,7 @@
BECB749A17185F48001BEB85 /* view0.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = view0.cxx; path = ../../../../sw/source/ui/uiview/view0.cxx; sourceTree = "<group>"; };
BECB749B17185F48001BEB85 /* view1.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = view1.cxx; path = ../../../../sw/source/ui/uiview/view1.cxx; sourceTree = "<group>"; };
BECB749C17185F48001BEB85 /* view2.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = view2.cxx; path = ../../../../sw/source/ui/uiview/view2.cxx; sourceTree = "<group>"; };
+ BEDB0EFA1859C206009A6F26 /* outdev2.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = outdev2.cxx; path = ../../../../vcl/source/gdi/outdev2.cxx; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -144,6 +145,7 @@
children = (
BE9A8D56181DBC70002A11AD /* cursor.cxx */,
BE954A2E1704F9500040D517 /* iosinst.cxx */,
+ BEDB0EFA1859C206009A6F26 /* outdev2.cxx */,
BEB752BD180C90D0005B5696 /* outmap.cxx */,
BE96AEB7181973DA00BD1AC4 /* salbmp.cxx */,
BEBF3E3A17002D0200C454AC /* svapp.cxx */,
@@ -469,7 +471,7 @@
GCC_PREFIX_HEADER = "LibreOffice/LibreOffice-Prefix.pch";
INFOPLIST_FILE = "LibreOffice/LibreOffice-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 6.1;
- LIBRARY_SEARCH_PATHS = "../../../workdir/LinkTarget/Library";
+ LIBRARY_SEARCH_PATHS = ../../../workdir/LinkTarget/Library;
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app;
};
@@ -482,7 +484,7 @@
GCC_PREFIX_HEADER = "LibreOffice/LibreOffice-Prefix.pch";
INFOPLIST_FILE = "LibreOffice/LibreOffice-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 6.1;
- LIBRARY_SEARCH_PATHS = "../../../workdir/LinkTarget/Library";
+ LIBRARY_SEARCH_PATHS = ../../../workdir/LinkTarget/Library;
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app;
};
diff --git a/sw/source/core/view/viewsh.cxx b/sw/source/core/view/viewsh.cxx
index add342d..0193376 100644
--- a/sw/source/core/view/viewsh.cxx
+++ b/sw/source/core/view/viewsh.cxx
@@ -67,6 +67,7 @@
#include "../../ui/inc/view.hxx"
#include <PostItMgr.hxx>
#include <vcl/dibtools.hxx>
+#include <vcl/sysdata.hxx>
#include <vcl/virdev.hxx>
#include <vcl/svapp.hxx>
#include <svx/sdrpaintwindow.hxx>
@@ -1756,6 +1757,9 @@ void SwViewShell::PaintTile(VirtualDevice &rDevice, int contextWidth, int contex
mbTiledRendering = true;
mpOut = &rDevice;
+ // resizes the virtual device so to contain the entrie context
+ rDevice.SetOutputSizePixel(Size(contextWidth, contextHeight));
+
// setup the output device to draw the tile
MapMode aMapMode(rDevice.GetMapMode());
aMapMode.SetMapUnit(MAP_TWIP);
@@ -1769,9 +1773,6 @@ void SwViewShell::PaintTile(VirtualDevice &rDevice, int contextWidth, int contex
aMapMode.SetScaleY(scaleY);
rDevice.SetMapMode(aMapMode);
- // resizes the virtual device so to contain the entrie context
- rDevice.SetOutputSizePixel(Size(contextWidth, contextHeight));
-
// scroll the requested area into view if necessary
MakeVisible(SwRect(Point(tilePosX, tilePosY), rDevice.PixelToLogic(Size(contextWidth, contextHeight))));
@@ -1813,25 +1814,11 @@ void touch_lo_draw_tile(void *context, int contextWidth, int contextHeight, MLOD
Application::AcquireSolarMutex(1);
if (pViewShell)
{
- // TODO create a VirtualDevice based on SystemGraphicsData instead so
- // that we get direct rendering; something like:
- //
- VirtualDevice aDevice;
-
+ SystemGraphicsData aData;
+ aData.rCGContext = (CGContextRef) context;
+ VirtualDevice aDevice(&aData, (sal_uInt16)0);
// paint to it
pViewShell->PaintTile(aDevice, contextWidth, contextHeight, tilePosX, tilePosY, tileWidth, tileHeight);
-
- // copy the aDevice content to mpImage
- Bitmap aBitmap(aDevice.GetBitmap(aDevice.PixelToLogic(Point(0,0)), aDevice.PixelToLogic(Size(contextWidth, contextHeight))));
- BitmapReadAccess * readAccess = aBitmap.AcquireReadAccess();
- touch_lo_copy_buffer((void *) readAccess->GetBuffer(),
- contextWidth,
- contextHeight,
- readAccess-> GetScanlineSize(),
- context,
- contextWidth,
- contextHeight);
- aBitmap.ReleaseAccess(readAccess);
}
Application::ReleaseSolarMutex();
#else
diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk
index 72d665a..e178412 100644
--- a/vcl/Library_vcl.mk
+++ b/vcl/Library_vcl.mk
@@ -339,6 +339,8 @@ endif
vcl_quartz_code= \
vcl/quartz/salbmp \
vcl/quartz/utils \
+ vcl/quartz/salgdicommon \
+ vcl/quartz/salvd \
vcl_coretext_code= \
vcl/quartz/ctfonts \
@@ -419,12 +421,10 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\
vcl/osx/clipboard \
vcl/osx/service_entry \
$(vcl_quartz_code) \
- vcl/quartz/salgdicommon \
vcl/quartz/salgdiutils \
vcl/quartz/salmathutils \
vcl/osx/salnativewidgets \
vcl/osx/salprn \
- vcl/osx/salvd \
vcl/osx/salframe \
vcl/osx/salmenu \
vcl/osx/salobj \
diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx
index 2a1035f..0917f9e 100644
--- a/vcl/headless/svpgdi.cxx
+++ b/vcl/headless/svpgdi.cxx
@@ -286,6 +286,10 @@ bool SvpSalGraphics::isClippedSetup( const basegfx::B2IBox &aRange, SvpSalGraphi
// bitmapdevice instead.
bool SvpSalGraphics::setClipRegion( const Region& i_rClip )
{
+#ifdef IOS
+ if (mbForeignContext)
+ return true;
+#endif
m_aClipRegion = i_rClip;
m_aClipMap.reset();
if( i_rClip.IsEmpty() )
@@ -314,6 +318,8 @@ bool SvpSalGraphics::setClipRegion( const Region& i_rClip )
return true;
}
+#ifndef IOS
+
void SvpSalGraphics::SetLineColor()
{
m_bUseLineColor = false;
@@ -677,6 +683,8 @@ SalBitmap* SvpSalGraphics::getBitmap( long nX, long nY, long nWidth, long nHeigh
return pBitmap;
}
+#endif
+
SalColor SvpSalGraphics::getPixel( long nX, long nY )
{
basebmp::Color aColor( m_aOrigDevice->getPixel( basegfx::B2IPoint( nX, nY ) ) );
diff --git a/vcl/headless/svpinst.cxx b/vcl/headless/svpinst.cxx
index 340f4f4..7a43eb1 100644
--- a/vcl/headless/svpinst.cxx
+++ b/vcl/headless/svpinst.cxx
@@ -30,6 +30,12 @@
#include "headless/svpframe.hxx"
#include "headless/svpdummies.hxx"
#include "headless/svpvd.hxx"
+#ifdef IOS
+#include "headless/svpgdi.hxx"
+#include "quartz/salbmp.h"
+#include "quartz/salgdi.h"
+#include "quartz/salvd.h"
+#endif
#include "headless/svpbmp.hxx"
#include <salframe.hxx>
@@ -211,13 +217,27 @@ void SvpSalInstance::DestroyObject( SalObject* pObject )
delete pObject;
}
-SalVirtualDevice* SvpSalInstance::CreateVirtualDevice( SalGraphics*,
+SalVirtualDevice* SvpSalInstance::CreateVirtualDevice( SalGraphics* pGraphics,
long nDX, long nDY,
- sal_uInt16 nBitCount, const SystemGraphicsData* )
+ sal_uInt16 nBitCount,
+ const SystemGraphicsData* pData )
{
+#ifdef IOS
+ if( pData )
+ return new AquaSalVirtualDevice( static_cast< AquaSalGraphics* >( pGraphics ), nDX, nDY, nBitCount, pData );
+ else
+ {
+ SvpSalVirtualDevice* pNew = new SvpSalVirtualDevice( nBitCount );
+ pNew->SetSize( nDX, nDY );
+ return pNew;
+ }
+#else
+ (void) pGraphics;
+ (void) pData;
SvpSalVirtualDevice* pNew = new SvpSalVirtualDevice( nBitCount );
pNew->SetSize( nDX, nDY );
return pNew;
+#endif
}
void SvpSalInstance::DestroyVirtualDevice( SalVirtualDevice* pDevice )
@@ -242,7 +262,11 @@ SalSystem* SvpSalInstance::CreateSalSystem()
SalBitmap* SvpSalInstance::CreateSalBitmap()
{
+#ifdef IOS
+ return new QuartzSalBitmap();
+#else
return new SvpSalBitmap();
+#endif
}
void SvpSalInstance::Yield( bool bWait, bool bHandleAllCurrentEvents )
diff --git a/vcl/inc/headless/svpframe.hxx b/vcl/inc/headless/svpframe.hxx
index 34bf77b..865fd28 100644
--- a/vcl/inc/headless/svpframe.hxx
+++ b/vcl/inc/headless/svpframe.hxx
@@ -30,6 +30,7 @@
#ifdef IOS
#define SvpSalGraphics AquaSalGraphics
+#define SvpSalInstance AquaSalInstance
#endif
class SvpSalInstance;
diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx
index 8e38bd2..1135c7d 100644
--- a/vcl/inc/headless/svpgdi.hxx
+++ b/vcl/inc/headless/svpgdi.hxx
@@ -22,6 +22,7 @@
#include <basebmp/bitmapdevice.hxx>
#include <basebmp/color.hxx>
+#include <vcl/sysdata.hxx>
#include "salgdi.hxx"
#include "sallayout.hxx"
@@ -48,6 +49,7 @@ class SvpSalGraphics : public SalGraphics
basebmp::BitmapDeviceSharedPtr m_aDevice;
basebmp::BitmapDeviceSharedPtr m_aOrigDevice;
+#ifndef IOS
bool m_bUseLineColor;
basebmp::Color m_aLineColor;
bool m_bUseFillColor;
@@ -55,12 +57,48 @@ class SvpSalGraphics : public SalGraphics
basebmp::DrawMode m_aDrawMode;
-#ifndef IOS
// These fields are used only when we use FreeType to draw into a
// headless backend, i.e. not on iOS.
basebmp::Color m_aTextColor;
ServerFont* m_pServerFont[ MAX_FALLBACK ];
basebmp::Format m_eTextFmt;
+#else
+ friend class CTLayout;
+
+ CGLayerRef mxLayer;
+ // mirror AquaSalVirtualDevice::mbForeignContext for SvpSalGraphics objects related to such
+ bool mbForeignContext;
+ CGContextRef mrContext;
+ class XorEmulation* mpXorEmulation;
+ int mnXorMode; // 0: off 1: on 2: invert only
+ int mnWidth;
+ int mnHeight;
+ int mnBitmapDepth; // zero unless bitmap
+ /// some graphics implementations (e.g. AquaSalInfoPrinter) 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 CoreTextFontData* mpFontData;
+ CoreTextStyle* mpTextStyle;
+ RGBAColor maTextColor;
+ /// allows text to be rendered without antialiasing
+ bool mbNonAntialiasedText;
+
+ /// is this a printer graphics
+ bool mbPrinter;
+ /// is this a virtual device graphics
+ bool mbVirDev;
#endif
basebmp::BitmapDeviceSharedPtr m_aClipMap;
@@ -81,22 +119,6 @@ private:
void ensureClip();
protected:
-
-#ifdef IOS
- friend class CTLayout;
-
- CGContextRef mrContext;
- double mfFakeDPIScale;
-
- // Device Font settings
- const CoreTextFontData* mpFontData;
- CoreTextStyle* mpTextStyle;
- RGBAColor maTextColor;
- /// allows text to be rendered without antialiasing
- bool mbNonAntialiasedText;
-
-#endif
-
virtual bool drawAlphaBitmap( const SalTwoRect&, const SalBitmap& rSourceBitmap, const SalBitmap& rAlphaBitmap );
virtual bool drawTransformedBitmap(
const basegfx::B2DPoint& rNull,
@@ -218,11 +240,30 @@ public:
virtual SystemFontData GetSysFontData( int nFallbacklevel ) const;
#ifdef IOS
+ void SetVirDevGraphics( CGLayerRef xLayer, CGContextRef xContext, int = 0 )
+ {
+ mxLayer = xLayer;
+ mrContext = xContext;
+ mbForeignContext = xContext != NULL;
+ };
+
bool CheckContext();
CGContextRef GetContext();
bool GetRawFontData( const PhysicalFontFace* pFontData,
std::vector<unsigned char>& rBuffer,
bool* pJustCFF );
+ void RefreshRect( const CGRect& ) { };
+ void RefreshRect(float /* lX */, float /* lY */, float /* lWidth */, float /* lHeight */) { };
+ void SetState();
+ void UnsetState();
+ void InvalidateContext();
+ bool IsPenVisible() const { return maLineColor.IsVisible(); }
+ bool IsBrushVisible() const { return maFillColor.IsVisible(); }
+ void ImplDrawPixel( long nX, long nY, const RGBAColor& ); // helper to draw single pixels
+ CGPoint* makeCGptArray(sal_uLong nPoints, const SalPoint* pPtAry);
+ bool IsFlipped() const { return false; }
+ void ApplyXorContext();
+ void Pattern50Fill();
#endif
};
diff --git a/vcl/inc/headless/svpinst.hxx b/vcl/inc/headless/svpinst.hxx
index e1ef8d4..79e5e1f 100644
--- a/vcl/inc/headless/svpinst.hxx
+++ b/vcl/inc/headless/svpinst.hxx
@@ -37,6 +37,10 @@
#define VIRTUAL_DESKTOP_WIDTH 1024
#define VIRTUAL_DESKTOP_HEIGHT 768
+#ifdef IOS
+#define SvpSalInstance AquaSalInstance
+#endif
+
class SvpSalInstance;
class SvpSalTimer : public SalTimer
{
diff --git a/vcl/inc/osx/saldata.hxx b/vcl/inc/osx/saldata.hxx
index c9c44bf..2bc0a6f 100644
--- a/vcl/inc/osx/saldata.hxx
+++ b/vcl/inc/osx/saldata.hxx
@@ -61,6 +61,9 @@ struct FrameHash : public boost::hash<sal_IntPtr>
#define INVALID_CURSOR_PTR (NSCursor*)0xdeadbeef
+// Singleton, instantiated from Application::Application() in
+// vcl/source/app/svapp.cxx through InitSalData().
+
class SalData
{
public:
@@ -75,11 +78,8 @@ public:
SystemFontList *mpFontList;
NSStatusItem* mpStatusItem; // one status item that draws all our stati
// at the moment this is only one add menu button
-
CGColorSpaceRef mxRGBSpace;
CGColorSpaceRef mxGraySpace;
- CGColorSpaceRef mxP50Space;
- CGPatternRef mxP50Pattern;
std::vector< NSCursor* > maCursors;
std::vector< NSMenuItem* > maFallbackMenu;
diff --git a/vcl/inc/osx/salinst.h b/vcl/inc/osx/salinst.h
index 62b7f85..d6d2824 100644
--- a/vcl/inc/osx/salinst.h
+++ b/vcl/inc/osx/salinst.h
@@ -25,7 +25,9 @@
#include "osl/conditn.h"
#include <vcl/solarmutex.hxx>
+#ifdef MACOSX
#include "osx/osxvcltypes.h"
+#endif
#include "salinst.hxx"
@@ -51,7 +53,6 @@ public:
#define YIELD_GUARD osl::Guard< comphelper::SolarMutex > aGuard( GetSalData()->mpFirstInstance->GetYieldMutex() )
-
class AquaSalInstance : public SalInstance
{
struct SalUserEvent
diff --git a/vcl/inc/quartz/salbmp.h b/vcl/inc/quartz/salbmp.h
index a645999..510c64f 100644
--- a/vcl/inc/quartz/salbmp.h
+++ b/vcl/inc/quartz/salbmp.h
@@ -92,7 +92,7 @@ private:
sal_uInt16 nSrcBits, sal_uInt32 nSrcBytesPerRow, const BitmapPalette& rSrcPalette, sal_uInt8* pSrcData );
public:
- bool Create( CGLayerRef xLayer, int nBitCount, int nX, int nY, int nWidth, int nHeight, bool bMirrorVert = true );
+ bool Create( CGLayerRef xLayer, int nBitCount, int nX, int nY, int nWidth, int nHeight );
public:
CGImageRef CreateWithMask( const QuartzSalBitmap& rMask, int nX, int nY, int nWidth, int nHeight ) const;
diff --git a/vcl/inc/osx/salvd.h b/vcl/inc/quartz/salvd.h
similarity index 82%
rename from vcl/inc/osx/salvd.h
rename to vcl/inc/quartz/salvd.h
index 1c32ad4..fe69336 100644
--- a/vcl/inc/osx/salvd.h
+++ b/vcl/inc/quartz/salvd.h
@@ -21,25 +21,17 @@
#define INCLUDED_VCL_INC_OSX_SALVD_H
#include "premac.h"
+#ifdef MACOSX
#include <ApplicationServices/ApplicationServices.h>
+#else
+#include <CoreGraphics/CoreGraphics.h>
+#endif
#include "postmac.h"
#include "quartz/salgdi.h"
#include "salvd.hxx"
-#if PRAGMA_ONCE
- #pragma once
-#endif
-
-// =======================================================================
-
-// =======================================================================
-
-// -----------------
-// - SalVirDevData -
-// -----------------
-
struct SalVirDevData
{
};
@@ -48,14 +40,8 @@ typedef struct SalVirDevData SalVirDevData;
typedef SalVirDevData *SalVirDevDataPtr;
typedef SalVirDevDataPtr *SalVirDevDataHandle;
-// =======================================================================
-
class AquaSalGraphics;
-// -----------------
-// - SalVirDevData -
-// -----------------
-
class AquaSalVirtualDevice : public SalVirtualDevice
{
private:
@@ -78,8 +64,6 @@ public:
virtual void GetSize( long& rWidth, long& rHeight );
};
-// =======================================================================
-
#endif // INCLUDED_VCL_INC_OSX_SALVD_H
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/saldatabasic.hxx b/vcl/inc/saldatabasic.hxx
index 3d2d2c0..0c504e4 100644
--- a/vcl/inc/saldatabasic.hxx
+++ b/vcl/inc/saldatabasic.hxx
@@ -45,9 +45,10 @@ public:
SalData();
virtual ~SalData();
#ifdef IOS
+ SystemFontList* mpFontList;
CGColorSpaceRef mxRGBSpace;
CGColorSpaceRef mxGraySpace;
- SystemFontList* mpFontList;
+ static void ensureThreadAutoreleasePool() {};
#endif
};
diff --git a/vcl/ios/iosinst.cxx b/vcl/ios/iosinst.cxx
index 0b3f69f..bcef629 100644
--- a/vcl/ios/iosinst.cxx
+++ b/vcl/ios/iosinst.cxx
@@ -248,7 +248,9 @@ SalData::SalData() :
m_pInstance( 0 ),
m_pPlugin( 0 ),
m_pPIManager(0 ),
- mpFontList( 0 )
+ mpFontList( 0 ),
+ mxRGBSpace( CGColorSpaceCreateDeviceRGB() ),
+ mxGraySpace( CGColorSpaceCreateDeviceGray() )
{
}
diff --git a/vcl/osx/salinst.cxx b/vcl/osx/salinst.cxx
index 9aab3a0..538747c 100644
--- a/vcl/osx/salinst.cxx
+++ b/vcl/osx/salinst.cxx
@@ -37,7 +37,7 @@
#include "osx/salframe.h"
#include "osx/salobj.h"
#include "osx/salsys.h"
-#include "osx/salvd.h"
+#include "quartz/salvd.h"
#include "quartz/salbmp.h"
#include "quartz/utils.h"
#include "osx/salprn.h"
diff --git a/vcl/quartz/salbmp.cxx b/vcl/quartz/salbmp.cxx
index 1a509bd..933bd2b 100644
--- a/vcl/quartz/salbmp.cxx
+++ b/vcl/quartz/salbmp.cxx
@@ -75,7 +75,7 @@ QuartzSalBitmap::~QuartzSalBitmap()
// ------------------------------------------------------------------
bool QuartzSalBitmap::Create( CGLayerRef xLayer, int nBitmapBits,
- int nX, int nY, int nWidth, int nHeight, bool /*bMirrorVert*/ )
+ int nX, int nY, int nWidth, int nHeight )
{
DBG_ASSERT( xLayer, "QuartzSalBitmap::Create() from non-layered context" );
@@ -102,7 +102,7 @@ bool QuartzSalBitmap::Create( CGLayerRef xLayer, int nBitmapBits,
// copy layer content into the bitmap buffer
const CGPoint aSrcPoint = { static_cast<CGFloat>(-nX), static_cast<CGFloat>(-nY) };
- ::CGContextDrawLayerAtPoint( mxGraphicContext, aSrcPoint, xLayer );
+ CGContextDrawLayerAtPoint( mxGraphicContext, aSrcPoint, xLayer );
return true;
}
@@ -239,7 +239,7 @@ bool QuartzSalBitmap::CreateContext()
if( maContextBuffer.get() )
{
- mxGraphicContext = ::CGBitmapContextCreate( maContextBuffer.get(), mnWidth, mnHeight,
+ mxGraphicContext = CGBitmapContextCreate( maContextBuffer.get(), mnWidth, mnHeight,
bitsPerComponent, nContextBytesPerRow, aCGColorSpace, aCGBmpInfo );
}
diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx
index ee80205..25a219f 100644
--- a/vcl/quartz/salgdi.cxx
+++ b/vcl/quartz/salgdi.cxx
@@ -266,39 +266,53 @@ AquaSalGraphics::AquaSalGraphics()
, mbVirDev( false )
, mbWindow( false )
#else
- : mrContext( NULL )
+ : mxLayer( NULL )
+ , mbForeignContext( false )
+ , mrContext( NULL )
+ , mpXorEmulation( NULL )
+ , mnXorMode( 0 )
+ , mnWidth( 0 )
+ , mnHeight( 0 )
+ , mnBitmapDepth( 0 )
, mfFakeDPIScale( 1.0 )
+ , mxClipPath( NULL )
+ , maLineColor( COL_WHITE )
+ , maFillColor( COL_BLACK )
, mpFontData( NULL )
, mpTextStyle( NULL )
, maTextColor( COL_BLACK )
, mbNonAntialiasedText( false )
+ , mbPrinter( false )
+ , mbVirDev( false )
#endif
{}
-// -----------------------------------------------------------------------
-
AquaSalGraphics::~AquaSalGraphics()
{
-#ifdef MACOSX
CGPathRelease( mxClipPath );
delete mpTextStyle;
if( mpXorEmulation )
delete mpXorEmulation;
+#ifdef IOS
+ if (mbForeignContext)
+ return;
+#endif
if( mxLayer )
CGLayerRelease( mxLayer );
- else if( mrContext && mbWindow )
+ else if( mrContext
+#ifdef MACOSX
+ && mbWindow
+#endif
+ )
{
// destroy backbuffer bitmap context that we created ourself
CGContextRelease( mrContext );
mrContext = NULL;
}
-#endif
}
-// =======================================================================
-
void AquaSalGraphics::SetTextColor( SalColor nSalColor )
{
maTextColor = RGBAColor( nSalColor );
@@ -792,6 +806,9 @@ SystemFontData AquaSalGraphics::GetSysFontData( int /* nFallbacklevel */ ) const
bool SvpSalGraphics::CheckContext()
{
+ if (mbForeignContext)
+ return true;
+
const basegfx::B2IVector size = m_aDevice->getSize();
const basegfx::B2IVector bufferSize = m_aDevice->getBufferSize();
const sal_Int32 scanlineStride = m_aDevice->getScanlineStride();
diff --git a/vcl/quartz/salgdicommon.cxx b/vcl/quartz/salgdicommon.cxx
index 85e6a9e..a204d74 100644
--- a/vcl/quartz/salgdicommon.cxx
+++ b/vcl/quartz/salgdicommon.cxx
@@ -25,7 +25,7 @@
#include <osl/endian.h>
#include <osl/file.hxx>
-#include "basegfx/polygon/b2dpolygon.hxx"
+#include <basegfx/polygon/b2dpolygon.hxx>
#include "quartz/salbmp.h"
#include "quartz/salgdi.h"
@@ -33,10 +33,12 @@
#include "fontsubset.hxx"
#include "sft.hxx"
-using namespace vcl;
+#ifdef IOS
+#include "saldatabasic.hxx"
+#endif
+using namespace vcl;
-//typedef unsigned char Boolean; // copied from MacTypes.h, should be properly included
typedef std::vector<unsigned char> ByteVector;
static const basegfx::B2DPoint aHalfPointOfs ( 0.5, 0.5 );
@@ -307,8 +309,11 @@ void AquaSalGraphics::copyBits( const SalTwoRect& rPosAry, SalGraphics *pSrcGrap
// accelerate trivial operations
/*const*/ AquaSalGraphics* pSrc = static_cast<AquaSalGraphics*>(pSrcGraphics);
- const bool bSameGraphics = (this == pSrc) ||
- (mbWindow && mpFrame && pSrc->mbWindow && (mpFrame == pSrc->mpFrame));
+ const bool bSameGraphics = (this == pSrc)
+#ifdef MACOSX
+ || (mbWindow && mpFrame && pSrc->mbWindow && (mpFrame == pSrc->mpFrame))
+#endif
+ ;
if( bSameGraphics
&& (rPosAry.mnSrcWidth == rPosAry.mnDestWidth)
&& (rPosAry.mnSrcHeight == rPosAry.mnDestHeight))
@@ -333,6 +338,10 @@ void AquaSalGraphics::copyBits( const SalTwoRect& rPosAry, SalGraphics *pSrcGrap
rPosAry.mnSrcHeight == rPosAry.mnDestHeight) &&
(!mnBitmapDepth || (aDstPoint.x + pSrc->mnWidth) <= mnWidth) ) // workaround a Quartz crasher
{
+#ifdef IOS
+ if( !CheckContext() )
+ return;
+#endif
// in XOR mode the drawing context is redirected to the XOR mask
// if source and target are identical then copyBits() paints onto the target context though
CGContextRef xCopyContext = mrContext;
@@ -354,7 +363,7 @@ void AquaSalGraphics::copyBits( const SalTwoRect& rPosAry, SalGraphics *pSrcGrap
CGContextTranslateCTM( xCopyContext, 0, +mnHeight ); CGContextScaleCTM( xCopyContext, +1, -1 );
}
// TODO: pSrc->size() != this->size()
- ::CGContextDrawLayerAtPoint( xCopyContext, aDstPoint, pSrc->mxLayer );
+ CGContextDrawLayerAtPoint( xCopyContext, aDstPoint, pSrc->mxLayer );
CGContextRestoreGState( xCopyContext );
// mark the destination rectangle as updated
RefreshRect( aDstRect );
@@ -462,21 +471,21 @@ void AquaSalGraphics::copyArea( long nDstX, long nDstY,long nSrcX, long nSrcY,
// TODO: if( mnBitmapDepth > 0 )
{
const CGSize aSrcSize = CGSizeMake(nSrcWidth, nSrcHeight);
- xSrcLayer = ::CGLayerCreateWithContext( xCopyContext, aSrcSize, NULL );
+ xSrcLayer = CGLayerCreateWithContext( xCopyContext, aSrcSize, NULL );
const CGContextRef xSrcContext = CGLayerGetContext( xSrcLayer );
CGPoint aSrcPoint = CGPointMake(-nSrcX, -nSrcY);
if( IsFlipped() )
{
- ::CGContextTranslateCTM( xSrcContext, 0, +nSrcHeight );
- ::CGContextScaleCTM( xSrcContext, +1, -1 );
+ CGContextTranslateCTM( xSrcContext, 0, +nSrcHeight );
+ CGContextScaleCTM( xSrcContext, +1, -1 );
aSrcPoint.y = (nSrcY + nSrcHeight) - mnHeight;
}
- ::CGContextDrawLayerAtPoint( xSrcContext, aSrcPoint, mxLayer );
+ CGContextDrawLayerAtPoint( xSrcContext, aSrcPoint, mxLayer );
}
// draw at new destination
const CGPoint aDstPoint = CGPointMake(+nDstX, +nDstY);
- ::CGContextDrawLayerAtPoint( xCopyContext, aDstPoint, xSrcLayer );
+ CGContextDrawLayerAtPoint( xCopyContext, aDstPoint, xSrcLayer );
// cleanup
if( xSrcLayer != mxLayer )
@@ -488,6 +497,8 @@ void AquaSalGraphics::copyArea( long nDstX, long nDstY,long nSrcX, long nSrcY,
}
+#ifndef IOS
+
void AquaSalGraphics::copyResolution( AquaSalGraphics& rGraphics )
{
if( !rGraphics.mnRealDPIY && rGraphics.mbWindow && rGraphics.mpFrame )
@@ -499,6 +510,8 @@ void AquaSalGraphics::copyResolution( AquaSalGraphics& rGraphics )
mfFakeDPIScale = rGraphics.mfFakeDPIScale;
}
+#endif
+
bool AquaSalGraphics::drawAlphaBitmap( const SalTwoRect& rTR,
const SalBitmap& rSrcBitmap,
const SalBitmap& rAlphaBmp )
@@ -655,6 +668,8 @@ void AquaSalGraphics::drawBitmap( const SalTwoRect& rPosAry, const SalBitmap& rS
RefreshRect( aDstRect );
}
+#ifndef IOS
+
sal_Bool AquaSalGraphics::drawEPS( long nX, long nY, long nWidth, long nHeight,
void* pEpsData, sal_uLong nByteCount )
{
@@ -700,6 +715,8 @@ sal_Bool AquaSalGraphics::drawEPS( long nX, long nY, long nWidth, long nHeight,
return bOK;
}
+#endif
+
void AquaSalGraphics::drawLine( long nX1, long nY1, long nX2, long nY2 )
{
if( nX1 == nX2 && nY1 == nY2 )
@@ -1129,7 +1146,7 @@ SalBitmap* AquaSalGraphics::getBitmap( long nX, long nY, long nDX, long nDY
ApplyXorContext();
QuartzSalBitmap* pBitmap = new QuartzSalBitmap;
- if( !pBitmap->Create( mxLayer, mnBitmapDepth, nX, nY, nDX, nDY, !mbWindow ) )
+ if( !pBitmap->Create( mxLayer, mnBitmapDepth, nX, nY, nDX, nDY) )
{
delete pBitmap;
pBitmap = NULL;
@@ -1138,6 +1155,8 @@ SalBitmap* AquaSalGraphics::getBitmap( long nX, long nY, long nDX, long nDY
return pBitmap;
}
+#ifndef IOS
+
SystemGraphicsData AquaSalGraphics::GetGraphicsData() const
{
SystemGraphicsData aRes;
@@ -1184,8 +1203,8 @@ SalColor AquaSalGraphics::getPixel( long nX, long nY )
// create a one-pixel bitmap context
// TODO: is it worth to cache it?
CGContextRef xOnePixelContext =
- ::CGBitmapContextCreate( &aPixel, 1, 1, 8, sizeof(aPixel),
- aCGColorSpace, aCGBmpInfo );
+ CGBitmapContextCreate( &aPixel, 1, 1, 8, sizeof(aPixel),
+ aCGColorSpace, aCGBmpInfo );
// update this graphics layer
ApplyXorContext();
@@ -1214,6 +1233,8 @@ void AquaSalGraphics::GetResolution( sal_Int32& rDPIX, sal_Int32& rDPIY )
rDPIY = static_cast<sal_Int32>(mfFakeDPIScale * mnRealDPIY);
}
+#endif
+
void AquaSalGraphics::ImplDrawPixel( long nX, long nY, const RGBAColor& rColor )
{
if( !CheckContext() )
@@ -1230,6 +1251,8 @@ void AquaSalGraphics::ImplDrawPixel( long nX, long nY, const RGBAColor& rColor )
CGContextSetFillColor( mrContext, maFillColor.AsArray() );
}
+#ifndef IOS
+
void AquaSalGraphics::initResolution( NSWindow* )
{
// #i100617# read DPI only once; there is some kind of weird caching going on
@@ -1322,6 +1345,8 @@ void AquaSalGraphics::initResolution( NSWindow* )
mfFakeDPIScale = 1.0;
}
+#endif
+
void AquaSalGraphics::invert( long nX, long nY, long nWidth, long nHeight, SalInvert nFlags )
{
if ( CheckContext() )
@@ -1395,19 +1420,13 @@ void AquaSalGraphics::Pattern50Fill()
{
static const CGFloat aFillCol[4] = { 1,1,1,1 };
static const CGPatternCallbacks aCallback = { 0, &DrawPattern50, NULL };
- if( ! GetSalData()->mxP50Space )
- {
- GetSalData()->mxP50Space = CGColorSpaceCreatePattern( GetSalData()->mxRGBSpace );
- }
- if( ! GetSalData()->mxP50Pattern )
- {
- GetSalData()->mxP50Pattern = CGPatternCreate( NULL, CGRectMake( 0, 0, 4, 4 ),
- CGAffineTransformIdentity, 4, 4,
- kCGPatternTilingConstantSpacing,
- false, &aCallback );
- }
- CGContextSetFillColorSpace( mrContext, GetSalData()->mxP50Space );
- CGContextSetFillPattern( mrContext, GetSalData()->mxP50Pattern, aFillCol );
+ static const CGColorSpaceRef mxP50Space = CGColorSpaceCreatePattern( GetSalData()->mxRGBSpace );
+ static const CGPatternRef mxP50Pattern = CGPatternCreate( NULL, CGRectMake( 0, 0, 4, 4 ),
+ CGAffineTransformIdentity, 4, 4,
+ kCGPatternTilingConstantSpacing,
+ false, &aCallback );
+ CGContextSetFillColorSpace( mrContext, mxP50Space );
+ CGContextSetFillPattern( mrContext, mxP50Pattern, aFillCol );
CGContextFillPath( mrContext );
}
@@ -1590,6 +1609,8 @@ void AquaSalGraphics::SetXORMode( bool bSet, bool bInvertOnly )
}
}
+#ifndef IOS
+
void AquaSalGraphics::updateResolution()
{
DBG_ASSERT( mbWindow, "updateResolution on inappropriate graphics" );
@@ -1597,6 +1618,7 @@ void AquaSalGraphics::updateResolution()
initResolution( (mbWindow && mpFrame) ? mpFrame->getNSWindow() : nil );
}
+#endif
// -----------------------------------------------------------
@@ -1669,10 +1691,10 @@ void XorEmulation::SetTarget( int nWidth, int nHeight, int nTargetDepth,
// create a XorMask context
m_pMaskBuffer = new sal_uLong[ m_nBufferLongs ];
- m_xMaskContext = ::CGBitmapContextCreate( m_pMaskBuffer,
- nWidth, nHeight,
- nBitsPerComponent, nBytesPerRow,
- aCGColorSpace, aCGBmpInfo );
+ m_xMaskContext = CGBitmapContextCreate( m_pMaskBuffer,
+ nWidth, nHeight,
+ nBitsPerComponent, nBytesPerRow,
+ aCGColorSpace, aCGBmpInfo );
// reset the XOR mask to black
memset( m_pMaskBuffer, 0, m_nBufferLongs * sizeof(sal_uLong) );
@@ -1684,10 +1706,10 @@ void XorEmulation::SetTarget( int nWidth, int nHeight, int nTargetDepth,
{
// create a bitmap context matching to the target context
m_pTempBuffer = new sal_uLong[ m_nBufferLongs ];
- m_xTempContext = ::CGBitmapContextCreate( m_pTempBuffer,
- nWidth, nHeight,
- nBitsPerComponent, nBytesPerRow,
- aCGColorSpace, aCGBmpInfo );
+ m_xTempContext = CGBitmapContextCreate( m_pTempBuffer,
+ nWidth, nHeight,
+ nBitsPerComponent, nBytesPerRow,
+ aCGColorSpace, aCGBmpInfo );
}
// initialize XOR mask context for drawing
diff --git a/vcl/osx/salvd.cxx b/vcl/quartz/salvd.cxx
similarity index 88%
rename from vcl/osx/salvd.cxx
rename to vcl/quartz/salvd.cxx
index 3f69ab9..7b041b9 100644
--- a/vcl/osx/salvd.cxx
+++ b/vcl/quartz/salvd.cxx
@@ -17,15 +17,21 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
-
#include "vcl/svapp.hxx"
#include "vcl/sysdata.hxx"
-#include "osx/salvd.h"
+#include "quartz/salvd.h"
+#ifdef MACOSX
#include "osx/salinst.h"
-#include "quartz/salgdi.h"
#include "osx/saldata.hxx"
#include "osx/salframe.h"
+#else
+#include "headless/svpframe.hxx"
+#include "headless/svpgdi.hxx"
+#include "headless/svpinst.hxx"
+#include "headless/svpvd.hxx"
+#endif
+#include "quartz/salgdi.h"
// -----------------------------------------------------------------------
@@ -35,7 +41,14 @@ SalVirtualDevice* AquaSalInstance::CreateVirtualDevice( SalGraphics* pGraphics,
// #i92075# can be called first in a thread
SalData::ensureThreadAutoreleasePool();
- return new AquaSalVirtualDevice( static_cast< AquaSalGraphics* >( pGraphics ), nDX, nDY, nBitCount, pData );
+#ifdef IOS
+ if( pData )
+ return new AquaSalVirtualDevice( static_cast< AquaSalGraphics* >( pGraphics ), nDX, nDY, nBitCount, pData );
+ else
+ return new SvpSalVirtualDevice( nBitCount );
+#else
+ return new AquaSalVirtualDevice( static_cast< AquaSalGraphics* >( pGraphics ), nDX, nDY, nBitCount, pData );
+#endif
}
// -----------------------------------------------------------------------
@@ -67,7 +80,7 @@ AquaSalVirtualDevice::AquaSalVirtualDevice( AquaSalGraphics* pGraphic, long nDX,
mbForeignContext = false; // the mxContext is created within VCL
mpGraphics = new AquaSalGraphics(); // never fails
mnBitmapDepth = nBitCount;
-
+#ifdef MACOSX
// inherit resolution from reference device
if( pGraphic )
{
@@ -78,7 +91,7 @@ AquaSalVirtualDevice::AquaSalVirtualDevice( AquaSalGraphics* pGraphic, long nDX,
mpGraphics->copyResolution( *pGraphic );
}
}
-
+#endif
if( nDX && nDY )
SetSize( nDX, nDY );
@@ -148,12 +161,21 @@ void AquaSalVirtualDevice::ReleaseGraphics( SalGraphics* )
sal_Bool AquaSalVirtualDevice::SetSize( long nDX, long nDY )
{
+#ifdef IOS
+ (void) nDX;
+ (void) nDY;
+ assert(mbForeignContext);
+#endif
+
if( mbForeignContext )
{
// Do not delete/resize mxContext that we have received from outside VCL
return true;
}
+#ifdef IOS
+ return false;
+#else
if( mxLayer )
{
const CGSize aSize = CGLayerGetSize( mxLayer );
@@ -176,8 +198,8 @@ sal_Bool AquaSalVirtualDevice::SetSize( long nDX, long nDY )
const int nBytesPerRow = (mnBitmapDepth * nDX + 7) / 8;
void* pRawData = rtl_allocateMemory( nBytesPerRow * nDY );
- mxBitmapContext = ::CGBitmapContextCreate( pRawData, nDX, nDY,
- mnBitmapDepth, nBytesPerRow, aCGColorSpace, aCGBmpInfo );
+ mxBitmapContext = CGBitmapContextCreate( pRawData, nDX, nDY,
+ mnBitmapDepth, nBytesPerRow, aCGColorSpace, aCGBmpInfo );
xCGContext = mxBitmapContext;
}
else
@@ -219,8 +241,8 @@ sal_Bool AquaSalVirtualDevice::SetSize( long nDX, long nDY )
const int nBytesPerRow = (mnBitmapDepth * nDX) / 8;
void* pRawData = rtl_allocateMemory( nBytesPerRow * nDY );
- mxBitmapContext = ::CGBitmapContextCreate( pRawData, nDX, nDY,
- 8, nBytesPerRow, aCGColorSpace, aCGBmpInfo );
+ mxBitmapContext = CGBitmapContextCreate( pRawData, nDX, nDY,
+ 8, nBytesPerRow, aCGColorSpace, aCGBmpInfo );
xCGContext = mxBitmapContext;
}
}
@@ -239,6 +261,7 @@ sal_Bool AquaSalVirtualDevice::SetSize( long nDX, long nDY )
}
return (mxLayer != NULL);
+#endif
}
// -----------------------------------------------------------------------
More information about the Libreoffice-commits
mailing list