From 21ea5a78427a1cd2f51d5ab43857da8ad7b666cc Mon Sep 17 00:00:00 2001 From: Emux Date: Tue, 19 Jul 2016 14:24:37 +0300 Subject: [PATCH] Render themes: SVG resources on iOS, improves #69 --- README.md | 4 +- docs/ios.md | 57 ++++++++-------- .../src/org/oscim/ios/backend/IosBitmap.java | 6 +- .../org/oscim/ios/backend/IosGraphics.java | 2 +- .../org/oscim/ios/backend/IosSvgBitmap.java | 65 +++++++------------ vtm-ios/src/svg/GHRenderable.java | 6 +- vtm-ios/src/svg/SVGContext.java | 5 +- vtm-ios/src/svg/SVGParser.java | 39 +++++++---- vtm-ios/src/svg/SVGRenderer.java | 51 ++++++++++----- 9 files changed, 126 insertions(+), 109 deletions(-) diff --git a/README.md b/README.md index e8d5d7e4..7d21595c 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ If you have any questions or problems, don't hesitate to ask our public [mailing - bitmap: any quadtree-scheme tiles as texture - Backends: - Android (optional libGDX) - - iOS (using libGDX/RoboVM) + - iOS (using libGDX/RoboVM) ([instructions](docs/ios.md)) - Desktop (using libGDX/JGLFW) - HTML5/WebGL (using libGDX/GWT) @@ -35,7 +35,7 @@ If you have any questions or problems, don't hesitate to ask our public [mailing - **vtm-web** HTML5/GWT backend - **vtm-web-app** HTML5/GWT application -The libGDX backends for iOS and GWT are experimental. +The libGDX backend for GWT is experimental. ## Master build downloads - [Latest jars and Samples applications](http://ci.mapsforge.org/job/vtm/) diff --git a/docs/ios.md b/docs/ios.md index fe9f1e2f..0fba68ab 100644 --- a/docs/ios.md +++ b/docs/ios.md @@ -1,50 +1,49 @@ -###Implement Exemple: +### Implementation example -RoboVm needs the native libs/frameworks for create a build! -Copy this files from vtm-ios-0.6.0-SNAPSHOT-natives.jar into a temp folder! +RoboVm needs the native libs / frameworks to create a build. +Copy those files from `vtm-ios-0.6.0-SNAPSHOT-natives.jar` into a temp folder. -Create a copy task into your build.gradle +Create a copy task into your **build.gradle**. -```java +```groovy task copyFrameWorks(type: Copy) { from(zipTree("./libs/vtm-ios-0.6.0-SNAPSHOT-natives.jar")) into("${buildDir}/native") } - tasks.withType(org.gradle.api.tasks.compile.JavaCompile) { compileTask -> compileTask.dependsOn copyFrameWorks } ``` -Now you can configure your robovm.xml to implement the vtm-natives and the SVG-Framework +Now you can configure your `robovm.xml` to implement the vtm-natives and the SVG-Framework. -``` - - z - build/native/libvtm-jni.a - - - build/native - - - SVGgh - UIKit - OpenGLES - QuartzCore - CoreGraphics - OpenAL - AudioToolbox - AVFoundation - +```xml + + z + build/native/libvtm-jni.a + + + build/native + + + SVGgh + UIKit + OpenGLES + QuartzCore + CoreGraphics + OpenAL + AudioToolbox + AVFoundation + ``` -Remember, the implementation of a iOS- framework is possible since iOS 8! -So we must set the min iOS-Version at Info.plist.xml! +Remember the implementation of a iOS framework is possible since iOS 8. +So we must set the min iOS-Version at `Info.plist.xml`. -``` +```xml MinimumOSVersion 8.0 ... -``` \ No newline at end of file +``` diff --git a/vtm-ios/src/org/oscim/ios/backend/IosBitmap.java b/vtm-ios/src/org/oscim/ios/backend/IosBitmap.java index b77e1777..3447bbc0 100644 --- a/vtm-ios/src/org/oscim/ios/backend/IosBitmap.java +++ b/vtm-ios/src/org/oscim/ios/backend/IosBitmap.java @@ -123,10 +123,11 @@ public class IosBitmap implements Bitmap { } /** - * protected constructor for create IosBitmap from IosSvgBitmap + * Protected constructor for create IosBitmap from IosSvgBitmap. + * * @param image */ - protected IosBitmap(UIImage image){ + protected IosBitmap(UIImage image) { CGImage cgiIimage = image.getCGImage(); this.width = (int) cgiIimage.getWidth(); this.height = (int) cgiIimage.getHeight(); @@ -138,7 +139,6 @@ public class IosBitmap implements Bitmap { // can dispose helper images for release memory image.dispose(); cgiIimage.dispose(); - } diff --git a/vtm-ios/src/org/oscim/ios/backend/IosGraphics.java b/vtm-ios/src/org/oscim/ios/backend/IosGraphics.java index f7365229..6f9cec9d 100644 --- a/vtm-ios/src/org/oscim/ios/backend/IosGraphics.java +++ b/vtm-ios/src/org/oscim/ios/backend/IosGraphics.java @@ -66,7 +66,7 @@ public class IosGraphics extends CanvasAdapter { try { return new IosSvgBitmap(inputStream); } catch (IOException e) { - log.error("decodeSvgImpl", e); + log.error("decodeSvgBitmapImpl", e); return null; } } diff --git a/vtm-ios/src/org/oscim/ios/backend/IosSvgBitmap.java b/vtm-ios/src/org/oscim/ios/backend/IosSvgBitmap.java index 870aa96b..981f3a84 100644 --- a/vtm-ios/src/org/oscim/ios/backend/IosSvgBitmap.java +++ b/vtm-ios/src/org/oscim/ios/backend/IosSvgBitmap.java @@ -1,5 +1,6 @@ /* * Copyright 2016 Longri + * Copyright 2016 devemux86 * * This program is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free Software @@ -14,34 +15,43 @@ */ package org.oscim.ios.backend; - import org.oscim.backend.CanvasAdapter; +import org.oscim.utils.IOUtils; import org.robovm.apple.coregraphics.CGRect; import org.robovm.apple.coregraphics.CGSize; import org.robovm.apple.uikit.UIImage; -import svg.SVGRenderer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -/** - * Created by Longri on 17.07.16. - */ +import svg.SVGRenderer; + public class IosSvgBitmap extends IosBitmap { + private static final Logger log = LoggerFactory.getLogger(IosSvgBitmap.class); + private static final float DEFAULT_SIZE = 400f; - /** - * Constructor
- * @param inputStream - * @throws IOException - */ - public IosSvgBitmap(InputStream inputStream) throws IOException { - super(getUIImage(inputStream)); + private static String getStringFromInputStream(InputStream is) { + StringBuilder sb = new StringBuilder(); + BufferedReader br = null; + String line; + try { + br = new BufferedReader(new InputStreamReader(is)); + while ((line = br.readLine()) != null) { + sb.append(line); + } + } catch (IOException e) { + log.error(e.getMessage(), e); + } finally { + IOUtils.closeQuietly(br); + } + return sb.toString(); } - //get UIImage from SVG file private static UIImage getUIImage(InputStream inputStream) { String svg = getStringFromInputStream(inputStream); SVGRenderer renderer = new SVGRenderer(svg); @@ -56,32 +66,7 @@ public class IosSvgBitmap extends IosBitmap { return renderer.asImageWithSize(new CGSize(bitmapWidth, bitmapHeight), 1); } - - // convert InputStream to String - private static String getStringFromInputStream(InputStream is) { - - BufferedReader br = null; - StringBuilder sb = new StringBuilder(); - - String line; - try { - - br = new BufferedReader(new InputStreamReader(is)); - while ((line = br.readLine()) != null) { - sb.append(line); - } - - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - return sb.toString(); + public IosSvgBitmap(InputStream inputStream) throws IOException { + super(getUIImage(inputStream)); } } diff --git a/vtm-ios/src/svg/GHRenderable.java b/vtm-ios/src/svg/GHRenderable.java index d01e90fa..9ff58907 100644 --- a/vtm-ios/src/svg/GHRenderable.java +++ b/vtm-ios/src/svg/GHRenderable.java @@ -4,12 +4,10 @@ import org.robovm.apple.coregraphics.CGAffineTransform; import org.robovm.apple.foundation.NSObjectProtocol; import org.robovm.objc.annotation.Property; -public interface GHRenderable extends NSObjectProtocol{ +public interface GHRenderable extends NSObjectProtocol { @Property(selector = "transform") public CGAffineTransform getTransform(); - + @Property(selector = "hidden") public boolean isHidden(); - - } diff --git a/vtm-ios/src/svg/SVGContext.java b/vtm-ios/src/svg/SVGContext.java index 0dbe2b7b..ea9ec80f 100644 --- a/vtm-ios/src/svg/SVGContext.java +++ b/vtm-ios/src/svg/SVGContext.java @@ -4,11 +4,10 @@ import org.robovm.apple.foundation.NSObject; import org.robovm.apple.uikit.UIColor; import org.robovm.objc.annotation.Method; -public interface SVGContext { +public interface SVGContext { @Method(selector = "colorForSVGColorString:") public UIColor colorForSVGColorString(String svgColorString); @Method(selector = "objectAtURL:") - public NSObject objectAtURL(String aLocation); - + public NSObject objectAtURL(String aLocation); } diff --git a/vtm-ios/src/svg/SVGParser.java b/vtm-ios/src/svg/SVGParser.java index fe46bcf4..ace115dd 100644 --- a/vtm-ios/src/svg/SVGParser.java +++ b/vtm-ios/src/svg/SVGParser.java @@ -10,22 +10,39 @@ import org.robovm.rt.bro.annotation.Library; import org.robovm.rt.bro.annotation.Pointer; import org.robovm.rt.bro.ptr.Ptr; -@Library(Library.INTERNAL) +@Library(Library.INTERNAL) @NativeClass("SVGParser") public class SVGParser extends NSObject { - public static class SVGParserPtr extends Ptr {} - static { ObjCRuntime.bind(SVGParser.class); }/**/ + public static class SVGParserPtr extends Ptr { + } + + static { + ObjCRuntime.bind(SVGParser.class); + }/**/ + + public SVGParser() { + } + + ; + + protected SVGParser(long handle) { + super(handle); + } + + protected SVGParser(SkipInit skipInit) { + super(skipInit); + } + + public SVGParser(String utf8String) { + super((SkipInit) null); + initObject(init(utf8String)); + } - public SVGParser() {}; - protected SVGParser(long handle) { super(handle); } - protected SVGParser(SkipInit skipInit) { super(skipInit); } - - public SVGParser(String utf8String) { super((SkipInit) null); initObject(init(utf8String)); } - @Method(selector = "initWithString:") - protected native @Pointer long init(String utf8String); + protected native + @Pointer + long init(String utf8String); @Property(selector = "parserError") public native NSError getParserError(); - } diff --git a/vtm-ios/src/svg/SVGRenderer.java b/vtm-ios/src/svg/SVGRenderer.java index 503bd74e..4df776d5 100644 --- a/vtm-ios/src/svg/SVGRenderer.java +++ b/vtm-ios/src/svg/SVGRenderer.java @@ -16,37 +16,56 @@ import org.robovm.rt.bro.annotation.MachineSizedFloat; import org.robovm.rt.bro.annotation.Pointer; import org.robovm.rt.bro.ptr.Ptr; -@Library(Library.INTERNAL) +@Library(Library.INTERNAL) @NativeClass("SVGRenderer") public class SVGRenderer extends SVGParser implements SVGContext, GHRenderable { - public static class SVGRendererPtr extends Ptr {} - static { ObjCRuntime.bind(SVGRenderer.class); }/**/ + public static class SVGRendererPtr extends Ptr { + } - public SVGRenderer() {}; - protected SVGRenderer(long handle) { super(handle); } - protected SVGRenderer(SkipInit skipInit) { super(skipInit); } + static { + ObjCRuntime.bind(SVGRenderer.class); + }/**/ + + public SVGRenderer() { + } + + ; + + protected SVGRenderer(long handle) { + super(handle); + } + + protected SVGRenderer(SkipInit skipInit) { + super(skipInit); + } + + public SVGRenderer(String utf8String) { + super((SkipInit) null); + initObject(init(utf8String)); + } - public SVGRenderer(String utf8String) { super((SkipInit) null); initObject(init(utf8String)); } - @Method(selector = "initWithString:") - protected native @Pointer long init(String utf8String); - + protected native + @Pointer + long init(String utf8String); + @Property(selector = "viewRect") - public native @ByVal CGRect getViewRect(); - + public native + @ByVal + CGRect getViewRect(); + @Method(selector = "colorForSVGColorString:") public native UIColor colorForSVGColorString(String svgColorString); @Method(selector = "objectAtURL:") - public native NSObject objectAtURL(String aLocation); - + public native NSObject objectAtURL(String aLocation); + @Property(selector = "transform") public native CGAffineTransform getTransform(); - + @Property(selector = "hidden") public native boolean isHidden(); @Method(selector = "asImageWithSize:andScale:") public native UIImage asImageWithSize(@ByVal CGSize maximumSize, @MachineSizedFloat double scale); - }