Implement simple UI for offline rendering
This commit is contained in:
parent
a6da67223e
commit
894e669a95
13 changed files with 218 additions and 129 deletions
|
@ -4,6 +4,8 @@ import java.io.File;
|
|||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class RenderingContext {
|
||||
static enum ShadowRenderingMode {
|
||||
|
@ -71,11 +73,13 @@ public class RenderingContext {
|
|||
return val * density;
|
||||
}
|
||||
|
||||
private Map<String, byte[]> precache = new HashMap<String, byte[]>();
|
||||
|
||||
protected byte[] getIconRawData(String data) {
|
||||
if(iconsBaseDir != null) {
|
||||
File fs = new File(iconsBaseDir+"/h_"+data+".png");
|
||||
File fs = new File(iconsBaseDir.getAbsolutePath()+"/h_"+data+".png");
|
||||
if(!fs.exists()) {
|
||||
fs = new File(iconsBaseDir+"/g_"+data+".png");
|
||||
fs = new File(iconsBaseDir.getAbsolutePath()+"/g_"+data+".png");
|
||||
}
|
||||
if (fs.exists()) {
|
||||
try {
|
||||
|
@ -84,6 +88,7 @@ public class RenderingContext {
|
|||
int l = fis.read(dta);
|
||||
fis.close();
|
||||
if (l == dta.length) {
|
||||
precache.put(data, dta);
|
||||
return dta;
|
||||
} else {
|
||||
System.err.println("Read data " + l + " however was expected " + dta.length + " for " + data);
|
||||
|
|
|
@ -42,41 +42,6 @@ public class DataExtractionSettings {
|
|||
preferences.put("working_dir", path.getAbsolutePath());
|
||||
}
|
||||
|
||||
|
||||
public File[] getDefaultRoutingFile(){
|
||||
String routingFile = preferences.get("routing_file", null);
|
||||
if(routingFile == null){
|
||||
return null;
|
||||
}
|
||||
String[] files = routingFile.split(",");
|
||||
List<File> fs = new ArrayList<File>();
|
||||
for(String f : files){
|
||||
if(new File(f.trim()).exists()){
|
||||
fs.add(new File(f.trim()));
|
||||
}
|
||||
}
|
||||
|
||||
return fs.toArray(new File[fs.size()]);
|
||||
}
|
||||
|
||||
public String getDefaultRoutingFilePath(){
|
||||
File[] file = getDefaultRoutingFile();
|
||||
String path = "";
|
||||
if (file != null) {
|
||||
for (int i = 0; i < file.length; i++) {
|
||||
if (i > 0) {
|
||||
path += ", ";
|
||||
}
|
||||
path += file[i].getAbsolutePath();
|
||||
}
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
public void setDefaultRoutingPath(String path){
|
||||
preferences.put("routing_file", path);
|
||||
}
|
||||
|
||||
public LatLon getDefaultLocation(){
|
||||
double lat = preferences.getDouble("default_lat", 53.9);
|
||||
double lon = preferences.getDouble("default_lon", 27.56);
|
||||
|
@ -172,6 +137,41 @@ public class DataExtractionSettings {
|
|||
preferences.put("cityAdminLevel", s);
|
||||
}
|
||||
|
||||
public String getNativeLibFile(){
|
||||
String fl = preferences.get("nativeLibFile", null);
|
||||
if(fl != null) {
|
||||
return fl;
|
||||
}
|
||||
return getDefaultWorkingDir().getAbsolutePath() +"/osmand.lib";
|
||||
}
|
||||
|
||||
public void setNativeLibFile(String file){
|
||||
preferences.put("nativeLibFile", file);
|
||||
}
|
||||
|
||||
public String getRenderXmlPath(){
|
||||
return preferences.get("renderXmlPath", "default.render.xml");
|
||||
}
|
||||
|
||||
public void setRenderXmlPath(String file){
|
||||
preferences.put("renderXmlPath", file);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public String getBinaryFilesDir(){
|
||||
String fl = preferences.get("binaryFilesDir", null);
|
||||
if(fl != null) {
|
||||
return fl;
|
||||
}
|
||||
return getDefaultWorkingDir().getAbsolutePath();
|
||||
}
|
||||
|
||||
public void setBinaryFilesDir(String file){
|
||||
preferences.put("binaryFilesDir", file);
|
||||
}
|
||||
|
||||
|
||||
public String getOsrmServerAddress(){
|
||||
return preferences.get("osrmServerAddress", "http://127.0.0.1:5000");
|
||||
}
|
||||
|
|
|
@ -123,7 +123,8 @@ public class MapClusterLayer implements MapPanelLayer {
|
|||
|
||||
private List<Way> clustering(double lat, double lon, Set<String> roads) throws IOException{
|
||||
List<Way> res = new ArrayList<Way>();
|
||||
File[] files = DataExtractionSettings.getSettings().getDefaultRoutingFile();
|
||||
//TODO DataExtractionSettings.getSettings().getBinaryFilesDir()
|
||||
File[] files = new File[0];
|
||||
BinaryMapIndexReader[] rs = new BinaryMapIndexReader[files.length];
|
||||
for(int i=0; i<files.length; i++){
|
||||
RandomAccessFile raf = new RandomAccessFile(files[i], "r"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
|
|
|
@ -364,6 +364,12 @@ public class MapPanel extends JPanel implements IMapDownloaderCallback {
|
|||
return getHeight() / 2;
|
||||
}
|
||||
|
||||
public NativeSwingRendering getNativeLibrary() {
|
||||
return nativeLibRendering;
|
||||
}
|
||||
public void setNativeLibrary( NativeSwingRendering nl) {
|
||||
nativeLibRendering = nl;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void paintComponent(Graphics g) {
|
||||
|
@ -910,7 +916,8 @@ public class MapPanel extends JPanel implements IMapDownloaderCallback {
|
|||
sright + EXPAND_X * cf, stop - EXPAND_Y * cf, sbottom + EXPAND_Y * cf, z);
|
||||
nativeLatLon = latLon;
|
||||
nativeZoom = z;
|
||||
} catch (IOException e) {
|
||||
} catch (Exception e) {
|
||||
log.error(e.getMessage(), e);
|
||||
e.printStackTrace();
|
||||
}
|
||||
repaint();
|
||||
|
|
|
@ -473,7 +473,8 @@ public class MapRouterLayer implements MapPanelLayer {
|
|||
public List<Way> selfRoute(LatLon start, LatLon end) {
|
||||
List<Way> res = new ArrayList<Way>();
|
||||
long time = System.currentTimeMillis();
|
||||
File[] files = DataExtractionSettings.getSettings().getDefaultRoutingFile();
|
||||
// TODO DataExtractionSettings.getSettings().getBinaryFilesDir()
|
||||
File[] files = new File[0];
|
||||
if(files == null){
|
||||
JOptionPane.showMessageDialog(OsmExtractionUI.MAIN_APP.getFrame(), "Please specify obf file in settings", "Obf file not found",
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
|
|
|
@ -30,7 +30,7 @@ public class NativePreferencesDialog extends JDialog {
|
|||
|
||||
private JTextField nativeFilesDirectory;
|
||||
private JTextField renderingStyleFile;
|
||||
private JTextField nativeLibFile;
|
||||
private boolean okPressed;
|
||||
|
||||
|
||||
public NativePreferencesDialog(Component parent){
|
||||
|
@ -89,7 +89,7 @@ public class NativePreferencesDialog extends JDialog {
|
|||
|
||||
nativeFilesDirectory = new JTextField();
|
||||
|
||||
nativeFilesDirectory.setText(DataExtractionSettings.getSettings().getDefaultWorkingDir().getAbsolutePath());
|
||||
nativeFilesDirectory.setText(DataExtractionSettings.getSettings().getBinaryFilesDir());
|
||||
panel.add(nativeFilesDirectory);
|
||||
constr = new GridBagConstraints();
|
||||
constr.weightx = 1;
|
||||
|
@ -100,27 +100,6 @@ public class NativePreferencesDialog extends JDialog {
|
|||
l.setConstraints(nativeFilesDirectory, constr);
|
||||
|
||||
|
||||
label = new JLabel("City admin level : ");
|
||||
panel.add(label);
|
||||
constr = new GridBagConstraints();
|
||||
constr.ipadx = 5;
|
||||
constr.gridx = 0;
|
||||
constr.gridy = 2;
|
||||
constr.anchor = GridBagConstraints.WEST;
|
||||
l.setConstraints(label, constr);
|
||||
|
||||
nativeLibFile = new JTextField();
|
||||
|
||||
nativeLibFile.setText(DataExtractionSettings.getSettings().getCityAdminLevel());
|
||||
panel.add(nativeLibFile);
|
||||
constr = new GridBagConstraints();
|
||||
constr.weightx = 1;
|
||||
constr.fill = GridBagConstraints.HORIZONTAL;
|
||||
constr.ipadx = 5;
|
||||
constr.gridx = 1;
|
||||
constr.gridy = 2;
|
||||
l.setConstraints(nativeLibFile, constr);
|
||||
|
||||
label = new JLabel("Rendering style file : ");
|
||||
panel.add(label);
|
||||
constr = new GridBagConstraints();
|
||||
|
@ -131,7 +110,7 @@ public class NativePreferencesDialog extends JDialog {
|
|||
l.setConstraints(label, constr);
|
||||
|
||||
renderingStyleFile = new JTextField();
|
||||
renderingStyleFile.setText(DataExtractionSettings.getSettings().getOsrmServerAddress());
|
||||
renderingStyleFile.setText(DataExtractionSettings.getSettings().getRenderXmlPath());
|
||||
panel.add(renderingStyleFile);
|
||||
constr = new GridBagConstraints();
|
||||
constr.weightx = 1;
|
||||
|
@ -151,6 +130,7 @@ public class NativePreferencesDialog extends JDialog {
|
|||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
saveProperties();
|
||||
okPressed = true;
|
||||
setVisible(false);
|
||||
}
|
||||
|
||||
|
@ -166,25 +146,20 @@ public class NativePreferencesDialog extends JDialog {
|
|||
|
||||
|
||||
public void saveProperties(){
|
||||
// TODO
|
||||
// DataExtractionSettings settings = DataExtractionSettings.getSettings();
|
||||
// if(!settings.getSuffixesToNormalizeStreetsString().equals(streetSuffixes.getText())){
|
||||
// settings.setSuffixesToNormalizeStreets(streetSuffixes.getText());
|
||||
// }
|
||||
// if(!settings.getDefaultSuffixesToNormalizeStreetsString().equals(streetDefaultSuffixes.getText())){
|
||||
// settings.setDefaultSuffixesToNormalizeStreets(streetDefaultSuffixes.getText());
|
||||
// }
|
||||
// if(settings.useInternetToLoadImages() != useInternet.isSelected()){
|
||||
// settings.setUseInterentToLoadImages(useInternet.isSelected());
|
||||
// }
|
||||
//
|
||||
// if(!settings.getLineSmoothness().equals(lineSmoothness.getText())){
|
||||
// settings.setLineSmoothness(lineSmoothness.getText());
|
||||
// }
|
||||
DataExtractionSettings settings = DataExtractionSettings.getSettings();
|
||||
if(!settings.getBinaryFilesDir().equals(nativeFilesDirectory.getText())){
|
||||
settings.setBinaryFilesDir(nativeFilesDirectory.getText());
|
||||
}
|
||||
|
||||
if(!settings.getRenderXmlPath().equals(renderingStyleFile.getText())){
|
||||
settings.setRenderXmlPath(renderingStyleFile.getText());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public boolean isOkPressed() {
|
||||
return okPressed;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ package net.osmand.swing;
|
|||
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Iterator;
|
||||
|
@ -21,14 +22,10 @@ import net.osmand.render.RenderingRulesStorage.RenderingRulesStorageResolver;
|
|||
|
||||
public class NativeSwingRendering extends NativeLibrary {
|
||||
|
||||
static {
|
||||
// System.load("/home/victor/projects/OsmAnd/git/Osmand-kernel/jni-prebuilt/linux-x86/osmand.lib");
|
||||
}
|
||||
|
||||
RenderingRulesStorage storage;
|
||||
private final File baseDirRC;
|
||||
|
||||
private RenderingRulesStorage getDefault() throws SAXException, IOException{
|
||||
public void loadRuleStorage(String path) throws SAXException, IOException{
|
||||
RenderingRulesStorage storage = new RenderingRulesStorage();
|
||||
final RenderingRulesStorageResolver resolver = new RenderingRulesStorageResolver() {
|
||||
@Override
|
||||
|
@ -43,14 +40,18 @@ public class NativeSwingRendering extends NativeLibrary {
|
|||
return depends;
|
||||
}
|
||||
};
|
||||
if(path == null || path.equals("default.render.xml")) {
|
||||
storage.parseRulesFromXmlInputStream(RenderingRulesStorage.class.getResourceAsStream("default.render.xml"), resolver);
|
||||
return storage;
|
||||
} else {
|
||||
storage.parseRulesFromXmlInputStream(new FileInputStream(path), resolver);
|
||||
}
|
||||
this.storage = storage;
|
||||
}
|
||||
|
||||
public NativeSwingRendering(File baseDirRC){
|
||||
this.baseDirRC = baseDirRC;
|
||||
try {
|
||||
storage = getDefault();
|
||||
loadRuleStorage(null);
|
||||
} catch (SAXException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (IOException e) {
|
||||
|
@ -60,6 +61,7 @@ public class NativeSwingRendering extends NativeLibrary {
|
|||
|
||||
|
||||
|
||||
|
||||
public BufferedImage renderImage(int sleft, int sright, int stop, int sbottom, int zoom) throws IOException {
|
||||
long time = -System.currentTimeMillis();
|
||||
RenderingContext rctx = new RenderingContext(baseDirRC);
|
||||
|
@ -111,26 +113,19 @@ public class NativeSwingRendering extends NativeLibrary {
|
|||
}
|
||||
}
|
||||
|
||||
private static NativeSwingRendering loaded = null;
|
||||
public static NativeSwingRendering loadLibrary(String path){
|
||||
if(loaded == null) {
|
||||
System.load(path);
|
||||
// TODO images !!!
|
||||
loaded = new NativeSwingRendering(new File("/home/victor/projects/OsmAnd/git/OsmAnd/res/drawable-mdpi/"));
|
||||
}
|
||||
return loaded;
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws SAXException, IOException {
|
||||
System.load("/home/victor/projects/OsmAnd/git/Osmand-kernel/jni-prebuilt/linux-x86/osmand.lib");
|
||||
NativeSwingRendering lib = new NativeSwingRendering(
|
||||
new File("/home/victor/projects/OsmAnd/git/OsmAnd/res/drawable-mdpi/"));
|
||||
NativeSwingRendering lib = loadLibrary("/home/victor/projects/OsmAnd/git/Osmand-kernel/jni-prebuilt/linux-x86/osmand.lib");
|
||||
lib.initFilesInDir(new File("/home/victor/projects/OsmAnd/data/version2"));
|
||||
double latTop = 22.5;
|
||||
double lonLeft = -80;
|
||||
int zoom = 11;
|
||||
|
||||
float tileX = 2;
|
||||
float tileY = 2;
|
||||
double latBottom = MapUtils.getLatitudeFromTile(zoom, MapUtils.getTileNumberY(zoom, latTop) + tileY);
|
||||
double lonRight = MapUtils.getLongitudeFromTile(zoom, MapUtils.getTileNumberX(zoom, lonLeft) + tileX);
|
||||
int sleft = MapUtils.get31TileNumberX(lonLeft);
|
||||
int sright = MapUtils.get31TileNumberX(lonRight);
|
||||
int stop = MapUtils.get31TileNumberY(latTop);
|
||||
int sbottom = MapUtils.get31TileNumberY(latBottom);
|
||||
lib.renderImage(sleft, sright, stop, sbottom, zoom);
|
||||
|
||||
MapPanel.showMainWindow(512, 512, lib);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,7 +35,9 @@ public class OsmExtractionPreferencesDialog extends JDialog {
|
|||
private JTextField cityAdminLevel;
|
||||
private JTextField osrmServerAddress;
|
||||
private JTextField renderingTypesFile;
|
||||
private JTextField pathToObfRoutingFile;
|
||||
private JTextField nativeLibFile;
|
||||
private JTextField nativeFilesDirectory;
|
||||
private JTextField renderingStyleFile;
|
||||
|
||||
private JCheckBox useInternet;
|
||||
|
||||
|
@ -51,7 +53,7 @@ public class OsmExtractionPreferencesDialog extends JDialog {
|
|||
}
|
||||
|
||||
public void showDialog(){
|
||||
setSize(700, 380);
|
||||
setSize(700, 500);
|
||||
double x = getParent().getBounds().getCenterX();
|
||||
double y = getParent().getBounds().getCenterY();
|
||||
setLocation((int) x - getWidth() / 2, (int) y - getHeight() / 2);
|
||||
|
@ -102,7 +104,7 @@ public class OsmExtractionPreferencesDialog extends JDialog {
|
|||
constr.anchor = GridBagConstraints.WEST;
|
||||
l.setConstraints(useInternet, constr);
|
||||
|
||||
JLabel label = new JLabel("Path to obf files (test routing, comma separated) : ");
|
||||
JLabel label = new JLabel("Directory with obf binary files (routing, rendering): ");
|
||||
panel.add(label);
|
||||
constr = new GridBagConstraints();
|
||||
constr.ipadx = 5;
|
||||
|
@ -111,17 +113,17 @@ public class OsmExtractionPreferencesDialog extends JDialog {
|
|||
constr.anchor = GridBagConstraints.WEST;
|
||||
l.setConstraints(label, constr);
|
||||
|
||||
pathToObfRoutingFile = new JTextField();
|
||||
nativeFilesDirectory = new JTextField();
|
||||
|
||||
pathToObfRoutingFile.setText(DataExtractionSettings.getSettings().getDefaultRoutingFilePath());
|
||||
panel.add(pathToObfRoutingFile);
|
||||
nativeFilesDirectory.setText(DataExtractionSettings.getSettings().getBinaryFilesDir());
|
||||
panel.add(nativeFilesDirectory);
|
||||
constr = new GridBagConstraints();
|
||||
constr.weightx = 1;
|
||||
constr.fill = GridBagConstraints.HORIZONTAL;
|
||||
constr.ipadx = 5;
|
||||
constr.gridx = 1;
|
||||
constr.gridy = 1;
|
||||
l.setConstraints(pathToObfRoutingFile, constr);
|
||||
l.setConstraints(nativeFilesDirectory, constr);
|
||||
|
||||
|
||||
label = new JLabel("City admin level : ");
|
||||
|
@ -166,6 +168,46 @@ public class OsmExtractionPreferencesDialog extends JDialog {
|
|||
constr.gridy = 3;
|
||||
l.setConstraints(osrmServerAddress, constr);
|
||||
|
||||
label = new JLabel("Rendering style file : ");
|
||||
panel.add(label);
|
||||
constr = new GridBagConstraints();
|
||||
constr.ipadx = 5;
|
||||
constr.gridx = 0;
|
||||
constr.gridy = 4;
|
||||
constr.anchor = GridBagConstraints.WEST;
|
||||
l.setConstraints(label, constr);
|
||||
|
||||
renderingStyleFile = new JTextField();
|
||||
renderingStyleFile.setText(DataExtractionSettings.getSettings().getRenderXmlPath());
|
||||
panel.add(renderingStyleFile);
|
||||
constr = new GridBagConstraints();
|
||||
constr.weightx = 1;
|
||||
constr.fill = GridBagConstraints.HORIZONTAL;
|
||||
constr.ipadx = 5;
|
||||
constr.gridx = 1;
|
||||
constr.gridy = 4;
|
||||
l.setConstraints(renderingStyleFile, constr);
|
||||
|
||||
label = new JLabel("Native lib file (osmand.lib): ");
|
||||
panel.add(label);
|
||||
constr = new GridBagConstraints();
|
||||
constr.ipadx = 5;
|
||||
constr.gridx = 0;
|
||||
constr.gridy = 5;
|
||||
constr.anchor = GridBagConstraints.WEST;
|
||||
l.setConstraints(label, constr);
|
||||
|
||||
nativeLibFile = new JTextField();
|
||||
nativeLibFile.setText(DataExtractionSettings.getSettings().getNativeLibFile());
|
||||
panel.add(nativeLibFile);
|
||||
constr = new GridBagConstraints();
|
||||
constr.weightx = 1;
|
||||
constr.fill = GridBagConstraints.HORIZONTAL;
|
||||
constr.ipadx = 5;
|
||||
constr.gridx = 1;
|
||||
constr.gridy = 5;
|
||||
l.setConstraints(nativeLibFile, constr);
|
||||
|
||||
// supressWarning = new JCheckBox();
|
||||
// supressWarning.setText(Messages.getString("OsmExtractionPreferencesDialog.DUPLICATED.ID")); //$NON-NLS-1$
|
||||
// supressWarning.setSelected(DataExtractionSettings.getSettings().isSupressWarningsForDuplicatedId());
|
||||
|
@ -320,6 +362,9 @@ public class OsmExtractionPreferencesDialog extends JDialog {
|
|||
if(settings.useInternetToLoadImages() != useInternet.isSelected()){
|
||||
settings.setUseInterentToLoadImages(useInternet.isSelected());
|
||||
}
|
||||
if(!settings.getNativeLibFile().equals(nativeLibFile.getText())){
|
||||
settings.setNativeLibFile(nativeLibFile.getText());
|
||||
}
|
||||
|
||||
if(!settings.getLineSmoothness().equals(lineSmoothness.getText())){
|
||||
settings.setLineSmoothness(lineSmoothness.getText());
|
||||
|
@ -330,15 +375,19 @@ public class OsmExtractionPreferencesDialog extends JDialog {
|
|||
if(!settings.getMapRenderingTypesFile().equals(renderingTypesFile.getText())){
|
||||
settings.setMapRenderingTypesFile(renderingTypesFile.getText());
|
||||
}
|
||||
if(!settings.getDefaultRoutingFilePath().equals(pathToObfRoutingFile.getText())){
|
||||
settings.setDefaultRoutingPath(pathToObfRoutingFile.getText());
|
||||
}
|
||||
if(!settings.getCityAdminLevel().equals(cityAdminLevel.getText())){
|
||||
settings.setCityAdminLevel(cityAdminLevel.getText());
|
||||
}
|
||||
if(!settings.getOsrmServerAddress().equals(osrmServerAddress.getText())){
|
||||
settings.setOsrmServerAddress(osrmServerAddress.getText());
|
||||
}
|
||||
if(!settings.getBinaryFilesDir().equals(nativeFilesDirectory.getText())){
|
||||
settings.setBinaryFilesDir(nativeFilesDirectory.getText());
|
||||
}
|
||||
|
||||
if(!settings.getRenderXmlPath().equals(renderingStyleFile.getText())){
|
||||
settings.setRenderXmlPath(renderingStyleFile.getText());
|
||||
}
|
||||
// if(settings.isSupressWarningsForDuplicatedId() != supressWarning.isSelected()){
|
||||
// settings.setSupressWarningsForDuplicatedId (supressWarning.isSelected());
|
||||
// }
|
||||
|
|
|
@ -218,11 +218,38 @@ public class OsmExtractionUI implements IMapLocationListener {
|
|||
showOfflineIndex.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
if(showOfflineIndex.isSelected()) {
|
||||
NativePreferencesDialog dlg = new NativePreferencesDialog(frame);
|
||||
dlg.showDialog();
|
||||
if(dlg.isOkPressed()) {
|
||||
initNativeRendering();
|
||||
} else {
|
||||
showOfflineIndex.setSelected(false);
|
||||
}
|
||||
} else {
|
||||
mapPanel.setNativeLibrary(null);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void initNativeRendering() {
|
||||
NativeSwingRendering lib = NativeSwingRendering.loadLibrary(
|
||||
DataExtractionSettings.getSettings().getNativeLibFile());
|
||||
if(lib != null) {
|
||||
try {
|
||||
lib.initFilesInDir(new File(DataExtractionSettings.getSettings().getBinaryFilesDir()));
|
||||
lib.loadRuleStorage(DataExtractionSettings.getSettings().getRenderXmlPath());
|
||||
mapPanel.setNativeLibrary(lib);
|
||||
mapPanel.repaint();
|
||||
} catch (SAXException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
throw new RuntimeException(e);
|
||||
} catch (IOException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void fillMenuWithActions(final JMenuBar bar){
|
||||
|
|
|
@ -5,6 +5,7 @@ OSMAND_SKIA_ABS := $(LOCAL_PATH)/../skia/skia_library
|
|||
LOCAL_C_INCLUDES := $(LOCAL_PATH)/src \
|
||||
$(PROTOBUF) \
|
||||
$(LOCAL_PATH)/../skia \
|
||||
$(LOCAL_PATH)/../expat/expat_library/lib \
|
||||
$(OSMAND_SKIA_ABS)/include/core \
|
||||
$(OSMAND_SKIA_ABS)/include/images \
|
||||
$(OSMAND_SKIA_ABS)/include/utils \
|
||||
|
|
|
@ -6,10 +6,12 @@ include ./Common.mk
|
|||
|
||||
LOCAL_SRC_FILES += src/osmand_main.cpp
|
||||
|
||||
LDFLAGS = -Wl,--hash-style=both -shared
|
||||
#LDFLAGS = -Wl,--hash-style=both -fPIC
|
||||
LDFLAGS = -Wall -fPIC -Wl,-Bsymbolic
|
||||
LDRUNFLAGS = -Wl,--hash-style=both
|
||||
# --trace -Bsymbolic -Bsymbolic-functions
|
||||
|
||||
LDLIBS = -L$(PREBUILT_DIR) -lskia -lproto -lpthread -lrt -lft2 -lexpat -lpng -lz
|
||||
LDLIBS = -L$(PREBUILT_DIR) -lskia -lproto -lpthread -lrt -lft2 -lexpat -lz -lpng
|
||||
CPP_FILE_EXTENSION = cpp
|
||||
OBJECTS = $(LOCAL_SRC_FILES:src/%.$(CPP_FILE_EXTENSION)=build/obj/%.o)
|
||||
|
||||
|
@ -29,7 +31,7 @@ target : $(PREBUILT_DIR)/$(LIBNAME)
|
|||
#target : $(PREBUILT_DIR)/$(LIBNAME) ../$(RUNFILE)
|
||||
|
||||
|
||||
../$(RUNFILE) : $(OBJECTS) $(PREBUILT_DIR)/libskia.a $(PREBUILT_DIR)/libproto.a
|
||||
../$(RUNFILE) : $(OBJECTS) $(PREBUILT_DIR)/libskia.a $(PREBUILT_DIR)/libproto.a Makefile
|
||||
$(CXX) $(LDRUNFLAGS) -o ../$(RUNFILE) $(OBJECTS) $(LDLIBS)
|
||||
@chmod +x ../$(RUNFILE)
|
||||
|
||||
|
@ -37,9 +39,8 @@ $(PREBUILT_DIR)/$(LIBNAME) : build/$(LIBNAME)
|
|||
cp build/$(LIBNAME) $(PREBUILT_DIR)/$(LIBNAME)
|
||||
|
||||
|
||||
build/$(LIBNAME): $(OBJECTS) $(PREBUILT_DIR)/libskia.a $(PREBUILT_DIR)/libproto.a
|
||||
$(CXX) $(LDFLAGS) -o build/$(LIBNAME) $(OBJECTS) $(LDLIBS)
|
||||
strip build/$(LIBNAME)
|
||||
build/$(LIBNAME): $(OBJECTS) $(PREBUILT_DIR)/libskia.a $(PREBUILT_DIR)/libproto.a Makefile
|
||||
$(CXX) -shared -o build/$(LIBNAME) $(OBJECTS) $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
build/obj/%.o : src/%.$(CPP_FILE_EXTENSION) $(LOCAL_C_INCLUDES)
|
||||
@mkdir -p `dirname $@`
|
||||
|
|
|
@ -17,6 +17,24 @@
|
|||
JavaVM* globalJVM = NULL;
|
||||
void loadJniRenderingContext(JNIEnv* env);
|
||||
void loadJniRenderingRules(JNIEnv* env);
|
||||
|
||||
static int simplePngSize = 93;
|
||||
static void* simplePng = new uint8[simplePngSize]{
|
||||
0x89 ,0x50 ,0x4E ,0x47 ,0x0D ,0x0A ,0x1A ,0x0A ,
|
||||
0x00 ,0x00 ,0x00 ,0x0D ,0x49 ,0x48 ,0x44 ,0x52 ,
|
||||
0x00 ,0x00 ,0x00 ,0x06 ,0x00 ,0x00 ,0x00 ,0x06 ,
|
||||
0x08 ,0x03 ,0x00 ,0x00 ,0x00 ,0xD7 ,0x12 ,0x1F ,
|
||||
0x7A ,0x00 ,0x00 ,0x00 ,0x03 ,0x50 ,0x4C ,0x54 ,
|
||||
0x45 ,0x20 ,0x97 ,0xCE ,0xDD ,0xEB ,0x88 ,0x50 ,
|
||||
0x00 ,0x00 ,0x00 ,0x15 ,0x49 ,0x44 ,0x41 ,0x54 ,
|
||||
0x78 ,0xDA ,0x8D ,0xC1 ,0x01 ,0x01 ,0x00 ,0x00 ,
|
||||
0x00 ,0x80 ,0x90 ,0xFE ,0xAF ,0x76 ,0x21 ,0xDA ,
|
||||
0x00 ,0x00 ,0x2A ,0x00 ,0x01 ,0xD0 ,0x79 ,0x58 ,
|
||||
0x1D ,0x00 ,0x00 ,0x00 ,0x00 ,0x49 ,0x45 ,0x4E ,
|
||||
0x44 ,0xAE ,0x42 ,0x60 ,0x82
|
||||
};
|
||||
|
||||
|
||||
extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
|
||||
{
|
||||
JNIEnv* globalJniEnv;
|
||||
|
@ -25,8 +43,19 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
|
|||
globalJVM = vm;
|
||||
loadJniRenderingContext(globalJniEnv);
|
||||
loadJniRenderingRules(globalJniEnv);
|
||||
osmand_log_print(LOG_INFO, "JNI_OnLoad completed");
|
||||
// Encode and decode png (bug in PC Java linking, currently using -Bsymbolic?)
|
||||
/*SkBitmap* bmp = new SkBitmap();
|
||||
if(!SkImageDecoder::DecodeMemory(simplePng, simplePngSize, bmp)) {
|
||||
osmand_log_print(LOG_INFO, "Initialization jni : decode png failed!");
|
||||
return JNI_VERSION_1_6;
|
||||
}
|
||||
SkImageEncoder* enc = SkImageEncoder::Create(SkImageEncoder::kPNG_Type);
|
||||
SkDynamicMemoryWStream* stream = new SkDynamicMemoryWStream();
|
||||
enc->encodeStream(stream, *bmp, 80);
|
||||
delete stream;
|
||||
delete bmp;*/
|
||||
|
||||
osmand_log_print(LOG_INFO, "JNI_OnLoad completed");
|
||||
return JNI_VERSION_1_6;
|
||||
}
|
||||
|
||||
|
@ -186,7 +215,6 @@ extern "C" JNIEXPORT jobject JNICALL Java_net_osmand_plus_render_NativeOsmandLib
|
|||
RenderingRuleSearchRequest* req = initSearchRequest(ienv, renderingRuleSearchRequest);
|
||||
JNIRenderingContext rc;
|
||||
pullFromJavaRenderingContext(ienv, renderingContext, &rc);
|
||||
rc.setUseEnglishNames(useEnglishNames);
|
||||
ResultPublisher* result = ((ResultPublisher*) searchResult);
|
||||
// std::vector <BaseMapDataObject* > mapDataObjects = marshalObjects(binaryMapDataObjects);
|
||||
|
||||
|
@ -304,6 +332,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_net_osmand_NativeLibrary_generateRende
|
|||
bitmapData = malloc(bitmapDataSize);
|
||||
|
||||
stream->copyTo(bitmapData);
|
||||
delete enc;
|
||||
}
|
||||
bitmapBuffer = ienv->NewDirectByteBuffer(bitmapData, bitmapDataSize);
|
||||
|
||||
|
@ -428,7 +457,6 @@ SkBitmap* JNIRenderingContext::getCachedBitmap(const std::string& bitmapResource
|
|||
this->nativeOperations.start();
|
||||
env->ReleaseByteArrayElements(javaIconRawData, bitmapBuffer, JNI_ABORT);
|
||||
env->DeleteLocalRef(javaIconRawData);
|
||||
env->DeleteLocalRef(jstr);
|
||||
|
||||
throwNewException(env, (std::string("Failed to decode ") + bitmapResource).c_str());
|
||||
|
||||
|
|
|
@ -9,7 +9,6 @@ LOCAL_MODULE := png
|
|||
else
|
||||
LOCAL_MODULE := png_neon
|
||||
endif
|
||||
LIBPNG
|
||||
ifneq ($(OSMAND_USE_PREBUILT),true)
|
||||
|
||||
common_CFLAGS := -fvisibility=hidden ## -fomit-frame-pointer
|
||||
|
|
Loading…
Reference in a new issue