Skip to content

Commit b695d43

Browse files
Longridevemux86
authored andcommitted
Mapsforge themes compatibility (#388) opensciencemap#100
1 parent f6d2db4 commit b695d43

File tree

18 files changed

+1565
-20
lines changed

18 files changed

+1565
-20
lines changed

vtm-android-example/AndroidManifest.xml

+3
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@
6161
<activity
6262
android:name=".MapsforgeMapActivity$MapFilePicker"
6363
android:configChanges="keyboardHidden|orientation|screenSize" />
64+
<activity
65+
android:name=".MapsforgeMapActivity$ThemeFilePicker"
66+
android:configChanges="keyboardHidden|orientation|screenSize" />
6467
<activity
6568
android:name=".MapsforgeStyleActivity"
6669
android:configChanges="keyboardHidden|orientation|screenSize" />

vtm-android-example/res/menu/theme_menu.xml

+3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
<item
2121
android:id="@+id/theme_newtron"
2222
android:title="@string/theme_newtron" />
23+
<item
24+
android:id="@+id/theme_load"
25+
android:title="@string/theme_load" />
2326
</group>
2427

2528
<item

vtm-android-example/res/values/strings.xml

+1
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,6 @@
1717
<string name="style_1">Show nature</string>
1818
<string name="style_2">Hide nature</string>
1919
<string name="menu_gridlayer">Grid</string>
20+
<string name="theme_load">load theme extern</string>
2021

2122
</resources>

vtm-android-example/src/org/oscim/android/filepicker/ValidRenderTheme.java

+12-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/*
22
* Copyright 2010, 2011, 2012 mapsforge.org
33
* Copyright 2016 devemux86
4+
* Copyright 2017 Longri
45
*
56
* This program is free software: you can redistribute it and/or modify it under the
67
* terms of the GNU Lesser General Public License as published by the Free Software
@@ -17,12 +18,16 @@
1718

1819
import org.oscim.theme.ExternalRenderTheme;
1920
import org.oscim.theme.ThemeFile;
21+
import org.oscim.theme.ThemeUtils;
22+
import org.oscim.theme.XmlMapsforgeThemeBuilder;
2023
import org.oscim.theme.XmlThemeBuilder;
2124
import org.oscim.tiling.TileSource.OpenResult;
2225
import org.xml.sax.InputSource;
2326
import org.xml.sax.XMLReader;
27+
import org.xml.sax.helpers.DefaultHandler;
2428

2529
import java.io.File;
30+
import java.io.FileInputStream;
2631

2732
import javax.xml.parsers.SAXParserFactory;
2833

@@ -34,9 +39,15 @@ public final class ValidRenderTheme implements ValidFileFilter {
3439

3540
@Override
3641
public boolean accept(File file) {
42+
3743
try {
3844
ThemeFile theme = new ExternalRenderTheme(file.getAbsolutePath());
39-
XmlThemeBuilder renderThemeHandler = new XmlThemeBuilder(theme);
45+
DefaultHandler renderThemeHandler;
46+
if(ThemeUtils.isMapsforgeTheme(new FileInputStream(file))) {
47+
renderThemeHandler = new XmlMapsforgeThemeBuilder(theme);
48+
}else{
49+
renderThemeHandler = new XmlThemeBuilder(theme);
50+
}
4051
XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
4152
xmlReader.setContentHandler(renderThemeHandler);
4253
xmlReader.parse(new InputSource(theme.getRenderThemeAsStream()));

vtm-android-example/src/org/oscim/android/test/MapsforgeMapActivity.java

+30
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/*
22
* Copyright 2014 Hannes Janetzek
33
* Copyright 2016-2017 devemux86
4+
* Copyright 2017 Longri
45
*
56
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
67
*
@@ -25,6 +26,7 @@
2526
import org.oscim.android.filepicker.FilePicker;
2627
import org.oscim.android.filepicker.FilterByFileExtension;
2728
import org.oscim.android.filepicker.ValidMapFile;
29+
import org.oscim.android.filepicker.ValidRenderTheme;
2830
import org.oscim.core.MapPosition;
2931
import org.oscim.core.Tile;
3032
import org.oscim.layers.TileGridLayer;
@@ -38,12 +40,14 @@
3840
import org.oscim.scalebar.MapScaleBar;
3941
import org.oscim.scalebar.MapScaleBarLayer;
4042
import org.oscim.scalebar.MetricUnitAdapter;
43+
import org.oscim.theme.ExternalRenderTheme;
4144
import org.oscim.theme.VtmThemes;
4245
import org.oscim.tiling.source.mapfile.MapFileTileSource;
4346
import org.oscim.tiling.source.mapfile.MapInfo;
4447

4548
public class MapsforgeMapActivity extends MapActivity {
4649
private static final int SELECT_MAP_FILE = 0;
50+
private static final int SELECT_THEME_FILE = 1;
4751

4852
private TileGridLayer mGridLayer;
4953
private DefaultMapScaleBar mMapScaleBar;
@@ -71,6 +75,13 @@ public MapFilePicker() {
7175
}
7276
}
7377

78+
public static class ThemeFilePicker extends FilePicker {
79+
public ThemeFilePicker() {
80+
setFileDisplayFilter(new FilterByFileExtension(".xml"));
81+
setFileSelectFilter(new ValidRenderTheme());
82+
}
83+
}
84+
7485
@Override
7586
public boolean onCreateOptionsMenu(Menu menu) {
7687
getMenuInflater().inflate(R.menu.theme_menu, menu);
@@ -106,6 +117,11 @@ public boolean onOptionsItemSelected(MenuItem item) {
106117
item.setChecked(true);
107118
return true;
108119

120+
case R.id.theme_load:
121+
startActivityForResult(new Intent(MapsforgeMapActivity.this, ThemeFilePicker.class),
122+
SELECT_THEME_FILE);
123+
return true;
124+
109125
case R.id.gridlayer:
110126
if (item.isChecked()) {
111127
item.setChecked(false);
@@ -163,6 +179,20 @@ protected void onActivityResult(int requestCode, int resultCode, Intent intent)
163179

164180
mPrefs.clear();
165181
}
182+
} else if (requestCode == SELECT_THEME_FILE) {
183+
if (resultCode != RESULT_OK || intent == null || intent.getStringExtra(FilePicker.SELECTED_FILE) == null) {
184+
finish();
185+
return;
186+
}
187+
188+
String themePath = intent.getStringExtra(FilePicker.SELECTED_FILE);
189+
190+
ExternalRenderTheme externalRenderTheme = new ExternalRenderTheme(themePath);
191+
try {
192+
mMap.setTheme(externalRenderTheme, true);
193+
} catch (Exception e) {
194+
e.printStackTrace();
195+
}
166196
}
167197
}
168198

vtm-android/src/org/oscim/android/canvas/AndroidCanvas.java

+9
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import android.graphics.Color;
2323
import android.graphics.PorterDuff;
24+
import android.graphics.RectF;
2425

2526
import org.oscim.backend.canvas.Bitmap;
2627
import org.oscim.backend.canvas.Canvas;
@@ -96,4 +97,12 @@ public int getHeight() {
9697
public int getWidth() {
9798
return canvas.getWidth();
9899
}
100+
101+
@Override
102+
public void fillRectangle(int x, int y, int width, int height, int color) {
103+
RectF rec = new RectF(x, y, x + width, y + height);
104+
android.graphics.Paint paint = new android.graphics.Paint();
105+
paint.setColor(color);
106+
canvas.drawRect(rec, paint);
107+
}
99108
}

vtm-desktop/src/org/oscim/awt/AwtCanvas.java

+11-6
Original file line numberDiff line numberDiff line change
@@ -183,12 +183,7 @@ public void drawLine(float x1, float y1, float x2, float y2, Paint paint) {
183183

184184
@Override
185185
public void fillColor(int color) {
186-
java.awt.Color awtColor = color == Color.TRANSPARENT ? TRANSPARENT : new java.awt.Color(color);
187-
Composite originalComposite = this.canvas.getComposite();
188-
this.canvas.setComposite(AlphaComposite.getInstance(color == Color.TRANSPARENT ? AlphaComposite.CLEAR : AlphaComposite.SRC_OVER));
189-
this.canvas.setColor(awtColor);
190-
this.canvas.fillRect(0, 0, getWidth(), getHeight());
191-
this.canvas.setComposite(originalComposite);
186+
fillRectangle(0, 0, getWidth(), getHeight(), color);
192187
}
193188

194189
@Override
@@ -200,4 +195,14 @@ public int getHeight() {
200195
public int getWidth() {
201196
return this.bitmap != null ? this.bitmap.getWidth() : 0;
202197
}
198+
199+
@Override
200+
public void fillRectangle(int x, int y, int width, int height, int color) {
201+
java.awt.Color awtColor = color == Color.TRANSPARENT ? TRANSPARENT : new java.awt.Color(color);
202+
Composite originalComposite = this.canvas.getComposite();
203+
this.canvas.setComposite(AlphaComposite.getInstance(color == Color.TRANSPARENT ? AlphaComposite.CLEAR : AlphaComposite.SRC_OVER));
204+
this.canvas.setColor(awtColor);
205+
this.canvas.fillRect(x, y, width, height);
206+
this.canvas.setComposite(originalComposite);
207+
}
203208
}

vtm-ios/src/org/oscim/ios/backend/IosCanvas.java

+8
Original file line numberDiff line numberDiff line change
@@ -159,4 +159,12 @@ public int getHeight() {
159159
public int getWidth() {
160160
return this.cgBitmapContext != null ? (int) this.cgBitmapContext.getWidth() : 0;
161161
}
162+
163+
@Override
164+
public void fillRectangle(int x, int y, int width, int height, int color) {
165+
CGRect rect = new CGRect(x, y, width, height);
166+
setFillColor(this.cgBitmapContext, (color));
167+
this.cgBitmapContext.setBlendMode(CGBlendMode.Normal);
168+
this.cgBitmapContext.fillRect(rect);
169+
}
162170
}

vtm-theme-comparator/src/org/oscim/theme/comparator/logging/BaseAppender.java

+12-7
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,18 @@ public abstract class BaseAppender extends AppenderBase<ILoggingEvent> {
5151
}
5252

5353
@Override
54-
protected void append(ILoggingEvent eventObject) {
55-
if (eventObject != null && canLogClass(eventObject.getLoggerName())) {
56-
stringBuilder.append(doLayout(eventObject));
57-
String areaText = stringBuilder.toString();
58-
this.textArea.setText(areaText);
59-
this.textArea.setCaretPosition(areaText.length());
60-
}
54+
protected void append(final ILoggingEvent eventObject) {
55+
Thread thread = new Thread(new Runnable() {
56+
@Override
57+
public void run() {
58+
if (eventObject != null && canLogClass(eventObject.getLoggerName())) {
59+
textArea.append(doLayout(eventObject));
60+
textArea.setCaretPosition(textArea.getDocument().getLength());
61+
}
62+
}
63+
});
64+
thread.start();
65+
6166
//TODO set Highlight for LogLevel [WARN], [ERROR]
6267
}
6368

vtm-web/src/org/oscim/gdx/client/GwtCanvas.java

+6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
* Copyright 2013 Hannes Janetzek
33
* Copyright 2016-2017 devemux86
44
* Copyright 2017 nebular
5+
* Copyright 2017 Longri
56
*
67
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
78
*
@@ -124,4 +125,9 @@ public int getHeight() {
124125
public int getWidth() {
125126
return this.bitmap != null ? this.bitmap.getWidth() : 0;
126127
}
128+
129+
@Override
130+
public void fillRectangle(int x, int y, int width, int height, int color) {
131+
// TODO
132+
}
127133
}

vtm/resources/assets/shaders/linetex_layer_tex.glsl

+8-3
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,15 @@ uniform sampler2D tex;
4343
uniform float u_mode;
4444
void
4545
main(){
46-
if (u_mode == 1.0) {
47-
vec4 c=texture2D(tex,vec2(abs(mod(v_st.s+1.0,2.0)),(v_st.t+1.0)*0.5));
46+
if (u_mode >= 1.0) {
47+
48+
float step= 2.0;
49+
if (u_mode == 3.0){// dashed texture
50+
step =1.0;
51+
}
52+
vec4 c=texture2D(tex,vec2(abs(mod(v_st.s+1.0,step)),(v_st.t+1.0)*0.5));
4853
float fuzz=fwidth(c.a);
49-
gl_FragColor=(c * u_color) *smoothstep(0.5-fuzz,0.5+fuzz,c.a);
54+
gl_FragColor=(c * u_color) * smoothstep(0.5-fuzz,0.5+fuzz,c.a);
5055
}
5156
else {
5257
/* distance on perpendicular to the line */

vtm/src/org/oscim/backend/canvas/Canvas.java

+2
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,6 @@ public interface Canvas {
5858
int getHeight();
5959

6060
int getWidth();
61+
62+
void fillRectangle(int x, int y, int width, int height, int color);
6163
}

vtm/src/org/oscim/renderer/bucket/LineTexBucket.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ public static RenderBucket draw(RenderBucket b, GLViewport v,
359359
LineTexBucket lb = (LineTexBucket) b;
360360
LineStyle line = lb.line.current();
361361

362-
gl.uniform1f(shader.uMode, line.texture != null ? 1 : 0);
362+
gl.uniform1f(shader.uMode, line.dashTexture? 3 : line.texture != null ? 1 : 0);
363363

364364
if (line.texture != null)
365365
line.texture.bind();

vtm/src/org/oscim/theme/ThemeLoader.java

+24-1
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,21 @@
1818
*/
1919
package org.oscim.theme;
2020

21+
2122
import org.oscim.backend.CanvasAdapter;
2223
import org.oscim.theme.IRenderTheme.ThemeException;
24+
import org.slf4j.Logger;
25+
import org.slf4j.LoggerFactory;
26+
import org.xml.sax.SAXException;
27+
28+
import java.io.IOException;
29+
30+
import javax.xml.parsers.ParserConfigurationException;
2331

2432
public class ThemeLoader {
2533

34+
private static final Logger log = LoggerFactory.getLogger(ThemeLoader.class);
35+
2636
public static boolean USE_ATLAS;
2737
public static boolean POT_TEXTURES;
2838

@@ -46,8 +56,21 @@ public static IRenderTheme load(ThemeFile theme) throws ThemeException {
4656
return load(theme, null);
4757
}
4858

59+
60+
4961
public static IRenderTheme load(ThemeFile theme, ThemeCallback themeCallback) throws ThemeException {
50-
IRenderTheme t = USE_ATLAS ? XmlAtlasThemeBuilder.read(theme, themeCallback) : XmlThemeBuilder.read(theme, themeCallback);
62+
IRenderTheme t = null;
63+
64+
try {
65+
if(ThemeUtils.isMapsforgeTheme(theme.getRenderThemeAsStream())){
66+
t = USE_ATLAS ? XmlMapsforgeAtlasThemeBuilder.read(theme, themeCallback) : XmlMapsforgeThemeBuilder.read(theme, themeCallback);
67+
}else{
68+
t = USE_ATLAS ? XmlAtlasThemeBuilder.read(theme, themeCallback) : XmlThemeBuilder.read(theme, themeCallback);
69+
}
70+
} catch (IOException | ParserConfigurationException | SAXException e) {
71+
e.printStackTrace();
72+
}
73+
5174
if (t != null)
5275
t.scaleTextSize(CanvasAdapter.textScale + (CanvasAdapter.dpi / CanvasAdapter.DEFAULT_DPI - 1));
5376
return t;

0 commit comments

Comments
 (0)