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(); + } + +}