gg: handle Android's own native dpi scaling factor (#8908)
parent
79edff5c6c
commit
b4dc6c83cd
|
@ -255,7 +255,7 @@ fn (b Board) hmirror() Board {
|
|||
// GCC optimization bug; inlining fails when compiled with -prod
|
||||
[no_inline]
|
||||
fn (t TileLine) to_left() TileLine {
|
||||
right_border_idx := 5
|
||||
right_border_idx := 4
|
||||
mut res := t
|
||||
mut zeros := 0
|
||||
mut nonzeros := 0
|
||||
|
@ -729,11 +729,11 @@ fn (mut app App) handle_tap() {
|
|||
avgx, avgy := avg(s.pos.x, e.pos.x), avg(s.pos.y, e.pos.y)
|
||||
// TODO: Replace "touch spots" with actual buttons
|
||||
// bottom left -> change theme
|
||||
if avgx < 200 && h - avgy < 200 {
|
||||
if avgx < 50 && h - avgy < 50 {
|
||||
app.next_theme()
|
||||
}
|
||||
// bottom right -> change tile format
|
||||
if w - avgx < 200 && h - avgy < 200 {
|
||||
if w - avgx < 50 && h - avgy < 50 {
|
||||
app.next_tile_format()
|
||||
}
|
||||
if app.state == .victory {
|
||||
|
@ -767,7 +767,7 @@ fn (mut app App) handle_swipe() {
|
|||
dmax := if max(adx, ady) > 0 { max(adx, ady) } else { 1 }
|
||||
tdiff := int(e.time.unix_time_milli() - s.time.unix_time_milli())
|
||||
// TODO: make this calculation more accurate (don't use arbitrary numbers)
|
||||
min_swipe_distance := int(math.sqrt(min(w, h) * tdiff / 60)) + 20
|
||||
min_swipe_distance := int(math.sqrt(min(w, h) * tdiff / 100)) + 20
|
||||
if dmax < min_swipe_distance {
|
||||
return
|
||||
}
|
||||
|
|
25
vlib/gg/gg.v
25
vlib/gg/gg.v
|
@ -148,12 +148,7 @@ fn gg_init_sokol_window(user_data voidptr) {
|
|||
gfx.setup(&desc)
|
||||
sgl_desc := C.sgl_desc_t{}
|
||||
sgl.setup(&sgl_desc)
|
||||
g.scale = sapp.dpi_scale()
|
||||
// NB: on older X11, `Xft.dpi` from ~/.Xresources, that sokol uses,
|
||||
// may not be set which leads to sapp.dpi_scale reporting incorrectly 0.0
|
||||
if g.scale < 0.1 {
|
||||
g.scale = 1.0
|
||||
}
|
||||
g.scale = dpi_scale()
|
||||
// is_high_dpi := sapp.high_dpi()
|
||||
// fb_w := sapp.width()
|
||||
// fb_h := sapp.height()
|
||||
|
@ -166,7 +161,7 @@ fn gg_init_sokol_window(user_data voidptr) {
|
|||
g.ft = new_ft(
|
||||
font_path: g.config.font_path
|
||||
custom_bold_font_path: g.config.custom_bold_font_path
|
||||
scale: sapp.dpi_scale()
|
||||
scale: dpi_scale()
|
||||
) or { panic(err) }
|
||||
// println('FT took ${time.ticks()-t} ms')
|
||||
g.font_inited = true
|
||||
|
@ -761,15 +756,21 @@ pub fn screen_size() Size {
|
|||
|
||||
// window_size returns the `Size` of the active window
|
||||
pub fn window_size() Size {
|
||||
mut s := sapp.dpi_scale()
|
||||
if s == 0 {
|
||||
s = 1.
|
||||
}
|
||||
s := dpi_scale()
|
||||
return Size{int(sapp.width() / s), int(sapp.height() / s)}
|
||||
}
|
||||
|
||||
pub fn dpi_scale() f32 {
|
||||
return sapp.dpi_scale()
|
||||
mut s := sapp.dpi_scale()
|
||||
$if android {
|
||||
s *= android_dpi_scale()
|
||||
}
|
||||
// NB: on older X11, `Xft.dpi` from ~/.Xresources, that sokol uses,
|
||||
// may not be set which leads to sapp.dpi_scale reporting incorrectly 0.0
|
||||
if s < 0.1 {
|
||||
s = 1.
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
pub fn high_dpi() bool {
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
module gg
|
||||
|
||||
import sokol.sapp
|
||||
|
||||
#include <android/configuration.h>
|
||||
#include <android/native_activity.h>
|
||||
|
||||
fn C.AConfiguration_new() voidptr
|
||||
fn C.AConfiguration_fromAssetManager(voidptr, voidptr)
|
||||
fn C.AConfiguration_getDensity(voidptr) u32
|
||||
fn C.AConfiguration_delete(voidptr)
|
||||
|
||||
struct C.AAssetManager {}
|
||||
struct C.ANativeActivity {
|
||||
assetManager voidptr
|
||||
}
|
||||
|
||||
pub fn android_dpi_scale() f32 {
|
||||
config := C.AConfiguration_new()
|
||||
activity := &C.ANativeActivity(sapp.android_get_native_activity())
|
||||
C.AConfiguration_fromAssetManager(config, activity.assetManager)
|
||||
density := C.AConfiguration_getDensity(config)
|
||||
C.AConfiguration_delete(config)
|
||||
return f32(density) / 160
|
||||
}
|
Loading…
Reference in New Issue