gg: add a `draw_line_with_config` method (#10513)

pull/10521/head
KJ Lawrence 2021-06-19 14:32:08 -04:00 committed by GitHub
parent 71b41d1042
commit 123682dffb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 64 additions and 16 deletions

View File

@ -101,6 +101,18 @@ pub:
native_rendering bool // Cocoa on macOS/iOS, GDI+ on Windows native_rendering bool // Cocoa on macOS/iOS, GDI+ on Windows
} }
pub enum PenLineType {
solid
dashed
dotted
}
pub struct PenConfig {
color gx.Color
line_type PenLineType = .solid
thickness int = 1
}
[heap] [heap]
pub struct Context { pub struct Context {
mut: mut:
@ -559,34 +571,70 @@ pub fn (gg &Context) end() {
*/ */
} }
// resize the context's Window
pub fn (mut ctx Context) resize(width int, height int) { pub fn (mut ctx Context) resize(width int, height int) {
ctx.width = width ctx.width = width
ctx.height = height ctx.height = height
} }
// draw_line draws a line between the points provided
pub fn (ctx &Context) draw_line(x f32, y f32, x2 f32, y2 f32, c gx.Color) { pub fn (ctx &Context) draw_line(x f32, y f32, x2 f32, y2 f32, c gx.Color) {
if c.a != 255 { if c.a != 255 {
sgl.load_pipeline(ctx.timage_pip) sgl.load_pipeline(ctx.timage_pip)
} }
$if !android {
if ctx.scale > 1 { ctx.draw_line_with_config(x, y, x2, y2, color: c)
// Make the line more clear on hi dpi screens: draw a rectangle }
mut width := (x2 - x)
mut height := (y2 - y) // draw_line_with_config draws a line between the points provided with the PenConfig
if width == 0 { pub fn (ctx &Context) draw_line_with_config(x f32, y f32, x2 f32, y2 f32, config PenConfig) {
width = 1 if config.color.a != 255 {
} else if height == 0 { sgl.load_pipeline(ctx.timage_pip)
height = 1 }
if config.thickness <= 0 {
return
}
nx := x * ctx.scale
ny := y * ctx.scale
nx2 := x2 * ctx.scale
ny2 := y2 * ctx.scale
dx := nx2 - nx
dy := ny2 - ny
length := math.sqrtf(math.powf(x2 - x, 2) + math.powf(y2 - y, 2))
theta := f32(math.atan2(dy, dx))
sgl.push_matrix()
sgl.translate(nx, ny, 0)
sgl.rotate(theta, 0, 0, 1)
sgl.translate(-nx, -ny, 0)
if config.line_type == .solid {
ctx.draw_rect(x, y, length, config.thickness, config.color)
} else {
size := if config.line_type == .dotted { config.thickness } else { config.thickness * 3 }
space := if size == 1 { 2 } else { size }
mut available := length
mut start_x := x
for i := 0; available > 0; i++ {
if i % 2 == 0 {
ctx.draw_rect(start_x, y, size, config.thickness, config.color)
available -= size
start_x += size
continue
} }
ctx.draw_rect(x, y, width, height, c)
return available -= space
start_x += space
} }
} }
sgl.c4b(c.r, c.g, c.b, c.a)
sgl.begin_line_strip() sgl.pop_matrix()
sgl.v2f(x * ctx.scale, y * ctx.scale)
sgl.v2f(x2 * ctx.scale, y2 * ctx.scale)
sgl.end()
} }
pub fn (ctx &Context) draw_rounded_rect(x f32, y f32, w f32, h f32, radius f32, color gx.Color) { pub fn (ctx &Context) draw_rounded_rect(x f32, y f32, w f32, h f32, radius f32, color gx.Color) {