gg: add a `draw_line_with_config` method (#10513)
parent
71b41d1042
commit
123682dffb
80
vlib/gg/gg.v
80
vlib/gg/gg.v
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue