sc/source/core/data/documen8.cxx | 4 ++++ sw/source/core/doc/docnew.cxx | 4 ++++ vcl/coretext/salcoretextlayout.cxx | 17 ----------------- vcl/coretext/salgdi.cxx | 34 ++++++++++++++++++++++++++++++---- vcl/headless/svpbmp.cxx | 1 + vcl/headless/svpgdi.cxx | 24 ++++++++++++++++++++---- vcl/inc/vcl/sysdata.hxx | 6 ++++-- vcl/inc/vcl/virdev.hxx | 28 +++++++++++++++++++++++----- vcl/ios/iosinst.cxx | 16 ++++++++-------- vcl/source/gdi/virdev.cxx | 6 ++++-- 10 files changed, 98 insertions(+), 42 deletions(-)
New commits: commit 4ac0eff680a9fbf81dfd9e8a5772dee93bd0fb1a Author: Tor Lillqvist <[email protected]> Date: Tue Mar 26 18:32:41 2013 +0200 Re-add change from 304cb6ab8fb159c883c42d2d42e82750fab4e4a7 Was accidentally reverted. Change-Id: I1d62003cfab222664b7cf2053f640287910b2892 diff --git a/ios/experimental/Viewer/Viewer/LOViewerAppDelegate.mm b/ios/experimental/Viewer/Viewer/LOViewerAppDelegate.mm index 7e7216f..271342b 100644 --- a/ios/experimental/Viewer/Viewer/LOViewerAppDelegate.mm +++ b/ios/experimental/Viewer/Viewer/LOViewerAppDelegate.mm @@ -26,7 +26,7 @@ static UIWindow *theWindow; (void) application; (void) launchOptions; - CGRect bounds = [[UIScreen mainScreen] bounds]; + CGRect bounds = [[UIScreen mainScreen] applicationFrame]; self.window = [[LOViewerWindow alloc] initWithFrame:bounds]; theWindow = self.window; commit 92b973fadcf63409026237884e81a1e3f3e62660 Author: Tor Lillqvist <[email protected]> Date: Mon Mar 25 08:04:27 2013 +0200 Use an 8bpp virtual device (instead of a 1bpp one) in sw and sc for iOS The reason why a 1bpp virtual device is used in these two places in sc and sw is unclear to me. It causes complications on iOS as such a bitmap gets passed to CGBitmapContextCreate() which does not accept 1bpp bitmaps. But let's keep the 1bpp for other platforms. Change-Id: Ia34927cf728d4be05a31e88b7da78200d0b799ba diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx index f535235..9a6c0fb 100644 --- a/sc/source/core/data/documen8.cxx +++ b/sc/source/core/data/documen8.cxx @@ -207,7 +207,11 @@ VirtualDevice* ScDocument::GetVirtualDevice_100th_mm() { if (!pVirtualDevice_100th_mm) { +#ifdef IOS + pVirtualDevice_100th_mm = new VirtualDevice( 8 ); +#else pVirtualDevice_100th_mm = new VirtualDevice( 1 ); +#endif pVirtualDevice_100th_mm->SetReferenceDevice(VirtualDevice::REFDEV_MODE_MSO1); MapMode aMapMode( pVirtualDevice_100th_mm->GetMapMode() ); aMapMode.SetMapUnit( MAP_100TH_MM ); diff --git a/sw/source/core/doc/docnew.cxx b/sw/source/core/doc/docnew.cxx index 7ffacc3..c978716 100644 --- a/sw/source/core/doc/docnew.cxx +++ b/sw/source/core/doc/docnew.cxx @@ -698,7 +698,11 @@ SwDoc::~SwDoc() VirtualDevice& SwDoc::CreateVirtualDevice_() const { +#ifdef IOS + VirtualDevice* pNewVir = new VirtualDevice( 8 ); +#else VirtualDevice* pNewVir = new VirtualDevice( 1 ); +#endif pNewVir->SetReferenceDevice( VirtualDevice::REFDEV_MODE_MSO1 ); diff --git a/vcl/inc/vcl/virdev.hxx b/vcl/inc/vcl/virdev.hxx index 9c8c4ed..5d8a70e 100644 --- a/vcl/inc/vcl/virdev.hxx +++ b/vcl/inc/vcl/virdev.hxx @@ -65,23 +65,41 @@ private: SAL_DLLPRIVATE bool ForceZeroExtleadBug() const { return ((meRefDevMode & REFDEV_FORCE_ZERO_EXTLEAD) != 0); } public: + /** Create a virtual device of size 1x1 + + @param nBitCount + Bit depth of the generated virtual device. Use 0 here, to + indicate: take default screen depth. Only 0, 1 and 8 + are allowed here, with 1 denoting binary mask and 8 a graylevel mask. + */ VirtualDevice( sal_uInt16 nBitCount = 0 ); + + /** Create a virtual device of size 1x1 + + @param rCompDev + The generated vdev will be compatible to this device. + + @param nBitCount + Bit depth of the generated virtual device. Use 0 here, to + indicate: take default screen depth. Only 0 and 1 + are allowed here, with 1 denoting binary mask. + */ VirtualDevice( const OutputDevice& rCompDev, sal_uInt16 nBitCount = 0 ); - /** Create a virtual device with alpha channel + + /** Create a virtual device of size 1x1 with alpha channel @param rCompDev - The generated vdev will be compatible to this device. By - default, Application::GetDefaultDevice() is used here. + The generated vdev will be compatible to this device. @param nBitCount Bit depth of the generated virtual device. Use 0 here, to - indicate: take default screen depth. Currently, only 0 and 1 + indicate: take default screen depth. Only 0 and 1 are allowed here, with 1 denoting binary mask. @param nAlphaBitCount Bit depth of the generated virtual device. Use 0 here, to - indicate: take default screen depth. Currently, only 0 and 1 + indicate: take default screen depth. Only 0 and 1 are allowed here, with 1 denoting binary mask. */ VirtualDevice( const OutputDevice& rCompDev, diff --git a/vcl/source/gdi/virdev.cxx b/vcl/source/gdi/virdev.cxx index 87a7487..3559550 100644 --- a/vcl/source/gdi/virdev.cxx +++ b/vcl/source/gdi/virdev.cxx @@ -39,6 +39,8 @@ using namespace ::com::sun::star::uno; void VirtualDevice::ImplInitVirDev( const OutputDevice* pOutDev, long nDX, long nDY, sal_uInt16 nBitCount, const SystemGraphicsData *pData ) { + SAL_INFO( "vcl.virdev", "ImplInitVirDev(" << nDX << "," << nDY << "," << nBitCount << ")" ); + if ( nDX < 1 ) nDX = 1; @@ -126,8 +128,8 @@ VirtualDevice::VirtualDevice( sal_uInt16 nBitCount ) : mpVirDev( NULL ), meRefDevMode( REFDEV_NONE ) { - SAL_WARN_IF( nBitCount > 1, "vcl.gdi", - "VirtualDevice::VirtualDevice(): Only 0 or 1 is for BitCount allowed" ); + SAL_WARN_IF( (nBitCount > 1 && nBitCount != 8), "vcl.gdi", + "VirtualDevice::VirtualDevice(): Only 0, 1 or 8 allowed for BitCount" ); SAL_INFO( "vcl.gdi", "VirtualDevice::VirtualDevice( " << nBitCount << " )" ); ImplInitVirDev( Application::GetDefaultDevice(), 1, 1, nBitCount ); commit 99a6a8d1bddc11097ff1bf386eb31132dbcdf311 Author: Tor Lillqvist <[email protected]> Date: Tue Mar 26 17:26:57 2013 +0200 rCGContext is not used for iOS Change-Id: If853edc8cd15bc61f0bc9d421799ad290a87d298 diff --git a/vcl/inc/vcl/sysdata.hxx b/vcl/inc/vcl/sysdata.hxx index 6d26bc2..a1db487 100644 --- a/vcl/inc/vcl/sysdata.hxx +++ b/vcl/inc/vcl/sysdata.hxx @@ -124,8 +124,9 @@ struct SystemGraphicsData unsigned long nSize; // size in bytes of this structure #if defined( WNT ) HDC hDC; // handle to a device context -#elif defined( MACOSX ) || defined( IOS ) +#elif defined( MACOSX ) CGContextRef rCGContext; // CoreGraphics graphic context +#elif defined( IOS ) #elif defined( UNX ) void* pDisplay; // the relevant display connection long hDrawable; // a drawable @@ -139,7 +140,8 @@ struct SystemGraphicsData : nSize( sizeof( SystemGraphicsData ) ) #if defined( WNT ) , hDC( 0 ) -#elif defined( MACOSX ) || defined( IOS ) +#elif defined( MACOSX ) +#elif defined( IOS ) #elif defined( UNX ) , pDisplay( NULL ) , hDrawable( 0 ) commit f238648cea537e5c40824270df8f91b50af392de Author: Tor Lillqvist <[email protected]> Date: Tue Mar 26 17:19:55 2013 +0200 Ifdef out methods for iOS that are actually in coretext/salgdi.cxx A bit scary that the linker didn't notice the duplicate symbols, but instead apparently just picked the first (or an arbitrary) one. Need to look into that. Anyway, now when the correct SetTextColor is linked in the coloured text in the demo document shows up in all its glory. The code that is partially shared between the headless, OS X CoreText and iOS backends should to be refactored a bit, I guess. Change-Id: Id341298f72dc253380d9b2319032e0a9a8bdd0f6 diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx index f3abe76..0fc3529 100644 --- a/vcl/headless/svpgdi.cxx +++ b/vcl/headless/svpgdi.cxx @@ -358,11 +358,15 @@ void SvpSalGraphics::SetROPFillColor( SalROPColor nROPColor ) } } +#ifndef IOS + void SvpSalGraphics::SetTextColor( SalColor nSalColor ) { m_aTextColor = basebmp::Color( nSalColor ); } +#endif + void SvpSalGraphics::drawPixel( long nX, long nY ) { if( m_bUseLineColor ) @@ -699,6 +703,8 @@ sal_Bool SvpSalGraphics::drawEPS( long, long, long, long, void*, sal_uLong ) return sal_False; } +#ifndef IOS + SystemFontData SvpSalGraphics::GetSysFontData( int nFallbacklevel ) const { SystemFontData aSysFontData; @@ -707,18 +713,16 @@ SystemFontData SvpSalGraphics::GetSysFontData( int nFallbacklevel ) const if (nFallbacklevel < 0 ) nFallbacklevel = 0; aSysFontData.nSize = sizeof( SystemFontData ); -#ifdef IOS - aSysFontData.rCTFont = NULL; -#else aSysFontData.nFontId = 0; aSysFontData.nFontFlags = 0; -#endif aSysFontData.bFakeBold = false; aSysFontData.bFakeItalic = false; aSysFontData.bAntialias = true; return aSysFontData; } +#endif + SystemGraphicsData SvpSalGraphics::GetGraphicsData() const { return SystemGraphicsData(); commit 91a3723922b5fecf0b18346d7d31a9ee685a0b43 Author: Tor Lillqvist <[email protected]> Date: Tue Mar 26 17:13:58 2013 +0200 Remove unnecessary code that was based on a wrong guess Change-Id: Ia3e12d68c0eef56ba32b2c6062448874a52a8df3 diff --git a/vcl/coretext/salcoretextlayout.cxx b/vcl/coretext/salcoretextlayout.cxx index d435630..7cadbe7 100644 --- a/vcl/coretext/salcoretextlayout.cxx +++ b/vcl/coretext/salcoretextlayout.cxx @@ -621,23 +621,6 @@ bool CoreTextLayout::LayoutText( ImplLayoutArgs& rArgs) return false; } -#ifdef IOS - // This might be a red herring and unnecessary once the CoreText - // code actually works;) - - // If the string contains U+FFFD ("REPLACEMENT CHARACTER"), which - // happens at least for the ooo80484-1.slk document in - // sc_filters_test, the CTTypesetterCreateWithAttributedString() - // call below crashes, at least in the iOS simulator. Go figure. - // (In that case the string consists of *only* such characters, - // but play it safe.) - for (int i = 0; i < mnCharCount; i++) - { - if ( rArgs.mpStr[rArgs.mnMinCharPos+i] == 0xFFFD) - return false; - } -#endif - SAL_INFO( "vcl.coretext.layout", "LayoutText() returning, mnGlyphCount=" << mnGlyphCount ); return true; commit 708270b616b486869e896d2ace4bc9b4fdbefad3 Author: Tor Lillqvist <[email protected]> Date: Tue Mar 26 00:27:59 2013 +0200 Improve the blitting, use memcpy for each row Change-Id: Idfc5efe8b2326748670fec82a7780f81b243dbc8 diff --git a/vcl/ios/iosinst.cxx b/vcl/ios/iosinst.cxx index 8e3137b..71dda58 100644 --- a/vcl/ios/iosinst.cxx +++ b/vcl/ios/iosinst.cxx @@ -56,20 +56,20 @@ void IosSalInstance::BlitFrameToBuffer(char *pPixelBuffer, const sal_Int32 nStride = aDev->getScanlineStride(); const unsigned char *pSrc = aSrcData.get(); + if (aDev->getScanlineFormat() != basebmp::Format::THIRTYTWO_BIT_TC_MASK_RGBA) + { + SAL_INFO( "vcl.ios", "BlitFrameToBuffer: format is not 32bpp RGBA but " << aDev->getScanlineFormat() ); + return; + } + for (unsigned int y = 0; y < (unsigned int)aDevSize.getY(); y++) { - const unsigned char *sp( pSrc + nStride * y ); + const unsigned char *sp( pSrc + nStride * (aDevSize.getY() - 1 - y) ); unsigned char *dp( (unsigned char *)pPixelBuffer + nPBWidth * 4 * (y + nDestY) + nDestX * 4 ); - for (unsigned int x = 0; x < (unsigned int)aDevSize.getX(); x++) - { - dp[x*4 + 0] = sp[x*4 + 0]; // R - dp[x*4 + 1] = sp[x*4 + 1]; // G - dp[x*4 + 2] = sp[x*4 + 2]; // B - dp[x*4 + 3] = 255; // A - } + memcpy(dp, sp, aDevSize.getX()*4); } } commit 40e67e2b5a2c0658633513c3c408cf6ef1441665 Author: Tor Lillqvist <[email protected]> Date: Tue Mar 26 00:27:03 2013 +0200 Add a SAL_INFO() Change-Id: Ieb3ff50a13172fa2c51173697b80ff5a71fbe244 diff --git a/vcl/headless/svpbmp.cxx b/vcl/headless/svpbmp.cxx index 3b22d1b..0b5eb52 100644 --- a/vcl/headless/svpbmp.cxx +++ b/vcl/headless/svpbmp.cxx @@ -39,6 +39,7 @@ bool SvpSalBitmap::Create( const Size& rSize, const BitmapPalette& rPalette ) { sal_uInt32 nFormat = SVP_DEFAULT_BITMAP_FORMAT; + SAL_INFO( "vcl.headless", "SvpSalBitmap::Create(" << rSize.Width() << "," << rSize.Height() << "," << nBitCount << ")" ); switch( nBitCount ) { case 1: nFormat = Format::ONE_BIT_MSB_PAL; break; commit e642b9d97d8ac56fda6b5c1e0859f99abc5c47e3 Author: Tor Lillqvist <[email protected]> Date: Tue Mar 26 00:26:30 2013 +0200 Release style and CGContext resources in dtor Change-Id: I40fa43aaccda42e276f729cb7948101482c6ce5c diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx index 58f496e..f3abe76 100644 --- a/vcl/headless/svpgdi.cxx +++ b/vcl/headless/svpgdi.cxx @@ -96,6 +96,18 @@ SvpSalGraphics::SvpSalGraphics() : SvpSalGraphics::~SvpSalGraphics() { +#ifdef IOS + if(m_style) + { + delete m_style; + m_style = NULL; + } + if(mrContext) + { + CGContextRelease( mrContext ); + mrContext = NULL; + } +#endif } void SvpSalGraphics::setDevice( basebmp::BitmapDeviceSharedPtr& rDevice ) commit b2ad5380ad70de51075d67bbd9dd2145d1484b6a Author: Tor Lillqvist <[email protected]> Date: Tue Mar 26 00:25:34 2013 +0200 Handle different basebmp scanline formats and flip vertically when needed Change-Id: Ic0fd7d60ddc66bcd5577988b3a4e5b2185d3ec1f diff --git a/ios/experimental/Viewer/Viewer/LOViewerAppDelegate.mm b/ios/experimental/Viewer/Viewer/LOViewerAppDelegate.mm index 271342b..7e7216f 100644 --- a/ios/experimental/Viewer/Viewer/LOViewerAppDelegate.mm +++ b/ios/experimental/Viewer/Viewer/LOViewerAppDelegate.mm @@ -26,7 +26,7 @@ static UIWindow *theWindow; (void) application; (void) launchOptions; - CGRect bounds = [[UIScreen mainScreen] applicationFrame]; + CGRect bounds = [[UIScreen mainScreen] bounds]; self.window = [[LOViewerWindow alloc] initWithFrame:bounds]; theWindow = self.window; diff --git a/vcl/coretext/salgdi.cxx b/vcl/coretext/salgdi.cxx index c7db660..7fdd975 100644 --- a/vcl/coretext/salgdi.cxx +++ b/vcl/coretext/salgdi.cxx @@ -30,6 +30,8 @@ #include <UIKit/UIKit.h> #include <postmac.h> +#include <basebmp/scanlineformats.hxx> + #include "saldatabasic.hxx" #include "headless/svpframe.hxx" #include "headless/svpgdi.hxx" @@ -284,17 +286,41 @@ bool SvpSalGraphics::CheckContext() basegfx::B2IVector size = m_aDevice->getSize(); basebmp::RawMemorySharedArray pixelBuffer = m_aDevice->getBuffer(); - mrContext = CGBitmapContextCreate(pixelBuffer.get(), size.getX(), size.getY(), 8, m_aDevice->getScanlineStride(), - CGColorSpaceCreateDeviceRGB(), kCGImageAlphaNoneSkipLast); + SAL_INFO( "vcl.ios", "CheckContext: device=" << m_aDevice.get() << " size=" << size.getX() << "x" << size.getY() << (m_aDevice->isTopDown() ? " top-down" : " bottom-up") << " stride=" << m_aDevice->getScanlineStride() ); + + switch( m_aDevice->getScanlineFormat() ) { + case basebmp::Format::EIGHT_BIT_PAL: + mrContext = CGBitmapContextCreate(pixelBuffer.get(), + size.getX(), size.getY(), + 8, m_aDevice->getScanlineStride(), + CGColorSpaceCreateDeviceGray(), + kCGImageAlphaNone); + break; + case basebmp::Format::THIRTYTWO_BIT_TC_MASK_RGBA: + mrContext = CGBitmapContextCreate(pixelBuffer.get(), + size.getX(), size.getY(), + 8, m_aDevice->getScanlineStride(), + CGColorSpaceCreateDeviceRGB(), + kCGImageAlphaNoneSkipLast); + break; + default: + SAL_INFO( "vcl.ios", "CheckContext: unsupported color format " << basebmp::Format::formatName( m_aDevice->getScanlineFormat() ) ); + } SAL_WARN_IF( mrContext == NULL, "vcl.ios", "CheckContext() failed" ); - return (mrContext != NULL); + if( mrContext != NULL && m_aDevice->isTopDown() ) + { + CGContextTranslateCTM( mrContext, 0, size.getY() ); + CGContextScaleCTM( mrContext, 1, -1 ); + } + + return ( mrContext != NULL ); } CGContextRef SvpSalGraphics::GetContext() { - if (!mrContext) + if ( !mrContext ) CheckContext(); return mrContext; _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
