[Libreoffice-commits] core.git: 12 commits - ios/CustomTarget_LibreOffice_app.mk ios/CustomTarget_Viewer_app.mk ios/Executable_LibreOffice.mk ios/Executable_Viewer.mk ios/experimental ios/Module_ios.mk Repository.mk sal/inc vcl/android vcl/headless vcl/inc vcl/ios

Tor Lillqvist tml at iki.fi
Fri Mar 29 23:47:35 PDT 2013


 Repository.mk                                                       |    2 
 dev/null                                                            |binary
 ios/CustomTarget_LibreOffice_app.mk                                 |  159 ++++
 ios/CustomTarget_Viewer_app.mk                                      |  169 ----
 ios/Executable_LibreOffice.mk                                       |   57 +
 ios/Executable_Viewer.mk                                            |   56 -
 ios/Module_ios.mk                                                   |    4 
 ios/experimental/LibreOffice/.gitignore                             |    4 
 ios/experimental/LibreOffice/LibreOffice.xcodeproj/project.pbxproj  |  351 ++++++++++
 ios/experimental/LibreOffice/LibreOffice/AppDelegate.h              |   22 
 ios/experimental/LibreOffice/LibreOffice/AppDelegate.m              |  103 ++
 ios/experimental/LibreOffice/LibreOffice/Default-568h at 2x.png        |binary
 ios/experimental/LibreOffice/LibreOffice/Default.png                |binary
 ios/experimental/LibreOffice/LibreOffice/Default at 2x.png             |binary
 ios/experimental/LibreOffice/LibreOffice/Icon-72.png                |binary
 ios/experimental/LibreOffice/LibreOffice/Icon.png                   |binary
 ios/experimental/LibreOffice/LibreOffice/Icon at 2x.png                |binary
 ios/experimental/LibreOffice/LibreOffice/LibreOffice-Info.plist     |   47 +
 ios/experimental/LibreOffice/LibreOffice/LibreOffice-Prefix.pch     |   14 
 ios/experimental/LibreOffice/LibreOffice/View.h                     |   19 
 ios/experimental/LibreOffice/LibreOffice/View.m                     |   43 +
 ios/experimental/LibreOffice/LibreOffice/ViewController.h           |   16 
 ios/experimental/LibreOffice/LibreOffice/ViewController.m           |   26 
 ios/experimental/LibreOffice/LibreOffice/en.lproj/InfoPlist.strings |    2 
 ios/experimental/LibreOffice/LibreOffice/iTunesArtwork              |binary
 ios/experimental/LibreOffice/LibreOffice/lo.h                       |   20 
 ios/experimental/LibreOffice/LibreOffice/lo.mm                      |  184 +++++
 ios/experimental/LibreOffice/LibreOffice/main.m                     |   20 
 ios/experimental/Viewer/.gitignore                                  |    4 
 ios/experimental/Viewer/Viewer.xcodeproj/project.pbxproj            |  342 ---------
 ios/experimental/Viewer/Viewer/LOViewerAppDelegate.h                |   24 
 ios/experimental/Viewer/Viewer/LOViewerAppDelegate.mm               |  114 ---
 ios/experimental/Viewer/Viewer/LOViewerWindow.h                     |   17 
 ios/experimental/Viewer/Viewer/LOViewerWindow.m                     |   26 
 ios/experimental/Viewer/Viewer/Viewer-Info.plist                    |   47 -
 ios/experimental/Viewer/Viewer/Viewer-Prefix.pch                    |   14 
 ios/experimental/Viewer/Viewer/en.lproj/InfoPlist.strings           |    2 
 ios/experimental/Viewer/Viewer/lo-viewer.h                          |   17 
 ios/experimental/Viewer/Viewer/lo-viewer.mm                         |  182 -----
 ios/experimental/Viewer/Viewer/main.mm                              |   20 
 sal/inc/osl/detail/ios-bootstrap.h                                  |    9 
 vcl/android/androidinst.cxx                                         |    3 
 vcl/headless/svpinst.cxx                                            |    4 
 vcl/inc/ios/iosinst.hxx                                             |   31 
 vcl/ios/iosinst.cxx                                                 |  135 ++-
 45 files changed, 1191 insertions(+), 1118 deletions(-)

New commits:
commit 114b17fc23456347b76c7f100ada693a598e74f3
Author: Tor Lillqvist <tml at iki.fi>
Date:   Sat Mar 30 07:50:58 2013 +0200

    Use more meaningful variable name
    
    Change-Id: I663ab56faf8d13a3f0443706d9dc75bd5969aece

