summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormvglasow <michael -at- vonglasow.com>2019-08-19 11:17:55 +0300
committermvglasow <michael -at- vonglasow.com>2019-08-19 11:17:55 +0300
commitb01fbab89f16e0ad1ed84772a331b209cac38162 (patch)
tree31baf5f54afc3a2b398e8df8b92567004532c6b3
parentba408d615ad7804529107f76665302924915a431 (diff)
parentc2f9838f07a52cc64cb05e9cf95bb378261946d9 (diff)
downloadnavit-b01fbab89f16e0ad1ed84772a331b209cac38162.tar.gz
Merge branch 'trunk' into traffic
-rw-r--r--.circleci/config.yml11
-rw-r--r--build.gradle2
-rw-r--r--gradle/wrapper/gradle-wrapper.properties2
-rw-r--r--navit/CMakeLists.txt11
-rw-r--r--navit/android/build.gradle14
-rw-r--r--navit/android/src/org/navitproject/navit/Navit.java2
-rw-r--r--navit/attr_def.h2
-rw-r--r--navit/callback.c12
-rw-r--r--navit/callback.h2
-rw-r--r--navit/graphics.c292
-rw-r--r--navit/graphics.h181
-rw-r--r--navit/graphics/qt5/graphics_qt5.cpp28
-rw-r--r--navit/main.c4
-rw-r--r--navit/main.h1
-rw-r--r--navit/navit.c22
-rw-r--r--navit/start_real.c1
-rw-r--r--navit/xslt/sailfish_cursor.xslt2
-rw-r--r--navit/xslt/sailfish_qt5.xslt2
-rwxr-xr-xscripts/build_android.sh9
19 files changed, 442 insertions, 158 deletions
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 823ca54d0..273406c54 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -68,7 +68,7 @@ jobs:
build_android:
working_directory: ~/code
docker:
- - image: circleci/android:api-28-ndk
+ - image: circleci/android:api-29
environment:
JVM_OPTS: -Xmx3200m
GRADLE_OPTS: '-Dorg.gradle.jvmargs="-Xmx2048m -XX:+HeapDumpOnOutOfMemoryError"'
@@ -78,14 +78,19 @@ jobs:
name: Id
command: cat /etc/*release
- run:
- name: Install cmake gettext libsaxonb-java librsvg2-bin pkg-config libprotobuf-c-dev protobuf-c-compiler
+ name: Install cmake gettext libsaxonb-java librsvg2-bin pkg-config rename
command: |
sudo apt-get update
- sudo apt-get install -y cmake gettext libsaxonb-java librsvg2-bin pkg-config libprotobuf-c-dev protobuf-c-compiler
+ sudo apt-get install -y cmake gettext libsaxonb-java librsvg2-bin pkg-config rename
- run:
name: Install Android SDK components
command: sdkmanager "cmake;3.6.4111459"
- run:
+ name: Install ndk
+ command: |
+ echo y | sdkmanager --licenses
+ echo y | sdkmanager ndk-bundle
+ - run:
name: Build for Android
command: bash scripts/build_android.sh
- run:
diff --git a/build.gradle b/build.gradle
index 5d598ab8b..8fe92d2f1 100644
--- a/build.gradle
+++ b/build.gradle
@@ -10,7 +10,7 @@ buildscript {
}
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.1.2'
+ classpath 'com.android.tools.build:gradle:3.4.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 73bb13d55..25f587d12 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.6-all.zip
diff --git a/navit/CMakeLists.txt b/navit/CMakeLists.txt
index 0c4d4243d..1234bd0cb 100644
--- a/navit/CMakeLists.txt
+++ b/navit/CMakeLists.txt
@@ -95,13 +95,12 @@ if(NOT ANDROID)
endif()
endif()
-#if (SHARED_LIBNAVIT)
-# add_library (${NAVIT_LIBNAME} SHARED ${NAVIT_SRC} )
-#else(SHARED_LIBNAVIT)
-# add_library (${NAVIT_LIBNAME} STATIC ${NAVIT_SRC} )
-#endif(SHARED_LIBNAVIT)
+if (SHARED_LIBNAVIT)
+ add_library (${NAVIT_LIBNAME} SHARED ${NAVIT_SRC} )
+else(SHARED_LIBNAVIT)
+ add_library (${NAVIT_LIBNAME} STATIC ${NAVIT_SRC} )
+endif(SHARED_LIBNAVIT)
-add_library (${NAVIT_LIBNAME} ${NAVIT_SRC} )
if(NOT MSVC)
SET(NAVIT_LIBS ${NAVIT_LIBS} m)
endif(NOT MSVC)
diff --git a/navit/android/build.gradle b/navit/android/build.gradle
index 1385336bf..faf5acc03 100644
--- a/navit/android/build.gradle
+++ b/navit/android/build.gradle
@@ -3,17 +3,17 @@ apply from: "$project.rootDir/gradle/scripts/git-scm-version.gradle"
apply plugin: 'checkstyle'
android {
- compileSdkVersion 27
- buildToolsVersion "27.0.3"
+ compileSdkVersion 28
+ buildToolsVersion "29.0.1"
defaultConfig {
applicationId "org.navitproject.navit"
minSdkVersion 9
- targetSdkVersion 27
+ targetSdkVersion 28
versionCode gitVersionCode
versionName gitVersionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
- ndk { // need for now for 'x86_64' and , 'armeabi' and , 'arm64-v8a'
- abiFilters 'x86', 'armeabi-v7a'
+ ndk { // need for now for 'x86_64' and 'armeabi'
+ abiFilters 'x86', 'armeabi-v7a', 'arm64-v8a'
}
externalNativeBuild {
cmake {
@@ -61,10 +61,10 @@ android {
xml.enabled = true
html.enabled = true
xml {
- destination "checkstyle/checkstyleMain.xml"
+ destination file("checkstyle/checkstyleMain.xml")
}
html {
- destination "checkstyle/checkstyleMain.html"
+ destination file("checkstyle/checkstyleMain.html")
}
}
diff --git a/navit/android/src/org/navitproject/navit/Navit.java b/navit/android/src/org/navitproject/navit/Navit.java
index bc2af1632..a2c1a4ff1 100644
--- a/navit/android/src/org/navitproject/navit/Navit.java
+++ b/navit/android/src/org/navitproject/navit/Navit.java
@@ -444,7 +444,7 @@ public class Navit extends Activity {
ActivityResults = new NavitActivityResult[16];
setVolumeControlStream(AudioManager.STREAM_MUSIC);
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
- wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,"NavitDoNotDimScreen");
+ wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,"navit:DoNotDimScreen");
if (!extractRes(langc, NAVIT_DATA_DIR + "/locale/" + langc + "/LC_MESSAGES/navit.mo")) {
Log.e(TAG, "Failed to extract language resource " + langc);
diff --git a/navit/attr_def.h b/navit/attr_def.h
index 4d859d1fa..055936b4a 100644
--- a/navit/attr_def.h
+++ b/navit/attr_def.h
@@ -200,6 +200,8 @@ ATTR(turn_around_penalty)
ATTR(turn_around_penalty2)
ATTR(autozoom_max)
ATTR(nav_status)
+ATTR(virtual_dpi)
+ATTR(real_dpi)
ATTR2(0x00027500,type_rel_abs_begin)
/* These attributes are int that can either hold relative or absolute values. See the
* documentation of ATTR_REL_RELSHIFT for details.
diff --git a/navit/callback.c b/navit/callback.c
index c9ce5adea..edf594c3e 100644
--- a/navit/callback.c
+++ b/navit/callback.c
@@ -23,6 +23,7 @@
#include "debug.h"
#include "callback.h"
+
struct callback {
/* func has variable number of arguments, not (void),
* but we must declare something... */
@@ -34,6 +35,8 @@ struct callback {
};
struct callback_list {
+ callback_patch patch;
+ void * patch_context;
GList *list;
};
@@ -115,6 +118,13 @@ void callback_list_remove_destroy(struct callback_list *l, struct callback *cb)
g_free(cb);
}
+void callback_list_add_patch_function (struct callback_list *l, callback_patch patch, void * context) {
+ if(!l)
+ return;
+ l->patch = patch;
+ l->patch_context = context;
+}
+
void callback_call(struct callback *cb, int pcount, void **p) {
int i;
void *pf[8];
@@ -193,6 +203,8 @@ void callback_list_call_attr(struct callback_list *l, enum attr_type type, int p
if (!l) {
return;
}
+ if(l->patch != NULL)
+ l->patch(l, type, pcount, p, l->patch_context);
cbi=l->list;
while (cbi) {
diff --git a/navit/callback.h b/navit/callback.h
index b0f4b9f81..c45735280 100644
--- a/navit/callback.h
+++ b/navit/callback.h
@@ -30,6 +30,7 @@ extern "C" {
enum attr_type;
struct callback;
struct callback_list;
+typedef void (*callback_patch) (struct callback_list *l, enum attr_type type, int pcount, void **p, void * context);
struct callback_list *callback_list_new(void);
struct callback *callback_new_attr(void (*func)(void), enum attr_type type, int pcount, void **p);
struct callback *callback_new_attr_args(void (*func)(void), enum attr_type type, int count, ...);
@@ -41,6 +42,7 @@ void callback_list_add(struct callback_list *l, struct callback *cb);
struct callback *callback_list_add_new(struct callback_list *l, void (*func)(void), int pcount, void **p);
void callback_list_remove(struct callback_list *l, struct callback *cb);
void callback_list_remove_destroy(struct callback_list *l, struct callback *cb);
+void callback_list_add_patch_function (struct callback_list *l, callback_patch patch, void * context);
void callback_call(struct callback *cb, int pcount, void **p);
void callback_call_args(struct callback *cb, int count, ...);
void callback_list_call_attr(struct callback_list *l, enum attr_type type, int pcount, void **p);
diff --git a/navit/graphics.c b/navit/graphics.c
index 1bb7dbd3c..40e04bb06 100644
--- a/navit/graphics.c
+++ b/navit/graphics.c
@@ -51,6 +51,7 @@
#include "callback.h"
#include "file.h"
#include "event.h"
+#include "navit.h"
//##############################################################################################################
@@ -88,6 +89,8 @@ struct graphics {
*/
int current_z_order;
GHashTable *image_cache_hash;
+ /* for dpi compensation */
+ int dpi_factor;
};
struct display_context {
@@ -140,6 +143,38 @@ static void circle_to_points(const struct point *center, int diameter, int scale
static void graphics_process_selection(struct graphics *gra, struct displaylist *dl);
static void graphics_gc_init(struct graphics *this_);
+
+static int graphics_dpi_scale(struct graphics * gra, int p) {
+ int result;
+ if(gra == NULL)
+ return p;
+ result = p * gra->dpi_factor;
+ return result;
+}
+static struct point graphics_dpi_scale_point(struct graphics * gra, struct point *p) {
+ struct point result = {-1,-1};
+ if(!p)
+ return result;
+ result.x = graphics_dpi_scale(gra, p->x);
+ result.y = graphics_dpi_scale(gra, p->y);
+ return result;
+}
+static int graphics_dpi_unscale(struct graphics * gra, int p) {
+ int result;
+ if(gra == NULL)
+ return p;
+ result = p / gra->dpi_factor;
+ return result;
+}
+static struct point graphics_dpi_unscale_point(struct graphics * gra, struct point *p) {
+ struct point result = {-1,-1};
+ if(!p)
+ return result;
+ result.x = graphics_dpi_unscale(gra, p->x);
+ result.y = graphics_dpi_unscale(gra, p->y);
+ return result;
+}
+
static void clear_hash(struct displaylist *dl) {
int i;
for (i = 0 ; i < HASH_SIZE ; i++)
@@ -243,6 +278,49 @@ void graphics_set_rect(struct graphics *gra, struct point_rect *pr) {
}
/**
+ * @brief unscale coordinates coming from the graphics backend via callback.
+ *
+ * @param l pointer to callback list
+ * @param pcount number of parameters attached to this callback
+ * @param p list of parameters
+ * @param context context handed over by callback_list_add_patch_function, gra in this case.
+ * @return nothing
+ */
+static void graphics_dpi_patch (struct callback_list *l, enum attr_type type, int pcount, void **p, void * context) {
+ /* this is black magic. We scaled all coordinates to the graphics backend
+ * to compensate screen dpi. Since the backends communicate back via the callback
+ * list, we hook this function to unscale the coordinates coming back to
+ * navit before actually calling the callbacks.
+ */
+ struct graphics * gra;
+ gra = (struct graphics *) context;
+ if(gra == NULL)
+ return;
+
+ if((type == attr_resize) && (pcount >= 2)) {
+ int w, h;
+ w = GPOINTER_TO_INT(p[0]);
+ h = GPOINTER_TO_INT(p[1]);
+ dbg(lvl_debug,"scaling attr_resize %d, %d, %d", pcount, w, h);
+ p[0] = GINT_TO_POINTER(graphics_dpi_unscale(gra,w));
+ p[1] = GINT_TO_POINTER(graphics_dpi_unscale(gra,h));
+ }
+ if((type == attr_button) && (pcount >=3)) {
+ struct point * pnt;
+ pnt = (struct point *) p[2];
+ dbg(lvl_debug,"scaling attr_button %d, %d, %d", pcount, pnt->x, pnt->y);
+ *pnt = graphics_dpi_unscale_point(gra, pnt);
+ }
+ if((type == attr_motion) && (pcount >=1)) {
+ struct point * pnt;
+ pnt = (struct point *) p[0];
+ dbg(lvl_debug,"scaling attr_motion %d, %d, %d", pcount, pnt->x, pnt->y);
+ *pnt = graphics_dpi_unscale_point(gra, pnt);
+ }
+ /* any more? attr_keypress doesn't come with coordinates */
+}
+
+/**
* Creates a new graphics object
* attr type required
* @param <>
@@ -251,7 +329,7 @@ void graphics_set_rect(struct graphics *gra, struct point_rect *pr) {
*/
struct graphics * graphics_new(struct attr *parent, struct attr **attrs) {
struct graphics *this_;
- struct attr *type_attr, cbl_attr;
+ struct attr *type_attr, cbl_attr, *real_dpi_attr, *virtual_dpi_attr;
struct graphics_priv * (*graphicstype_new)(struct navit *nav, struct graphics_methods *meth, struct attr **attrs,
struct callback_list *cbl);
@@ -265,11 +343,15 @@ struct graphics * graphics_new(struct attr *parent, struct attr **attrs) {
dbg(lvl_error,"Failed to load graphics plugin %s.", type_attr->u.str);
return NULL;
}
+
this_=g_new0(struct graphics, 1);
this_->attrs=attr_list_dup(attrs);
+ /* start with no scaling */
+ this_->dpi_factor=1;
this_->cbl=callback_list_new();
cbl_attr.type=attr_callback_list;
cbl_attr.u.callback_list=this_->cbl;
+ callback_list_add_patch_function (this_->cbl, graphics_dpi_patch, (void*) this_);
this_->attrs=attr_generic_add_attr(this_->attrs, &cbl_attr);
this_->priv=(*graphicstype_new)(parent->u.navit, &this_->meth, this_->attrs, this_->cbl);
this_->brightness=0;
@@ -277,6 +359,26 @@ struct graphics * graphics_new(struct attr *parent, struct attr **attrs) {
this_->gamma=65536;
this_->font_size=20;
this_->image_cache_hash = g_hash_table_new_full(g_str_hash, g_str_equal,g_free,g_free);
+ /*get dpi */
+ virtual_dpi_attr=attr_search(attrs, NULL, attr_virtual_dpi);
+ real_dpi_attr=attr_search(attrs, NULL, attr_real_dpi);
+ if(virtual_dpi_attr != NULL) {
+ navit_float virtual_dpi, real_dpi=0;
+ virtual_dpi=virtual_dpi_attr->u.num;
+ if(real_dpi_attr != NULL)
+ real_dpi=real_dpi_attr->u.num;
+ else
+ real_dpi=graphics_get_dpi(this_);
+ if((real_dpi != 0) && (virtual_dpi != 0)) {
+ this_->dpi_factor = round(real_dpi / virtual_dpi);
+ if(this_->dpi_factor < 1)
+ this_->dpi_factor = 1;
+ dbg(lvl_error,"Using virtual dpi %f, real dpi %f factor %d", virtual_dpi, real_dpi, this_->dpi_factor);
+ }
+ }
+ if(this_->dpi_factor != 1)
+ callback_list_call_attr_2(this_->cbl, attr_resize, GINT_TO_POINTER(navit_get_width(parent->u.navit)),
+ GINT_TO_POINTER(navit_get_height(parent->u.navit)));
while (*attrs) {
graphics_set_attr_do(this_,*attrs);
attrs++;
@@ -335,10 +437,16 @@ int graphics_get_attr(struct graphics *this_, enum attr_type type, struct attr *
struct graphics * graphics_overlay_new(struct graphics *parent, struct point *p, int w, int h, int wraparound) {
struct graphics *this_;
struct point_rect pr;
+ struct point p_scaled;
+ int w_scaled, h_scaled;
if (!parent->meth.overlay_new)
return NULL;
this_=g_new0(struct graphics, 1);
- this_->priv=parent->meth.overlay_new(parent->priv, &this_->meth, p, w, h, wraparound);
+ this_->dpi_factor = parent->dpi_factor;
+ p_scaled=graphics_dpi_scale_point(parent,p);
+ w_scaled=graphics_dpi_scale(parent,w);
+ h_scaled=graphics_dpi_scale(parent,h);
+ this_->priv=parent->meth.overlay_new(parent->priv, &this_->meth, &p_scaled, w_scaled, h_scaled, wraparound);
this_->image_cache_hash = parent->image_cache_hash;
this_->parent = parent;
pr.lu.x=0;
@@ -364,11 +472,16 @@ struct graphics * graphics_overlay_new(struct graphics *parent, struct point *p,
* @param wraparound The new wraparound of the overlay
*/
void graphics_overlay_resize(struct graphics *this_, struct point *p, int w, int h, int wraparound) {
+ struct point p_scaled;
+ int w_scaled, h_scaled;
if (! this_->meth.overlay_resize) {
return;
}
- this_->meth.overlay_resize(this_->priv, p, w, h, wraparound);
+ p_scaled = graphics_dpi_scale_point(this_,p);
+ w_scaled = graphics_dpi_scale(this_,w);
+ h_scaled =graphics_dpi_scale(this_,h);
+ this_->meth.overlay_resize(this_->priv, &p_scaled, w_scaled, h_scaled, wraparound);
}
static void graphics_gc_init(struct graphics *this_) {
@@ -428,18 +541,15 @@ void graphics_remove_callback(struct graphics *this_, struct callback *cb) {
* @author Martin Schaller (04/2008)
*/
struct graphics_font * graphics_font_new(struct graphics *gra, int size, int flags) {
- struct graphics_font *this_;
- this_=g_new0(struct graphics_font,1);
- this_->priv=gra->meth.font_new(gra->priv, &this_->meth, gra->default_font, size, flags);
- return this_;
+ return graphics_named_font_new(gra, gra->default_font, size, flags);
}
struct graphics_font * graphics_named_font_new(struct graphics *gra, char *font, int size, int flags) {
struct graphics_font *this_;
this_=g_new0(struct graphics_font,1);
- this_->priv=gra->meth.font_new(gra->priv, &this_->meth, font, size, flags);
+ this_->priv=gra->meth.font_new(gra->priv, &this_->meth, font, graphics_dpi_scale(gra,size), flags);
return this_;
}
@@ -603,7 +713,7 @@ void graphics_gc_set_background(struct graphics_gc *gc, struct color *c) {
* @author Martin Schaller (04/2008)
*/
void graphics_gc_set_linewidth(struct graphics_gc *gc, int width) {
- gc->meth.gc_set_linewidth(gc->priv, width);
+ gc->meth.gc_set_linewidth(gc->priv, graphics_dpi_scale(gc->gra, width));
}
/**
@@ -613,8 +723,15 @@ void graphics_gc_set_linewidth(struct graphics_gc *gc, int width) {
* @author Martin Schaller (04/2008)
*/
void graphics_gc_set_dashes(struct graphics_gc *gc, int width, int offset, unsigned char dash_list[], int n) {
- if (gc->meth.gc_set_dashes)
- gc->meth.gc_set_dashes(gc->priv, width, offset, dash_list, n);
+ if (gc->meth.gc_set_dashes) {
+ int a;
+ unsigned char * dash_list_scaled = g_alloca(sizeof (unsigned char) * n);
+ for(a = 0; a < n; a ++) {
+ dash_list_scaled[a]=graphics_dpi_scale(gc->gra,dash_list[a]);
+ }
+ gc->meth.gc_set_dashes(gc->priv, graphics_dpi_scale(gc->gra,width), graphics_dpi_scale(gc->gra,offset),
+ dash_list_scaled, n);
+ }
}
/**
@@ -728,13 +845,34 @@ static void image_new_helper(struct graphics *gra, struct graphics_image *this_,
struct graphics_image_buffer buffer= {"buffer:",graphics_image_type_unknown};
buffer.start=start;
buffer.len=len;
+ this_->hot = graphics_dpi_scale_point(gra,&this_->hot);
+ if(this_->width != IMAGE_W_H_UNSET)
+ this_->width = graphics_dpi_scale(gra,this_->width);
+ if(this_->height != IMAGE_W_H_UNSET)
+ this_->height = graphics_dpi_scale(gra,this_->height);
this_->priv=gra->meth.image_new(gra->priv, &this_->meth, (char *)&buffer, &this_->width, &this_->height, &this_->hot,
rotate);
+ this_->hot = graphics_dpi_unscale_point(gra,&this_->hot);
+ if(this_->width != IMAGE_W_H_UNSET)
+ this_->width = graphics_dpi_unscale(gra,this_->width);
+ if(this_->height != IMAGE_W_H_UNSET)
+ this_->height = graphics_dpi_unscale(gra,this_->height);
g_free(start);
}
} else {
- if (strcmp(new_name,"buffer:"))
+ if (strcmp(new_name,"buffer:")) {
+ this_->hot = graphics_dpi_scale_point(gra,&this_->hot);
+ if(this_->width != IMAGE_W_H_UNSET)
+ this_->width = graphics_dpi_scale(gra,this_->width);
+ if(this_->height != IMAGE_W_H_UNSET)
+ this_->height = graphics_dpi_scale(gra,this_->height);
this_->priv=gra->meth.image_new(gra->priv, &this_->meth, new_name, &this_->width, &this_->height, &this_->hot, rotate);
+ this_->hot = graphics_dpi_unscale_point(gra,&this_->hot);
+ if(this_->width != IMAGE_W_H_UNSET)
+ this_->width = graphics_dpi_unscale(gra,this_->width);
+ if(this_->height != IMAGE_W_H_UNSET)
+ this_->height = graphics_dpi_unscale(gra,this_->height);
+ }
}
if (this_->priv) {
dbg(lvl_info,"Using image '%s' for '%s' at %dx%d", new_name, path, width, height);
@@ -897,7 +1035,11 @@ void graphics_draw_mode(struct graphics *this_, enum draw_mode_num mode) {
* @author Martin Schaller (04/2008)
*/
void graphics_draw_lines(struct graphics *this_, struct graphics_gc *gc, struct point *p, int count) {
- this_->meth.draw_lines(this_->priv, gc->priv, p, count);
+ struct point * p_scaled = g_alloca(sizeof (struct point)*count);
+ int a;
+ for(a=0; a < count; a ++)
+ p_scaled[a] = graphics_dpi_scale_point(this_,&(p[a]));
+ this_->meth.draw_lines(this_->priv, gc->priv, p_scaled, count);
}
/**
@@ -912,14 +1054,16 @@ void graphics_draw_lines(struct graphics *this_, struct graphics_gc *gc, struct
void graphics_draw_circle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int r) {
struct point *pnt=g_alloca(sizeof(struct point)*(r*4+64));
int i=0;
-
- if(this_->meth.draw_circle)
- this_->meth.draw_circle(this_->priv, gc->priv, p, r);
- else {
+ if(this_->meth.draw_circle) {
+ struct point p_scaled;
+ p_scaled = graphics_dpi_scale_point(this_,p);
+ this_->meth.draw_circle(this_->priv, gc->priv, &p_scaled, graphics_dpi_scale(this_,r));
+ } else {
+ /* do not scale circle_to_points */
circle_to_points(p, r, 0, -1, 1026, pnt, &i, 1);
pnt[i] = pnt[0];
i++;
- this_->meth.draw_lines(this_->priv, gc->priv, pnt, i);
+ graphics_draw_lines(this_, gc, pnt, i);
}
}
@@ -930,7 +1074,29 @@ void graphics_draw_circle(struct graphics *this_, struct graphics_gc *gc, struct
* @author Martin Schaller (04/2008)
*/
void graphics_draw_rectangle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int w, int h) {
- this_->meth.draw_rectangle(this_->priv, gc->priv, p, w, h);
+ struct point p_scaled;
+ p_scaled = graphics_dpi_scale_point(this_,p);
+ this_->meth.draw_rectangle(this_->priv, gc->priv, &p_scaled, graphics_dpi_scale(this_,w), graphics_dpi_scale(this_,h));
+}
+
+/**
+ * @brief Draw a plain polygon on the display
+ *
+ * @param gra The graphics instance on which to draw
+ * @param gc The graphics context
+ * @param[in] pin An array of points forming the polygon
+ * @param count_in The number of elements inside @p pin
+ */
+static void graphics_draw_polygon(struct graphics *gra, struct graphics_gc *gc, struct point *pin, int count_in) {
+ if (! gra->meth.draw_polygon) {
+ return;
+ } else {
+ struct point * pin_scaled = g_alloca(sizeof (struct point)*count_in);
+ int a;
+ for(a=0; a < count_in; a ++)
+ pin_scaled[a] = graphics_dpi_scale_point(gra,&(pin[a]));
+ gra->meth.draw_polygon(gra->priv, gc->priv, pin_scaled, count_in);
+ }
}
void graphics_draw_rectangle_rounded(struct graphics *this_, struct graphics_gc *gc, struct point *plu, int w, int h,
@@ -949,9 +1115,9 @@ void graphics_draw_rectangle_rounded(struct graphics *this_, struct graphics_gc
p[i]=p[0];
i++;
if (fill)
- this_->meth.draw_polygon(this_->priv, gc->priv, p, i);
+ graphics_draw_polygon(this_,gc,p,i);
else
- this_->meth.draw_lines(this_->priv, gc->priv, p, i);
+ graphics_draw_lines(this_,gc,p,i);
}
@@ -963,7 +1129,9 @@ void graphics_draw_rectangle_rounded(struct graphics *this_, struct graphics_gc
*/
void graphics_draw_text(struct graphics *this_, struct graphics_gc *gc1, struct graphics_gc *gc2,
struct graphics_font *font, char *text, struct point *p, int dx, int dy) {
- this_->meth.draw_text(this_->priv, gc1->priv, gc2 ? gc2->priv : NULL, font->priv, text, p, dx, dy);
+ struct point p_scaled;
+ p_scaled = graphics_dpi_scale_point(this_,p);
+ this_->meth.draw_text(this_->priv, gc1->priv, gc2 ? gc2->priv : NULL, font->priv, text, &p_scaled, dx, dy);
}
@@ -976,6 +1144,10 @@ void graphics_draw_text(struct graphics *this_, struct graphics_gc *gc1, struct
void graphics_get_text_bbox(struct graphics *this_, struct graphics_font *font, char *text, int dx, int dy,
struct point *ret, int estimate) {
this_->meth.get_text_bbox(this_->priv, font->priv, text, dx, dy, ret, estimate);
+ ret[0]=graphics_dpi_unscale_point(this_,&(ret[0]));
+ ret[1]=graphics_dpi_unscale_point(this_,&(ret[1]));
+ ret[2]=graphics_dpi_unscale_point(this_,&(ret[2]));
+ ret[3]=graphics_dpi_unscale_point(this_,&(ret[3]));
}
/**
@@ -1001,9 +1173,29 @@ int graphics_is_disabled(struct graphics *this_) {
* @author Martin Schaller (04/2008)
*/
void graphics_draw_image(struct graphics *this_, struct graphics_gc *gc, struct point *p, struct graphics_image *img) {
- this_->meth.draw_image(this_->priv, gc->priv, p, img->priv);
+ struct point p_scaled;
+ p_scaled = graphics_dpi_scale_point(this_,p);
+ this_->meth.draw_image(this_->priv, gc->priv, &p_scaled, img->priv);
}
+/**
+ * FIXME
+ * @param <>
+ * @returns <>
+ * @author Martin Schaller (04/2008)
+*/
+static void graphics_draw_image_warp(struct graphics *this_, struct graphics_gc *gc, struct point *p, int count,
+ struct graphics_image *img) {
+ if(this_->meth.draw_image_warp) {
+ struct point * p_scaled = g_alloca(sizeof (struct point)*count);
+ int a;
+ for(a=0; a < count; a ++)
+ p_scaled[a] = graphics_dpi_scale_point(this_,&(p[a]));
+ this_->meth.draw_image_warp(this_->priv, gc->priv, p_scaled, count, img->priv);
+ } else {
+ dbg(lvl_error,"draw_image_warp not supported by graphics driver");
+ }
+}
//##############################################################################################################
//# Description:
@@ -1011,9 +1203,11 @@ void graphics_draw_image(struct graphics *this_, struct graphics_gc *gc, struct
//# Authors: Martin Schaller (04/2008)
//##############################################################################################################
int graphics_draw_drag(struct graphics *this_, struct point *p) {
+ struct point p_scaled;
if (!this_->meth.draw_drag)
return 0;
- this_->meth.draw_drag(this_->priv, p);
+ p_scaled = graphics_dpi_scale_point(this_,p);
+ this_->meth.draw_drag(this_->priv, &p_scaled);
return 1;
}
@@ -1204,7 +1398,7 @@ static void label_line(struct graphics *gra, struct graphics_gc *fg, struct grap
struct point pb[5];
if (gra->meth.get_text_bbox) {
- gra->meth.get_text_bbox(gra->priv, font->priv, label, 0x10000, 0x0, pb, 1);
+ graphics_get_text_bbox(gra,font,label,0x10000, 0x00, pb, 1);
tl=(pb[2].x-pb[0].x);
th=(pb[0].y-pb[1].y);
} else {
@@ -1237,7 +1431,7 @@ static void label_line(struct graphics *gra, struct graphics_gc *fg, struct grap
p_t.x=x;
p_t.y=y;
if (x < gra->r.rl.x && x + tl > gra->r.lu.x && y + tl > gra->r.lu.y && y - tl < gra->r.rl.y)
- gra->meth.draw_text(gra->priv, fg->priv, bg?bg->priv:NULL, font->priv, label, &p_t, dx*0x10000/l, dy*0x10000/l);
+ graphics_draw_text(gra, fg, bg, font, label, &p_t, dx*0x10000/l, dy*0x10000/l);
}
}
}
@@ -1249,7 +1443,7 @@ static void display_draw_arrow(struct point *p, int dx, int dy, int l, struct gr
pnt[0].y+=-dy*l/65536-dx*l/65536;
pnt[2].x+=-dx*l/65536-dy*l/65536;
pnt[2].y+=-dy*l/65536+dx*l/65536;
- gra->meth.draw_lines(gra->priv, gc->priv, pnt, 3);
+ graphics_draw_lines(gra, gc, pnt, 3);
}
static void display_draw_arrows(struct graphics *gra, struct graphics_gc *gc, struct point *pnt, int count) {
@@ -1612,9 +1806,8 @@ static void draw_init_ctx(struct draw_polyline_context *ctx, int maxpoints) {
}
-static void graphics_draw_polyline_as_polygon(struct graphics_priv *gra_priv, struct graphics_gc_priv *gc_priv,
- struct point *pnt, int count, int *width, void (*draw)(struct graphics_priv *gr, struct graphics_gc_priv *gc,
- struct point *p, int count)) {
+static void graphics_draw_polyline_as_polygon(struct graphics *gra, struct graphics_gc *gc,
+ struct point *pnt, int count, int *width) {
int maxpoints=200;
struct draw_polyline_context ctx;
int i=0;
@@ -1633,7 +1826,7 @@ static void graphics_draw_polyline_as_polygon(struct graphics_priv *gra_priv, st
if (ctx.npos < max_circle_points || ctx.ppos >= maxpoints-max_circle_points || !draw_middle(&ctx,&pnt[i])) {
draw_end(&ctx,&pnt[i]);
ctx.res[ctx.npos]=ctx.res[ctx.ppos-1];
- draw(gra_priv, gc_priv, ctx.res+ctx.npos, ctx.ppos-ctx.npos);
+ graphics_draw_polygon(gra, gc, ctx.res+ctx.npos, ctx.ppos-ctx.npos);
draw_init_ctx(&ctx, maxpoints);
draw_begin(&ctx,&pnt[i]);
}
@@ -1642,7 +1835,7 @@ static void graphics_draw_polyline_as_polygon(struct graphics_priv *gra_priv, st
ctx.prev_shape=ctx.shape;
draw_end(&ctx,&pnt[count-1]);
ctx.res[ctx.npos]=ctx.res[ctx.ppos-1];
- draw(gra_priv, gc_priv, ctx.res+ctx.npos, ctx.ppos-ctx.npos);
+ graphics_draw_polygon(gra, gc, ctx.res+ctx.npos, ctx.ppos-ctx.npos);
}
@@ -1792,9 +1985,9 @@ void graphics_draw_polyline_clipped(struct graphics *gra, struct graphics_gc *gc
// ... then draw the resulting polyline
if (points_to_draw_cnt > 1) {
if (poly) {
- graphics_draw_polyline_as_polygon(gra->priv, gc->priv, points_to_draw, points_to_draw_cnt, w, gra->meth.draw_polygon);
+ graphics_draw_polyline_as_polygon(gra, gc, points_to_draw, points_to_draw_cnt, w);
} else
- gra->meth.draw_lines(gra->priv, gc->priv, points_to_draw, points_to_draw_cnt);
+ graphics_draw_lines(gra, gc, points_to_draw, points_to_draw_cnt);
points_to_draw_cnt=0;
}
}
@@ -1894,7 +2087,7 @@ void graphics_draw_polygon_clipped(struct graphics *gra, struct graphics_gc *gc,
pout=p2;
}
}
- gra->meth.draw_polygon(gra->priv, gc->priv, pin, count_in);
+ graphics_draw_polygon(gra, gc, pin, count_in);
if (count_in >= limit) {
g_free(p1);
g_free(p2);
@@ -2030,8 +2223,8 @@ static void multiline_label_draw(struct graphics *gra, struct graphics_gc *fg, s
/* Parse all stored lines, and display them */
for (label_linepos=0; label_linepos<label_nblines; label_linepos++) {
- gra->meth.draw_text(gra->priv, fg->priv, bg?bg->priv:NULL, font->priv, label_lines[label_linepos],
- &pref, 0x10000, 0);
+ graphics_draw_text(gra, fg, bg, font, label_lines[label_linepos],
+ &pref, 0x10000, 0);
pref.y+=line_spacing;
}
g_free(input_label);
@@ -2080,7 +2273,7 @@ static void displayitem_draw(struct displayitem *di, void *dummy, struct display
graphics_draw_polygon_clipped(gra, gc, pa, count);
break;
case element_polyline: {
- gc->meth.gc_set_linewidth(gc->priv, 1);
+ graphics_gc_set_linewidth(gc, 1);
if (e->u.polyline.width > 0 && e->u.polyline.dash_num > 0)
graphics_gc_set_dashes(gc, e->u.polyline.width, e->u.polyline.offset, e->u.polyline.dash_table, e->u.polyline.dash_num);
for (i = 0 ; i < count ; i++) {
@@ -2093,7 +2286,7 @@ static void displayitem_draw(struct displayitem *di, void *dummy, struct display
case element_circle:
if (count) {
if (e->u.circle.width > 1)
- gc->meth.gc_set_linewidth(gc->priv, e->u.polyline.width);
+ graphics_gc_set_linewidth(gc, e->u.polyline.width);
graphics_draw_circle(gra, gc, pa, e->u.circle.radius);
if (di->label && e->text_size) {
struct graphics_font *font=get_font(gra, e->text_size);
@@ -2159,7 +2352,7 @@ static void displayitem_draw(struct displayitem *di, void *dummy, struct display
p.x=pa[0].x - img->hot.x;
p.y=pa[0].y - img->hot.y;
}
- gra->meth.draw_image(gra->priv, gra->gc[0]->priv, &p, img->priv);
+ graphics_draw_image(gra, gra->gc[0], &p, img);
}
}
break;
@@ -2168,7 +2361,7 @@ static void displayitem_draw(struct displayitem *di, void *dummy, struct display
if (gra->meth.draw_image_warp) {
img=graphics_image_new_scaled_rotated(gra, di->label, IMAGE_W_H_UNSET, IMAGE_W_H_UNSET, 0);
if (img)
- gra->meth.draw_image_warp(gra->priv, gra->gc[0]->priv, pa, count, img->priv);
+ graphics_draw_image_warp(gra, gra->gc[0], pa, count, img);
} else
dbg(lvl_error,"draw_image_warp not supported by graphics driver drawing '%s'", di->label);
break;
@@ -2524,9 +2717,9 @@ void graphics_displaylist_draw(struct graphics *gra, struct displaylist *display
graphics_background_gc(gra, gra->gc[0]);
if (flags & 1)
callback_list_call_attr_0(gra->cbl, attr_predraw);
- gra->meth.draw_mode(gra->priv, draw_mode_begin);
+ graphics_draw_mode(gra, draw_mode_begin);
if (!(flags & 2))
- gra->meth.draw_rectangle(gra->priv, gra->gc[0]->priv, &gra->r.lu, gra->r.rl.x-gra->r.lu.x, gra->r.rl.y-gra->r.lu.y);
+ graphics_draw_rectangle(gra, gra->gc[0], &gra->r.lu, gra->r.rl.x-gra->r.lu.x, gra->r.rl.y-gra->r.lu.y);
if (l) {
order+=l->order_delta;
xdisplay_draw(displaylist, gra, l, order>0?order:0);
@@ -2534,7 +2727,7 @@ void graphics_displaylist_draw(struct graphics *gra, struct displaylist *display
if (flags & 1)
callback_list_call_attr_0(gra->cbl, attr_postdraw);
if (!(flags & 4))
- gra->meth.draw_mode(gra->priv, draw_mode_end);
+ graphics_draw_mode(gra, draw_mode_end);
}
static void graphics_load_mapset(struct graphics *gra, struct displaylist *displaylist, struct mapset *mapset,
@@ -2941,3 +3134,14 @@ static void graphics_process_selection(struct graphics *gra, struct displaylist
}
}
+/**
+ * @brief get display resolution in DPI
+ * This method returns the native display density in DPI
+ * @param gra graphics handle
+ * @returns dpi value. May be fraction therefore double.
+ */
+navit_float graphics_get_dpi(struct graphics *gra) {
+ if (!gra->meth.get_dpi)
+ return 0;
+ return gra->meth.get_dpi(gra->priv);
+}
diff --git a/navit/graphics.h b/navit/graphics.h
index befeb8e2b..eec44ae14 100644
--- a/navit/graphics.h
+++ b/navit/graphics.h
@@ -24,6 +24,7 @@
#ifndef NAVIT_GRAPHICS_H
#define NAVIT_GRAPHICS_H
+#include "coord.h"
#ifdef __cplusplus
extern "C" {
@@ -42,7 +43,7 @@ struct mapset;
/* This enum must be synchronized with the constants in NavitGraphics.java. */
enum draw_mode_num {
- draw_mode_begin, draw_mode_end
+ draw_mode_begin, draw_mode_end
};
struct graphics_priv;
@@ -54,14 +55,14 @@ struct graphics_gc_methods;
struct graphics_image_methods;
enum graphics_image_type {
- graphics_image_type_unknown=0,
+ graphics_image_type_unknown=0,
};
struct graphics_image_buffer {
- char magic[8]; /* buffer:\0 */
- enum graphics_image_type type;
- void *start;
- int len;
+ char magic[8]; /* buffer:\0 */
+ enum graphics_image_type type;
+ void *start;
+ int len;
};
struct graphics_keyboard_priv;
@@ -70,20 +71,20 @@ struct graphics_keyboard_priv;
* Describes an instance of the native on-screen keyboard or other input method.
*/
struct graphics_keyboard {
- int w; /**< The width of the area obscured by the keyboard (-1 for full width) */
- int h; /**< The height of the area obscured by the keyboard (-1 for full height) */
- /* TODO mode is currently a copy of the respective value in the internal GUI and uses the same values.
- * This may need to be changed to something with globally available enum, possibly with revised values.
- * The Android implementation (the first to support a native on-screen keyboard) does not use this field
- * due to limitations of the platform. */
- int mode; /**< Mode flags for the keyboard */
- char *lang; /**< The preferred language for text input, may be {@code NULL}. */
- void *gui_priv; /**< Private data determined by the GUI. The GUI may store
+ int w; /**< The width of the area obscured by the keyboard (-1 for full width) */
+ int h; /**< The height of the area obscured by the keyboard (-1 for full height) */
+ /* TODO mode is currently a copy of the respective value in the internal GUI and uses the same values.
+ * This may need to be changed to something with globally available enum, possibly with revised values.
+ * The Android implementation (the first to support a native on-screen keyboard) does not use this field
+ * due to limitations of the platform. */
+ int mode; /**< Mode flags for the keyboard */
+ char *lang; /**< The preferred language for text input, may be {@code NULL}. */
+ void *gui_priv; /**< Private data determined by the GUI. The GUI may store
* a pointer to a data structure of its choice here. It is
* the responsibility of the GUI to free the data structure
* when it is no longer needed. The graphics plugin should
* not access this member. */
- struct graphics_keyboard_priv *gra_priv; /**< Private data determined by the graphics plugin. The
+ struct graphics_keyboard_priv *gra_priv; /**< Private data determined by the graphics plugin. The
* graphics plugin is responsible for its management. If it
* uses this member, it must free the associated data in
* its {@code hide_native_keyboard} method. */
@@ -108,67 +109,75 @@ struct graphics_keyboard {
* to be visible as long as Navit is in the foreground.
*/
struct padding {
- int left;
- int top;
- int right;
- int bottom;
+ int left;
+ int top;
+ int right;
+ int bottom;
};
struct graphics_methods {
- void (*graphics_destroy)(struct graphics_priv *gr);
- void (*draw_mode)(struct graphics_priv *gr, enum draw_mode_num mode);
- void (*draw_lines)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count);
- void (*draw_polygon)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count);
- void (*draw_rectangle)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h);
- void (*draw_circle)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r);
- void (*draw_text)(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy);
- void (*draw_image)(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img);
- void (*draw_image_warp)(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, struct graphics_image_priv *img);
- void (*draw_drag)(struct graphics_priv *gr, struct point *p);
- struct graphics_font_priv *(*font_new)(struct graphics_priv *gr, struct graphics_font_methods *meth, char *font, int size, int flags);
- struct graphics_gc_priv *(*gc_new)(struct graphics_priv *gr, struct graphics_gc_methods *meth);
- void (*background_gc)(struct graphics_priv *gr, struct graphics_gc_priv *gc);
- struct graphics_priv *(*overlay_new)(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int wraparound);
- /** @brief Load an image from a file.
- *
- * @param gr graphics object
- * @param meth output parameter for graphics methods object
- * @param path file name/path of image to load
- * @param w In: width to scale image to, or IMAGE_W_H_UNSET for original width.
- * Out: Actual width of returned image.
- * @param h heigth; see w
- * @param hot output parameter for image hotspot
- * @param rotate angle to rotate the image, in 90 degree steps (not supported by all plugins).
- * @return pointer to allocated image, to be freed by image_free()
- * @see image_free()
- */
- struct graphics_image_priv *(*image_new)(struct graphics_priv *gr, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation);
- void *(*get_data)(struct graphics_priv *gr, const char *type);
- void (*image_free)(struct graphics_priv *gr, struct graphics_image_priv *priv);
- void (*get_text_bbox)(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate);
- void (*overlay_disable)(struct graphics_priv *gr, int disable);
- void (*overlay_resize)(struct graphics_priv *gr, struct point *p, int w, int h, int wraparound);
- int (*set_attr)(struct graphics_priv *gr, struct attr *attr);
- int (*show_native_keyboard)(struct graphics_keyboard *kbd);
- void (*hide_native_keyboard)(struct graphics_keyboard *kbd);
+ void (*graphics_destroy)(struct graphics_priv *gr);
+ void (*draw_mode)(struct graphics_priv *gr, enum draw_mode_num mode);
+ void (*draw_lines)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count);
+ void (*draw_polygon)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count);
+ void (*draw_rectangle)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h);
+ void (*draw_circle)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r);
+ void (*draw_text)(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg,
+ struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy);
+ void (*draw_image)(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p,
+ struct graphics_image_priv *img);
+ void (*draw_image_warp)(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count,
+ struct graphics_image_priv *img);
+ void (*draw_drag)(struct graphics_priv *gr, struct point *p);
+ struct graphics_font_priv *(*font_new)(struct graphics_priv *gr, struct graphics_font_methods *meth, char *font,
+ int size, int flags);
+ struct graphics_gc_priv *(*gc_new)(struct graphics_priv *gr, struct graphics_gc_methods *meth);
+ void (*background_gc)(struct graphics_priv *gr, struct graphics_gc_priv *gc);
+ struct graphics_priv *(*overlay_new)(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w,
+ int h, int wraparound);
+ /** @brief Load an image from a file.
+ *
+ * @param gr graphics object
+ * @param meth output parameter for graphics methods object
+ * @param path file name/path of image to load
+ * @param w In: width to scale image to, or IMAGE_W_H_UNSET for original width.
+ * Out: Actual width of returned image.
+ * @param h heigth; see w
+ * @param hot output parameter for image hotspot
+ * @param rotate angle to rotate the image, in 90 degree steps (not supported by all plugins).
+ * @return pointer to allocated image, to be freed by image_free()
+ * @see image_free()
+ */
+ struct graphics_image_priv *(*image_new)(struct graphics_priv *gr, struct graphics_image_methods *meth, char *path,
+ int *w, int *h, struct point *hot, int rotation);
+ void *(*get_data)(struct graphics_priv *gr, const char *type);
+ void (*image_free)(struct graphics_priv *gr, struct graphics_image_priv *priv);
+ void (*get_text_bbox)(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy,
+ struct point *ret, int estimate);
+ void (*overlay_disable)(struct graphics_priv *gr, int disable);
+ void (*overlay_resize)(struct graphics_priv *gr, struct point *p, int w, int h, int wraparound);
+ int (*set_attr)(struct graphics_priv *gr, struct attr *attr);
+ int (*show_native_keyboard)(struct graphics_keyboard *kbd);
+ void (*hide_native_keyboard)(struct graphics_keyboard *kbd);
+ navit_float (*get_dpi)(struct graphics_priv * gr);
};
struct graphics_font_methods {
- void (*font_destroy)(struct graphics_font_priv *font);
+ void (*font_destroy)(struct graphics_font_priv *font);
};
struct graphics_font {
- struct graphics_font_priv *priv;
- struct graphics_font_methods meth;
+ struct graphics_font_priv *priv;
+ struct graphics_font_methods meth;
};
struct graphics_gc_methods {
- void (*gc_destroy)(struct graphics_gc_priv *gc);
- void (*gc_set_linewidth)(struct graphics_gc_priv *gc, int width);
- void (*gc_set_dashes)(struct graphics_gc_priv *gc, int width, int offset, unsigned char dash_list[], int n);
- void (*gc_set_foreground)(struct graphics_gc_priv *gc, struct color *c);
- void (*gc_set_background)(struct graphics_gc_priv *gc, struct color *c);
+ void (*gc_destroy)(struct graphics_gc_priv *gc);
+ void (*gc_set_linewidth)(struct graphics_gc_priv *gc, int width);
+ void (*gc_set_dashes)(struct graphics_gc_priv *gc, int width, int offset, unsigned char dash_list[], int n);
+ void (*gc_set_foreground)(struct graphics_gc_priv *gc, struct color *c);
+ void (*gc_set_background)(struct graphics_gc_priv *gc, struct color *c);
};
/**
@@ -177,26 +186,26 @@ struct graphics_gc_methods {
* linewidth and drawing color.
*/
struct graphics_gc {
- struct graphics_gc_priv *priv;
- struct graphics_gc_methods meth;
- struct graphics *gra;
+ struct graphics_gc_priv *priv;
+ struct graphics_gc_methods meth;
+ struct graphics *gra;
};
struct graphics_image_methods {
- void (*image_destroy)(struct graphics_image_priv *img);
+ void (*image_destroy)(struct graphics_image_priv *img);
};
struct graphics_image {
- struct graphics_image_priv *priv;
- struct graphics_image_methods meth;
- int width;
- int height;
- struct point hot;
+ struct graphics_image_priv *priv;
+ struct graphics_image_methods meth;
+ int width;
+ int height;
+ struct point hot;
};
struct graphics_data_image {
- void *data;
- int size;
+ void *data;
+ int size;
};
/* prototypes */
@@ -250,9 +259,12 @@ void graphics_draw_mode(struct graphics *this_, enum draw_mode_num mode);
void graphics_draw_lines(struct graphics *this_, struct graphics_gc *gc, struct point *p, int count);
void graphics_draw_circle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int r);
void graphics_draw_rectangle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int w, int h);
-void graphics_draw_rectangle_rounded(struct graphics *this_, struct graphics_gc *gc, struct point *plu, int w, int h, int r, int fill);
-void graphics_draw_text(struct graphics *this_, struct graphics_gc *gc1, struct graphics_gc *gc2, struct graphics_font *font, char *text, struct point *p, int dx, int dy);
-void graphics_get_text_bbox(struct graphics *this_, struct graphics_font *font, char *text, int dx, int dy, struct point *ret, int estimate);
+void graphics_draw_rectangle_rounded(struct graphics *this_, struct graphics_gc *gc, struct point *plu, int w, int h,
+ int r, int fill);
+void graphics_draw_text(struct graphics *this_, struct graphics_gc *gc1, struct graphics_gc *gc2,
+ struct graphics_font *font, char *text, struct point *p, int dx, int dy);
+void graphics_get_text_bbox(struct graphics *this_, struct graphics_font *font, char *text, int dx, int dy,
+ struct point *ret, int estimate);
void graphics_overlay_disable(struct graphics *this_, int disable);
int graphics_is_disabled(struct graphics *this_);
void graphics_draw_image(struct graphics *this_, struct graphics_gc *gc, struct point *p, struct graphics_image *img);
@@ -261,8 +273,10 @@ void graphics_background_gc(struct graphics *this_, struct graphics_gc *gc);
void graphics_draw_text_std(struct graphics *this_, int text_size, char *text, struct point *p);
char *graphics_icon_path(const char *icon);
void graphics_draw_itemgra(struct graphics *gra, struct itemgra *itm, struct transformation *t, char *label);
-void graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, struct layout *l, int flags);
-void graphics_draw(struct graphics *gra, struct displaylist *displaylist, struct mapset *mapset, struct transformation *trans, struct layout *l, int async, struct callback *cb, int flags);
+void graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans,
+ struct layout *l, int flags);
+void graphics_draw(struct graphics *gra, struct displaylist *displaylist, struct mapset *mapset,
+ struct transformation *trans, struct layout *l, int async, struct callback *cb, int flags);
int graphics_draw_cancel(struct graphics *gra, struct displaylist *displaylist);
struct displaylist_handle *graphics_displaylist_open(struct displaylist *displaylist);
struct displayitem *graphics_displaylist_next(struct displaylist_handle *dlh);
@@ -276,14 +290,17 @@ int graphics_displayitem_get_coord_count(struct displayitem *di);
char *graphics_displayitem_get_label(struct displayitem *di);
int graphics_displayitem_get_displayed(struct displayitem *di);
int graphics_displayitem_get_z_order(struct displayitem *di);
-int graphics_displayitem_within_dist(struct displaylist *displaylist, struct displayitem *di, struct point *p, int dist);
+int graphics_displayitem_within_dist(struct displaylist *displaylist, struct displayitem *di, struct point *p,
+ int dist);
void graphics_add_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl);
void graphics_remove_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl);
void graphics_clear_selection(struct graphics *gra, struct displaylist *dl);
int graphics_show_native_keyboard (struct graphics *this_, struct graphics_keyboard *kbd);
int graphics_hide_native_keyboard (struct graphics *this_, struct graphics_keyboard *kbd);
void graphics_draw_polygon_clipped(struct graphics *gra, struct graphics_gc *gc, struct point *pin, int count_in);
-void graphics_draw_polyline_clipped(struct graphics *gra, struct graphics_gc *gc, struct point *pa, int count, int *width, int poly);
+void graphics_draw_polyline_clipped(struct graphics *gra, struct graphics_gc *gc, struct point *pa, int count,
+ int *width, int poly);
+navit_float graphics_get_dpi(struct graphics *gra);
/* end of prototypes */
#ifdef __cplusplus
diff --git a/navit/graphics/qt5/graphics_qt5.cpp b/navit/graphics/qt5/graphics_qt5.cpp
index e7b31c605..535b370dc 100644
--- a/navit/graphics/qt5/graphics_qt5.cpp
+++ b/navit/graphics/qt5/graphics_qt5.cpp
@@ -172,7 +172,10 @@ static const char* fontfamilies[] = {
* @param gr own private context
* @param meth fill this structure with correct functions to be called with handle as interface to font
* @param font font family e.g. "Arial"
- * @param size Font size in ???
+ * @param size Font size in 16.6 fractional points @ 300dpi. This is bullsh***. The encoding is freetypes
+ * 16.6 fixed point format usually giving points. One point is usually 72th part of an inch. But
+ * navit does not honor dpi correct. It's traditionally used freetype backend is fixed to 300 dpi.
+ * So this value is (300/72) pixels
* @param flags Font flags (currently 1 if bold and 0 if not)
*
* @return font handle
@@ -205,8 +208,9 @@ static struct graphics_font_priv* font_new(struct graphics_priv* gr, struct grap
dbg(lvl_debug, "No matching font. Resort to: %s", font_priv->font->family().toUtf8().data());
}
- /* No clue why factor 20. Found this by comparing to Freetype rendering. */
- font_priv->font->setPointSize(size / 20);
+ /* Convert silly font size to pixels. by 64 is to convert fixpoint to int. */
+ dbg(lvl_debug, "(font %s, %d=%f, %d)", font, size,((float)size)/64.0, ((size * 300) / 72) / 64);
+ font_priv->font->setPixelSize(((size * 300) / 72) / 64);
//font_priv->font->setStyleStrategy(QFont::NoSubpixelAntialias);
/* Check for bold font */
if (flags) {
@@ -809,6 +813,20 @@ static void overlay_resize(struct graphics_priv* gr, struct point* p, int w, int
#endif
}
+/**
+ * @brief Return number of dots per inch
+ * @param gr self handle
+ * @return dpi value
+ */
+static navit_float get_dpi(struct graphics_priv * gr) {
+ qreal dpi = 96;
+ QScreen* primary = navit_app->primaryScreen();
+ if (primary != NULL) {
+ dpi = primary->physicalDotsPerInch();
+ }
+ return (navit_float)dpi;
+}
+
static struct graphics_methods graphics_methods = {
graphics_destroy,
draw_mode,
@@ -830,6 +848,10 @@ static struct graphics_methods graphics_methods = {
get_text_bbox,
overlay_disable,
overlay_resize,
+ NULL, //set_attr
+ NULL, //show_native_keyboard
+ NULL, //hide_native_keyboard
+ get_dpi
};
/* create new graphics context on given context */
diff --git a/navit/main.c b/navit/main.c
index 986947f0d..f4a59970d 100644
--- a/navit/main.c
+++ b/navit/main.c
@@ -328,10 +328,6 @@ static void win_set_nls(void) {
}
#endif
-void main_update_default_layout(struct navit *navit) {
- navit_update_current_layout(navit, NULL);
-}
-
void main_init(const char *program) {
char *s;
#ifdef _UNICODE /* currently for wince */
diff --git a/navit/main.h b/navit/main.h
index 910d56200..47f275c09 100644
--- a/navit/main.h
+++ b/navit/main.h
@@ -35,7 +35,6 @@ void main_add_navit(struct navit *nav);
void main_remove_navit(struct navit *nav);
int main_add_attr(struct attr *attr);
int main_remove_attr(struct attr *attr);
-void main_update_default_layout(struct navit *navit);
void main_init(const char *program);
void main_init_nls(void);
int main(int argc, char **argv);
diff --git a/navit/navit.c b/navit/navit.c
index 1d1b8e664..ae39aca59 100644
--- a/navit/navit.c
+++ b/navit/navit.c
@@ -2551,6 +2551,7 @@ static int navit_set_attr_do(struct navit *this_, struct attr *attr, int init) {
case attr_layout:
if(!attr->u.layout)
return 0;
+ dbg(lvl_debug,"setting attr_layout to %s", attr->u.layout->name);
if(this_->layout_current!=attr->u.layout) {
navit_update_current_layout(this_, attr->u.layout);
graphics_font_destroy_all(this_->gra);
@@ -2563,6 +2564,7 @@ static int navit_set_attr_do(struct navit *this_, struct attr *attr, int init) {
case attr_layout_name:
if(!attr->u.str)
return 0;
+ dbg(lvl_debug,"setting attr_layout_name to %s", attr->u.str);
l=this_->layouts;
while (l) {
lay=l->data;
@@ -3000,9 +3002,27 @@ static int navit_add_log(struct navit *this_, struct log *log) {
static int navit_add_layout(struct navit *this_, struct layout *layout) {
struct attr active;
+ int is_default=0;
+ int is_active=0;
this_->layouts = g_list_append(this_->layouts, layout);
+ /** check if we want to immediately activate this layout.
+ * Unfortunately we have concurring conditions about when to activate
+ * a layout:
+ * - A layout could bear the "active" property
+ * - A layout's name could match this_->default_layout_name
+ * This cannot be fully resolved, as we cannot predict the future, so
+ * lets set the last parsed layout active, which either matches default_layout_name or
+ * bears the "active" tag, or is the first layout ever parsed.
+ */
+ if((layout->name != NULL) && (this_->default_layout_name != NULL)) {
+ if (strcmp(layout->name, this_->default_layout_name) == 0)
+ is_default = 1;
+ }
layout_get_attr(layout, attr_active, &active, NULL);
- if(active.u.num || !this_->layout_current) {
+ if(active.u.num)
+ is_active = 1;
+ dbg(lvl_debug, "add layout '%s' is_default %d, is_active %d", layout->name, is_default, is_active);
+ if(is_default || is_active || !this_->layout_current) {
this_->layout_current=layout;
return 1;
}
diff --git a/navit/start_real.c b/navit/start_real.c
index ad990d874..a29d558bf 100644
--- a/navit/start_real.c
+++ b/navit/start_real.c
@@ -207,7 +207,6 @@ int main_real(int argc, char * const* argv) {
dbg(lvl_error, "%s", _("Internal initialization failed, exiting. Check previous error messages."));
exit(5);
}
- main_update_default_layout(navit.u.navit);
conf.type=attr_config;
conf.u.config=config;
if (startup_file) {
diff --git a/navit/xslt/sailfish_cursor.xslt b/navit/xslt/sailfish_cursor.xslt
index 01029638c..40e128305 100644
--- a/navit/xslt/sailfish_cursor.xslt
+++ b/navit/xslt/sailfish_cursor.xslt
@@ -12,7 +12,7 @@
</xsl:copy>
</xsl:template>
- <xsl:template match="/config/navit/layout[@name='Car' or @name='Car-dark']/cursor">
+ <xsl:template match="/layout[@name='Car' or @name='Car-dark']/cursor">
<cursor w="57" h="57">
<xsl:text>&#x0A; </xsl:text>
<itemgra speed_range="-2">
diff --git a/navit/xslt/sailfish_qt5.xslt b/navit/xslt/sailfish_qt5.xslt
index 5ee20e2e9..80ce1c402 100644
--- a/navit/xslt/sailfish_qt5.xslt
+++ b/navit/xslt/sailfish_qt5.xslt
@@ -13,7 +13,7 @@
</xsl:template>
<xsl:template match="/config/navit/graphics[1]">
- <graphics type="qt5" qt5_platform="wayland"/>
+ <graphics type="qt5" qt5_platform="wayland" virtual_dpi="245"/>
<xsl:text>&#x0A; </xsl:text>
<xsl:copy>
<xsl:apply-templates select="@*"/>
diff --git a/scripts/build_android.sh b/scripts/build_android.sh
index 4b915f35e..3f2738451 100755
--- a/scripts/build_android.sh
+++ b/scripts/build_android.sh
@@ -22,8 +22,13 @@ export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin
export JVM_OPTS="-Xmx3200m"
export GRADLE_OPTS='-Dorg.gradle.jvmargs="-Xmx2048m -XX:+HeapDumpOnOutOfMemoryError"'
+# processing xml is messed up a bit after the original introduction of gradle
+# so a useless install of ant here even if using gradle/ninja
+
+sudo apt-get install -y ant
+
echo Run CMake
-cmake ./ -Dvehicle/gpsd_dbus:BOOL=FALSE -Dsvg2png_scaling:STRING=-1,24,32,48,64,96,128,192,256 -Dsvg2png_scaling_nav:STRING=-1,24,32,48,64,96,128,192,256 -Dsvg2png_scaling_flag:STRING=-1,24,32,64,96 -DUSE_PLUGINS=n -DBUILD_MAPTOOL=n -DXSL_PROCESSING=y -DXSLTS=android -DANDROID=y -DSAMPLE_MAP=n || exit 1
+cmake ./ -Dvehicle/gpsd_dbus:BOOL=FALSE -Dsvg2png_scaling:STRING=-1,24,32,48,64,96,128,192,256 -Dsvg2png_scaling_nav:STRING=-1,24,32,48,64,96,128,192,256 -Dsvg2png_scaling_flag:STRING=-1,24,32,64,96 -DXSL_PROCESSING=y -DXSLTS=android -DANDROID=y || exit 1
echo Process icons
pushd navit/icons
@@ -45,6 +50,8 @@ rename 'y/A-Z/a-z/' ./*.mo
popd
popd
+
+
echo Process xml config files
make navit_config_xml || exit 96
pushd navit