diff --git a/.gitignore b/.gitignore
index fc926b29..b3636b46 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,7 +17,6 @@ build/
/vtm-gdx-desktop/assets/
/vtm-gdx-html/war/
/vtm-gdx-html/gwt-unitCache
-/vtm-gdx-ios/
/vtm-spatialite/
/vtm-spatialite-android/
/vtm-examples/
diff --git a/jni/.project b/jni/.project
index 9487b4af..591bc7f4 100644
--- a/jni/.project
+++ b/jni/.project
@@ -17,8 +17,14 @@
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+ org.eclipse.jdt.core.javanature
org.eclipse.cdt.core.cnature
org.eclipse.cdt.core.ccnature
org.eclipse.cdt.managedbuilder.core.managedBuildNature
diff --git a/jni/build.xml b/jni/build.xml
index 7a9f0343..81c329b9 100644
--- a/jni/build.xml
+++ b/jni/build.xml
@@ -1,25 +1,14 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/jni/builder/JniBuilder.java b/jni/builder/JniBuilder.java
index 567c9f25..ad8e387b 100644
--- a/jni/builder/JniBuilder.java
+++ b/jni/builder/JniBuilder.java
@@ -81,11 +81,11 @@ public class JniBuilder {
android.cppFlags += cflags;
android.linkerFlags += " -llog";
- // BuildTarget ios = BuildTarget.newDefaultTarget(TargetOs.IOS, false);
- // ios.headerDirs = headers;
- // ios.cIncludes = sources;
- // ios.cFlags += cflags;
- // ios.cppFlags += cflags;
+ BuildTarget ios = BuildTarget.newDefaultTarget(TargetOs.IOS, false);
+ ios.headerDirs = headers;
+ ios.cIncludes = sources;
+ ios.cFlags += cflags;
+ ios.cppFlags += cflags;
//new NativeCodeGenerator().generate();
new AntScriptGenerator().generate(new BuildConfig("vtm-jni"),
@@ -94,8 +94,9 @@ public class JniBuilder {
// win32,
// win64,
// lin32,
- lin64,
- android);
+ //lin64,
+ //android
+ ios);
// BuildExecutor.executeAnt("jni/build-windows32home.xml", "-v clean");
// BuildExecutor.executeAnt("jni/build-windows32home.xml", "-v");
diff --git a/settings.gradle b/settings.gradle
index f288cccb..93f56fc4 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -2,10 +2,10 @@ include ':vtm'
include ':vtm-extras'
include ':vtm-android'
include ':vtm-android-example'
+include ':vtm-android-app'
+include ':vtm-themes'
include ':vtm-gdx'
include ':vtm-gdx-desktop'
include ':vtm-gdx-android'
-include ':vtm-android-app'
-include ':vtm-themes'
-//include ':vtm-gdx-html'
-//include ':vtm-ext-libs'
+include ':vtm-gdx-html'
+include ':vtm-gdx-ios'
diff --git a/vtm-android-app b/vtm-android-app
index 0bf68282..92d16812 160000
--- a/vtm-android-app
+++ b/vtm-android-app
@@ -1 +1 @@
-Subproject commit 0bf68282155798f3884a4635e52fbbc90a0e5cc6
+Subproject commit 92d16812200c396536bbfd5a5aa34ee08084e26c
diff --git a/vtm-gdx-ios/Info.plist.xml b/vtm-gdx-ios/Info.plist.xml
new file mode 100644
index 00000000..414332e3
--- /dev/null
+++ b/vtm-gdx-ios/Info.plist.xml
@@ -0,0 +1,62 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleDisplayName
+ ${app.name}
+ CFBundleExecutable
+ ${app.executable}
+ CFBundleIdentifier
+ ${app.id}
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ ${app.name}
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ ${app.version}
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ ${app.build}
+ LSRequiresIPhoneOS
+
+ UIStatusBarHidden
+
+ UIViewControllerBasedStatusBarAppearance
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ CFBundleIcons
+
+ CFBundlePrimaryIcon
+
+ CFBundleIconFiles
+
+ Icon
+ Icon-72
+
+
+
+
+
diff --git a/vtm-gdx-ios/build.gradle b/vtm-gdx-ios/build.gradle
new file mode 100644
index 00000000..39f54e1b
--- /dev/null
+++ b/vtm-gdx-ios/build.gradle
@@ -0,0 +1,69 @@
+buildscript {
+ repositories {
+ mavenCentral()
+ }
+
+ dependencies {
+ classpath 'com.github.jtakakura:gradle-robovm-plugin:0.0.4'
+ }
+}
+
+repositories {
+ maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
+}
+
+apply plugin: 'java'
+apply plugin: 'robovm'
+
+ext {
+ // Configure your application main class
+ mainClassName = "org.oscim.ios.RoboVmLauncher"
+ //roboVMVersion = "0.0.9"
+}
+
+dependencies {
+ compile project(':vtm-gdx')
+ compile project(':vtm-themes')
+ compile 'org.slf4j:slf4j-simple:1.7.5'
+ compile "com.badlogicgames.gdx:gdx-backend-robovm:$gdxVersion"
+}
+
+
+sourceCompatibility = '1.7'
+//[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
+
+robovm {
+ // Configure robovm
+ iosSignIdentity = ""
+ iosProvisioningProfile = ""
+}
+
+sourceSets {
+ main {
+ java.srcDirs = ['src/']
+ //resources.srcDirs = ['src/', 'data']
+ }
+ output.resourcesDir = 'assets'
+}
+
+// compile bytecode to llvm and run in the ios simulator
+// task run (dependsOn: compileJava){
+// doFirst {
+// println(">> Running RoboVM")
+// String cmd = "$project.robovm_home/bin/robovm -verbose -arch x86 -os ios -cp $project.robovm_home/lib/robovm-objc.jar:$project.robovm_home/lib/robovm-cocoatouch.jar:$projectDir/build/classes/main/ -run $mainClass"
+// def proc = cmd.execute()
+
+// proc.in.eachLine {line -> println line}
+// proc.err.eachLine {line -> System.err.println( 'ERROR: ' + line)}
+// proc.waitFor()
+// }
+// }
+
+
+eclipse {
+ project {
+ natures = [ 'org.eclipse.jdt.core.javanature',
+ 'org.robovm.eclipse.RoboVMNature']
+ buildCommand 'org.robovm.eclipse.RoboVMClassBuilder'
+ }
+}
diff --git a/vtm-gdx-ios/robovm.properties b/vtm-gdx-ios/robovm.properties
new file mode 100644
index 00000000..b94925cd
--- /dev/null
+++ b/vtm-gdx-ios/robovm.properties
@@ -0,0 +1,8 @@
+#
+#Fri May 31 13:01:40 CEST 2013
+app.version=1.0
+app.id=com.noxymo.opensciencemap
+app.mainclass=org.oscim.ios.RobovmLauncher
+app.executable=VtmApp
+app.build=1
+app.name=VectorMap
diff --git a/vtm-gdx-ios/robovm.xml b/vtm-gdx-ios/robovm.xml
new file mode 100644
index 00000000..d6e6a9f4
--- /dev/null
+++ b/vtm-gdx-ios/robovm.xml
@@ -0,0 +1,37 @@
+
+ ${app.executable}
+ ${app.mainclass}
+ ios
+ thumbv7
+ ios
+ Info.plist.xml
+
+
+ ../vtm-themes/resources/assets
+
+ **
+
+ true
+
+
+ data
+
+
+
+ com.badlogic.gdx.scenes.scene2d.ui.*
+
+
+ ../vtm-ext-libs/ios/libgdx.a
+ ../vtm-ext-libs/ios/libObjectAL.a
+ ../vtm-ext-libs/ios/libvtm-jni.a
+
+
+ UIKit
+ OpenGLES
+ QuartzCore
+ CoreGraphics
+ OpenAL
+ AudioToolbox
+ AVFoundation
+
+
\ No newline at end of file
diff --git a/vtm-gdx-ios/src/org/oscim/ios/RobovmLauncher.java b/vtm-gdx-ios/src/org/oscim/ios/RobovmLauncher.java
new file mode 100644
index 00000000..44358aa8
--- /dev/null
+++ b/vtm-gdx-ios/src/org/oscim/ios/RobovmLauncher.java
@@ -0,0 +1,61 @@
+package org.oscim.ios;
+
+import org.oscim.backend.CanvasAdapter;
+import org.oscim.backend.GLAdapter;
+import org.oscim.gdx.GdxMap;
+import org.oscim.ios.backend.IosGLAdapter;
+import org.oscim.ios.backend.IosGraphics;
+import org.oscim.layers.tile.vector.BuildingLayer;
+import org.oscim.layers.tile.vector.VectorTileLayer;
+import org.oscim.layers.tile.vector.labeling.LabelLayer;
+import org.oscim.theme.VtmThemes;
+import org.oscim.tiling.TileSource;
+import org.oscim.tiling.source.oscimap4.OSciMap4TileSource;
+import org.robovm.cocoatouch.foundation.NSAutoreleasePool;
+import org.robovm.cocoatouch.glkit.GLKViewDrawableStencilFormat;
+import org.robovm.cocoatouch.uikit.UIApplication;
+
+import com.badlogic.gdx.backends.iosrobovm.IOSApplication;
+import com.badlogic.gdx.backends.iosrobovm.IOSApplicationConfiguration;
+
+public class RobovmLauncher extends IOSApplication.Delegate {
+ @Override
+ protected IOSApplication createApplication() {
+ IOSApplicationConfiguration config = new IOSApplicationConfiguration();
+ config.orientationLandscape = true;
+ config.orientationPortrait = true;
+ config.stencilFormat = GLKViewDrawableStencilFormat.Format8;
+
+
+
+ return new IOSApplication(new GdxMap() {
+ @Override
+ public void createLayers() {
+ TileSource tileSource = new OSciMap4TileSource();
+
+ //initDefaultLayers(tileSource, false,true, false);
+ VectorTileLayer l = mMap.setBaseMap(tileSource);
+ mMap.setTheme(VtmThemes.TRON2);
+ mMap.layers().add(new BuildingLayer(mMap, l));
+ mMap.layers().add(new LabelLayer(mMap, l));
+
+ // mMap.getLayers().add(new GenericLayer(mMap, new
+ // GridRenderer(1,new Line(Color.LTGRAY, 1.2f),null)));
+
+ mMap.setMapPosition(53.1, 8.8, 1 << 14);
+ }
+
+ }, config);
+ }
+
+ public static void main(String[] argv) {
+
+ NSAutoreleasePool pool = new NSAutoreleasePool();
+ System.setProperty(org.slf4j.impl.SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "TRACE");
+ CanvasAdapter.g = IosGraphics.get();
+ GLAdapter.g = new IosGLAdapter();
+
+ UIApplication.main(argv, null, RobovmLauncher.class);
+ pool.drain();
+ }
+}
diff --git a/vtm-gdx-ios/src/org/oscim/ios/backend/IosBitmap.java b/vtm-gdx-ios/src/org/oscim/ios/backend/IosBitmap.java
new file mode 100644
index 00000000..c624663f
--- /dev/null
+++ b/vtm-gdx-ios/src/org/oscim/ios/backend/IosBitmap.java
@@ -0,0 +1,77 @@
+package org.oscim.ios.backend;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.oscim.backend.canvas.Bitmap;
+
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.files.FileHandle;
+import com.badlogic.gdx.graphics.GL10;
+import com.badlogic.gdx.graphics.Pixmap;
+import com.badlogic.gdx.graphics.g2d.Gdx2DPixmap;
+
+public class IosBitmap implements Bitmap {
+
+ Pixmap pixmap;
+ boolean disposable;
+
+ /** always argb8888 */
+ public IosBitmap(int width, int height, int format) {
+ pixmap = new Pixmap(width, height, Pixmap.Format.RGBA8888);
+ }
+
+ public IosBitmap(String fileName) {
+ FileHandle handle = Gdx.files.internal(fileName);
+ pixmap = new Pixmap(handle);
+ disposable = true;
+ }
+
+ public IosBitmap(InputStream inputStream) throws IOException {
+ pixmap = new Pixmap(new Gdx2DPixmap(inputStream, Gdx2DPixmap.GDX2D_FORMAT_RGBA8888));
+ }
+
+ @Override
+ public int getWidth() {
+ return pixmap.getWidth();
+ }
+
+ @Override
+ public int getHeight() {
+ return pixmap.getHeight();
+ }
+
+ @Override
+ public void recycle() {
+ // FIXME this should be called at some point in time
+ pixmap.dispose();
+
+ }
+
+ @Override
+ public int[] getPixels() {
+ return null;
+ }
+
+ @Override
+ public void eraseColor(int color) {
+ }
+
+ @Override
+ public void uploadToTexture(boolean replace) {
+
+ Gdx.gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, pixmap.getGLInternalFormat(),
+ pixmap.getWidth(), pixmap.getHeight(), 0,
+ pixmap.getGLFormat(), pixmap.getGLType(),
+ pixmap.getPixels());
+
+ if (disposable) {
+ pixmap.dispose();
+ }
+ }
+
+ @Override
+ public boolean isValid() {
+ return true;
+ }
+}
diff --git a/vtm-gdx-ios/src/org/oscim/ios/backend/IosCanvas.java b/vtm-gdx-ios/src/org/oscim/ios/backend/IosCanvas.java
new file mode 100644
index 00000000..7587f028
--- /dev/null
+++ b/vtm-gdx-ios/src/org/oscim/ios/backend/IosCanvas.java
@@ -0,0 +1,78 @@
+package org.oscim.ios.backend;
+
+import org.oscim.backend.canvas.Bitmap;
+import org.oscim.backend.canvas.Canvas;
+import org.oscim.backend.canvas.Paint;
+
+import com.badlogic.gdx.graphics.Pixmap;
+import com.badlogic.gdx.graphics.TextureData;
+import com.badlogic.gdx.graphics.g2d.BitmapFont;
+import com.badlogic.gdx.graphics.g2d.BitmapFont.Glyph;
+
+public class IosCanvas implements Canvas {
+
+ IosBitmap bitmap;
+ static BitmapFont font = new BitmapFont();
+
+ public IosCanvas() {
+ // canvas comes with gdx pixmap
+ }
+
+ @Override
+ public void setBitmap(Bitmap bitmap) {
+ this.bitmap = (IosBitmap) bitmap;
+ this.bitmap.pixmap.setColor(0);
+ this.bitmap.pixmap.fill();
+ }
+
+ @Override
+ public void drawText(String string, float x, float y, Paint paint) {
+ if (bitmap == null) {
+ // log.debug("no bitmap set");
+ return;
+ }
+
+ // IosPaint p = (IosPaint) paint;
+
+ Pixmap pixmap = bitmap.pixmap;
+
+ TextureData td = font.getRegion().getTexture().getTextureData();
+ if (!td.isPrepared())
+ td.prepare();
+
+ Pixmap f = td.consumePixmap();
+
+ int adv = (int) x;
+ Glyph last = null;
+
+ int ch = (int) font.getCapHeight();
+ int h = (int) font.getLineHeight();
+ int yy = (int) (y - font.getLineHeight());
+ if (y < 0)
+ y = 0;
+
+ // pixmap.setColor(0xff0000ff);
+ // int w = (int) font.getBounds(string).width;
+ // pixmap.drawRectangle((int) x - 4, (int) y - 4, w + 8, h + 8);
+
+ for (int i = 0; i < string.length(); i++) {
+ char c = string.charAt(i);
+ Glyph g = font.getData().getGlyph(c);
+ if (g == null)
+ g = font.getData().getGlyph(' ');
+
+ if (i > 0)
+ adv += last.getKerning(c);
+ pixmap.drawPixmap(f, adv, //- g.xoffset,
+ yy - (g.height + g.yoffset) - (h - ch),
+ g.srcX, g.srcY,
+ g.width, g.height);
+ adv += g.width;
+ last = g;
+ }
+ }
+
+ @Override
+ public void drawBitmap(Bitmap bitmap, float x, float y) {
+ }
+}
diff --git a/vtm-gdx-ios/src/org/oscim/ios/backend/IosGLAdapter.java b/vtm-gdx-ios/src/org/oscim/ios/backend/IosGLAdapter.java
new file mode 100644
index 00000000..68b9c893
--- /dev/null
+++ b/vtm-gdx-ios/src/org/oscim/ios/backend/IosGLAdapter.java
@@ -0,0 +1,9 @@
+package org.oscim.ios.backend;
+
+import org.oscim.backend.GL20;
+
+import com.badlogic.gdx.backends.iosrobovm.IOSGLES20;
+
+public class IosGLAdapter extends IOSGLES20 implements GL20 {
+
+}
diff --git a/vtm-gdx-ios/src/org/oscim/ios/backend/IosGraphics.java b/vtm-gdx-ios/src/org/oscim/ios/backend/IosGraphics.java
new file mode 100644
index 00000000..035e5f5b
--- /dev/null
+++ b/vtm-gdx-ios/src/org/oscim/ios/backend/IosGraphics.java
@@ -0,0 +1,56 @@
+package org.oscim.ios.backend;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.oscim.backend.CanvasAdapter;
+import org.oscim.backend.canvas.Bitmap;
+import org.oscim.backend.canvas.Canvas;
+import org.oscim.backend.canvas.Paint;
+
+public class IosGraphics extends CanvasAdapter {
+
+ private static final IosGraphics INSTANCE = new IosGraphics();
+
+ public static CanvasAdapter get() {
+ return INSTANCE;
+ }
+
+ @Override
+ public Canvas getCanvas() {
+ return new IosCanvas();
+ }
+
+ @Override
+ public Paint getPaint() {
+ return new IosPaint();
+ }
+
+ @Override
+ public Bitmap getBitmap(int width, int height, int format) {
+ return new IosBitmap(width, height, format);
+ }
+
+ @Override
+ public Bitmap decodeBitmap(InputStream inputStream) {
+ try {
+ return new IosBitmap(inputStream);
+ } catch (IOException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ @Override
+ public Bitmap loadBitmapAsset(String fileName) {
+ return new IosBitmap(fileName);
+
+ // try {
+ // return createBitmap(fileName);
+ // } catch (IOException e) {
+ // e.printStackTrace();
+ // }
+ // return null;
+ }
+
+}
diff --git a/vtm-gdx-ios/src/org/oscim/ios/backend/IosPaint.java b/vtm-gdx-ios/src/org/oscim/ios/backend/IosPaint.java
new file mode 100644
index 00000000..af7f7674
--- /dev/null
+++ b/vtm-gdx-ios/src/org/oscim/ios/backend/IosPaint.java
@@ -0,0 +1,74 @@
+package org.oscim.ios.backend;
+
+import org.oscim.backend.canvas.Bitmap;
+import org.oscim.backend.canvas.Paint;
+
+public class IosPaint implements Paint {
+
+ @Override
+ public int getColor() {
+ return 0;
+ }
+
+ @Override
+ public int getTextHeight(String text) {
+ return 0;
+ }
+
+ @Override
+ public int getTextWidth(String text) {
+ return 0;
+ }
+
+ @Override
+ public void setBitmapShader(Bitmap bitmap) {
+ }
+
+ @Override
+ public void setColor(int color) {
+ }
+
+ @Override
+ public void setDashPathEffect(float[] strokeDasharray) {
+ }
+
+ @Override
+ public void setStrokeCap(Cap cap) {
+ }
+
+ @Override
+ public void setStrokeWidth(float width) {
+ }
+
+ @Override
+ public void setStyle(Style style) {
+ }
+
+ @Override
+ public void setTextAlign(Align align) {
+ }
+
+ @Override
+ public void setTextSize(float textSize) {
+ }
+
+ @Override
+ public void setTypeface(FontFamily fontFamily, FontStyle fontStyle) {
+ }
+
+ @Override
+ public float measureText(String text) {
+ return IosCanvas.font.getBounds(text).width;
+ }
+
+ @Override
+ public float getFontHeight() {
+ return IosCanvas.font.getLineHeight();
+ }
+
+ @Override
+ public float getFontDescent() {
+ return IosCanvas.font.getDescent();
+ }
+
+}