diff --git a/vcl/headless/svpinst.cxx b/vcl/headless/svpinst.cxx
index 6d13490..38e0777 100644
--- a/vcl/headless/svpinst.cxx
+++ b/vcl/headless/svpinst.cxx
@@ -369,13 +369,13 @@ void SvpSalInstance::StopTimer()
 
 void SvpSalInstance::StartTimer( sal_uLong nMS )
 {
-    timeval Timeout (m_aTimeout); // previous timeout.
+    timeval aPrevTimeout (m_aTimeout);
     gettimeofday (&m_aTimeout, 0);
 
     m_nTimeoutMS  = nMS;
     m_aTimeout    += m_nTimeoutMS;
 
-    if ((Timeout > m_aTimeout) || (Timeout.tv_sec == 0))
+    if ((aPrevTimeout > m_aTimeout) || (aPrevTimeout.tv_sec == 0))
     {
         // Wakeup from previous timeout (or stopped timer).
         Wakeup();
commit d08a58a6845a3423d7d2919e157d1b205d68db51
Author: Tor Lillqvist <tml at iki.fi>
Date:   Sat Mar 30 01:39:22 2013 +0200

    Render the "headless" frames to the UI view in the LO thread
    
    We used to render them in the app main (GUI) thread, which is
    dangerous, accessing the headless frames in one thread while the LO
    thread (where the "main" LibreOffice code is running) might be
    updating and changing them.
    
    This fixes some problems like that part of the document did not show
    up. If I would test the app on a multi-core iPad, presumably I would
    have seen even more problems.
    
    But this also introduces new problems: Now the UI doesn't appear
    incrementally (for instance, with an actually progressing progress bar
    during the loading of the document) as it used to. Now it all appeads
    all of a sudden, everything at once. Which would be fine if it
    happened very quickly after starting the app, but it doesn't... on the
    original iPad it takes half a minute.
    
    Change-Id: I04068e0d884aa5cb86acefa76449aac4e081b193

diff --git a/vcl/inc/ios/iosinst.hxx b/vcl/inc/ios/iosinst.hxx
index d5d6b8c..654bd58 100644
--- a/vcl/inc/ios/iosinst.hxx
+++ b/vcl/inc/ios/iosinst.hxx
@@ -20,6 +20,14 @@
 #ifndef IOS_SALINST_H
 #define IOS_SALINST_H
 
+#include <pthread.h>
+
+#include <premac.h>
+#include <CoreGraphics/CoreGraphics.h>
+#include <postmac.h>
+
+#include <tools/link.hxx>
+
 #include "headless/svpinst.hxx"
 #include "headless/svpframe.hxx"
 
@@ -37,12 +45,21 @@ public:
     SalFrame* CreateFrame( SalFrame* pParent, sal_uLong nStyle );
     SalFrame* CreateChildFrame( SystemParentData* pParent, sal_uLong nStyle );
 
-    virtual bool AnyInput( sal_uInt16 nType );
+    // virtual bool AnyInput( sal_uInt16 nType );
 
     SalFrame *getFocusFrame() const;
 
     void damaged( IosSalFrame *frame,
                   const basegfx::B2IBox& rDamageRect);
+
+    typedef struct {
+        CGContextRef context;
+        CGRect rect;
+    } RenderWindowsArg;
+    DECL_LINK( RenderWindows, RenderWindowsArg* );
+
+    pthread_mutex_t m_aRenderMutex;
+    pthread_cond_t m_aRenderCond;
 };
 
 #endif // IOS_SALINST_H
diff --git a/vcl/ios/iosinst.cxx b/vcl/ios/iosinst.cxx
index 9715918..b2c1516 100644
--- a/vcl/ios/iosinst.cxx
+++ b/vcl/ios/iosinst.cxx
@@ -87,13 +87,19 @@ IosSalInstance *IosSalInstance::getInstance()
 IosSalInstance::IosSalInstance( SalYieldMutex *pMutex )
     : SvpSalInstance( pMutex )
 {
-
+    pthread_cond_init( &m_aRenderCond, NULL );
+    pthread_mutex_init( &m_aRenderMutex, NULL );
+    pthread_mutex_lock( &m_aRenderMutex );
 }
 
 IosSalInstance::~IosSalInstance()
 {
+    pthread_cond_destroy( &m_aRenderCond );
+    pthread_mutex_destroy( &m_aRenderMutex );
 }
 
+#if 0
+
 bool IosSalInstance::AnyInput( sal_uInt16 nType )
 {
     if( (nType & VCL_INPUT_TIMER) != 0 )
@@ -104,6 +110,8 @@ bool IosSalInstance::AnyInput( sal_uInt16 nType )
     return SvpSalInstance::s_pDefaultInstance->PostedEventsInQueue();
 }
 
+#endif
+
 class IosSalSystem : public SvpSalSystem {
 public:
     IosSalSystem() : SvpSalSystem() {}
@@ -254,38 +262,48 @@ void lo_set_view_size(int width, int height)
     viewHeight = height;
 }
 
-extern "C"
-void lo_render_windows( CGContextRef context, CGRect rect )
+IMPL_LINK( IosSalInstance, RenderWindows, RenderWindowsArg*, arg )
 {
-    if( IosSalInstance::getInstance() != NULL ) {
-        int i = 0;
-        std::list< SalFrame* >::const_iterator it;
-        for( it = IosSalInstance::getInstance()->getFrames().begin(); it != IosSalInstance::getInstance()->getFrames().end(); i++, it++ ) {
-            SvpSalFrame *pFrame = static_cast<SvpSalFrame *>(*it);
-            SalFrameGeometry aGeom = pFrame->GetGeometry();
-            CGRect bbox = CGRectMake( aGeom.nX, aGeom.nY, aGeom.nWidth, aGeom.nHeight );
-            if ( pFrame->IsVisible() &&
-                 CGRectIntersectsRect( rect, bbox ) ) {
-
-                const basebmp::BitmapDeviceSharedPtr aDevice = pFrame->getDevice();
-                CGDataProviderRef provider =
-                    CGDataProviderCreateWithData( NULL,
-                                                  aDevice->getBuffer().get(),
-                                                  aDevice->getSize().getY() * aDevice->getScanlineStride(),
-                                                  NULL );
-                CGImage *image =
-                    CGImageCreate( aDevice->getSize().getX(), aDevice->getSize().getY(),
-                                   8, 32, aDevice->getScanlineStride(),
-                                   CGColorSpaceCreateDeviceRGB(),
-                                   kCGImageAlphaNoneSkipLast,
-                                   provider,
-                                   NULL,
-                                   false,
-                                   kCGRenderingIntentDefault );
-                CGContextDrawImage( context, bbox, image );
-            }
+    int i = 0;
+    std::list< SalFrame* >::const_iterator it;
+    for( it = getFrames().begin(); it != getFrames().end(); i++, it++ ) {
+        SvpSalFrame *pFrame = static_cast<SvpSalFrame *>(*it);
+        SalFrameGeometry aGeom = pFrame->GetGeometry();
+        CGRect bbox = CGRectMake( aGeom.nX, aGeom.nY, aGeom.nWidth, aGeom.nHeight );
+        if ( pFrame->IsVisible() &&
+             CGRectIntersectsRect( arg->rect, bbox ) ) {
+
+            const basebmp::BitmapDeviceSharedPtr aDevice = pFrame->getDevice();
+            CGDataProviderRef provider =
+                CGDataProviderCreateWithData( NULL,
+                                              aDevice->getBuffer().get(),
+                                              aDevice->getSize().getY() * aDevice->getScanlineStride(),
+                                              NULL );
+            CGImage *image =
+                CGImageCreate( aDevice->getSize().getX(), aDevice->getSize().getY(),
+                               8, 32, aDevice->getScanlineStride(),
+                               CGColorSpaceCreateDeviceRGB(),
+                               kCGImageAlphaNoneSkipLast,
+                               provider,
+                               NULL,
+                               false,
+                               kCGRenderingIntentDefault );
+            CGContextDrawImage( arg->context, bbox, image );
         }
     }
+    pthread_cond_signal( &m_aRenderCond );
+    return 0;
+}
+
+extern "C"
+void lo_render_windows( CGContextRef context, CGRect rect )
+{
+    IosSalInstance *pInstance = IosSalInstance::getInstance();
+    if ( pInstance == NULL )
+        return;
+    IosSalInstance::RenderWindowsArg arg = { context, rect };
+    Application::PostUserEvent( LINK( pInstance, IosSalInstance, RenderWindows), &arg );
+    pthread_cond_wait( &pInstance->m_aRenderCond, &pInstance->m_aRenderMutex );
 }
 
 extern "C"
commit 62f6e67f6b0986208cf1030e265b51f1bf154bc7
Author: Tor Lillqvist <tml at iki.fi>
Date:   Fri Mar 29 23:16:23 2013 +0200

    IosSalInstance::BlitFrameToBuffer() and RedrawWindows() are unneeded now
    
    Change-Id: I6873461aed7db7b7f06e45556eacb82bcf118aea

diff --git a/vcl/inc/ios/iosinst.hxx b/vcl/inc/ios/iosinst.hxx
index 15ededa..d5d6b8c 100644
--- a/vcl/inc/ios/iosinst.hxx
+++ b/vcl/inc/ios/iosinst.hxx
@@ -26,12 +26,6 @@
 class IosSalFrame;
 class IosSalInstance : public SvpSalInstance
 {
-    void BlitFrameToBuffer(char *pPixelBuffer,
-                           int nPBWidth, int nPBHeight,
-                           int destX, int nDestY,
-                           int nDestWidth, int nDestHeight,
-                           const basebmp::BitmapDeviceSharedPtr& aDev);
-
 public:
     IosSalInstance( SalYieldMutex *pMutex );
     virtual ~IosSalInstance();
@@ -47,11 +41,6 @@ public:
 
     SalFrame *getFocusFrame() const;
 
-    void RedrawWindows( char *pPixelBuffer,
-                        int nPBWidth, int nPBHeight,
-                        int destX, int nDestY,
-                        int nDestWidth, int nDestHeight);
-
     void damaged( IosSalFrame *frame,
                   const basegfx::B2IBox& rDamageRect);
 };
diff --git a/vcl/ios/iosinst.cxx b/vcl/ios/iosinst.cxx
index 905c0b3..9715918 100644
--- a/vcl/ios/iosinst.cxx
+++ b/vcl/ios/iosinst.cxx
@@ -40,55 +40,6 @@ public:
     virtual bool ErrorTrapPop( bool ) { return false; }
 };
 
-void IosSalInstance::BlitFrameToBuffer(char *pPixelBuffer,
-                                       int nPBWidth, int nPBHeight,
-                                       int nDestX, int nDestY,
-                                       int nDestWidth, int nDestHeight,
-                                       const basebmp::BitmapDeviceSharedPtr& aDev)
-{
-    // TODO: Cropping (taking all the parameters into account)
-    (void) nPBHeight;
-    (void) nDestWidth;
-    (void) nDestHeight;
-
-    basebmp::RawMemorySharedArray aSrcData = aDev->getBuffer();
-    const basegfx::B2IVector aDevSize = aDev->getSize();
-    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 * (aDevSize.getY() - 1 - y) );
-
-        unsigned char *dp( (unsigned char *)pPixelBuffer +
-                           nPBWidth * 4 * (y + nDestY) +
-                           nDestX * 4 );
-        memcpy(dp, sp, aDevSize.getX()*4);
-    }
-}
-
-void IosSalInstance::RedrawWindows(char *pPixelBuffer,
-                                   int nPBWidth, int nPBHeight,
-                                   int nDestX, int nDestY,
-                                   int nDestWidth, int nDestHeight)
-{
-    int i = 0;
-    std::list< SalFrame* >::const_iterator it;
-    for ( it = getFrames().begin(); it != getFrames().end(); i++, it++ )
-    {
-        SvpSalFrame *pFrame = static_cast<SvpSalFrame *>(*it);
-
-        if (pFrame->IsVisible())
-            BlitFrameToBuffer( pPixelBuffer, nPBWidth, nPBHeight, nDestX, nDestY, nDestWidth, nDestHeight, pFrame->getDevice() );
-    }
-}
-
 void IosSalInstance::damaged( IosSalFrame */* frame */,
                               const basegfx::B2IBox& rDamageRect )
 {
commit b46eed92ce1e30008e0325e4d9f37dbe3d6624a3
Author: Tor Lillqvist <tml at iki.fi>
Date:   Fri Mar 29 22:28:18 2013 +0200

    Use iOS 5.1 as deployment target
    
    Change-Id: Idd44c792b4e0ee9cd27c3d66c2c5d794f4304045

diff --git a/ios/experimental/LibreOffice/LibreOffice.xcodeproj/project.pbxproj b/ios/experimental/LibreOffice/LibreOffice.xcodeproj/project.pbxproj
index 088a75b..0e03980 100644
--- a/ios/experimental/LibreOffice/LibreOffice.xcodeproj/project.pbxproj
+++ b/ios/experimental/LibreOffice/LibreOffice.xcodeproj/project.pbxproj
@@ -270,7 +270,7 @@
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNINITIALIZED_AUTOS = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 5.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 5.1;
 				LIBRARY_SEARCH_PATHS = "";
 				OTHER_LDFLAGS = "-v";
 				SDKROOT = iphoneos;
@@ -288,7 +288,7 @@
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNINITIALIZED_AUTOS = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 5.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 5.1;
 				LIBRARY_SEARCH_PATHS = "";
 				OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
 				OTHER_LDFLAGS = "-v";
commit 82e030bf1d3e8e7d66eeede661731afe1ea5dd87
Author: Tor Lillqvist <tml at iki.fi>
Date:   Fri Mar 29 21:34:32 2013 +0200

    No need to verify the Xcode "configuration" ("Debug" or "Release") matching
    
    Change-Id: I5c2e05feecffa1679930b041854b1cd190ef007a

diff --git a/ios/CustomTarget_LibreOffice_app.mk b/ios/CustomTarget_LibreOffice_app.mk
index 82e8566..581ebb4 100644
--- a/ios/CustomTarget_LibreOffice_app.mk
+++ b/ios/CustomTarget_LibreOffice_app.mk
@@ -20,12 +20,6 @@ xcode_sdk=iphoneos
 xcode_arch=armv7
 endif
 
-ifeq ($(debug),)
-xcode_config := Release
-else
-xcode_config := Debug
-endif
-
 # If run from Xcode, check that its configuration (device or
 # simulator) matches that of gbuild. We detect being run from Xcode by
 # looking for $(SCRIPT_OUTPUT_FILE_0). The Run Script build phase in
@@ -40,10 +34,6 @@ ifneq ($(CURRENT_ARCH),$(xcode_arch))
 $(error Xcode platform ($(CURRENT_ARCH)) does not match that of this build tree ($(xcode_arch)))
 endif
 
-ifneq ($(CONFIGURATION),$(xcode_config))
-$(error Xcode configuration ($(CONFIGURATION)) does not match that of this build tree ($(xcode_config)))
-endif
-
 endif
 
 ifneq ($(SCRIPT_OUTPUT_FILE_0),)
commit 95cedfd95a67b39852b9ae0248207ae8750b4f1e
Author: Tor Lillqvist <tml at iki.fi>
Date:   Fri Mar 29 20:14:35 2013 +0200

    Protect CoreGraphics.h inclusion with <premac.h>, sigh
    
    Change-Id: I9d16929d3b8fb5114e72eee850da64433394df9c

diff --git a/sal/inc/osl/detail/ios-bootstrap.h b/sal/inc/osl/detail/ios-bootstrap.h
index f0e09f7..c96706a 100644
--- a/sal/inc/osl/detail/ios-bootstrap.h
+++ b/sal/inc/osl/detail/ios-bootstrap.h
@@ -12,7 +12,9 @@
 
 #if defined(IOS)
 
+#include <premac.h>
 #include <CoreGraphics/CoreGraphics.h>
+#include <postmac.h>
 
 #ifdef __cplusplus
 extern "C" {
commit bb0b2744af130d3f03939bd883d7f9fa9d373941
Author: Tor Lillqvist <tml at iki.fi>
Date:   Fri Mar 29 00:47:10 2013 +0200

    Draw the frame virtual device bitmaps directly to the destination CGContext
    
    Much faster. No need for the pixelBuffer inbetween.
    
    Change-Id: I6493faca6da3a3e9a1285e00c887928b85dca56e

diff --git a/ios/experimental/LibreOffice/LibreOffice/AppDelegate.h b/ios/experimental/LibreOffice/LibreOffice/AppDelegate.h
index 79b0e56..c5c4560 100644
--- a/ios/experimental/LibreOffice/LibreOffice/AppDelegate.h
+++ b/ios/experimental/LibreOffice/LibreOffice/AppDelegate.h
@@ -11,11 +11,6 @@
 #import "View.h"
 
 @interface AppDelegate : UIResponder <UIApplicationDelegate>
-{
-  int nbytes;
-  char *pixelBuffer;
-  CGImageRef image;
-}
 
 @property (strong, nonatomic) UIWindow *window;
 @property (strong, nonatomic) View *view;
diff --git a/ios/experimental/LibreOffice/LibreOffice/AppDelegate.m b/ios/experimental/LibreOffice/LibreOffice/AppDelegate.m
index 93f995e..2f74d48 100644
--- a/ios/experimental/LibreOffice/LibreOffice/AppDelegate.m
+++ b/ios/experimental/LibreOffice/LibreOffice/AppDelegate.m
@@ -44,17 +44,6 @@ static UIView *theView;
 
     [self.window addGestureRecognizer: tapRecognizer];
 
-    nbytes = bounds.size.width * bounds.size.height * 4;
-
-    pixelBuffer = (char *) malloc(nbytes);
-    memset(pixelBuffer, 0xFF, nbytes);
-
-    CGDataProviderRef provider = CGDataProviderCreateWithData( NULL, pixelBuffer, nbytes, NULL);
-    image = CGImageCreate(bounds.size.width, bounds.size.height, 8, 32, bounds.size.width*4, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaNoneSkipLast, provider, NULL, false, kCGRenderingIntentDefault);
-
-    self.view.pixelBuffer = pixelBuffer;
-    self.view.image = image;
-
     lo_set_view_size(bounds.size.width, bounds.size.height);
 
     NSThread* thread = [[NSThread alloc] initWithTarget:self
@@ -105,7 +94,9 @@ static UIView *theView;
 void lo_damaged(CGRect rect)
 {
     (void) rect;
-    [theView performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:NO];
+    dispatch_async(dispatch_get_main_queue(), ^{
+            [theView setNeedsDisplayInRect:rect];
+        });
     // NSLog(@"lo_damaged: %dx%d@(%d,%d)", (int)rect.size.width, (int)rect.size.height, (int)rect.origin.x, (int)rect.origin.y);
 }
 
diff --git a/ios/experimental/LibreOffice/LibreOffice/View.h b/ios/experimental/LibreOffice/LibreOffice/View.h
index d953722..c128806 100644
--- a/ios/experimental/LibreOffice/LibreOffice/View.h
+++ b/ios/experimental/LibreOffice/LibreOffice/View.h
@@ -11,9 +11,6 @@
 
 @interface View : UIView
 
- at property char *pixelBuffer;
- at property CGImageRef image;
-
 - (void)drawRect:(CGRect)rect;
 - (void)tapGesture:(UIGestureRecognizer *)gestureRecognizer;
 
diff --git a/ios/experimental/LibreOffice/LibreOffice/View.m b/ios/experimental/LibreOffice/LibreOffice/View.m
index bcde704..7968316 100644
--- a/ios/experimental/LibreOffice/LibreOffice/View.m
+++ b/ios/experimental/LibreOffice/LibreOffice/View.m
@@ -14,18 +14,18 @@
 
 - (void)drawRect:(CGRect)rect
 {
-    (void) rect;
-    
     // NSLog(@"drawRect: %fx%f@(%f,%f)", rect.size.width, rect.size.height, rect.origin.x, rect.origin.y);
 
     NSDate *a = [NSDate date];
-    lo_render_windows([self pixelBuffer], [self bounds].size.width, [self bounds].size.height);
-    
-    NSLog(@"drawRect: lo_render_windows took %f s", [[NSDate date] timeIntervalSinceDate: a]);
 
     CGContextRef context = UIGraphicsGetCurrentContext();
+    CGContextSaveGState(context);
+    CGContextTranslateCTM(context, 0, self.frame.size.height);
+    CGContextScaleCTM(context, 1, -1);
+    lo_render_windows(context, rect);
+    CGContextRestoreGState(context);
 
-    CGContextDrawImage(context, [self bounds], [self image]);
+    NSLog(@"drawRect: lo_render_windows took %f s", [[NSDate date] timeIntervalSinceDate: a]);
 }
 
 - (void) tapGesture:(UIGestureRecognizer *)gestureRecognizer
diff --git a/sal/inc/osl/detail/ios-bootstrap.h b/sal/inc/osl/detail/ios-bootstrap.h
index 6057b39..f0e09f7 100644
--- a/sal/inc/osl/detail/ios-bootstrap.h
+++ b/sal/inc/osl/detail/ios-bootstrap.h
@@ -12,7 +12,7 @@
 
 #if defined(IOS)
 
-#include <CoreGraphics/CGGeometry.h>
+#include <CoreGraphics/CoreGraphics.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -45,7 +45,7 @@ void lo_damaged(CGRect rect);
 
 void lo_runMain();
 void lo_set_view_size(int width, int height);
-void lo_render_windows(char *pixelBuffer, int width, int height);
+void lo_render_windows(CGContextRef context, CGRect rect);
 void lo_tap(int x, int y);
 
 #ifdef __cplusplus
diff --git a/vcl/ios/iosinst.cxx b/vcl/ios/iosinst.cxx
index 819fdec..905c0b3 100644
--- a/vcl/ios/iosinst.cxx
+++ b/vcl/ios/iosinst.cxx
@@ -304,11 +304,37 @@ void lo_set_view_size(int width, int height)
 }
 
 extern "C"
-void lo_render_windows(char *pixelBuffer, int width, int height)
+void lo_render_windows( CGContextRef context, CGRect rect )
 {
-    // Hack: assume so far that we are asked to redraw the whole pixel buffer
-    if (IosSalInstance::getInstance() != NULL)
-        IosSalInstance::getInstance()->RedrawWindows(pixelBuffer, width, height, 0, 0, width, height);
+    if( IosSalInstance::getInstance() != NULL ) {
+        int i = 0;
+        std::list< SalFrame* >::const_iterator it;
+        for( it = IosSalInstance::getInstance()->getFrames().begin(); it != IosSalInstance::getInstance()->getFrames().end(); i++, it++ ) {
+            SvpSalFrame *pFrame = static_cast<SvpSalFrame *>(*it);
+            SalFrameGeometry aGeom = pFrame->GetGeometry();
+            CGRect bbox = CGRectMake( aGeom.nX, aGeom.nY, aGeom.nWidth, aGeom.nHeight );
+            if ( pFrame->IsVisible() &&
+                 CGRectIntersectsRect( rect, bbox ) ) {
+
+                const basebmp::BitmapDeviceSharedPtr aDevice = pFrame->getDevice();
+                CGDataProviderRef provider =
+                    CGDataProviderCreateWithData( NULL,
+                                                  aDevice->getBuffer().get(),
+                                                  aDevice->getSize().getY() * aDevice->getScanlineStride(),
+                                                  NULL );
+                CGImage *image =
+                    CGImageCreate( aDevice->getSize().getX(), aDevice->getSize().getY(),
+                                   8, 32, aDevice->getScanlineStride(),
+                                   CGColorSpaceCreateDeviceRGB(),
+                                   kCGImageAlphaNoneSkipLast,
+                                   provider,
+                                   NULL,
+                                   false,
+                                   kCGRenderingIntentDefault );
+                CGContextDrawImage( context, bbox, image );
+            }
+        }
+    }
 }
 
 extern "C"
commit 378d389620b50e172af3f488f1256aa950b0aea9
Author: Tor Lillqvist <tml at iki.fi>
Date:   Fri Mar 29 00:46:34 2013 +0200

    Add iosinst.cxx
    
    Change-Id: Ia5e84bc661d0de1140a259be7dd9fcdaca5e1930

diff --git a/ios/experimental/LibreOffice/LibreOffice.xcodeproj/project.pbxproj b/ios/experimental/LibreOffice/LibreOffice.xcodeproj/project.pbxproj
index 1aacac4..088a75b 100644
--- a/ios/experimental/LibreOffice/LibreOffice.xcodeproj/project.pbxproj
+++ b/ios/experimental/LibreOffice/LibreOffice.xcodeproj/project.pbxproj
@@ -55,6 +55,7 @@
 		BE9086FE16FF02B3004400A1 /* svpprn.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpprn.cxx; path = ../../../../vcl/headless/svpprn.cxx; sourceTree = "<group>"; };
 		BE9086FF16FF02B3004400A1 /* svptext.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svptext.cxx; path = ../../../../vcl/headless/svptext.cxx; sourceTree = "<group>"; };
 		BE90870016FF02B3004400A1 /* svpvd.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpvd.cxx; path = ../../../../vcl/headless/svpvd.cxx; sourceTree = "<group>"; };
+		BE954A2E1704F9500040D517 /* iosinst.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = iosinst.cxx; path = ../../../../vcl/ios/iosinst.cxx; sourceTree = "<group>"; };
 		BEBF3E3A17002D0200C454AC /* svapp.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svapp.cxx; path = ../../../../vcl/source/app/svapp.cxx; sourceTree = "<group>"; };
 		BEBF3E3B17002D0200C454AC /* svmain.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svmain.cxx; path = ../../../../vcl/source/app/svmain.cxx; sourceTree = "<group>"; };
 		BEBF3E3C17002D4C00C454AC /* frame.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = frame.cxx; path = ../../../../framework/source/services/frame.cxx; sourceTree = "<group>"; };
@@ -104,18 +105,15 @@
 		BE5A225F1664F87600CF01C9 /* LibreOffice */ = {
 			isa = PBXGroup;
 			children = (
+				BE5A22681664F87600CF01C9 /* AppDelegate.h */,
+				BE5A22691664F87600CF01C9 /* AppDelegate.m */,
 				BE4EEE9916FF724200D475B2 /* bitmapdevice.cxx */,
 				BEBF3E3C17002D4C00C454AC /* frame.cxx */,
 				BEBF3E3E17005E6B00C454AC /* frmload.cxx */,
 				BE9086F616FF02B2004400A1 /* headlessinst.cxx */,
-				BE5A22681664F87600CF01C9 /* AppDelegate.h */,
-				BE5A22691664F87600CF01C9 /* AppDelegate.m */,
+				BE954A2E1704F9500040D517 /* iosinst.cxx */,
 				BE56CD651704A08E00CA5B15 /* lo.h */,
 				BE56CD661704A08E00CA5B15 /* lo.mm */,
-				BE7B7AFF170438D0002341F4 /* ViewController.h */,
-				BE7B7B00170438D0002341F4 /* ViewController.m */,
-				BE08805B16FDB784000CED5C /* View.h */,
-				BE08805C16FDB784000CED5C /* View.m */,
 				BEBF3E3A17002D0200C454AC /* svapp.cxx */,
 				BEBF3E3B17002D0200C454AC /* svmain.cxx */,
 				BE9086F716FF02B2004400A1 /* svpbmp.cxx */,
@@ -128,6 +126,10 @@
 				BE9086FE16FF02B3004400A1 /* svpprn.cxx */,
 				BE9086FF16FF02B3004400A1 /* svptext.cxx */,
 				BE90870016FF02B3004400A1 /* svpvd.cxx */,
+				BE08805B16FDB784000CED5C /* View.h */,
+				BE08805C16FDB784000CED5C /* View.m */,
+				BE7B7AFF170438D0002341F4 /* ViewController.h */,
+				BE7B7B00170438D0002341F4 /* ViewController.m */,
 				BE4EEE9A16FF80B100D475B2 /* virdev.cxx */,
 				BEBF3E3D17002D6900C454AC /* window.cxx */,
 				BE69AD3716958CA0001BE1CD /* Resources */,
commit e36e86ee3cf7761dea59141881ee5108d3d3bb86
Author: Tor Lillqvist <tml at iki.fi>
Date:   Thu Mar 28 23:16:12 2013 +0200

    Refactor the iOS Viewer app and rename it to "LibreOffice"
    
    No, it isn't any closer to being "ready" despite the name, but still,
    using the current approach, it clearly isn't restricted to be just a
    viewer.
    
    Also drop the verbose LOViewer prefix from class and file names in it.
    
    Change-Id: Ib4e8a31d6fa1b35169ee98cf2aa8f0f22957164c

diff --git a/Repository.mk b/Repository.mk
index f07b819..268eadc 100644
--- a/Repository.mk
+++ b/Repository.mk
@@ -204,7 +204,7 @@ endif
 ifeq ($(OS),IOS)
 
 $(eval $(call gb_Helper_register_executables,NONE,\
-    Viewer \
+    LibreOffice \
 ))
 
 endif
diff --git a/ios/CustomTarget_LibreOffice_app.mk b/ios/CustomTarget_LibreOffice_app.mk
new file mode 100644
index 0000000..82e8566
--- /dev/null
+++ b/ios/CustomTarget_LibreOffice_app.mk
@@ -0,0 +1,169 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+$(eval $(call gb_CustomTarget_CustomTarget,ios/LibreOffice_app))
+
+# We distinguish between builds for the simulator and device by
+# looking for the "iarmv7" or "i386" in the -arch option that is part
+# of $(CC)
+
+ifneq ($(filter i386,$(CC)),)
+xcode_sdk=iphonesimulator
+xcode_arch=i386
+else
+xcode_sdk=iphoneos
+xcode_arch=armv7
+endif
+
+ifeq ($(debug),)
+xcode_config := Release
+else
+xcode_config := Debug
+endif
+
+# If run from Xcode, check that its configuration (device or
+# simulator) matches that of gbuild. We detect being run from Xcode by
+# looking for $(SCRIPT_OUTPUT_FILE_0). The Run Script build phase in
+# our project has as its (single) output file the location of the app
+# executable in its app bundle.
+
+ifneq ($(SCRIPT_OUTPUT_FILE_0),)
+
+export CCACHE_CPP2=y
+
+ifneq ($(CURRENT_ARCH),$(xcode_arch))
+$(error Xcode platform ($(CURRENT_ARCH)) does not match that of this build tree ($(xcode_arch)))
+endif
+
+ifneq ($(CONFIGURATION),$(xcode_config))
+$(error Xcode configuration ($(CONFIGURATION)) does not match that of this build tree ($(xcode_config)))
+endif
+
+endif
+
+ifneq ($(SCRIPT_OUTPUT_FILE_0),)
+ifeq ($(EXECUTABLE_NAME),LibreOffice)
+# When run from Xcode, we move the LibreOffice executable from solver into
+# the LibreOffice.app directory that Xcode uses. We also set up/copy all
+# the run-time configuration etc files that the app needs.
+$(call gb_CustomTarget_get_target,ios/LibreOffice_app) : $(SCRIPT_OUTPUT_FILE_0)
+
+appdir=$(dir $(SCRIPT_OUTPUT_FILE_0))
+buildid=$(shell git log -1 --format=%H)
+
+$(SCRIPT_OUTPUT_FILE_0) : $(call gb_Executable_get_target,LibreOffice)
+	$(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),APP,2)
+	mkdir -p $(appdir)/ure
+	mv $(call gb_Executable_get_target,LibreOffice) $(SCRIPT_OUTPUT_FILE_0)
+#
+# Copy rdb files
+#
+	cp $(OUTDIR)/bin/types.rdb $(appdir)
+	cp $(OUTDIR)/bin/ure/types.rdb $(appdir)/ure
+	cp $(OUTDIR)/bin/offapi.rdb $(appdir)
+	cp $(OUTDIR)/xml/services.rdb $(appdir)
+	cp $(OUTDIR)/xml/ure/services.rdb $(appdir)/ure
+#
+# Copy "registry" files
+#
+	mkdir -p $(appdir)/registry/modules $(appdir)/registry/res
+	cp $(OUTDIR)/xml/*.xcd $(appdir)/registry
+	mv $(appdir)/registry/fcfg_langpack_en-US.xcd $(appdir)/registry/res
+	cp -R $(OUTDIR)/xml/registry/* $(appdir)/registry
+#
+# Copy .res files
+#
+# program/resource is hardcoded in tools/source/rc/resmgr.cxx. Sure,
+# we could set STAR_RESOURCE_PATH instead. sigh...
+#
+	mkdir -p $(appdir)/program/resource
+	cp $(OUTDIR)/bin/*en-US.res $(appdir)/program/resource
+#
+# Artwork
+#
+	mkdir -p $(appdir)/share/config
+	cp -R $(OUTDIR)/bin/images_tango.zip $(appdir)/share/config/images.zip
+#
+# soffice.cfg
+#
+	mkdir -p $(appdir)/share/config/soffice.cfg
+	cp -R $(OUTDIR)/xml/uiconfig/* $(appdir)/share/config/soffice.cfg
+#
+# "registry"
+#
+	mkdir -p $(appdir)/share/registry/res
+	cp $(OUTDIR)/xml/*.xcd $(appdir)/share/registry
+	mv $(appdir)/share/registry/fcfg_langpack_en-US.xcd $(appdir)/share/registry/res
+	cp -R $(OUTDIR)/xml/registry/* $(appdir)/share/registry
+#
+# Set up rc, the "inifile". See getIniFileName_Impl().
+#
+	( \
+		echo '[Bootstrap]' && \
+		echo 'URE_BOOTSTRAP=file://$$APP_DATA_DIR/fundamentalrc' && \
+		echo 'HOME=$$APP_DATA_DIR/tmp' && \
+	: ) > $(appdir)/rc
+#
+# Set up fundamentalrc, unorc, bootstraprc and versionrc.
+#
+# Do we really need all these?
+#
+	( \
+		echo '[Bootstrap]' && \
+		echo 'BRAND_BASE_DIR=file://$$APP_DATA_DIR' && \
+		echo 'CONFIGURATION_LAYERS=xcsxcu:$${BRAND_BASE_DIR}/registry module:$${BRAND_BASE_DIR}/registry/modules res:$${BRAND_BASE_DIR}/registry' && \
+	: ) > $(appdir)/fundamentalrc
+#
+	( \
+		echo '[Bootstrap]' && \
+		: UNO_TYPES and UNO_SERVICES are set up in lo-viewer.mm, is that sane? && \
+	: ) > $(appdir)/unorc
+#
+# bootstraprc must be in $BRAND_BASE_DIR/program
+#
+	mkdir -p $(appdir)/program
+	( \
+		echo '[Bootstrap]' && \
+		echo 'InstallMode=<installmode>' && \
+		echo 'ProductKey=LibreOffice $(PRODUCTVERSION)' && \
+		echo 'UserInstallation=file://$$APP_DATA_DIR/../Library/Application%20Support' && \
+	: ) > $(appdir)/program/bootstraprc
+#
+# Is this really needed?
+#
+	( \
+		echo '[Version]' && \
+		echo 'AllLanguages=en-US' && \
+		echo 'BuildVersion=' && \
+		echo 'buildid=$(buildid)' && \
+		echo 'ProductMajor=360' && \
+		echo 'ProductMinor=1' && \
+	: ) > $(appdir)/program/versionrc
+#
+# Copy a sample document... good old test1.odt...
+#
+	cp $(SRC_ROOT)/odk/examples/java/DocumentHandling/test/test1.odt $(appdir)
+endif
+else
+# When run just from the command line, we don't have any app bundle to
+# copy or move the executable to. So do nothing. Except one trick:
+# Copy the Xcode project to BUILDDIR if SRCDIR!=BUILDDIR, so that one
+# can then open it from there in Xcode.
+$(call gb_CustomTarget_get_target,ios/LibreOffice_app) : $(gb_Helper_PHONY)
+	if test $(SRCDIR) != $(BUILDDIR); then \
+		(cd $(SRCDIR) && tar cf - ios/experimental/LibreOffice/LibreOffice.xcodeproj/project.pbxproj) | (cd $(BUILDDIR) && tar xf -); \
+	fi
+
+$(call gb_CustomTarget_get_clean_target,ios/LibreOffice_app) :
+	$(call gb_Output_announce,$(subst $(WORKDIR)/Clean/,,$@),$(false),APP,2)
+# Here we just assume that Xcode's settings are default, or something
+	rm -rf experimental/LibreOffice/build
+
+endif
+
+# vim: set noet sw=4 ts=4:
diff --git a/ios/CustomTarget_Viewer_app.mk b/ios/CustomTarget_Viewer_app.mk
deleted file mode 100644
index 29868e8..0000000
--- a/ios/CustomTarget_Viewer_app.mk
+++ /dev/null
@@ -1,169 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-$(eval $(call gb_CustomTarget_CustomTarget,ios/Viewer_app))
-
-# We distinguish between builds for the simulator and device by
-# looking for the "iarmv7" or "i386" in the -arch option that is part
-# of $(CC)
-
-ifneq ($(filter i386,$(CC)),)
-xcode_sdk=iphonesimulator
-xcode_arch=i386
-else
-xcode_sdk=iphoneos
-xcode_arch=armv7
-endif
-
-ifeq ($(debug),)
-xcode_config := Release
-else
-xcode_config := Debug
-endif
-
-# If run from Xcode, check that its configuration (device or
-# simulator) matches that of gbuild. We detect being run from Xcode by
-# looking for $(SCRIPT_OUTPUT_FILE_0). The Run Script build phase in
-# our project has as its (single) output file the location of the app
-# executable in its app bundle.
-
-ifneq ($(SCRIPT_OUTPUT_FILE_0),)
-
-export CCACHE_CPP2=y
-
-ifneq ($(CURRENT_ARCH),$(xcode_arch))
-$(error Xcode platform (device or simulator) does not match that of this build tree)
-endif
-
-ifneq ($(CONFIGURATION),$(xcode_config))
-$(error Xcode configuration (release or debug) does not match that of this build tree)
-endif
-
-endif
-
-ifneq ($(SCRIPT_OUTPUT_FILE_0),)
-ifeq ($(EXECUTABLE_NAME),Viewer)
-# When run from Xcode, we move the Viewer executable from solver into
-# the Viewer.app directory that Xcode uses. We also set up/copy all
-# the run-time configuration etc files that the app needs.
-$(call gb_CustomTarget_get_target,ios/Viewer_app) : $(SCRIPT_OUTPUT_FILE_0)
-
-appdir=$(dir $(SCRIPT_OUTPUT_FILE_0))
-buildid=$(shell git log -1 --format=%H)
-
-$(SCRIPT_OUTPUT_FILE_0) : $(call gb_Executable_get_target,Viewer)
-	$(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),APP,2)
-	mkdir -p $(appdir)/ure
-	mv $(call gb_Executable_get_target,Viewer) $(SCRIPT_OUTPUT_FILE_0)
-#
-# Copy rdb files
-#
-	cp $(OUTDIR)/bin/types.rdb $(appdir)
-	cp $(OUTDIR)/bin/ure/types.rdb $(appdir)/ure
-	cp $(OUTDIR)/bin/offapi.rdb $(appdir)
-	cp $(OUTDIR)/xml/services.rdb $(appdir)
-	cp $(OUTDIR)/xml/ure/services.rdb $(appdir)/ure
-#
-# Copy "registry" files
-#
-	mkdir -p $(appdir)/registry/modules $(appdir)/registry/res
-	cp $(OUTDIR)/xml/*.xcd $(appdir)/registry
-	mv $(appdir)/registry/fcfg_langpack_en-US.xcd $(appdir)/registry/res
-	cp -R $(OUTDIR)/xml/registry/* $(appdir)/registry
-#
-# Copy .res files
-#
-# program/resource is hardcoded in tools/source/rc/resmgr.cxx. Sure,
-# we could set STAR_RESOURCE_PATH instead. sigh...
-#
-	mkdir -p $(appdir)/program/resource
-	cp $(OUTDIR)/bin/*en-US.res $(appdir)/program/resource
-#
-# Artwork
-#
-	mkdir -p $(appdir)/share/config
-	cp -R $(OUTDIR)/bin/images_tango.zip $(appdir)/share/config/images.zip
-#
-# soffice.cfg
-#
-	mkdir -p $(appdir)/share/config/soffice.cfg
-	cp -R $(OUTDIR)/xml/uiconfig/* $(appdir)/share/config/soffice.cfg
-#
-# "registry"
-#
-	mkdir -p $(appdir)/share/registry/res
-	cp $(OUTDIR)/xml/*.xcd $(appdir)/share/registry
-	mv $(appdir)/share/registry/fcfg_langpack_en-US.xcd $(appdir)/share/registry/res
-	cp -R $(OUTDIR)/xml/registry/* $(appdir)/share/registry
-#
-# Set up rc, the "inifile". See getIniFileName_Impl(). 
-#
-	( \
-		echo '[Bootstrap]' && \
-		echo 'URE_BOOTSTRAP=file://$$APP_DATA_DIR/fundamentalrc' && \
-		echo 'HOME=$$APP_DATA_DIR/tmp' && \
-	: ) > $(appdir)/rc
-#
-# Set up fundamentalrc, unorc, bootstraprc and versionrc.
-#
-# Do we really need all these?
-#
-	( \
-		echo '[Bootstrap]' && \
-		echo 'BRAND_BASE_DIR=file://$$APP_DATA_DIR' && \
-		echo 'CONFIGURATION_LAYERS=xcsxcu:$${BRAND_BASE_DIR}/registry module:$${BRAND_BASE_DIR}/registry/modules res:$${BRAND_BASE_DIR}/registry' && \
-	: ) > $(appdir)/fundamentalrc
-#
-	( \
-		echo '[Bootstrap]' && \
-		: UNO_TYPES and UNO_SERVICES are set up in lo-viewer.mm, is that sane? && \
-	: ) > $(appdir)/unorc
-#
-# bootstraprc must be in $BRAND_BASE_DIR/program
-#
-	mkdir -p $(appdir)/program
-	( \
-		echo '[Bootstrap]' && \
-		echo 'InstallMode=<installmode>' && \
-		echo 'ProductKey=LibreOffice Viewer $(PRODUCTVERSION)' && \
-		echo 'UserInstallation=file://$$APP_DATA_DIR/../Library/Application%20Support' && \
-	: ) > $(appdir)/program/bootstraprc
-#
-# Is this really needed?
-#
-	( \
-		echo '[Version]' && \
-		echo 'AllLanguages=en-US' && \
-		echo 'BuildVersion=' && \
-		echo 'buildid=$(buildid)' && \
-		echo 'ProductMajor=360' && \
-		echo 'ProductMinor=1' && \
-	: ) > $(appdir)/program/versionrc
-#
-# Copy a sample document... good old test1.odt...
-#
-	cp $(SRC_ROOT)/odk/examples/java/DocumentHandling/test/test1.odt $(appdir)
-endif
-else
-# When run just from the command line, we don't have any app bundle to
-# copy or move the executable to. So do nothing. Except one trick:
-# Copy the Xcode project to BUILDDIR if SRCDIR!=BUILDDIR, so that one
-# can then open it from there in Xcode.
-$(call gb_CustomTarget_get_target,ios/Viewer_app) : $(gb_Helper_PHONY)
-	if test $(SRCDIR) != $(BUILDDIR); then \
-		(cd $(SRCDIR) && tar cf - ios/experimental/Viewer/Viewer.xcodeproj/project.pbxproj) | (cd $(BUILDDIR) && tar xf -); \
-	fi
-
-$(call gb_CustomTarget_get_clean_target,ios/Viewer_app) :
-	$(call gb_Output_announce,$(subst $(WORKDIR)/Clean/,,$@),$(false),APP,2)
-# Here we just assume that Xcode's settings are default, or something
-	rm -rf experimental/Viewer/build
-
-endif
-
-# vim: set noet sw=4 ts=4:
diff --git a/ios/Executable_LibreOffice.mk b/ios/Executable_LibreOffice.mk
new file mode 100644
index 0000000..badc09f
--- /dev/null
+++ b/ios/Executable_LibreOffice.mk
@@ -0,0 +1,57 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+$(eval $(call gb_Executable_Executable,LibreOffice))
+
+$(eval $(call gb_Executable_use_api,LibreOffice,\
+    udkapi \
+    offapi \
+))
+
+$(eval $(call gb_Executable_use_externals,LibreOffice,\
+    boost_headers \
+    iconv \
+    zlib \
+))
+
+$(eval $(call gb_Executable_use_system_darwin_frameworks,LibreOffice,\
+    Foundation \
+    CoreFoundation \
+    CoreGraphics \
+    CoreText \
+    UIKit \
+))
+
+$(eval $(call gb_Executable_add_objcxxobjects,LibreOffice,\
+    ios/experimental/LibreOffice/LibreOffice/lo \
+))
+
+$(eval $(call gb_Executable_add_objcobjects,LibreOffice,\
+    ios/experimental/LibreOffice/LibreOffice/AppDelegate \
+    ios/experimental/LibreOffice/LibreOffice/main \
+    ios/experimental/LibreOffice/LibreOffice/View \
+    ios/experimental/LibreOffice/LibreOffice/ViewController \
+))
+
+# The executables built for iOS link to all LO libs statically. The
+# link command just uses the wildcard function to list all of them.
+# Instead of tediously here declare dependencies on the transitive
+# closure of those from which some object ends up being linked in, we
+# list a few libraries that are high in the dependency forest to make
+# it likely that all necessary libraries are built before this
+# executable is.
+$(eval $(call gb_Executable_use_libraries,LibreOffice,\
+	msword \
+	sal \
+	sc \
+	scfilt \
+	sdfilt \
+	swui \
+))
+
+# Mark the executable as depending on all libraries so that it gets
+# rebuilt if any library has been rebuilt. Avoids need for "make
+# ios.clean".
+
+$(call gb_LinkTarget_get_target,Executable/LibreOffice) : $(wildcard $(OUTDIR)/lib/lib*.a)
+
+# vim: set ts=4 sw=4 et:
diff --git a/ios/Executable_Viewer.mk b/ios/Executable_Viewer.mk
deleted file mode 100644
index 79a5aa9..0000000
--- a/ios/Executable_Viewer.mk
+++ /dev/null
@@ -1,56 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-$(eval $(call gb_Executable_Executable,Viewer))
-
-$(eval $(call gb_Executable_use_api,Viewer,\
-    udkapi \
-    offapi \
-))
-
-$(eval $(call gb_Executable_use_externals,Viewer,\
-    boost_headers \
-    iconv \
-    zlib \
-))
-
-$(eval $(call gb_Executable_use_system_darwin_frameworks,Viewer,\
-    Foundation \
-    CoreFoundation \
-    CoreGraphics \
-    CoreText \
-    UIKit \
-))
-
-$(eval $(call gb_Executable_add_objcxxobjects,Viewer,\
-    ios/experimental/Viewer/Viewer/lo-viewer \
-    ios/experimental/Viewer/Viewer/LOViewerAppDelegate \
-    ios/experimental/Viewer/Viewer/main \
-))
-
-$(eval $(call gb_Executable_add_objcobjects,Viewer,\
-    ios/experimental/Viewer/Viewer/LOViewerWindow \
-))
-
-# The executables built for iOS link to all LO libs statically. The
-# link command just uses the wildcard function to list all of them.
-# Instead of tediously here declare dependencies on the transitive
-# closure of those from which some object ends up being linked in, we
-# list a few libraries that are high in the dependency forest to make
-# it likely that all necessary libraries are built before this
-# executable is.
-$(eval $(call gb_Executable_use_libraries,Viewer,\
-	msword \
-	sal \
-	sc \
-	scfilt \
-	sdfilt \
-	swui \
-))
-
-# Mark the executable as depending on all libraries so that it gets
-# rebuilt if any library has been rebuilt. Avoids need for "make
-# ios.clean".
-
-$(call gb_LinkTarget_get_target,Executable/Viewer) : $(wildcard $(OUTDIR)/lib/lib*.a)
-
-# vim: set ts=4 sw=4 et:
diff --git a/ios/Module_ios.mk b/ios/Module_ios.mk
index e723b43..d70e277 100644
--- a/ios/Module_ios.mk
+++ b/ios/Module_ios.mk
@@ -11,8 +11,8 @@ $(eval $(call gb_Module_Module,ios))
 ifeq ($(OS),IOS)
 
 $(eval $(call gb_Module_add_targets,ios,\
-	Executable_Viewer \
-	CustomTarget_Viewer_app \
+	Executable_LibreOffice \
+	CustomTarget_LibreOffice_app \
 ))
 
 endif
diff --git a/ios/experimental/LibreOffice/.gitignore b/ios/experimental/LibreOffice/.gitignore
new file mode 100644
index 0000000..8c1326f
--- /dev/null
+++ b/ios/experimental/LibreOffice/.gitignore
@@ -0,0 +1,4 @@
+.DS_Store
+build
+project.xcworkspace
+xcuserdata
diff --git a/ios/experimental/LibreOffice/LibreOffice.xcodeproj/project.pbxproj b/ios/experimental/LibreOffice/LibreOffice.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..1aacac4
--- /dev/null
+++ b/ios/experimental/LibreOffice/LibreOffice.xcodeproj/project.pbxproj
@@ -0,0 +1,349 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 46;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		BE5A22641664F87600CF01C9 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BE5A22621664F87600CF01C9 /* InfoPlist.strings */; };
+		BE5A226C1664F87600CF01C9 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = BE5A226B1664F87600CF01C9 /* Default.png */; };
+		BE5A226E1664F87600CF01C9 /* Default at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BE5A226D1664F87600CF01C9 /* Default at 2x.png */; };
+		BE5A22701664F87600CF01C9 /* Default-568h at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BE5A226F1664F87600CF01C9 /* Default-568h at 2x.png */; };
+		BE69AD88169592C4001BE1CD /* iTunesArtwork in Resources */ = {isa = PBXBuildFile; fileRef = BE69AD87169592C4001BE1CD /* iTunesArtwork */; };
+		BE69AD8D1695954D001BE1CD /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = BE69AD8A1695954D001BE1CD /* Icon-72.png */; };
+		BE69AD8E1695954D001BE1CD /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = BE69AD8B1695954D001BE1CD /* Icon.png */; };
+		BE69AD8F1695954D001BE1CD /* Icon at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BE69AD8C1695954D001BE1CD /* Icon at 2x.png */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+		BE08805B16FDB784000CED5C /* View.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = View.h; sourceTree = "<group>"; };
+		BE08805C16FDB784000CED5C /* View.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = View.m; sourceTree = "<group>"; };
+		BE4EEE9916FF724200D475B2 /* bitmapdevice.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bitmapdevice.cxx; path = ../../../../basebmp/source/bitmapdevice.cxx; sourceTree = "<group>"; };
+		BE4EEE9A16FF80B100D475B2 /* virdev.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = virdev.cxx; path = ../../../../vcl/source/gdi/virdev.cxx; sourceTree = "<group>"; };
+		BE56CD651704A08E00CA5B15 /* lo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lo.h; sourceTree = "<group>"; };
+		BE56CD661704A08E00CA5B15 /* lo.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = lo.mm; sourceTree = "<group>"; };
+		BE5A22551664F87600CF01C9 /* LibreOffice.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LibreOffice.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		BE5A22591664F87600CF01C9 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+		BE5A225B1664F87600CF01C9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+		BE5A225D1664F87600CF01C9 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+		BE5A22611664F87600CF01C9 /* LibreOffice-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "LibreOffice-Info.plist"; sourceTree = "<group>"; };
+		BE5A22631664F87600CF01C9 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		BE5A22651664F87600CF01C9 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+		BE5A22671664F87600CF01C9 /* LibreOffice-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "LibreOffice-Prefix.pch"; sourceTree = "<group>"; };
+		BE5A22681664F87600CF01C9 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+		BE5A22691664F87600CF01C9 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+		BE5A226B1664F87600CF01C9 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = "<group>"; };
+		BE5A226D1664F87600CF01C9 /* Default at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default at 2x.png"; sourceTree = "<group>"; };
+		BE5A226F1664F87600CF01C9 /* Default-568h at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h at 2x.png"; sourceTree = "<group>"; };
+		BE5A22771664F87600CF01C9 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; };
+		BE69AD87169592C4001BE1CD /* iTunesArtwork */ = {isa = PBXFileReference; lastKnownFileType = file; path = iTunesArtwork; sourceTree = "<group>"; };
+		BE69AD8A1695954D001BE1CD /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-72.png"; sourceTree = "<group>"; };
+		BE69AD8B1695954D001BE1CD /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = "<group>"; };
+		BE69AD8C1695954D001BE1CD /* Icon at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon at 2x.png"; sourceTree = "<group>"; };
+		BE7B7AFF170438D0002341F4 /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
+		BE7B7B00170438D0002341F4 /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
+		BE9086F616FF02B2004400A1 /* headlessinst.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = headlessinst.cxx; path = ../../../../vcl/headless/headlessinst.cxx; sourceTree = "<group>"; };
+		BE9086F716FF02B2004400A1 /* svpbmp.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpbmp.cxx; path = ../../../../vcl/headless/svpbmp.cxx; sourceTree = "<group>"; };
+		BE9086F816FF02B2004400A1 /* svpdata.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpdata.cxx; path = ../../../../vcl/headless/svpdata.cxx; sourceTree = "<group>"; };
+		BE9086F916FF02B2004400A1 /* svpdummies.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpdummies.cxx; path = ../../../../vcl/headless/svpdummies.cxx; sourceTree = "<group>"; };
+		BE9086FA16FF02B3004400A1 /* svpelement.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpelement.cxx; path = ../../../../vcl/headless/svpelement.cxx; sourceTree = "<group>"; };
+		BE9086FB16FF02B3004400A1 /* svpframe.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpframe.cxx; path = ../../../../vcl/headless/svpframe.cxx; sourceTree = "<group>"; };
+		BE9086FC16FF02B3004400A1 /* svpgdi.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpgdi.cxx; path = ../../../../vcl/headless/svpgdi.cxx; sourceTree = "<group>"; };
+		BE9086FD16FF02B3004400A1 /* svpinst.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpinst.cxx; path = ../../../../vcl/headless/svpinst.cxx; sourceTree = "<group>"; };
+		BE9086FE16FF02B3004400A1 /* svpprn.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpprn.cxx; path = ../../../../vcl/headless/svpprn.cxx; sourceTree = "<group>"; };
+		BE9086FF16FF02B3004400A1 /* svptext.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svptext.cxx; path = ../../../../vcl/headless/svptext.cxx; sourceTree = "<group>"; };
+		BE90870016FF02B3004400A1 /* svpvd.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpvd.cxx; path = ../../../../vcl/headless/svpvd.cxx; sourceTree = "<group>"; };
+		BEBF3E3A17002D0200C454AC /* svapp.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svapp.cxx; path = ../../../../vcl/source/app/svapp.cxx; sourceTree = "<group>"; };
+		BEBF3E3B17002D0200C454AC /* svmain.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svmain.cxx; path = ../../../../vcl/source/app/svmain.cxx; sourceTree = "<group>"; };
+		BEBF3E3C17002D4C00C454AC /* frame.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = frame.cxx; path = ../../../../framework/source/services/frame.cxx; sourceTree = "<group>"; };
+		BEBF3E3D17002D6900C454AC /* window.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = window.cxx; path = ../../../../vcl/source/window/window.cxx; sourceTree = "<group>"; };
+		BEBF3E3E17005E6B00C454AC /* frmload.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = frmload.cxx; path = ../../../../sfx2/source/view/frmload.cxx; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		BECC59C2169344C300D29860 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		BE5A224A1664F87600CF01C9 = {
+			isa = PBXGroup;
+			children = (
+				BE5A225F1664F87600CF01C9 /* LibreOffice */,
+				BE5A22581664F87600CF01C9 /* Frameworks */,
+				BE5A22561664F87600CF01C9 /* Products */,
+			);
+			sourceTree = "<group>";
+		};
+		BE5A22561664F87600CF01C9 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				BE5A22551664F87600CF01C9 /* LibreOffice.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		BE5A22581664F87600CF01C9 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				BE5A22591664F87600CF01C9 /* UIKit.framework */,
+				BE5A225B1664F87600CF01C9 /* Foundation.framework */,
+				BE5A225D1664F87600CF01C9 /* CoreGraphics.framework */,
+				BE5A22771664F87600CF01C9 /* SenTestingKit.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		BE5A225F1664F87600CF01C9 /* LibreOffice */ = {
+			isa = PBXGroup;
+			children = (
+				BE4EEE9916FF724200D475B2 /* bitmapdevice.cxx */,
+				BEBF3E3C17002D4C00C454AC /* frame.cxx */,
+				BEBF3E3E17005E6B00C454AC /* frmload.cxx */,
+				BE9086F616FF02B2004400A1 /* headlessinst.cxx */,
+				BE5A22681664F87600CF01C9 /* AppDelegate.h */,
+				BE5A22691664F87600CF01C9 /* AppDelegate.m */,
+				BE56CD651704A08E00CA5B15 /* lo.h */,
+				BE56CD661704A08E00CA5B15 /* lo.mm */,
+				BE7B7AFF170438D0002341F4 /* ViewController.h */,
+				BE7B7B00170438D0002341F4 /* ViewController.m */,
+				BE08805B16FDB784000CED5C /* View.h */,
+				BE08805C16FDB784000CED5C /* View.m */,
+				BEBF3E3A17002D0200C454AC /* svapp.cxx */,
+				BEBF3E3B17002D0200C454AC /* svmain.cxx */,
+				BE9086F716FF02B2004400A1 /* svpbmp.cxx */,
+				BE9086F816FF02B2004400A1 /* svpdata.cxx */,
+				BE9086F916FF02B2004400A1 /* svpdummies.cxx */,
+				BE9086FA16FF02B3004400A1 /* svpelement.cxx */,
+				BE9086FB16FF02B3004400A1 /* svpframe.cxx */,
+				BE9086FC16FF02B3004400A1 /* svpgdi.cxx */,
+				BE9086FD16FF02B3004400A1 /* svpinst.cxx */,
+				BE9086FE16FF02B3004400A1 /* svpprn.cxx */,
+				BE9086FF16FF02B3004400A1 /* svptext.cxx */,
+				BE90870016FF02B3004400A1 /* svpvd.cxx */,
+				BE4EEE9A16FF80B100D475B2 /* virdev.cxx */,
+				BEBF3E3D17002D6900C454AC /* window.cxx */,
+				BE69AD3716958CA0001BE1CD /* Resources */,
+				BE5A22601664F87600CF01C9 /* Supporting Files */,
+			);
+			path = LibreOffice;
+			sourceTree = "<group>";
+		};
+		BE5A22601664F87600CF01C9 /* Supporting Files */ = {
+			isa = PBXGroup;
+			children = (
+				BE5A22611664F87600CF01C9 /* LibreOffice-Info.plist */,
+				BE5A22621664F87600CF01C9 /* InfoPlist.strings */,
+				BE5A22651664F87600CF01C9 /* main.m */,
+				BE5A22671664F87600CF01C9 /* LibreOffice-Prefix.pch */,
+				BE5A226B1664F87600CF01C9 /* Default.png */,
+				BE5A226D1664F87600CF01C9 /* Default at 2x.png */,
+				BE5A226F1664F87600CF01C9 /* Default-568h at 2x.png */,
+			);
+			name = "Supporting Files";
+			sourceTree = "<group>";
+		};
+		BE69AD3716958CA0001BE1CD /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				BE69AD87169592C4001BE1CD /* iTunesArtwork */,
+				BE69AD8A1695954D001BE1CD /* Icon-72.png */,
+				BE69AD8B1695954D001BE1CD /* Icon.png */,
+				BE69AD8C1695954D001BE1CD /* Icon at 2x.png */,
+			);
+			name = Resources;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		BE5A22541664F87600CF01C9 /* LibreOffice */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = BE5A22881664F87600CF01C9 /* Build configuration list for PBXNativeTarget "LibreOffice" */;
+			buildPhases = (
+				BE8B879916933FCD00F61E9F /* ShellScript */,
+				BE5A22531664F87600CF01C9 /* Resources */,
+				BECC59C2169344C300D29860 /* Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = LibreOffice;
+			productName = LibreOffice;
+			productReference = BE5A22551664F87600CF01C9 /* LibreOffice.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		BE5A224C1664F87600CF01C9 /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0450;
+				ORGANIZATIONNAME = "Tor Lillqvist";
+			};
+			buildConfigurationList = BE5A224F1664F87600CF01C9 /* Build configuration list for PBXProject "LibreOffice" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+			);
+			mainGroup = BE5A224A1664F87600CF01C9;
+			productRefGroup = BE5A22561664F87600CF01C9 /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				BE5A22541664F87600CF01C9 /* LibreOffice */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		BE5A22531664F87600CF01C9 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				BE5A22641664F87600CF01C9 /* InfoPlist.strings in Resources */,
+				BE5A226C1664F87600CF01C9 /* Default.png in Resources */,
+				BE5A226E1664F87600CF01C9 /* Default at 2x.png in Resources */,
+				BE5A22701664F87600CF01C9 /* Default-568h at 2x.png in Resources */,
+				BE69AD88169592C4001BE1CD /* iTunesArtwork in Resources */,
+				BE69AD8D1695954D001BE1CD /* Icon-72.png in Resources */,
+				BE69AD8E1695954D001BE1CD /* Icon.png in Resources */,
+				BE69AD8F1695954D001BE1CD /* Icon at 2x.png in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		BE8B879916933FCD00F61E9F /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			outputPaths = (
+				"$(CONFIGURATION_BUILD_DIR)/$(EXECUTABLE_PATH)",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "cd ../../.. && /opt/lo/bin/make ios";
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+		BE5A22621664F87600CF01C9 /* InfoPlist.strings */ = {
+			isa = PBXVariantGroup;
+			children = (
+				BE5A22631664F87600CF01C9 /* en */,
+			);
+			name = InfoPlist.strings;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		BE5A22861664F87600CF01C9 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 5.0;
+				LIBRARY_SEARCH_PATHS = "";
+				OTHER_LDFLAGS = "-v";
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = 2;
+				VALID_ARCHS = armv7;
+			};
+			name = Debug;
+		};
+		BE5A22871664F87600CF01C9 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 5.0;
+				LIBRARY_SEARCH_PATHS = "";
+				OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
+				OTHER_LDFLAGS = "-v";
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = 2;
+				VALID_ARCHS = armv7;
+			};
+			name = Release;
+		};
+		BE5A22891664F87600CF01C9 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "LibreOffice/LibreOffice-Prefix.pch";
+				INFOPLIST_FILE = "LibreOffice/LibreOffice-Info.plist";
+				IPHONEOS_DEPLOYMENT_TARGET = 5.0;
+				LIBRARY_SEARCH_PATHS = "../../../workdir/$(LO_INPATH)/LinkTarget/Library";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				WRAPPER_EXTENSION = app;
+			};
+			name = Debug;
+		};
+		BE5A228A1664F87600CF01C9 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "LibreOffice/LibreOffice-Prefix.pch";
+				INFOPLIST_FILE = "LibreOffice/LibreOffice-Info.plist";
+				IPHONEOS_DEPLOYMENT_TARGET = 5.0;
+				LIBRARY_SEARCH_PATHS = "../../../workdir/$(LO_INPATH)/LinkTarget/Library";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				WRAPPER_EXTENSION = app;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		BE5A224F1664F87600CF01C9 /* Build configuration list for PBXProject "LibreOffice" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				BE5A22861664F87600CF01C9 /* Debug */,
+				BE5A22871664F87600CF01C9 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		BE5A22881664F87600CF01C9 /* Build configuration list for PBXNativeTarget "LibreOffice" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				BE5A22891664F87600CF01C9 /* Debug */,
+				BE5A228A1664F87600CF01C9 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = BE5A224C1664F87600CF01C9 /* Project object */;
+}
diff --git a/ios/experimental/LibreOffice/LibreOffice/AppDelegate.h b/ios/experimental/LibreOffice/LibreOffice/AppDelegate.h
new file mode 100644
index 0000000..79b0e56
--- /dev/null
+++ b/ios/experimental/LibreOffice/LibreOffice/AppDelegate.h
@@ -0,0 +1,27 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <UIKit/UIKit.h>
+
+#import "View.h"
+
+ at interface AppDelegate : UIResponder <UIApplicationDelegate>
+{
+  int nbytes;
+  char *pixelBuffer;
+  CGImageRef image;
+}
+
+ at property (strong, nonatomic) UIWindow *window;
+ at property (strong, nonatomic) View *view;
+
+- (void) threadMainMethod: (id) argument;
+
+ at end
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/experimental/LibreOffice/LibreOffice/AppDelegate.m b/ios/experimental/LibreOffice/LibreOffice/AppDelegate.m
new file mode 100644
index 0000000..93f995e
--- /dev/null
+++ b/ios/experimental/LibreOffice/LibreOffice/AppDelegate.m
@@ -0,0 +1,112 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <UIKit/UIKit.h>
+
+#include <osl/detail/ios-bootstrap.h>
+
+#import "AppDelegate.h"
+#import "ViewController.h"
+
+#import "lo.h"
+
+static UIView *theView;
+
+ at implementation AppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+    (void) application;
+    (void) launchOptions;
+
+    CGRect bounds = [[UIScreen mainScreen] bounds];
+    self.window = [[UIWindow alloc] initWithFrame:bounds];
+    self.window.backgroundColor = [UIColor whiteColor];
+
+    ViewController *vc = [[ViewController alloc] init];
+    self.window.rootViewController = vc;
+
+    [self.window makeKeyAndVisible];
+    
+    CGRect r = [self.window frame];
+    r.origin = CGPointMake(0, 0);
+
+    self.view = [[View alloc] initWithFrame: r];
+    vc.view = self.view;
+    theView = self.view;
+
+    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(tapGesture:)];
+
+    [self.window addGestureRecognizer: tapRecognizer];
+
+    nbytes = bounds.size.width * bounds.size.height * 4;
+
+    pixelBuffer = (char *) malloc(nbytes);
+    memset(pixelBuffer, 0xFF, nbytes);
+
+    CGDataProviderRef provider = CGDataProviderCreateWithData( NULL, pixelBuffer, nbytes, NULL);
+    image = CGImageCreate(bounds.size.width, bounds.size.height, 8, 32, bounds.size.width*4, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaNoneSkipLast, provider, NULL, false, kCGRenderingIntentDefault);
+
+    self.view.pixelBuffer = pixelBuffer;
+    self.view.image = image;
+
+    lo_set_view_size(bounds.size.width, bounds.size.height);
+
+    NSThread* thread = [[NSThread alloc] initWithTarget:self
+                                               selector:@selector(threadMainMethod:)
+                                                 object:nil];
+    [thread start];
+
+    return YES;
+}
+
+- (void)threadMainMethod:(id)argument
+{
+    (void) argument;
+
+    @autoreleasepool {
+        lo_initialize();
+        lo_runMain();
+    }
+}
+
+- (void)applicationWillResignActive:(UIApplication *)application
+{
+    (void) application;
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application
+{
+    (void) application;
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application
+{
+    (void) application;
+}
+
+- (void)applicationDidBecomeActive:(UIApplication *)application
+{
+    (void) application;
+}
+
+- (void)applicationWillTerminate:(UIApplication *)application
+{
+    (void) application;
+}
+
+ at end
+
+void lo_damaged(CGRect rect)
+{
+    (void) rect;
+    [theView performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:NO];
+    // NSLog(@"lo_damaged: %dx%d@(%d,%d)", (int)rect.size.width, (int)rect.size.height, (int)rect.origin.x, (int)rect.origin.y);
+}
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/experimental/LibreOffice/LibreOffice/Default-568h at 2x.png b/ios/experimental/LibreOffice/LibreOffice/Default-568h at 2x.png
new file mode 100644
index 0000000..0891b7a
Binary files /dev/null and b/ios/experimental/LibreOffice/LibreOffice/Default-568h at 2x.png differ
diff --git a/ios/experimental/LibreOffice/LibreOffice/Default.png b/ios/experimental/LibreOffice/LibreOffice/Default.png
new file mode 100644
index 0000000..4c8ca6f
Binary files /dev/null and b/ios/experimental/LibreOffice/LibreOffice/Default.png differ
diff --git a/ios/experimental/LibreOffice/LibreOffice/Default at 2x.png b/ios/experimental/LibreOffice/LibreOffice/Default at 2x.png
new file mode 100644
index 0000000..35b84cf
Binary files /dev/null and b/ios/experimental/LibreOffice/LibreOffice/Default at 2x.png differ
diff --git a/ios/experimental/LibreOffice/LibreOffice/Icon-72.png b/ios/experimental/LibreOffice/LibreOffice/Icon-72.png
new file mode 100644
index 0000000..8a355c2
Binary files /dev/null and b/ios/experimental/LibreOffice/LibreOffice/Icon-72.png differ
diff --git a/ios/experimental/LibreOffice/LibreOffice/Icon.png b/ios/experimental/LibreOffice/LibreOffice/Icon.png
new file mode 100644
index 0000000..04254bf
Binary files /dev/null and b/ios/experimental/LibreOffice/LibreOffice/Icon.png differ
diff --git a/ios/experimental/LibreOffice/LibreOffice/Icon at 2x.png b/ios/experimental/LibreOffice/LibreOffice/Icon at 2x.png
new file mode 100644
index 0000000..6d90d1f
Binary files /dev/null and b/ios/experimental/LibreOffice/LibreOffice/Icon at 2x.png differ
diff --git a/ios/experimental/LibreOffice/LibreOffice/LibreOffice-Info.plist b/ios/experimental/LibreOffice/LibreOffice/LibreOffice-Info.plist
new file mode 100644
index 0000000..7ac2f9d
--- /dev/null
+++ b/ios/experimental/LibreOffice/LibreOffice/LibreOffice-Info.plist
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleDisplayName</key>
+	<string>${PRODUCT_NAME}</string>
+	<key>CFBundleExecutable</key>
+	<string>${EXECUTABLE_NAME}</string>
+	<key>CFBundleIdentifier</key>
+	<string>org.libreoffice.${PRODUCT_NAME:rfc1034identifier}</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>${PRODUCT_NAME}</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1.0</string>
+	<key>LSRequiresIPhoneOS</key>
+	<true/>
+	<key>UIRequiredDeviceCapabilities</key>
+	<array>
+		<string>armv7</string>
+	</array>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>UISupportedInterfaceOrientations~ipad</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>CFBundleIconFiles</key>
+	<array>
+		<string>Icon.png</string>
+		<string>Icon-72.png</string>
+		<string>Icon at 2x.png</string>
+	</array>
+</dict>
+</plist>
diff --git a/ios/experimental/LibreOffice/LibreOffice/LibreOffice-Prefix.pch b/ios/experimental/LibreOffice/LibreOffice/LibreOffice-Prefix.pch
new file mode 100644
index 0000000..e5d7173
--- /dev/null
+++ b/ios/experimental/LibreOffice/LibreOffice/LibreOffice-Prefix.pch
@@ -0,0 +1,14 @@
+//
+// Prefix header for all source files of the 'LibreOffice' target in the 'LibreOffice' project
+//
+
+#import <Availability.h>
+
+#ifndef __IPHONE_3_0
+#warning "This project uses features only available in iOS SDK 3.0 and later."
+#endif
+
+#ifdef __OBJC__
+    #import <UIKit/UIKit.h>
+    #import <Foundation/Foundation.h>
+#endif
diff --git a/ios/experimental/LibreOffice/LibreOffice/View.h b/ios/experimental/LibreOffice/LibreOffice/View.h
new file mode 100644
index 0000000..d953722
--- /dev/null
+++ b/ios/experimental/LibreOffice/LibreOffice/View.h
@@ -0,0 +1,22 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+
+#import <UIKit/UIKit.h>
+
+ at interface View : UIView
+
+ at property char *pixelBuffer;
+ at property CGImageRef image;
+
+- (void)drawRect:(CGRect)rect;
+- (void)tapGesture:(UIGestureRecognizer *)gestureRecognizer;
+
+ at end
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/experimental/LibreOffice/LibreOffice/View.m b/ios/experimental/LibreOffice/LibreOffice/View.m
new file mode 100644
index 0000000..bcde704
--- /dev/null
+++ b/ios/experimental/LibreOffice/LibreOffice/View.m
@@ -0,0 +1,43 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "View.h"
+
+#include <osl/detail/ios-bootstrap.h>
+
+ at implementation View
+
+- (void)drawRect:(CGRect)rect
+{
+    (void) rect;
+    
+    // NSLog(@"drawRect: %fx%f@(%f,%f)", rect.size.width, rect.size.height, rect.origin.x, rect.origin.y);
+
+    NSDate *a = [NSDate date];
+    lo_render_windows([self pixelBuffer], [self bounds].size.width, [self bounds].size.height);
+    
+    NSLog(@"drawRect: lo_render_windows took %f s", [[NSDate date] timeIntervalSinceDate: a]);
+
+    CGContextRef context = UIGraphicsGetCurrentContext();
+
+    CGContextDrawImage(context, [self bounds], [self image]);
+}
+
+- (void) tapGesture:(UIGestureRecognizer *)gestureRecognizer
+{
+    if ([gestureRecognizer state] == UIGestureRecognizerStateEnded) {
+        CGPoint location = [gestureRecognizer locationInView: self];
+        NSLog(@"tapGesture: at: (%d,%d)", (int)location.x, (int)location.y);
+        lo_tap(location.x, location.y);
+    } else
+        NSLog(@"tapGesture: %@", gestureRecognizer);
+}
+
+ at end
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/experimental/LibreOffice/LibreOffice/ViewController.h b/ios/experimental/LibreOffice/LibreOffice/ViewController.h
new file mode 100644
index 0000000..4269512
--- /dev/null
+++ b/ios/experimental/LibreOffice/LibreOffice/ViewController.h
@@ -0,0 +1,16 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+
+#import <UIKit/UIKit.h>
+
+ at interface ViewController : UIViewController
+
+ at end
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/experimental/LibreOffice/LibreOffice/ViewController.m b/ios/experimental/LibreOffice/LibreOffice/ViewController.m
new file mode 100644
index 0000000..8a44526
--- /dev/null
+++ b/ios/experimental/LibreOffice/LibreOffice/ViewController.m
@@ -0,0 +1,26 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+
+#import "ViewController.h"
+
+ at implementation ViewController
+
+- (void)viewDidLoad
+{
+    [super viewDidLoad];
+
+    CGRect rect = [self.view bounds];
+    NSLog(@"viewDidLoad: bounds=%dx%d@(%d,%d)", (int)rect.size.width, (int)rect.size.height, (int)rect.origin.x, (int)rect.origin.y);
+    rect = [self.view frame];
+    NSLog(@"  frame=%dx%d@(%d,%d)", (int)rect.size.width, (int)rect.size.height, (int)rect.origin.x, (int)rect.origin.y);
+}
+
+ at end
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/experimental/LibreOffice/LibreOffice/en.lproj/InfoPlist.strings b/ios/experimental/LibreOffice/LibreOffice/en.lproj/InfoPlist.strings
new file mode 100644
index 0000000..477b28f
--- /dev/null
+++ b/ios/experimental/LibreOffice/LibreOffice/en.lproj/InfoPlist.strings
@@ -0,0 +1,2 @@
+/* Localized versions of Info.plist keys */
+
diff --git a/ios/experimental/LibreOffice/LibreOffice/iTunesArtwork b/ios/experimental/LibreOffice/LibreOffice/iTunesArtwork
new file mode 100644
index 0000000..ef1890b
Binary files /dev/null and b/ios/experimental/LibreOffice/LibreOffice/iTunesArtwork differ
diff --git a/ios/experimental/LibreOffice/LibreOffice/lo.h b/ios/experimental/LibreOffice/LibreOffice/lo.h
new file mode 100644
index 0000000..77054b0
--- /dev/null
+++ b/ios/experimental/LibreOffice/LibreOffice/lo.h
@@ -0,0 +1,20 @@
+// -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void lo_initialize(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:
+
diff --git a/ios/experimental/LibreOffice/LibreOffice/lo.mm b/ios/experimental/LibreOffice/LibreOffice/lo.mm
new file mode 100644
index 0000000..f23bdd0
--- /dev/null
+++ b/ios/experimental/LibreOffice/LibreOffice/lo.mm
@@ -0,0 +1,184 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <stdlib.h>
+
+#include <premac.h>
+#import <UIKit/UIKit.h>
+#include <postmac.h>
+
+#include <comphelper/processfactory.hxx>
+#include <cppuhelper/bootstrap.hxx>
+#include <osl/detail/ios-bootstrap.h>
+#include <osl/process.h>
+
+#include <com/sun/star/awt/XDevice.hpp>
+#include <com/sun/star/awt/XToolkitExperimental.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/bridge/XUnoUrlResolver.hpp>
+#include <com/sun/star/frame/XComponentLoader.hpp>
+#include <com/sun/star/lang/XMultiComponentFactory.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/registry/XSimpleRegistry.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/view/XRenderable.hpp>
+
+#include <vcl/svapp.hxx>
+
+using namespace com::sun::star;
+
+using ::rtl::OUString;
+using ::rtl::OUStringToOString;
+
+extern "C" {
+    extern void * animcore_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * avmedia_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * dba_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * dbaxml_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * evtatt_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * fileacc_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * frm_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * fsstorage_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * fwk_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * fwl_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * fwm_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * hwp_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * hyphen_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * lng_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * lnth_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * lotuswordpro_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * oox_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * sc_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * scd_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * scfilt_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * sd_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * sdd_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * sm_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * smd_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * spell_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * svgfilter_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * svt_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * svx_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * sw_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * swd_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * t602filter_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * textfd_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * unoxml_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * unordf_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * uui_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * xmlfd_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * xmlsecurity_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * xo_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * xof_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+
+}
+
+extern "C"
+const lib_to_component_mapping *
+lo_get_libmap(void)
+{
+    static lib_to_component_mapping map[] = {
+        { "libanimcorelo.a", animcore_component_getFactory },
+        { "libavmedialo.a", avmedia_component_getFactory },
+        { "libdbalo.a", dba_component_getFactory },
+        { "libdbaxmllo.a", dbaxml_component_getFactory },
+        { "libevtattlo.a", evtatt_component_getFactory },
+        { "libfileacc.a", fileacc_component_getFactory },
+        { "libfrmlo.a", frm_component_getFactory },
+        { "fsstorage.uno.a", fsstorage_component_getFactory },
+        { "libfwklo.a", fwk_component_getFactory },
+        { "libfwllo.a", fwl_component_getFactory },
+        { "libfwmlo.a", fwm_component_getFactory },
+        { "libhwplo.a", hwp_component_getFactory },
+        { "libhyphenlo.a", hyphen_component_getFactory },
+        { "liblnglo.a", lng_component_getFactory },
+        { "liblnthlo.a", lnth_component_getFactory },
+        { "liblwpftlo.a", lotuswordpro_component_getFactory },
+        { "libooxlo.a", oox_component_getFactory },
+        { "libscdlo.a", scd_component_getFactory },
+        { "libscfiltlo.a", scfilt_component_getFactory },
+        { "libsclo.a", sc_component_getFactory },
+        { "libsddlo.a", sdd_component_getFactory },
+        { "libsdlo.a", sd_component_getFactory },
+        { "libsmdlo.a", smd_component_getFactory },
+        { "libsmlo.a", sm_component_getFactory },
+        { "libspelllo.a", spell_component_getFactory },
+        { "libsvgfilterlo.a", svgfilter_component_getFactory },
+        { "libsvtlo.a", svt_component_getFactory },
+        { "libsvxlo.a", svx_component_getFactory },
+        { "libswdlo.a", swd_component_getFactory },
+        { "libswlo.a", sw_component_getFactory },
+        { "libt602filterlo.a", t602filter_component_getFactory },
+        { "libtextfdlo.a", textfd_component_getFactory },
+        { "libunordflo.a", unordf_component_getFactory },
+        { "libunoxmllo.a", unoxml_component_getFactory },
+        { "libuuilo.a", uui_component_getFactory },
+        { "libxmlfdlo.a", xmlfd_component_getFactory },
+        { "libxmlsecurity.a", xmlsecurity_component_getFactory },
+        { "libxoflo.a", xof_component_getFactory },
+        { "libxolo.a", xo_component_getFactory },
+        { NULL, NULL }
+    };
+
+    return map;
+}
+
+extern "C"
+void
+lo_initialize(void)
+{
+    if (UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation]))
+        setenv("SAL_LOG", "+WARN+INFO.vcl.headless+INFO.vcl.ios", 1);
+    else
+        setenv("SAL_LOG", "-WARN-INFO", 1);
+
+    const char *argv[] = {
+        "placeholder-exe",
+        "-env:URE_INTERNAL_LIB_DIR=file:///",
+        "placeholder-uno-types",
+        "placeholder-uno-services",
+        "placeholder-document"
+    };
+
+    const int argc = sizeof(argv)/sizeof(*argv);
+
+    argv[0] = [[[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent: @"Viewer"] UTF8String];
+
+    NSString *app_root_escaped = [[[NSBundle mainBundle] bundlePath] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
+
+    NSString *uno_types = @"-env:UNO_TYPES=";
+
+    uno_types = [uno_types stringByAppendingString: @"file://"];
+    uno_types = [uno_types stringByAppendingString: [app_root_escaped stringByAppendingPathComponent: @"ure/types.rdb"]];
+
+    uno_types = [uno_types stringByAppendingString: @" file://"];
+    uno_types = [uno_types stringByAppendingString: [app_root_escaped stringByAppendingPathComponent: @"types.rdb"]];
+
+    uno_types = [uno_types stringByAppendingString: @" file://"];
+    uno_types = [uno_types stringByAppendingString: [app_root_escaped stringByAppendingPathComponent: @"offapi.rdb"]];
+
+    assert(strcmp(argv[2], "placeholder-uno-types") == 0);
+    argv[2] = [uno_types UTF8String];
+
+    NSString *uno_services = @"-env:UNO_SERVICES=";
+
+    uno_services = [uno_services stringByAppendingString: @"file://"];
+    uno_services = [uno_services stringByAppendingString: [app_root_escaped stringByAppendingPathComponent: @"ure/services.rdb"]];
+
+    uno_services = [uno_services stringByAppendingString: @" file://"];
+    uno_services = [uno_services stringByAppendingString: [app_root_escaped stringByAppendingPathComponent: @"services.rdb"]];
+
+    assert(strcmp(argv[3], "placeholder-uno-services") == 0);
+    argv[3] = [uno_services UTF8String];
+
+    assert(strcmp(argv[4], "placeholder-document") == 0);
+    argv[4] = [[app_root_escaped stringByAppendingPathComponent: @"test1.odt"] UTF8String];
+
+    osl_setCommandArgs(argc, (char **) argv);
+}
diff --git a/ios/experimental/LibreOffice/LibreOffice/main.m b/ios/experimental/LibreOffice/LibreOffice/main.m
new file mode 100644
index 0000000..55f0a70
--- /dev/null
+++ b/ios/experimental/LibreOffice/LibreOffice/main.m
@@ -0,0 +1,20 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <UIKit/UIKit.h>
+
+#import "AppDelegate.h"
+
+int main(int argc, char *argv[])
+{
+    @autoreleasepool {
+        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+    }
+}
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/experimental/Viewer/.gitignore b/ios/experimental/Viewer/.gitignore
deleted file mode 100644
index e76e0ed..0000000
--- a/ios/experimental/Viewer/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-.DS_Store
-build
-Viewer.xcodeproj/project.xcworkspace
-Viewer.xcodeproj/xcuserdata
diff --git a/ios/experimental/Viewer/Viewer.xcodeproj/project.pbxproj b/ios/experimental/Viewer/Viewer.xcodeproj/project.pbxproj
deleted file mode 100644
index 3ba5a67..0000000
--- a/ios/experimental/Viewer/Viewer.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,342 +0,0 @@
-// !$*UTF8*$!
-{
-	archiveVersion = 1;
-	classes = {
-	};
-	objectVersion = 46;
-	objects = {
-
-/* Begin PBXBuildFile section */
-		BE5A22641664F87600CF01C9 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BE5A22621664F87600CF01C9 /* InfoPlist.strings */; };
-		BE5A226C1664F87600CF01C9 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = BE5A226B1664F87600CF01C9 /* Default.png */; };
-		BE5A226E1664F87600CF01C9 /* Default at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BE5A226D1664F87600CF01C9 /* Default at 2x.png */; };
-		BE5A22701664F87600CF01C9 /* Default-568h at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BE5A226F1664F87600CF01C9 /* Default-568h at 2x.png */; };
-		BE69AD88169592C4001BE1CD /* iTunesArtwork in Resources */ = {isa = PBXBuildFile; fileRef = BE69AD87169592C4001BE1CD /* iTunesArtwork */; };
-		BE69AD8D1695954D001BE1CD /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = BE69AD8A1695954D001BE1CD /* Icon-72.png */; };
-		BE69AD8E1695954D001BE1CD /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = BE69AD8B1695954D001BE1CD /* Icon.png */; };
-		BE69AD8F1695954D001BE1CD /* Icon at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BE69AD8C1695954D001BE1CD /* Icon at 2x.png */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXFileReference section */
-		BE08805B16FDB784000CED5C /* LOViewerWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LOViewerWindow.h; sourceTree = "<group>"; };
-		BE08805C16FDB784000CED5C /* LOViewerWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LOViewerWindow.m; sourceTree = "<group>"; };
-		BE4EEE9916FF724200D475B2 /* bitmapdevice.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bitmapdevice.cxx; path = ../../../../basebmp/source/bitmapdevice.cxx; sourceTree = "<group>"; };
-		BE4EEE9A16FF80B100D475B2 /* virdev.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = virdev.cxx; path = ../../../../vcl/source/gdi/virdev.cxx; sourceTree = "<group>"; };
-		BE5A22551664F87600CF01C9 /* Viewer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Viewer.app; sourceTree = BUILT_PRODUCTS_DIR; };
-		BE5A22591664F87600CF01C9 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
-		BE5A225B1664F87600CF01C9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
-		BE5A225D1664F87600CF01C9 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
-		BE5A22611664F87600CF01C9 /* Viewer-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Viewer-Info.plist"; sourceTree = "<group>"; };
-		BE5A22631664F87600CF01C9 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
-		BE5A22651664F87600CF01C9 /* main.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = "<group>"; };
-		BE5A22671664F87600CF01C9 /* Viewer-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Viewer-Prefix.pch"; sourceTree = "<group>"; };
-		BE5A22681664F87600CF01C9 /* LOViewerAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LOViewerAppDelegate.h; sourceTree = "<group>"; };
-		BE5A22691664F87600CF01C9 /* LOViewerAppDelegate.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = LOViewerAppDelegate.mm; sourceTree = "<group>"; };
-		BE5A226B1664F87600CF01C9 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = "<group>"; };
-		BE5A226D1664F87600CF01C9 /* Default at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default at 2x.png"; sourceTree = "<group>"; };
-		BE5A226F1664F87600CF01C9 /* Default-568h at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h at 2x.png"; sourceTree = "<group>"; };
-		BE5A22771664F87600CF01C9 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; };
-		BE69AD87169592C4001BE1CD /* iTunesArtwork */ = {isa = PBXFileReference; lastKnownFileType = file; path = iTunesArtwork; sourceTree = "<group>"; };
-		BE69AD8A1695954D001BE1CD /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-72.png"; sourceTree = "<group>"; };
-		BE69AD8B1695954D001BE1CD /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = "<group>"; };
-		BE69AD8C1695954D001BE1CD /* Icon at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon at 2x.png"; sourceTree = "<group>"; };
-		BE9086F616FF02B2004400A1 /* headlessinst.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = headlessinst.cxx; path = ../../../../vcl/headless/headlessinst.cxx; sourceTree = "<group>"; };
-		BE9086F716FF02B2004400A1 /* svpbmp.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpbmp.cxx; path = ../../../../vcl/headless/svpbmp.cxx; sourceTree = "<group>"; };
-		BE9086F816FF02B2004400A1 /* svpdata.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpdata.cxx; path = ../../../../vcl/headless/svpdata.cxx; sourceTree = "<group>"; };
-		BE9086F916FF02B2004400A1 /* svpdummies.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpdummies.cxx; path = ../../../../vcl/headless/svpdummies.cxx; sourceTree = "<group>"; };
-		BE9086FA16FF02B3004400A1 /* svpelement.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpelement.cxx; path = ../../../../vcl/headless/svpelement.cxx; sourceTree = "<group>"; };
-		BE9086FB16FF02B3004400A1 /* svpframe.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpframe.cxx; path = ../../../../vcl/headless/svpframe.cxx; sourceTree = "<group>"; };
-		BE9086FC16FF02B3004400A1 /* svpgdi.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpgdi.cxx; path = ../../../../vcl/headless/svpgdi.cxx; sourceTree = "<group>"; };
-		BE9086FD16FF02B3004400A1 /* svpinst.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpinst.cxx; path = ../../../../vcl/headless/svpinst.cxx; sourceTree = "<group>"; };
-		BE9086FE16FF02B3004400A1 /* svpprn.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpprn.cxx; path = ../../../../vcl/headless/svpprn.cxx; sourceTree = "<group>"; };
-		BE9086FF16FF02B3004400A1 /* svptext.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svptext.cxx; path = ../../../../vcl/headless/svptext.cxx; sourceTree = "<group>"; };
-		BE90870016FF02B3004400A1 /* svpvd.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svpvd.cxx; path = ../../../../vcl/headless/svpvd.cxx; sourceTree = "<group>"; };
-		BEBF3E3A17002D0200C454AC /* svapp.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svapp.cxx; path = ../../../../vcl/source/app/svapp.cxx; sourceTree = "<group>"; };
-		BEBF3E3B17002D0200C454AC /* svmain.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = svmain.cxx; path = ../../../../vcl/source/app/svmain.cxx; sourceTree = "<group>"; };
-		BEBF3E3C17002D4C00C454AC /* frame.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = frame.cxx; path = ../../../../framework/source/services/frame.cxx; sourceTree = "<group>"; };
-		BEBF3E3D17002D6900C454AC /* window.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = window.cxx; path = ../../../../vcl/source/window/window.cxx; sourceTree = "<group>"; };
-		BEBF3E3E17005E6B00C454AC /* frmload.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = frmload.cxx; path = ../../../../sfx2/source/view/frmload.cxx; sourceTree = "<group>"; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
-		BECC59C2169344C300D29860 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
-		BE5A224A1664F87600CF01C9 = {
-			isa = PBXGroup;
-			children = (
-				BE5A225F1664F87600CF01C9 /* Viewer */,
-				BE5A22581664F87600CF01C9 /* Frameworks */,
-				BE5A22561664F87600CF01C9 /* Products */,
-			);
-			sourceTree = "<group>";
-		};
-		BE5A22561664F87600CF01C9 /* Products */ = {
-			isa = PBXGroup;
-			children = (
-				BE5A22551664F87600CF01C9 /* Viewer.app */,
-			);
-			name = Products;
-			sourceTree = "<group>";
-		};
-		BE5A22581664F87600CF01C9 /* Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-				BE5A22591664F87600CF01C9 /* UIKit.framework */,
-				BE5A225B1664F87600CF01C9 /* Foundation.framework */,
-				BE5A225D1664F87600CF01C9 /* CoreGraphics.framework */,
-				BE5A22771664F87600CF01C9 /* SenTestingKit.framework */,
-			);
-			name = Frameworks;
-			sourceTree = "<group>";
-		};
-		BE5A225F1664F87600CF01C9 /* Viewer */ = {
-			isa = PBXGroup;
-			children = (
-				BE4EEE9916FF724200D475B2 /* bitmapdevice.cxx */,
-				BEBF3E3C17002D4C00C454AC /* frame.cxx */,
-				BEBF3E3E17005E6B00C454AC /* frmload.cxx */,
-				BE9086F616FF02B2004400A1 /* headlessinst.cxx */,
-				BE5A22681664F87600CF01C9 /* LOViewerAppDelegate.h */,
-				BE5A22691664F87600CF01C9 /* LOViewerAppDelegate.mm */,
-				BE08805B16FDB784000CED5C /* LOViewerWindow.h */,
-				BE08805C16FDB784000CED5C /* LOViewerWindow.m */,
-				BEBF3E3A17002D0200C454AC /* svapp.cxx */,
-				BEBF3E3B17002D0200C454AC /* svmain.cxx */,
-				BE9086F716FF02B2004400A1 /* svpbmp.cxx */,
-				BE9086F816FF02B2004400A1 /* svpdata.cxx */,
-				BE9086F916FF02B2004400A1 /* svpdummies.cxx */,
-				BE9086FA16FF02B3004400A1 /* svpelement.cxx */,
-				BE9086FB16FF02B3004400A1 /* svpframe.cxx */,
-				BE9086FC16FF02B3004400A1 /* svpgdi.cxx */,
-				BE9086FD16FF02B3004400A1 /* svpinst.cxx */,
-				BE9086FE16FF02B3004400A1 /* svpprn.cxx */,
-				BE9086FF16FF02B3004400A1 /* svptext.cxx */,
-				BE90870016FF02B3004400A1 /* svpvd.cxx */,
-				BE4EEE9A16FF80B100D475B2 /* virdev.cxx */,
-				BEBF3E3D17002D6900C454AC /* window.cxx */,
-				BE69AD3716958CA0001BE1CD /* Resources */,
-				BE5A22601664F87600CF01C9 /* Supporting Files */,
-			);
-			path = Viewer;
-			sourceTree = "<group>";
-		};
-		BE5A22601664F87600CF01C9 /* Supporting Files */ = {
-			isa = PBXGroup;
-			children = (
-				BE5A22611664F87600CF01C9 /* Viewer-Info.plist */,
-				BE5A22621664F87600CF01C9 /* InfoPlist.strings */,
-				BE5A22651664F87600CF01C9 /* main.mm */,
-				BE5A22671664F87600CF01C9 /* Viewer-Prefix.pch */,
-				BE5A226B1664F87600CF01C9 /* Default.png */,
-				BE5A226D1664F87600CF01C9 /* Default at 2x.png */,
-				BE5A226F1664F87600CF01C9 /* Default-568h at 2x.png */,
-			);
-			name = "Supporting Files";
-			sourceTree = "<group>";
-		};
-		BE69AD3716958CA0001BE1CD /* Resources */ = {
-			isa = PBXGroup;
-			children = (
-				BE69AD87169592C4001BE1CD /* iTunesArtwork */,
-				BE69AD8A1695954D001BE1CD /* Icon-72.png */,
-				BE69AD8B1695954D001BE1CD /* Icon.png */,
-				BE69AD8C1695954D001BE1CD /* Icon at 2x.png */,
-			);
-			name = Resources;
-			sourceTree = "<group>";
-		};
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
-		BE5A22541664F87600CF01C9 /* Viewer */ = {
-			isa = PBXNativeTarget;

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list