[Libreoffice-commits] core.git: config_host.mk.in ios/CustomTarget_MobileLibreOffice_app.mk ios/CustomTarget_TiledLibreOffice_app.mk ios/experimental ios/MobileLibreOffice ios/Module_ios.mk sw/source vcl/quartz

Tor Lillqvist tml at collabora.com
Wed Dec 18 13:00:00 PST 2013


 config_host.mk.in                                                                                        |    1 
 ios/CustomTarget_MobileLibreOffice_app.mk                                                                |   44 
 ios/CustomTarget_TiledLibreOffice_app.mk                                                                 |  100 ++
 ios/MobileLibreOffice/MobileLibreOffice.xcodeproj/project.pbxproj                                        |   48 
 ios/Module_ios.mk                                                                                        |    1 
 ios/experimental/TiledLibreOffice/TiledLibreOffice.xcodeproj/project.pbxproj                             |  497 ++++++++++
 ios/experimental/TiledLibreOffice/TiledLibreOffice/AppDelegate.h                                         |   19 
 ios/experimental/TiledLibreOffice/TiledLibreOffice/AppDelegate.m                                         |  118 ++
 ios/experimental/TiledLibreOffice/TiledLibreOffice/Images.xcassets/AppIcon.appiconset/Contents.json      |   38 
 ios/experimental/TiledLibreOffice/TiledLibreOffice/Images.xcassets/LaunchImage.launchimage/Contents.json |   36 
 ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledLibreOffice-Info.plist                           |   39 
 ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledLibreOffice-Prefix.pch                           |   22 
 ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledView.h                                           |   17 
 ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledView.m                                           |   62 +
 ios/experimental/TiledLibreOffice/TiledLibreOffice/View.h                                                |   15 
 ios/experimental/TiledLibreOffice/TiledLibreOffice/View.m                                                |   57 +
 ios/experimental/TiledLibreOffice/TiledLibreOffice/ViewController.h                                      |   15 
 ios/experimental/TiledLibreOffice/TiledLibreOffice/ViewController.m                                      |   29 
 ios/experimental/TiledLibreOffice/TiledLibreOffice/en.lproj/InfoPlist.strings                            |    2 
 ios/experimental/TiledLibreOffice/TiledLibreOffice/lo.h                                                  |   19 
 ios/experimental/TiledLibreOffice/TiledLibreOffice/lo.mm                                                 |  181 +++
 ios/experimental/TiledLibreOffice/TiledLibreOffice/main.m                                                |   20 
 sw/source/core/view/viewsh.cxx                                                                           |   17 
 vcl/quartz/salgdicommon.cxx                                                                              |   12 
 vcl/quartz/salvd.cxx                                                                                     |   16 
 25 files changed, 1400 insertions(+), 25 deletions(-)

New commits:
commit 48f625b899b2c7774548af078f25dfccd7602d27
Author: Tor Lillqvist <tml at collabora.com>
Date:   Wed Dec 18 00:03:02 2013 +0200

    Add a view-only iOS test app using tiled rendering
    
    I had to add some horrible hacks to make sure the test doc has been
    loaded into a Writer shell before retrieving its size and being able
    to render it. Obviously some better solution is needed. But this is
    just a testbed to get some profiling data.
    
    The app is built using an Xcode project, and in gbuild through a
    custom target based on the MobileLibreOffice one. Setting up the
    various files used (or not used...) at run-time should really be
    factored out from the CustomTarget files.
    
    Change-Id: I1711b0cae9d28a09b73476b2d37d98b1820c9943

diff --git a/config_host.mk.in b/config_host.mk.in
index 09442b5..c50c6e0 100644
--- a/config_host.mk.in
+++ b/config_host.mk.in
@@ -605,6 +605,7 @@ export WPG_CFLAGS=$(gb_SPACE)@WPG_CFLAGS@
 export WPG_LIBS=$(gb_SPACE)@WPG_LIBS@
 export WPS_CFLAGS=$(gb_SPACE)@WPS_CFLAGS@
 export WPS_LIBS=$(gb_SPACE)@WPS_LIBS@
+export XCODE_ARCHS=@XCODE_ARCHS@
 export XINERAMA_LINK=@XINERAMA_LINK@
 export XMLLINT=@XMLLINT@
 export XRANDR_CFLAGS=$(gb_SPACE)@XRANDR_CFLAGS@
diff --git a/ios/CustomTarget_MobileLibreOffice_app.mk b/ios/CustomTarget_MobileLibreOffice_app.mk
index 262cf9d..dcf20d9 100644
--- a/ios/CustomTarget_MobileLibreOffice_app.mk
+++ b/ios/CustomTarget_MobileLibreOffice_app.mk
@@ -8,14 +8,14 @@
 
 #- Env ------------------------------------------------------------------------
 
-DEST_RESOURCE 	:= MobileLibreOffice/resource_link
+MobileLibreOffice_resource 	:= MobileLibreOffice/resource_link
 BUILDID			:=$(shell cd $(SRCDIR) && git log -1 --format=%H)
 
 #- Macros ---------------------------------------------------------------------
 
 define MobileLibreOfficeXcodeBuild 
-	CC=;xcodebuild -project shared/ios_sharedlo.xcodeproj -target ios_sharedlo -arch armv7 -configuration $(if $(ENABLE_DEBUG),Debug,Release) $(1) $(if $(verbose)$(VERBOSE),,>/dev/null)
-	CC=;xcodebuild -project MobileLibreOffice/MobileLibreOffice.xcodeproj -target MobileLibreOffice -arch armv7 -configuration $(if $(ENABLE_DEBUG),Debug,Release) $(1) $(if $(verbose)$(VERBOSE),,>/dev/null)
+	CC=;xcodebuild -project shared/ios_sharedlo.xcodeproj -target ios_sharedlo -arch $(XCODE_ARCHS) -configuration $(if $(ENABLE_DEBUG),Debug,Release) $(1) $(if $(verbose)$(VERBOSE),,>/dev/null)
+	CC=;xcodebuild -project MobileLibreOffice/MobileLibreOffice.xcodeproj -target MobileLibreOffice -arch $(XCODE_ARCHS) -configuration $(if $(ENABLE_DEBUG),Debug,Release) $(1) $(if $(verbose)$(VERBOSE),,>/dev/null)
 endef
 
 #- Targets --------------------------------------------------------------------
@@ -42,56 +42,56 @@ MobileLibreOffice_setup:
 	$(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),ENV,2)
 
 	# Resources #
-	rm -rf $(DEST_RESOURCE) 2>/dev/null
-	mkdir -p $(DEST_RESOURCE)
-	mkdir -p $(DEST_RESOURCE)/ure
+	rm -rf $(MobileLibreOffice_resource) 2>/dev/null
+	mkdir -p $(MobileLibreOffice_resource)
+	mkdir -p $(MobileLibreOffice_resource)/ure
 
 	# copy rdb files
-	cp $(INSTDIR)/ure/share/misc/types.rdb 	    $(DEST_RESOURCE)
-	cp $(INSTDIR)/program/types/offapi.rdb      $(DEST_RESOURCE)
-	cp $(INSTDIR)/program/types/oovbaapi.rdb  	$(DEST_RESOURCE)
-	cp $(INSTDIR)/program/services/services.rdb $(DEST_RESOURCE)
-	cp $(INSTDIR)/ure/share/misc/services.rdb   $(DEST_RESOURCE)/ure
+	cp $(INSTDIR)/ure/share/misc/types.rdb 	    $(MobileLibreOffice_resource)
+	cp $(INSTDIR)/program/types/offapi.rdb      $(MobileLibreOffice_resource)
+	cp $(INSTDIR)/program/types/oovbaapi.rdb  	$(MobileLibreOffice_resource)
+	cp $(INSTDIR)/program/services/services.rdb $(MobileLibreOffice_resource)
+	cp $(INSTDIR)/ure/share/misc/services.rdb   $(MobileLibreOffice_resource)/ure
 
 	# copy .res files
 	# program/resource is hardcoded in tools/source/rc/resmgr.cxx. Sure,
 	# we could set STAR_RESOURCE_PATH instead. sigh...
-	mkdir -p $(DEST_RESOURCE)/program/resource
-	cp $(INSTDIR)/program/resource/*en-US.res $(DEST_RESOURCE)/program/resource
+	mkdir -p $(MobileLibreOffice_resource)/program/resource
+	cp $(INSTDIR)/program/resource/*en-US.res $(MobileLibreOffice_resource)/program/resource
 
 	# soffice.cfg
-	mkdir -p $(DEST_RESOURCE)/share/config
-	cp -R $(INSTDIR)/share/config/soffice.cfg $(DEST_RESOURCE)/share/config
+	mkdir -p $(MobileLibreOffice_resource)/share/config
+	cp -R $(INSTDIR)/share/config/soffice.cfg $(MobileLibreOffice_resource)/share/config
 
 	# "registry"
-	cp -R $(INSTDIR)/share/registry $(DEST_RESOURCE)/share
+	cp -R $(INSTDIR)/share/registry $(MobileLibreOffice_resource)/share
 
 	# Set up rc, the "inifile". See getIniFileName_Impl().
-	file=$(DEST_RESOURCE)/rc; \
+	file=$(MobileLibreOffice_resource)/rc; \
 	echo '[Bootstrap]'                                       >  $$file; \
 	echo 'URE_BOOTSTRAP=file://$$APP_DATA_DIR/fundamentalrc' >> $$file; \
 	echo 'HOME=$$APP_DATA_DIR/tmp'                           >> $$file;
 
 	# Set up fundamentalrc, unorc, bootstraprc and versionrc.
 	# Do we really need all these?
-	file=$(DEST_RESOURCE)/fundamentalrc; \
+	file=$(MobileLibreOffice_resource)/fundamentalrc; \
 	echo '[Bootstrap]'                                      >  $$file; \
 	echo 'BRAND_BASE_DIR=file://$$APP_DATA_DIR'             >> $$file; \
 	echo 'CONFIGURATION_LAYERS=xcsxcu:$${BRAND_BASE_DIR}/share/registry res:$${BRAND_BASE_DIR}/registry' >> $$file;
 
-	file=$(DEST_RESOURCE)/unorc; \
+	file=$(MobileLibreOffice_resource)/unorc; \
 	echo '[Bootstrap]' > $$file;
 
 	# bootstraprc must be in $BRAND_BASE_DIR/program
-	mkdir -p $(DEST_RESOURCE)/program
-	file=$(DEST_RESOURCE)/program/bootstraprc; \
+	mkdir -p $(MobileLibreOffice_resource)/program
+	file=$(MobileLibreOffice_resource)/program/bootstraprc; \
 	echo '[Bootstrap]'                                                              >  $$file; \
 	echo 'InstallMode=<installmode>'                                                >> $$file; \
 	echo "ProductKey=LibreOffice $(PRODUCTVERSION)"                                 >> $$file; \
 	echo 'UserInstallation=file://$$APP_DATA_DIR/../Library/Application%20Support'  >> $$file;
 
 	# Is this really needed?
-	file=$(DEST_RESOURCE)/program/versionrc; \
+	file=$(MobileLibreOffice_resource)/program/versionrc; \
 	echo '[Version]'            >  $$file; \
 	echo 'AllLanguages=en-US'   >> $$file; \
 	echo 'BuildVersion='        >> $$file; \
diff --git a/ios/CustomTarget_TiledLibreOffice_app.mk b/ios/CustomTarget_TiledLibreOffice_app.mk
new file mode 100644
index 0000000..44cacf5
--- /dev/null
+++ b/ios/CustomTarget_TiledLibreOffice_app.mk
@@ -0,0 +1,100 @@
+# -*- 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/.
+
+#- Env ------------------------------------------------------------------------
+
+TiledLibreOffice_resource := experimental/TiledLibreOffice/Resources
+BUILDID			:=$(shell cd $(SRCDIR) && git log -1 --format=%H)
+
+#- Macros ---------------------------------------------------------------------
+
+define TiledLibreOfficeXcodeBuild
+	CC=;xcodebuild -project experimental/TiledLibreOffice/TiledLibreOffice.xcodeproj -target TiledLibreOffice -arch $(XCODE_ARCHS) -configuration $(if $(ENABLE_DEBUG),Debug,Release) $(1) $(if $(verbose)$(VERBOSE),,>/dev/null)
+endef
+
+#- Targets --------------------------------------------------------------------
+
+.PHONY: TiledLibreOffice_setup
+
+# Register target
+$(eval $(call gb_CustomTarget_CustomTarget,ios/TiledLibreOffice))
+
+# Build
+# Depend on the custom target that sets up lo.xcconfig
+$(call gb_CustomTarget_get_target,ios/TiledLibreOffice): $(call gb_CustomTarget_get_target,ios/Lo_Xcconfig) TiledLibreOffice_setup
+	$(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),APP,2)
+	$(call TiledLibreOfficeXcodeBuild, clean build)
+
+# Setup
+TiledLibreOffice_setup:
+	$(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),ENV,2)
+
+	# Resources #
+	rm -rf $(TiledLibreOffice_resource) 2>/dev/null
+	mkdir -p $(TiledLibreOffice_resource)
+	mkdir -p $(TiledLibreOffice_resource)/ure
+
+	# copy rdb files
+	cp $(INSTDIR)/ure/share/misc/types.rdb 	    $(TiledLibreOffice_resource)
+	cp $(INSTDIR)/program/types/offapi.rdb      $(TiledLibreOffice_resource)
+	cp $(INSTDIR)/program/types/oovbaapi.rdb  	$(TiledLibreOffice_resource)
+	cp $(INSTDIR)/program/services/services.rdb $(TiledLibreOffice_resource)
+	cp $(INSTDIR)/ure/share/misc/services.rdb   $(TiledLibreOffice_resource)/ure
+
+	# copy .res files
+	# program/resource is hardcoded in tools/source/rc/resmgr.cxx. Sure,
+	# we could set STAR_RESOURCE_PATH instead. sigh...
+	mkdir -p $(TiledLibreOffice_resource)/program/resource
+	cp $(INSTDIR)/program/resource/*en-US.res $(TiledLibreOffice_resource)/program/resource
+
+	# soffice.cfg
+	mkdir -p $(TiledLibreOffice_resource)/share/config
+	cp -R $(INSTDIR)/share/config/soffice.cfg $(TiledLibreOffice_resource)/share/config
+
+	# "registry"
+	cp -R $(INSTDIR)/share/registry $(TiledLibreOffice_resource)/share
+
+	# Set up rc, the "inifile". See getIniFileName_Impl().
+	file=$(TiledLibreOffice_resource)/rc; \
+	echo '[Bootstrap]'                                       >  $$file; \
+	echo 'URE_BOOTSTRAP=file://$$APP_DATA_DIR/fundamentalrc' >> $$file; \
+	echo 'HOME=$$APP_DATA_DIR/tmp'                           >> $$file;
+
+	# Set up fundamentalrc, unorc, bootstraprc and versionrc.
+	# Do we really need all these?
+	file=$(TiledLibreOffice_resource)/fundamentalrc; \
+	echo '[Bootstrap]'                                      >  $$file; \
+	echo 'BRAND_BASE_DIR=file://$$APP_DATA_DIR'             >> $$file; \
+	echo 'CONFIGURATION_LAYERS=xcsxcu:$${BRAND_BASE_DIR}/share/registry res:$${BRAND_BASE_DIR}/registry' >> $$file;
+
+	file=$(TiledLibreOffice_resource)/unorc; \
+	echo '[Bootstrap]' > $$file;
+
+	# bootstraprc must be in $BRAND_BASE_DIR/program
+	mkdir -p $(TiledLibreOffice_resource)/program
+	file=$(TiledLibreOffice_resource)/program/bootstraprc; \
+	echo '[Bootstrap]'                                                              >  $$file; \
+	echo 'InstallMode=<installmode>'                                                >> $$file; \
+	echo "ProductKey=LibreOffice $(PRODUCTVERSION)"                                 >> $$file; \
+	echo 'UserInstallation=file://$$APP_DATA_DIR/../Library/Application%20Support'  >> $$file;
+
+	# Is this really needed?
+	file=$(TiledLibreOffice_resource)/program/versionrc; \
+	echo '[Version]'            >  $$file; \
+	echo 'AllLanguages=en-US'   >> $$file; \
+	echo 'BuildVersion='        >> $$file; \
+	echo "buildid=$(BUILDID)"   >> $$file; \
+	echo 'ProductMajor=360'     >> $$file; \
+	echo 'ProductMinor=1'       >> $$file;
+
+# Clean
+$(call gb_CustomTarget_get_clean_target,ios/TiledLibreOffice):
+	$(call gb_Output_announce,$(subst $(WORKDIR)/Clean/,,$@),$(false),APP,2)
+	$(call TiledLibreOfficeXcodeBuild, clean)
+
+# vim: set noet sw=4 ts=4:
diff --git a/ios/MobileLibreOffice/MobileLibreOffice.xcodeproj/project.pbxproj b/ios/MobileLibreOffice/MobileLibreOffice.xcodeproj/project.pbxproj
index ce34006..e0dcfc9 100644
--- a/ios/MobileLibreOffice/MobileLibreOffice.xcodeproj/project.pbxproj
+++ b/ios/MobileLibreOffice/MobileLibreOffice.xcodeproj/project.pbxproj
@@ -129,6 +129,26 @@
 		691D78B0180C12D300D52D5E /* types.rdb */ = {isa = PBXFileReference; lastKnownFileType = file; name = types.rdb; path = resource_link/types.rdb; sourceTree = SOURCE_ROOT; };
 		88E94769180DB9B600771808 /* NSObject+MLOFileUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+MLOFileUtils.h"; sourceTree = "<group>"; };
 		88E9476A180DB9B600771808 /* NSObject+MLOFileUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+MLOFileUtils.m"; sourceTree = "<group>"; };
+		BE0898FE1860D5580021A679 /* brand.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = brand.cxx; path = ../../vcl/source/app/brand.cxx; sourceTree = "<group>"; };
+		BE0898FF1860D5580021A679 /* dbggui.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = dbggui.cxx; path = ../../vcl/source/app/dbggui.cxx; sourceTree = "<group>"; };
+		BE0899001860D5580021A679 /* dndhelp.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = dndhelp.cxx; path = ../../vcl/source/app/dndhelp.cxx; sourceTree = "<group>"; };
+		BE0899011860D5580021A679 /* help.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = help.cxx; path = ../../vcl/source/app/help.cxx; sourceTree = "<group>"; };
+		BE0899021860D5580021A679 /* i18nhelp.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = i18nhelp.cxx; path = ../../vcl/source/app/i18nhelp.cxx; sourceTree = "<group>"; };
+		BE0899031860D5580021A679 /* idlemgr.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = idlemgr.cxx; path = ../../vcl/source/app/idlemgr.cxx; sourceTree = "<group>"; };
+		BE0899041860D5580021A679 /* salvtables.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = salvtables.cxx; path = ../../vcl/source/app/salvtables.cxx; sourceTree = "<group>"; };
+		BE0899051860D5580021A679 /* session.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = session.cxx; path = ../../vcl/source/app/session.cxx; sourceTree = "<group>"; };
+		BE0899061860D5580021A679 /* settings.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = settings.cxx; path = ../../vcl/source/app/settings.cxx; sourceTree = "<group>"; };
+		BE0899071860D5580021A679 /* solarmutex.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = solarmutex.cxx; path = ../../vcl/source/app/solarmutex.cxx; sourceTree = "<group>"; };
+		BE0899081860D5580021A679 /* sound.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = sound.cxx; path = ../../vcl/source/app/sound.cxx; sourceTree = "<group>"; };
+		BE0899091860D5580021A679 /* stdtext.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = stdtext.cxx; path = ../../vcl/source/app/stdtext.cxx; sourceTree = "<group>"; };
+		BE08990A1860D5580021A679 /* svapp.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = svapp.cxx; path = ../../vcl/source/app/svapp.cxx; sourceTree = "<group>"; };
+		BE08990B1860D5580021A679 /* svdata.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = svdata.cxx; path = ../../vcl/source/app/svdata.cxx; sourceTree = "<group>"; };
+		BE08990C1860D5580021A679 /* svmain.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = svmain.cxx; path = ../../vcl/source/app/svmain.cxx; sourceTree = "<group>"; };
+		BE08990D1860D5580021A679 /* svmainhook.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = svmainhook.cxx; path = ../../vcl/source/app/svmainhook.cxx; sourceTree = "<group>"; };
+		BE08990E1860D5580021A679 /* timer.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = timer.cxx; path = ../../vcl/source/app/timer.cxx; sourceTree = "<group>"; };
+		BE08990F1860D5580021A679 /* unohelp.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = unohelp.cxx; path = ../../vcl/source/app/unohelp.cxx; sourceTree = "<group>"; };
+		BE0899101860D5580021A679 /* unohelp2.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = unohelp2.cxx; path = ../../vcl/source/app/unohelp2.cxx; sourceTree = "<group>"; };
+		BE0899111860D5580021A679 /* vclevent.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = vclevent.cxx; path = ../../vcl/source/app/vclevent.cxx; sourceTree = "<group>"; };
 		BE82BDB8182261AD00A447B5 /* pagechg.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = pagechg.cxx; path = ../../sw/source/core/layout/pagechg.cxx; sourceTree = "<group>"; };
 		BE82BDBA182261E900A447B5 /* pagepreviewlayout.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = pagepreviewlayout.cxx; path = ../../sw/source/core/view/pagepreviewlayout.cxx; sourceTree = "<group>"; };
 		BE82BDBB182261E900A447B5 /* printdata.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = printdata.cxx; path = ../../sw/source/core/view/printdata.cxx; sourceTree = "<group>"; };
@@ -482,6 +502,33 @@
 			name = Images;
 			sourceTree = "<group>";
 		};
+		BE0898FC1860D5380021A679 /* app */ = {
+			isa = PBXGroup;
+			children = (
+				BE0898FE1860D5580021A679 /* brand.cxx */,
+				BE0898FF1860D5580021A679 /* dbggui.cxx */,
+				BE0899001860D5580021A679 /* dndhelp.cxx */,
+				BE0899011860D5580021A679 /* help.cxx */,
+				BE0899021860D5580021A679 /* i18nhelp.cxx */,
+				BE0899031860D5580021A679 /* idlemgr.cxx */,
+				BE0899041860D5580021A679 /* salvtables.cxx */,
+				BE0899051860D5580021A679 /* session.cxx */,
+				BE0899061860D5580021A679 /* settings.cxx */,
+				BE0899071860D5580021A679 /* solarmutex.cxx */,
+				BE0899081860D5580021A679 /* sound.cxx */,
+				BE0899091860D5580021A679 /* stdtext.cxx */,
+				BE08990A1860D5580021A679 /* svapp.cxx */,
+				BE08990B1860D5580021A679 /* svdata.cxx */,
+				BE08990C1860D5580021A679 /* svmain.cxx */,
+				BE08990D1860D5580021A679 /* svmainhook.cxx */,
+				BE08990E1860D5580021A679 /* timer.cxx */,
+				BE08990F1860D5580021A679 /* unohelp.cxx */,
+				BE0899101860D5580021A679 /* unohelp2.cxx */,
+				BE0899111860D5580021A679 /* vclevent.cxx */,
+			);
+			name = app;
+			sourceTree = "<group>";
+		};
 		BE82BDB41822616200A447B5 /* LibreOffice source files */ = {
 			isa = PBXGroup;
 			children = (
@@ -496,6 +543,7 @@
 		BE82BDB51822617500A447B5 /* vcl */ = {
 			isa = PBXGroup;
 			children = (
+				BE0898FC1860D5380021A679 /* app */,
 				BE82BE4A1822D0E900A447B5 /* quartz */,
 				BE82BDF11822626C00A447B5 /* gdi */,
 				BE82BDF01822625C00A447B5 /* headless */,
diff --git a/ios/Module_ios.mk b/ios/Module_ios.mk
index caf3220..f112b53 100644
--- a/ios/Module_ios.mk
+++ b/ios/Module_ios.mk
@@ -14,6 +14,7 @@ $(eval $(call gb_Module_add_targets,ios,\
 	CustomTarget_Lo_Xcconfig \
 	Executable_LibreOffice \
 	CustomTarget_LibreOffice_app \
+	CustomTarget_TiledLibreOffice_app \
 	CustomTarget_MobileLibreOffice_app \
 ))
 
diff --git a/ios/experimental/TiledLibreOffice/TiledLibreOffice.xcodeproj/project.pbxproj b/ios/experimental/TiledLibreOffice/TiledLibreOffice.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..0f7ad53
--- /dev/null
+++ b/ios/experimental/TiledLibreOffice/TiledLibreOffice.xcodeproj/project.pbxproj
@@ -0,0 +1,497 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 46;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		BE82BD7618218E2E00A447B5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE82BD7518218E2E00A447B5 /* Foundation.framework */; };
+		BE82BD7818218E2E00A447B5 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE82BD7718218E2E00A447B5 /* CoreGraphics.framework */; };
+		BE82BD7A18218E2E00A447B5 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE82BD7918218E2E00A447B5 /* UIKit.framework */; };
+		BE82BD8018218E2E00A447B5 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BE82BD7E18218E2E00A447B5 /* InfoPlist.strings */; };
+		BE82BD8218218E2E00A447B5 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BE82BD8118218E2E00A447B5 /* main.m */; };
+		BE82BD8618218E2E00A447B5 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = BE82BD8518218E2E00A447B5 /* AppDelegate.m */; };
+		BE82BD8C18218E2E00A447B5 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BE82BD8B18218E2E00A447B5 /* ViewController.m */; };
+		BE82BD8E18218E2E00A447B5 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BE82BD8D18218E2E00A447B5 /* Images.xcassets */; };
+		BE82BDAC182190E400A447B5 /* TiledView.m in Sources */ = {isa = PBXBuildFile; fileRef = BE82BDAB182190E400A447B5 /* TiledView.m */; };
+		BE82BDAF1821A1D000A447B5 /* View.m in Sources */ = {isa = PBXBuildFile; fileRef = BE82BDAE1821A1D000A447B5 /* View.m */; };
+		BECAB372186054DE00F814F9 /* lo.mm in Sources */ = {isa = PBXBuildFile; fileRef = BECAB371186054DE00F814F9 /* lo.mm */; };
+		BEEE02D11860ABDB00FBDE67 /* program in Resources */ = {isa = PBXBuildFile; fileRef = BEEE02CE1860ABB700FBDE67 /* program */; };
+		BEEE02D21860ABDB00FBDE67 /* share in Resources */ = {isa = PBXBuildFile; fileRef = BEEE02CF1860ABB700FBDE67 /* share */; };
+		BEEE02D31860ABDB00FBDE67 /* ure in Resources */ = {isa = PBXBuildFile; fileRef = BEEE02D01860ABB700FBDE67 /* ure */; };
+		BEEEF9641860740400FBDE67 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = BEEEF9631860740400FBDE67 /* libiconv.dylib */; };
+		BEEEF9661860741400FBDE67 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = BEEEF9651860741400FBDE67 /* libz.dylib */; };
+		BEEEF96A1860A25400FBDE67 /* test1.odt in Resources */ = {isa = PBXBuildFile; fileRef = BEEEF9691860A25400FBDE67 /* test1.odt */; };
+		BEEEFE011860A89100FBDE67 /* fundamentalrc in Resources */ = {isa = PBXBuildFile; fileRef = BEEEF96D1860A82900FBDE67 /* fundamentalrc */; };
+		BEEEFE021860A89100FBDE67 /* offapi.rdb in Resources */ = {isa = PBXBuildFile; fileRef = BEEEF96E1860A82900FBDE67 /* offapi.rdb */; };
+		BEEEFE031860A89100FBDE67 /* oovbaapi.rdb in Resources */ = {isa = PBXBuildFile; fileRef = BEEEF96F1860A82900FBDE67 /* oovbaapi.rdb */; };
+		BEEEFE041860A89100FBDE67 /* rc in Resources */ = {isa = PBXBuildFile; fileRef = BEEEF9AA1860A82900FBDE67 /* rc */; };
+		BEEEFE051860A89100FBDE67 /* services.rdb in Resources */ = {isa = PBXBuildFile; fileRef = BEEEF9AB1860A82900FBDE67 /* services.rdb */; };
+		BEEEFE061860A89100FBDE67 /* types.rdb in Resources */ = {isa = PBXBuildFile; fileRef = BEEEFDFD1860A82C00FBDE67 /* types.rdb */; };
+		BEEEFE071860A89100FBDE67 /* unorc in Resources */ = {isa = PBXBuildFile; fileRef = BEEEFDFE1860A82C00FBDE67 /* unorc */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+		BE0898E81860D42B0021A679 /* brand.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = brand.cxx; path = ../../../vcl/source/app/brand.cxx; sourceTree = "<group>"; };
+		BE0898E91860D42B0021A679 /* dbggui.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = dbggui.cxx; path = ../../../vcl/source/app/dbggui.cxx; sourceTree = "<group>"; };
+		BE0898EA1860D42B0021A679 /* dndhelp.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = dndhelp.cxx; path = ../../../vcl/source/app/dndhelp.cxx; sourceTree = "<group>"; };
+		BE0898EB1860D42B0021A679 /* help.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = help.cxx; path = ../../../vcl/source/app/help.cxx; sourceTree = "<group>"; };
+		BE0898EC1860D42B0021A679 /* i18nhelp.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = i18nhelp.cxx; path = ../../../vcl/source/app/i18nhelp.cxx; sourceTree = "<group>"; };
+		BE0898ED1860D42B0021A679 /* idlemgr.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = idlemgr.cxx; path = ../../../vcl/source/app/idlemgr.cxx; sourceTree = "<group>"; };
+		BE0898EE1860D42B0021A679 /* salvtables.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = salvtables.cxx; path = ../../../vcl/source/app/salvtables.cxx; sourceTree = "<group>"; };
+		BE0898EF1860D42B0021A679 /* session.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = session.cxx; path = ../../../vcl/source/app/session.cxx; sourceTree = "<group>"; };
+		BE0898F01860D42B0021A679 /* settings.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = settings.cxx; path = ../../../vcl/source/app/settings.cxx; sourceTree = "<group>"; };
+		BE0898F11860D42B0021A679 /* solarmutex.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = solarmutex.cxx; path = ../../../vcl/source/app/solarmutex.cxx; sourceTree = "<group>"; };
+		BE0898F21860D42B0021A679 /* sound.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = sound.cxx; path = ../../../vcl/source/app/sound.cxx; sourceTree = "<group>"; };
+		BE0898F31860D42B0021A679 /* stdtext.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = stdtext.cxx; path = ../../../vcl/source/app/stdtext.cxx; sourceTree = "<group>"; };
+		BE0898F41860D42B0021A679 /* svapp.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = svapp.cxx; path = ../../../vcl/source/app/svapp.cxx; sourceTree = "<group>"; };
+		BE0898F51860D42B0021A679 /* svdata.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = svdata.cxx; path = ../../../vcl/source/app/svdata.cxx; sourceTree = "<group>"; };
+		BE0898F61860D42B0021A679 /* svmain.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = svmain.cxx; path = ../../../vcl/source/app/svmain.cxx; sourceTree = "<group>"; };
+		BE0898F71860D42B0021A679 /* svmainhook.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = svmainhook.cxx; path = ../../../vcl/source/app/svmainhook.cxx; sourceTree = "<group>"; };
+		BE0898F81860D42B0021A679 /* timer.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = timer.cxx; path = ../../../vcl/source/app/timer.cxx; sourceTree = "<group>"; };
+		BE0898F91860D42B0021A679 /* unohelp.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = unohelp.cxx; path = ../../../vcl/source/app/unohelp.cxx; sourceTree = "<group>"; };
+		BE0898FA1860D42B0021A679 /* unohelp2.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = unohelp2.cxx; path = ../../../vcl/source/app/unohelp2.cxx; sourceTree = "<group>"; };
+		BE0898FB1860D42B0021A679 /* vclevent.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = vclevent.cxx; path = ../../../vcl/source/app/vclevent.cxx; sourceTree = "<group>"; };
+		BE0899141860F6450021A679 /* ctfonts.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ctfonts.cxx; path = ../../../vcl/quartz/ctfonts.cxx; sourceTree = "<group>"; };
+		BE0899151860F6450021A679 /* ctlayout.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ctlayout.cxx; path = ../../../vcl/quartz/ctlayout.cxx; sourceTree = "<group>"; };
+		BE0899161860F6450021A679 /* salbmp.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = salbmp.cxx; path = ../../../vcl/quartz/salbmp.cxx; sourceTree = "<group>"; };
+		BE0899171860F6450021A679 /* salgdi.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = salgdi.cxx; path = ../../../vcl/quartz/salgdi.cxx; sourceTree = "<group>"; };
+		BE0899181860F6450021A679 /* salgdicommon.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = salgdicommon.cxx; path = ../../../vcl/quartz/salgdicommon.cxx; sourceTree = "<group>"; };
+		BE0899191860F6450021A679 /* salgdiutils.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = salgdiutils.cxx; path = ../../../vcl/quartz/salgdiutils.cxx; sourceTree = "<group>"; };
+		BE08991A1860F6450021A679 /* salmathutils.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = salmathutils.cxx; path = ../../../vcl/quartz/salmathutils.cxx; sourceTree = "<group>"; };
+		BE08991B1860F6450021A679 /* salvd.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = salvd.cxx; path = ../../../vcl/quartz/salvd.cxx; sourceTree = "<group>"; };
+		BE08991C1860F6450021A679 /* utils.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = utils.cxx; path = ../../../vcl/quartz/utils.cxx; sourceTree = "<group>"; };
+		BE82BD7218218E2E00A447B5 /* TiledLibreOffice.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TiledLibreOffice.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		BE82BD7518218E2E00A447B5 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+		BE82BD7718218E2E00A447B5 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+		BE82BD7918218E2E00A447B5 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+		BE82BD7D18218E2E00A447B5 /* TiledLibreOffice-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TiledLibreOffice-Info.plist"; sourceTree = "<group>"; };
+		BE82BD7F18218E2E00A447B5 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		BE82BD8118218E2E00A447B5 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+		BE82BD8318218E2E00A447B5 /* TiledLibreOffice-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TiledLibreOffice-Prefix.pch"; sourceTree = "<group>"; };
+		BE82BD8418218E2E00A447B5 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+		BE82BD8518218E2E00A447B5 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+		BE82BD8A18218E2E00A447B5 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
+		BE82BD8B18218E2E00A447B5 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
+		BE82BD8D18218E2E00A447B5 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
+		BE82BD9418218E2E00A447B5 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
+		BE82BDAA182190E400A447B5 /* TiledView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TiledView.h; sourceTree = "<group>"; };
+		BE82BDAB182190E400A447B5 /* TiledView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TiledView.m; sourceTree = "<group>"; };
+		BE82BDAD1821A1D000A447B5 /* View.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = View.h; sourceTree = "<group>"; };
+		BE82BDAE1821A1D000A447B5 /* View.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = View.m; sourceTree = "<group>"; };
+		BECAB371186054DE00F814F9 /* lo.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = lo.mm; sourceTree = "<group>"; };
+		BEDB0F08185B7537009A6F26 /* lo.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = lo.xcconfig; path = ../../../lo.xcconfig; sourceTree = "<group>"; };
+		BEEE02CE1860ABB700FBDE67 /* program */ = {isa = PBXFileReference; lastKnownFileType = folder; name = program; path = Resources/program; sourceTree = SOURCE_ROOT; };
+		BEEE02CF1860ABB700FBDE67 /* share */ = {isa = PBXFileReference; lastKnownFileType = folder; name = share; path = Resources/share; sourceTree = SOURCE_ROOT; };
+		BEEE02D01860ABB700FBDE67 /* ure */ = {isa = PBXFileReference; lastKnownFileType = folder; name = ure; path = Resources/ure; sourceTree = SOURCE_ROOT; };
+		BEEEF9631860740400FBDE67 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; };
+		BEEEF9651860741400FBDE67 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
+		BEEEF9691860A25400FBDE67 /* test1.odt */ = {isa = PBXFileReference; lastKnownFileType = file; name = test1.odt; path = ../../../../odk/examples/java/DocumentHandling/test/test1.odt; sourceTree = "<group>"; };
+		BEEEF96D1860A82900FBDE67 /* fundamentalrc */ = {isa = PBXFileReference; lastKnownFileType = text; name = fundamentalrc; path = Resources/fundamentalrc; sourceTree = SOURCE_ROOT; };
+		BEEEF96E1860A82900FBDE67 /* offapi.rdb */ = {isa = PBXFileReference; lastKnownFileType = file; name = offapi.rdb; path = Resources/offapi.rdb; sourceTree = SOURCE_ROOT; };
+		BEEEF96F1860A82900FBDE67 /* oovbaapi.rdb */ = {isa = PBXFileReference; lastKnownFileType = file; name = oovbaapi.rdb; path = Resources/oovbaapi.rdb; sourceTree = SOURCE_ROOT; };
+		BEEEF9AA1860A82900FBDE67 /* rc */ = {isa = PBXFileReference; lastKnownFileType = text; name = rc; path = Resources/rc; sourceTree = SOURCE_ROOT; };
+		BEEEF9AB1860A82900FBDE67 /* services.rdb */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = services.rdb; path = Resources/services.rdb; sourceTree = SOURCE_ROOT; };
+		BEEEFDFD1860A82C00FBDE67 /* types.rdb */ = {isa = PBXFileReference; lastKnownFileType = file; name = types.rdb; path = Resources/types.rdb; sourceTree = SOURCE_ROOT; };
+		BEEEFDFE1860A82C00FBDE67 /* unorc */ = {isa = PBXFileReference; lastKnownFileType = text; name = unorc; path = Resources/unorc; sourceTree = SOURCE_ROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		BE82BD6F18218E2E00A447B5 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				BEEEF9661860741400FBDE67 /* libz.dylib in Frameworks */,
+				BEEEF9641860740400FBDE67 /* libiconv.dylib in Frameworks */,
+				BE82BD7818218E2E00A447B5 /* CoreGraphics.framework in Frameworks */,
+				BE82BD7A18218E2E00A447B5 /* UIKit.framework in Frameworks */,
+				BE82BD7618218E2E00A447B5 /* Foundation.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		BE0898E61860D3CD0021A679 /* LibreOffice source files */ = {
+			isa = PBXGroup;
+			children = (
+				BE0898E71860D3DA0021A679 /* vcl */,
+			);
+			name = "LibreOffice source files";
+			sourceTree = "<group>";
+		};
+		BE0898E71860D3DA0021A679 /* vcl */ = {
+			isa = PBXGroup;
+			children = (
+				BE0899121860D78B0021A679 /* app */,
+				BE0899131860F6100021A679 /* quartz */,
+			);
+			name = vcl;
+			sourceTree = "<group>";
+		};
+		BE0899121860D78B0021A679 /* app */ = {
+			isa = PBXGroup;
+			children = (
+				BE0898E81860D42B0021A679 /* brand.cxx */,
+				BE0898E91860D42B0021A679 /* dbggui.cxx */,
+				BE0898EA1860D42B0021A679 /* dndhelp.cxx */,
+				BE0898EB1860D42B0021A679 /* help.cxx */,
+				BE0898EC1860D42B0021A679 /* i18nhelp.cxx */,
+				BE0898ED1860D42B0021A679 /* idlemgr.cxx */,
+				BE0898EE1860D42B0021A679 /* salvtables.cxx */,
+				BE0898EF1860D42B0021A679 /* session.cxx */,
+				BE0898F01860D42B0021A679 /* settings.cxx */,
+				BE0898F11860D42B0021A679 /* solarmutex.cxx */,
+				BE0898F21860D42B0021A679 /* sound.cxx */,
+				BE0898F31860D42B0021A679 /* stdtext.cxx */,
+				BE0898F41860D42B0021A679 /* svapp.cxx */,
+				BE0898F51860D42B0021A679 /* svdata.cxx */,
+				BE0898F61860D42B0021A679 /* svmain.cxx */,
+				BE0898F71860D42B0021A679 /* svmainhook.cxx */,
+				BE0898F81860D42B0021A679 /* timer.cxx */,
+				BE0898F91860D42B0021A679 /* unohelp.cxx */,
+				BE0898FA1860D42B0021A679 /* unohelp2.cxx */,
+				BE0898FB1860D42B0021A679 /* vclevent.cxx */,
+			);
+			name = app;
+			sourceTree = "<group>";
+		};
+		BE0899131860F6100021A679 /* quartz */ = {
+			isa = PBXGroup;
+			children = (
+				BE0899141860F6450021A679 /* ctfonts.cxx */,
+				BE0899151860F6450021A679 /* ctlayout.cxx */,
+				BE0899161860F6450021A679 /* salbmp.cxx */,
+				BE0899171860F6450021A679 /* salgdi.cxx */,
+				BE0899181860F6450021A679 /* salgdicommon.cxx */,
+				BE0899191860F6450021A679 /* salgdiutils.cxx */,
+				BE08991A1860F6450021A679 /* salmathutils.cxx */,
+				BE08991B1860F6450021A679 /* salvd.cxx */,
+				BE08991C1860F6450021A679 /* utils.cxx */,
+			);
+			name = quartz;
+			sourceTree = "<group>";
+		};
+		BE82BD6918218E2E00A447B5 = {
+			isa = PBXGroup;
+			children = (
+				BE0898E61860D3CD0021A679 /* LibreOffice source files */,
+				BE82BD7B18218E2E00A447B5 /* TiledLibreOffice */,
+				BEEEF9681860A21F00FBDE67 /* Resources */,
+				BE82BD7418218E2E00A447B5 /* Frameworks */,
+				BE82BD7318218E2E00A447B5 /* Products */,
+			);
+			sourceTree = "<group>";
+		};
+		BE82BD7318218E2E00A447B5 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				BE82BD7218218E2E00A447B5 /* TiledLibreOffice.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		BE82BD7418218E2E00A447B5 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				BEEEF9651860741400FBDE67 /* libz.dylib */,
+				BEEEF9631860740400FBDE67 /* libiconv.dylib */,
+				BE82BD7518218E2E00A447B5 /* Foundation.framework */,
+				BE82BD7718218E2E00A447B5 /* CoreGraphics.framework */,
+				BE82BD7918218E2E00A447B5 /* UIKit.framework */,
+				BE82BD9418218E2E00A447B5 /* XCTest.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		BE82BD7B18218E2E00A447B5 /* TiledLibreOffice */ = {
+			isa = PBXGroup;
+			children = (
+				BECAB371186054DE00F814F9 /* lo.mm */,
+				BE82BD8418218E2E00A447B5 /* AppDelegate.h */,
+				BE82BD8518218E2E00A447B5 /* AppDelegate.m */,
+				BE82BDAA182190E400A447B5 /* TiledView.h */,
+				BE82BDAB182190E400A447B5 /* TiledView.m */,
+				BE82BDAD1821A1D000A447B5 /* View.h */,
+				BE82BDAE1821A1D000A447B5 /* View.m */,
+				BE82BD8A18218E2E00A447B5 /* ViewController.h */,
+				BE82BD8B18218E2E00A447B5 /* ViewController.m */,
+				BE82BD8D18218E2E00A447B5 /* Images.xcassets */,
+				BE82BD7C18218E2E00A447B5 /* Supporting Files */,
+			);
+			path = TiledLibreOffice;
+			sourceTree = "<group>";
+		};
+		BE82BD7C18218E2E00A447B5 /* Supporting Files */ = {
+			isa = PBXGroup;
+			children = (
+				BEDB0F08185B7537009A6F26 /* lo.xcconfig */,
+				BE82BD7D18218E2E00A447B5 /* TiledLibreOffice-Info.plist */,
+				BE82BD7E18218E2E00A447B5 /* InfoPlist.strings */,
+				BE82BD8118218E2E00A447B5 /* main.m */,
+				BE82BD8318218E2E00A447B5 /* TiledLibreOffice-Prefix.pch */,
+			);
+			name = "Supporting Files";
+			sourceTree = "<group>";
+		};
+		BEEEF9681860A21F00FBDE67 /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				BEEEF96D1860A82900FBDE67 /* fundamentalrc */,
+				BEEEF96E1860A82900FBDE67 /* offapi.rdb */,
+				BEEEF96F1860A82900FBDE67 /* oovbaapi.rdb */,
+				BEEE02CE1860ABB700FBDE67 /* program */,
+				BEEEF9AA1860A82900FBDE67 /* rc */,
+				BEEEF9AB1860A82900FBDE67 /* services.rdb */,
+				BEEE02CF1860ABB700FBDE67 /* share */,
+				BEEEFDFD1860A82C00FBDE67 /* types.rdb */,
+				BEEEFDFE1860A82C00FBDE67 /* unorc */,
+				BEEE02D01860ABB700FBDE67 /* ure */,
+				BEEEF9691860A25400FBDE67 /* test1.odt */,
+			);
+			name = Resources;
+			path = TiledLibreOffice;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		BE82BD7118218E2E00A447B5 /* TiledLibreOffice */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = BE82BDA418218E2E00A447B5 /* Build configuration list for PBXNativeTarget "TiledLibreOffice" */;
+			buildPhases = (
+				BE82BD6E18218E2E00A447B5 /* Sources */,
+				BE82BD6F18218E2E00A447B5 /* Frameworks */,
+				BE82BD7018218E2E00A447B5 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = TiledLibreOffice;
+			productName = TiledLibreOffice;
+			productReference = BE82BD7218218E2E00A447B5 /* TiledLibreOffice.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		BE82BD6A18218E2E00A447B5 /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0500;
+			};
+			buildConfigurationList = BE82BD6D18218E2E00A447B5 /* Build configuration list for PBXProject "TiledLibreOffice" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+			);
+			mainGroup = BE82BD6918218E2E00A447B5;
+			productRefGroup = BE82BD7318218E2E00A447B5 /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				BE82BD7118218E2E00A447B5 /* TiledLibreOffice */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		BE82BD7018218E2E00A447B5 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				BE82BD8E18218E2E00A447B5 /* Images.xcassets in Resources */,
+				BE82BD8018218E2E00A447B5 /* InfoPlist.strings in Resources */,
+				BEEEFE011860A89100FBDE67 /* fundamentalrc in Resources */,
+				BEEEFE021860A89100FBDE67 /* offapi.rdb in Resources */,
+				BEEEFE031860A89100FBDE67 /* oovbaapi.rdb in Resources */,
+				BEEE02D11860ABDB00FBDE67 /* program in Resources */,
+				BEEEFE041860A89100FBDE67 /* rc in Resources */,
+				BEEEFE051860A89100FBDE67 /* services.rdb in Resources */,
+				BEEE02D21860ABDB00FBDE67 /* share in Resources */,
+				BEEEFE061860A89100FBDE67 /* types.rdb in Resources */,
+				BEEEFE071860A89100FBDE67 /* unorc in Resources */,
+				BEEE02D31860ABDB00FBDE67 /* ure in Resources */,
+				BEEEF96A1860A25400FBDE67 /* test1.odt in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		BE82BD6E18218E2E00A447B5 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				BECAB372186054DE00F814F9 /* lo.mm in Sources */,
+				BE82BDAF1821A1D000A447B5 /* View.m in Sources */,
+				BE82BDAC182190E400A447B5 /* TiledView.m in Sources */,
+				BE82BD8C18218E2E00A447B5 /* ViewController.m in Sources */,
+				BE82BD8618218E2E00A447B5 /* AppDelegate.m in Sources */,
+				BE82BD8218218E2E00A447B5 /* main.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+		BE82BD7E18218E2E00A447B5 /* InfoPlist.strings */ = {
+			isa = PBXVariantGroup;
+			children = (
+				BE82BD7F18218E2E00A447B5 /* en */,
+			);
+			name = InfoPlist.strings;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		BE82BDA218218E2E00A447B5 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = BEDB0F08185B7537009A6F26 /* lo.xcconfig */;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				HEADER_SEARCH_PATHS = (
+					"$(inherited)",
+					/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+					"$(LO_BUILDDIR)/config_host",
+					"$(LO_SRCDIR)/include",
+					"$(LO_WORKDIR)/UnoApiHeadersTarget/udkapi/comprehensive",
+					"$(LO_WORKDIR)/UnoApiHeadersTarget/offapi/comprehensive",
+				);
+				IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+				ONLY_ACTIVE_ARCH = YES;
+				OTHER_LDFLAGS = "$(LINK_LDFLAGS)";
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = 2;
+			};
+			name = Debug;
+		};
+		BE82BDA318218E2E00A447B5 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = BEDB0F08185B7537009A6F26 /* lo.xcconfig */;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = YES;
+				ENABLE_NS_ASSERTIONS = NO;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				HEADER_SEARCH_PATHS = (
+					"$(inherited)",
+					/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+					"$(LO_BUILDDIR)/config_host",
+					$LO_SRCDIR/include,
+					"$(LO_WORKDIR)/UnoApiHeadersTarget/udkapi/comprehensive",
+					"$(LO_WORKDIR)/UnoApiHeadersTarget/offapi/comprehensive",
+				);
+				IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+				ONLY_ACTIVE_ARCH = YES;
+				OTHER_LDFLAGS = "$(LINK_LDFLAGS)";
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = 2;
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		BE82BDA518218E2E00A447B5 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "TiledLibreOffice/TiledLibreOffice-Prefix.pch";
+				INFOPLIST_FILE = "TiledLibreOffice/TiledLibreOffice-Info.plist";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				WRAPPER_EXTENSION = app;
+			};
+			name = Debug;
+		};
+		BE82BDA618218E2E00A447B5 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "TiledLibreOffice/TiledLibreOffice-Prefix.pch";
+				INFOPLIST_FILE = "TiledLibreOffice/TiledLibreOffice-Info.plist";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				WRAPPER_EXTENSION = app;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		BE82BD6D18218E2E00A447B5 /* Build configuration list for PBXProject "TiledLibreOffice" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				BE82BDA218218E2E00A447B5 /* Debug */,
+				BE82BDA318218E2E00A447B5 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		BE82BDA418218E2E00A447B5 /* Build configuration list for PBXNativeTarget "TiledLibreOffice" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				BE82BDA518218E2E00A447B5 /* Debug */,
+				BE82BDA618218E2E00A447B5 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = BE82BD6A18218E2E00A447B5 /* Project object */;
+}
diff --git a/ios/experimental/TiledLibreOffice/TiledLibreOffice/AppDelegate.h b/ios/experimental/TiledLibreOffice/TiledLibreOffice/AppDelegate.h
new file mode 100644
index 0000000..e128714
--- /dev/null
+++ b/ios/experimental/TiledLibreOffice/TiledLibreOffice/AppDelegate.h
@@ -0,0 +1,19 @@
+// -*- 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 AppDelegate : UIResponder <UIApplicationDelegate>
+
+ at property (strong, nonatomic) UIWindow *window;
+
+- (void)threadMainMethod: (id) argument;
+
+ at end
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/experimental/TiledLibreOffice/TiledLibreOffice/AppDelegate.m b/ios/experimental/TiledLibreOffice/TiledLibreOffice/AppDelegate.m
new file mode 100644
index 0000000..9b9e525
--- /dev/null
+++ b/ios/experimental/TiledLibreOffice/TiledLibreOffice/AppDelegate.m
@@ -0,0 +1,118 @@
+// -*- 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 <touch/touch.h>
+
+#import "AppDelegate.h"
+#import "View.h"
+#import "ViewController.h"
+#import "lo.h"
+
+ at implementation AppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
+    self.window.backgroundColor = [UIColor whiteColor];
+    [self.window makeKeyAndVisible];
+
+    ViewController *vc = [[ViewController alloc] init];
+    self.window.rootViewController = vc;
+
+    [[[NSThread alloc] initWithTarget:self selector:@selector(threadMainMethod:) object:nil] start];
+
+    vc.view = [[View alloc] initWithFrame:[self.window frame]];
+
+    return YES;
+}
+
+- (void)threadMainMethod:(id)argument
+{
+    (void) argument;
+
+    @autoreleasepool {
+        lo_initialize();
+        touch_lo_runMain();
+    }
+}
+
+- (void)applicationWillResignActive:(UIApplication *)application
+{
+    // Sent when the application is about to move from active to
+    // inactive state. This can occur for certain types of temporary
+    // interruptions (such as an incoming phone call or SMS message)
+    // or when the user quits the application and it begins the
+    // transition to the background state. Use this method to pause
+    // ongoing tasks, disable timers, and throttle down OpenGL ES
+    // frame rates. Games should use this method to pause the game.
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application
+{
+    // Use this method to release shared resources, save user data,
+    // invalidate timers, and store enough application state
+    // information to restore your application to its current state in
+    // case it is terminated later. If your application supports
+    // background execution, this method is called instead of
+    // applicationWillTerminate: when the user quits.
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application
+{
+    // Called as part of the transition from the background to the
+    // inactive state; here you can undo many of the changes made on
+    // entering the background.
+}
+
+- (void)applicationDidBecomeActive:(UIApplication *)application
+{
+    // Restart any tasks that were paused (or not yet started) while
+    // the application was inactive. If the application was previously
+    // in the background, optionally refresh the user interface.
+}
+
+- (void)applicationWillTerminate:(UIApplication *)application
+{
+    // Called when the application is about to terminate. Save data if
+    // appropriate. See also applicationDidEnterBackground:.
+}
+
+ at end
+
+// dummies
+
+void touch_ui_selection_start(MLOSelectionKind kind,
+                              const void *documentHandle,
+                              MLORect *rectangles,
+                              int rectangleCount,
+                              void *preview)
+{
+}
+
+void touch_ui_selection_none()
+{
+}
+
+MLODialogResult touch_ui_dialog_modal(MLODialogKind kind, const char *message)
+{
+    return MLODialogCancel;
+}
+
+void touch_ui_show_keyboard()
+{
+}
+
+void touch_ui_hide_keyboard()
+{
+}
+
+void touch_ui_damaged(int minX, int minY, int width, int height)
+{
+}
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/experimental/TiledLibreOffice/TiledLibreOffice/Images.xcassets/AppIcon.appiconset/Contents.json b/ios/experimental/TiledLibreOffice/TiledLibreOffice/Images.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..a4645e6
--- /dev/null
+++ b/ios/experimental/TiledLibreOffice/TiledLibreOffice/Images.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,38 @@
+{
+  "images" : [
+    {
+      "idiom" : "ipad",
+      "size" : "29x29",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "29x29",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "40x40",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "40x40",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "76x76",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "76x76",
+      "scale" : "2x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file
diff --git a/ios/experimental/TiledLibreOffice/TiledLibreOffice/Images.xcassets/LaunchImage.launchimage/Contents.json b/ios/experimental/TiledLibreOffice/TiledLibreOffice/Images.xcassets/LaunchImage.launchimage/Contents.json
new file mode 100644
index 0000000..a0ad363
--- /dev/null
+++ b/ios/experimental/TiledLibreOffice/TiledLibreOffice/Images.xcassets/LaunchImage.launchimage/Contents.json
@@ -0,0 +1,36 @@
+{
+  "images" : [
+    {
+      "orientation" : "portrait",
+      "idiom" : "ipad",
+      "extent" : "full-screen",
+      "minimum-system-version" : "7.0",
+      "scale" : "1x"
+    },
+    {
+      "orientation" : "landscape",
+      "idiom" : "ipad",
+      "extent" : "full-screen",
+      "minimum-system-version" : "7.0",
+      "scale" : "1x"
+    },
+    {
+      "orientation" : "portrait",
+      "idiom" : "ipad",
+      "extent" : "full-screen",
+      "minimum-system-version" : "7.0",
+      "scale" : "2x"
+    },
+    {
+      "orientation" : "landscape",
+      "idiom" : "ipad",
+      "extent" : "full-screen",
+      "minimum-system-version" : "7.0",
+      "scale" : "2x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file
diff --git a/ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledLibreOffice-Info.plist b/ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledLibreOffice-Info.plist
new file mode 100644
index 0000000..c20aa82
--- /dev/null
+++ b/ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledLibreOffice-Info.plist
@@ -0,0 +1,39 @@
+<?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>UISupportedInterfaceOrientations~ipad</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+</dict>
+</plist>
diff --git a/ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledLibreOffice-Prefix.pch b/ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledLibreOffice-Prefix.pch
new file mode 100644
index 0000000..638bf30
--- /dev/null
+++ b/ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledLibreOffice-Prefix.pch
@@ -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 <Availability.h>
+
+#ifndef __IPHONE_5_0
+#warning "This project uses features only available in iOS SDK 5.0 and later."
+#endif
+
+#ifdef __OBJC__
+    #include <premac.h>
+    #import <UIKit/UIKit.h>
+    #import <Foundation/Foundation.h>
+    #include <postmac.h>
+#endif
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledView.h b/ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledView.h
new file mode 100644
index 0000000..fb42358
--- /dev/null
+++ b/ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledView.h
@@ -0,0 +1,17 @@
+// -*- 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 TiledView : UIView
+
+- (id)initWithFrame:(CGRect)frame andScale:(CGFloat)scale;
+
+ at end
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledView.m b/ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledView.m
new file mode 100644
index 0000000..0fe9c94
--- /dev/null
+++ b/ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledView.m
@@ -0,0 +1,62 @@
+// -*- 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 <touch/touch.h>
+
+#import "View.h"
+#import "TiledView.h"
+
+ at interface TiledView ()
+
+ at property CGFloat scale;
+
+ at end
+
+ at implementation TiledView
+
+- (id)initWithFrame:(CGRect)frame andScale:(CGFloat)scale
+{
+    self = [super initWithFrame:frame];
+    if (self) {
+        self.scale = scale;
+        CATiledLayer *catl = (CATiledLayer*) [self layer];
+        catl.tileSize = CGSizeMake(512, 512);
+        catl.levelsOfDetail = 4;
+        catl.levelsOfDetailBias = 4;
+    }
+    return self;
+}
+
++ (Class)layerClass
+{
+    return [CATiledLayer class];
+}
+
+- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
+{
+    CGContextSaveGState(ctx);
+
+    CGRect bb = CGContextGetClipBoundingBox(ctx);
+
+    // NSLog(@"%.0fx%.0f@(%.0f,%.0f) %f", bb.size.width, bb.size.height, bb.origin.x, bb.origin.y, 1/[(View *) [self superview] zoomScale]);
+
+    CGContextTranslateCTM(ctx, bb.origin.x, bb.origin.y);
+
+    NSLog(@"tile:%.0fx%.0f at:(%.0f,%.0f) size:%.0fx%.0f", bb.size.width, bb.size.height, bb.origin.x/self.scale, bb.origin.y/self.scale, bb.size.width/self.scale, bb.size.height/self.scale);
+
+    touch_lo_draw_tile(ctx,
+                       bb.size.width, bb.size.height,
+                       CGPointMake(bb.origin.x/self.scale, bb.origin.y/self.scale),
+                       CGSizeMake(bb.size.width/self.scale, bb.size.height/self.scale));
+
+    CGContextRestoreGState(ctx);
+}
+
+ at end
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/experimental/TiledLibreOffice/TiledLibreOffice/View.h b/ios/experimental/TiledLibreOffice/TiledLibreOffice/View.h
new file mode 100644
index 0000000..3043632
--- /dev/null
+++ b/ios/experimental/TiledLibreOffice/TiledLibreOffice/View.h
@@ -0,0 +1,15 @@
+// -*- 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 : UIScrollView <UIScrollViewDelegate>
+
+ at end
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/experimental/TiledLibreOffice/TiledLibreOffice/View.m b/ios/experimental/TiledLibreOffice/TiledLibreOffice/View.m
new file mode 100644
index 0000000..be27c09
--- /dev/null
+++ b/ios/experimental/TiledLibreOffice/TiledLibreOffice/View.m
@@ -0,0 +1,57 @@
+// -*- 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 <touch/touch.h>
+
+#import "View.h"
+#import "TiledView.h"
+
+ at interface View ()
+
+ at property UIView *subView;
+
+ at end
+
+ at implementation View
+
+- (id)initWithFrame:(CGRect)frame
+{
+    self = [super initWithFrame:frame];
+    if (self) {
+        [self setMaximumZoomScale:4];
+        [self setDelegate:self];
+
+        MLODpxSize docSize = touch_lo_get_content_size();
+
+        double widthScale = frame.size.width / docSize.width;
+        double docAspectRatio = docSize.height / docSize.width;
+
+        NSLog(@"View frame=%.0fx%.0f docSize=%.0fx%.0f scale=%.3f aspectRatio=%.3f", frame.size.width, frame.size.height, docSize.width, docSize.height, widthScale, docAspectRatio);
+
+        self.subView = [[TiledView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.width*docAspectRatio) andScale:widthScale];
+        [self addSubview:self.subView];
+    }
+    return self;
+}
+
+- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
+{
+    return self.subView;
+}
+
+- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
+{
+}
+
+- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale
+{
+}
+
+ at end
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/experimental/TiledLibreOffice/TiledLibreOffice/ViewController.h b/ios/experimental/TiledLibreOffice/TiledLibreOffice/ViewController.h
new file mode 100644
index 0000000..b94b718
--- /dev/null
+++ b/ios/experimental/TiledLibreOffice/TiledLibreOffice/ViewController.h
@@ -0,0 +1,15 @@
+// -*- 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/TiledLibreOffice/TiledLibreOffice/ViewController.m b/ios/experimental/TiledLibreOffice/TiledLibreOffice/ViewController.m
new file mode 100644
index 0000000..b8bc2e3
--- /dev/null
+++ b/ios/experimental/TiledLibreOffice/TiledLibreOffice/ViewController.m
@@ -0,0 +1,29 @@
+// -*- 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 interface ViewController ()
+
+ at end
+
+ at implementation ViewController
+
+- (void)viewDidLoad
+{
+    [super viewDidLoad];
+}
+
+- (void)didReceiveMemoryWarning
+{
+    [super didReceiveMemoryWarning];
+}
+
+ at end
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/experimental/TiledLibreOffice/TiledLibreOffice/en.lproj/InfoPlist.strings b/ios/experimental/TiledLibreOffice/TiledLibreOffice/en.lproj/InfoPlist.strings
new file mode 100644
index 0000000..477b28f
--- /dev/null
+++ b/ios/experimental/TiledLibreOffice/TiledLibreOffice/en.lproj/InfoPlist.strings
@@ -0,0 +1,2 @@
+/* Localized versions of Info.plist keys */
+
diff --git a/ios/experimental/TiledLibreOffice/TiledLibreOffice/lo.h b/ios/experimental/TiledLibreOffice/TiledLibreOffice/lo.h
new file mode 100644
index 0000000..0997c84
--- /dev/null
+++ b/ios/experimental/TiledLibreOffice/TiledLibreOffice/lo.h
@@ -0,0 +1,19 @@
+// -*- 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/.
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void lo_initialize(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/experimental/TiledLibreOffice/TiledLibreOffice/lo.mm b/ios/experimental/TiledLibreOffice/TiledLibreOffice/lo.mm
new file mode 100644
index 0000000..d9f724c
--- /dev/null
+++ b/ios/experimental/TiledLibreOffice/TiledLibreOffice/lo.mm
@@ -0,0 +1,181 @@
+// -*- 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 <osl/detail/component-mapping.h>
+#include <osl/process.h>
+#include <touch/touch.h>
+
+extern "C" {
+    extern void * analysis_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    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 * chartcore_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * cui_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * date_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 * embobj_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * emboleobj_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * evtatt_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * expwrap_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * filterconfig1_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 * oox_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * pricing_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 * sot_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * spell_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * spl_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 * svxcore_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 * tk_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * ucppkg1_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * unordf_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * unoxml_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * uui_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * wpftdraw_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * wpftwriter_component_getFactory( const char * pImplName, void * pServiceManager, void * pRegistryKey );
+    extern void * writerfilter_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[] = {
+        { "libanalysislo.a", analysis_component_getFactory },
+        { "libanimcorelo.a", animcore_component_getFactory },
+        { "libavmedialo.a", avmedia_component_getFactory },
+        { "libchartcorelo.a", chartcore_component_getFactory },
+        { "libcuilo.a", cui_component_getFactory },
+        { "libdatelo.a", date_component_getFactory },
+        { "libdbalo.a", dba_component_getFactory },
+        { "libdbaxmllo.a", dbaxml_component_getFactory },
+        { "libembobj.a", embobj_component_getFactory },
+        { "libemboleobj.a", emboleobj_component_getFactory },
+        { "libevtattlo.a", evtatt_component_getFactory },
+        { "libexpwraplo.a", expwrap_component_getFactory },
+        { "libfilterconfiglo.a", filterconfig1_component_getFactory },
+        { "libfrmlo.a", frm_component_getFactory },
+        { "libfsstoragelo.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 },
+        { "libooxlo.a", oox_component_getFactory },
+        { "libpricinglo.a", pricing_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 },
+        { "libsotlo.a", sot_component_getFactory },
+        { "libspelllo.a", spell_component_getFactory },
+        { "libspllo.a", spl_component_getFactory },
+        { "libsvgfilterlo.a", svgfilter_component_getFactory },
+        { "libsvtlo.a", svt_component_getFactory },
+        { "libsvxcorelo.a", svxcore_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 },
+        { "libtklo.a", tk_component_getFactory },
+        { "libucppkg1.a", ucppkg1_component_getFactory },
+        { "libunordflo.a", unordf_component_getFactory },
+        { "libunoxmllo.a", unoxml_component_getFactory },
+        { "libuuilo.a", uui_component_getFactory },
+        { "libwpftdrawlo.a", wpftdraw_component_getFactory },
+        { "libwpftwriterlo.a", wpftwriter_component_getFactory },
+        { "libwriterfilterlo.a", writerfilter_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;
+}
+
+static NSString *createPaths(NSString *base, NSString *appRootEscaped, NSArray *fileNames)
+{
+    NSString *result;
+    NSString *prefix = @"file://";
+    BOOL first = YES;
+
+    result = base;
+    for (NSString *fileName in fileNames) {
+        result = [result stringByAppendingString: prefix];
+        result = [result stringByAppendingString: [appRootEscaped stringByAppendingPathComponent: fileName]];
+
+        if (first) {
+            prefix = [@" " stringByAppendingString:prefix];
+            first = NO;
+        }
+    }
+
+    return result;
+}
+
+extern "C" void lo_initialize(void)
+{
+    NSString * bundlePath = [[NSBundle mainBundle] bundlePath];
+    NSString * app_root_escaped = [bundlePath stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
+    NSString * uno_types = createPaths(@"-env:UNO_TYPES=", app_root_escaped, @[@"offapi.rdb", @"oovbaapi.rdb", @"types.rdb"]);
+    NSString * uno_services = createPaths(@"-env:UNO_SERVICES=", app_root_escaped, @[@"ure/services.rdb", @"services.rdb"]);
+
+    const char *argv[] = {
+        [[[NSBundle mainBundle] executablePath] UTF8String],
+        "-env:URE_INTERNAL_LIB_DIR=file:///",
+        [uno_types UTF8String],
+        [uno_services UTF8String],
+        [[@"file://" stringByAppendingString: [app_root_escaped stringByAppendingPathComponent: @"test1.odt"]] UTF8String]};
+
+    const int argc = sizeof(argv)/sizeof(*argv);
+
+    osl_setCommandArgs(argc, (char **) argv);
+}
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ios/experimental/TiledLibreOffice/TiledLibreOffice/main.m b/ios/experimental/TiledLibreOffice/TiledLibreOffice/main.m
new file mode 100644
index 0000000..79f7dcc
--- /dev/null
+++ b/ios/experimental/TiledLibreOffice/TiledLibreOffice/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/sw/source/core/view/viewsh.cxx b/sw/source/core/view/viewsh.cxx
index 0193376..bd90cbe 100644
--- a/sw/source/core/view/viewsh.cxx
+++ b/sw/source/core/view/viewsh.cxx
@@ -1807,7 +1807,14 @@ void touch_lo_draw_tile(void *context, int contextWidth, int contextHeight, MLOD
     // open, we need to add a documentHandle that would hold the right
     // document shell in the iOS / Android impl, and we would get it as a
     // parameter.
-    SwWrtShell *pViewShell = GetActiveWrtShell();
+
+    SwWrtShell *pViewShell;
+
+    // FIXME: make sure this is not called before we have a document...
+    while (!(pViewShell = GetActiveWrtShell()))
+    {
+        sleep(1);
+    }
 
     // Creation, use and destruction of a VirtualDevice needs to be
     // protected by the SolarMutex, it seems.
@@ -1833,7 +1840,13 @@ extern "C"
 MLODpxSize touch_lo_get_content_size()
 {
 #ifdef IOS
-    SwWrtShell *pViewShell = GetActiveWrtShell();
+    SwWrtShell *pViewShell;
+    // FIXME: make sure this is not called before we have a document...
+    while (!(pViewShell = GetActiveWrtShell()))
+    {
+        sleep(1);
+    }
+
     if (pViewShell)
     {
         static const MLORip WIDTH_ADDITION  = 6L * DOCUMENTBORDER;
diff --git a/vcl/quartz/salgdicommon.cxx b/vcl/quartz/salgdicommon.cxx
index 75fea3f..6f96a6c 100644
--- a/vcl/quartz/salgdicommon.cxx
+++ b/vcl/quartz/salgdicommon.cxx
@@ -293,6 +293,13 @@ static inline void alignLinePoint( const SalPoint* i_pIn, float& o_fX, float& o_
 
 void AquaSalGraphics::copyBits( const SalTwoRect& rPosAry, SalGraphics *pSrcGraphics )
 {
+#ifdef IOS
+    // Horrible horrible this is all crack, mxLayer is always NULL on iOS,
+    // all this stuff should be rewritten anyway for iOS
+    if( !mxLayer )
+        return;
+#endif
+
     if( !pSrcGraphics )
     {
         pSrcGraphics = this;
@@ -452,6 +459,11 @@ void AquaSalGraphics::ApplyXorContext()
 void AquaSalGraphics::copyArea( long nDstX, long nDstY,long nSrcX, long nSrcY,
                                 long nSrcWidth, long nSrcHeight, sal_uInt16 /*nFlags*/ )
 {
+#ifdef IOS
+    if( !mxLayer )
+        return;
+#endif
+
     ApplyXorContext();
 
     DBG_ASSERT( mxLayer!=NULL, "AquaSalGraphics::copyArea() for non-layered graphics" );
diff --git a/vcl/quartz/salvd.cxx b/vcl/quartz/salvd.cxx
index 7b041b9..07753bc 100644
--- a/vcl/quartz/salvd.cxx
+++ b/vcl/quartz/salvd.cxx
@@ -69,9 +69,23 @@ AquaSalVirtualDevice::AquaSalVirtualDevice( AquaSalGraphics* pGraphic, long nDX,
     if( pGraphic && pData && pData->rCGContext )
     {
         // Create virtual device based on existing SystemGraphicsData
-        // We ignore nDx and nDY, as the desired size comes from the SystemGraphicsData
+        // We ignore nDx and nDY, as the desired size comes from the SystemGraphicsData.
+        // WTF does the above mean, SystemGraphicsData has no size field(s).
         mbForeignContext = true;        // the mxContext is from pData
         mpGraphics = new AquaSalGraphics( /*pGraphic*/ );
+#ifdef IOS
+        // Note: we should *not* create a CGLayer and assign it to
+        // mxLayer here. Don't confuse CGLayer and CALayer. A CGLayer
+        // is basically a fancy off-screen bitmap not related to
+        // anything being displayed at all. The CGContext passed in
+        // here refers to something actively part of the compositor
+        // stack and being dislayed on the device, and *there*
+        // CALayers are involved, sure. The use of mxLayer in this
+        // code is for "traditional" LO virtual devices, off-screen
+        // bitmaps. I think. On the other hand, the use of
+        // VirtualDevice with a "foreign" CGContext for OS X is
+        // actually dead code...
+#endif
         mpGraphics->SetVirDevGraphics( mxLayer, pData->rCGContext );
     }
     else


More information about the Libreoffice-commits mailing list