gg,os: minimize memory allocation
parent
71653273f6
commit
da21b50750
18
vlib/gg/gg.v
18
vlib/gg/gg.v
|
@ -416,19 +416,23 @@ pub fn (ctx &GG) draw_line(x, y, x2, y2 f32, color gx.Color) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (ctx &GG) draw_arc(x, y, r, start_angle, end_angle f32, segments int, color gx.Color) {
|
pub fn (ctx &GG) draw_arc(x, y, r, start_angle, end_angle f32, segments int, color gx.Color) {
|
||||||
ctx.use_color_shader(color)
|
ctx.use_color_shader(color)
|
||||||
mut vertices := arc_vertices(x, y, r, start_angle, end_angle, segments)
|
vertices := arc_vertices(x, y, r, start_angle, end_angle, segments)
|
||||||
ctx.bind_vertices(vertices)
|
ctx.bind_vertices(vertices)
|
||||||
gl.draw_arrays(C.GL_LINE_STRIP, 0, segments + 1)
|
gl.draw_arrays(C.GL_LINE_STRIP, 0, segments + 1)
|
||||||
|
unsafe { vertices.free() }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (ctx &GG) draw_filled_arc(x, y, r, start_angle, end_angle f32, segments int, color gx.Color) {
|
pub fn (ctx &GG) draw_filled_arc(x, y, r, start_angle, end_angle f32, segments int, color gx.Color) {
|
||||||
ctx.use_color_shader(color)
|
ctx.use_color_shader(color)
|
||||||
|
|
||||||
|
|
||||||
mut vertices := []f32
|
mut vertices := []f32
|
||||||
vertices << [x, y]
|
vertices << [x, y] !
|
||||||
vertices << arc_vertices(x, y, r, start_angle, end_angle, segments)
|
vertices << arc_vertices(x, y, r, start_angle, end_angle, segments)
|
||||||
ctx.bind_vertices(vertices)
|
ctx.bind_vertices(vertices)
|
||||||
gl.draw_arrays(C.GL_TRIANGLE_FAN, 0, segments + 2)
|
gl.draw_arrays(C.GL_TRIANGLE_FAN, 0, segments + 2)
|
||||||
|
unsafe { vertices.free() }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (ctx &GG) draw_circle(x, y, r f32, color gx.Color) {
|
pub fn (ctx &GG) draw_circle(x, y, r f32, color gx.Color) {
|
||||||
|
@ -441,16 +445,17 @@ pub fn (ctx &GG) draw_rounded_rect(x, y, w, h, r f32, color gx.Color) {
|
||||||
segments := 6 + int(r / 8)
|
segments := 6 + int(r / 8)
|
||||||
|
|
||||||
// Create a rounded rectangle using a triangle fan mesh.
|
// Create a rounded rectangle using a triangle fan mesh.
|
||||||
vertices << [x + (w/2.0), y + (h/2.0)]
|
vertices << [x + (w/2.0), y + (h/2.0)] !
|
||||||
vertices << arc_vertices(x + w - r, y + h - r, r, 0, 90, segments)
|
vertices << arc_vertices(x + w - r, y + h - r, r, 0, 90, segments)
|
||||||
vertices << arc_vertices(x + r, y + h - r, r, 90, 180, segments)
|
vertices << arc_vertices(x + r, y + h - r, r, 90, 180, segments)
|
||||||
vertices << arc_vertices(x + r, y + r, r, 180, 270, segments)
|
vertices << arc_vertices(x + r, y + r, r, 180, 270, segments)
|
||||||
vertices << arc_vertices(x + w - r, y + r, r, 270, 360, segments)
|
vertices << arc_vertices(x + w - r, y + r, r, 270, 360, segments)
|
||||||
// Finish the loop by going back to the first vertex
|
// Finish the loop by going back to the first vertex
|
||||||
vertices << [vertices[2], vertices[3]]
|
vertices << [vertices[2], vertices[3]] !
|
||||||
|
|
||||||
ctx.bind_vertices(vertices)
|
ctx.bind_vertices(vertices)
|
||||||
gl.draw_arrays(C.GL_TRIANGLE_FAN, 0, segments * 4 + 6)
|
gl.draw_arrays(C.GL_TRIANGLE_FAN, 0, segments * 4 + 6)
|
||||||
|
unsafe { vertices.free() }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (ctx &GG) draw_empty_rounded_rect(x, y, w, h, r f32, color gx.Color) {
|
pub fn (ctx &GG) draw_empty_rounded_rect(x, y, w, h, r f32, color gx.Color) {
|
||||||
|
@ -465,6 +470,7 @@ pub fn (ctx &GG) draw_empty_rounded_rect(x, y, w, h, r f32, color gx.Color) {
|
||||||
|
|
||||||
ctx.bind_vertices(vertices)
|
ctx.bind_vertices(vertices)
|
||||||
gl.draw_arrays(C.GL_LINE_STRIP, 0, segments * 4 + 1)
|
gl.draw_arrays(C.GL_LINE_STRIP, 0, segments * 4 + 1)
|
||||||
|
unsafe { vertices.free() }
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -539,4 +545,4 @@ pub fn (c &GG) draw_empty_rect(x, y, w, h f32, color gx.Color) {
|
||||||
|
|
||||||
pub fn scissor(x, y, w, h f32) {
|
pub fn scissor(x, y, w, h f32) {
|
||||||
C.glScissor(x, y, w, h)
|
C.glScissor(x, y, w, h)
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,14 +11,14 @@ fn arc_vertices(x, y, r, start_angle, end_angle f32, segments int) []f32 {
|
||||||
start_rads := start_angle * 0.0174533 // deg -> rad approx
|
start_rads := start_angle * 0.0174533 // deg -> rad approx
|
||||||
end_rads := end_angle * 0.0174533
|
end_rads := end_angle * 0.0174533
|
||||||
increment := (end_rads - start_rads) / segments
|
increment := (end_rads - start_rads) / segments
|
||||||
vertices << [x + f32(math.cos(start_rads)) * r, y + f32(math.sin(start_rads)) * r]
|
vertices << [x + f32(math.cos(start_rads)) * r, y + f32(math.sin(start_rads)) * r] !
|
||||||
mut i := 1
|
mut i := 1
|
||||||
for i < segments {
|
for i < segments {
|
||||||
theta := f32(i) * increment + start_rads
|
theta := f32(i) * increment + start_rads
|
||||||
vertices << [x + f32(math.cos(theta)) * r, y + f32(math.sin(theta)) * r]
|
vertices << [x + f32(math.cos(theta)) * r, y + f32(math.sin(theta)) * r] !
|
||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
vertices << [x + f32(math.cos(end_rads)) * r, y + f32(math.sin(end_rads)) * r]
|
vertices << [x + f32(math.cos(end_rads)) * r, y + f32(math.sin(end_rads)) * r] !
|
||||||
return vertices
|
return vertices
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
module os
|
module os
|
||||||
|
|
||||||
|
import strings
|
||||||
|
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
@ -198,18 +200,19 @@ pub fn exec(cmd string) ?Result {
|
||||||
if isnil(f) {
|
if isnil(f) {
|
||||||
return error('exec("$cmd") failed')
|
return error('exec("$cmd") failed')
|
||||||
}
|
}
|
||||||
buf := [1000]byte
|
buf := [4096]byte
|
||||||
mut res := ''
|
mut res := strings.new_builder(1024)
|
||||||
for C.fgets(charptr(buf), 1000, f) != 0 {
|
for C.fgets(charptr(buf), 4096, f) != 0 {
|
||||||
res += tos(buf, vstrlen(buf))
|
res.write_bytes( buf, vstrlen(buf) )
|
||||||
}
|
}
|
||||||
res = res.trim_space()
|
soutput := res.str().trim_space()
|
||||||
|
res.free()
|
||||||
exit_code := vpclose(f)
|
exit_code := vpclose(f)
|
||||||
// if exit_code != 0 {
|
// if exit_code != 0 {
|
||||||
// return error(res)
|
// return error(res)
|
||||||
// }
|
// }
|
||||||
return Result{
|
return Result{
|
||||||
output: res
|
output: soutput
|
||||||
exit_code: exit_code
|
exit_code: exit_code
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
module os
|
module os
|
||||||
|
|
||||||
|
import strings
|
||||||
|
|
||||||
#flag -lws2_32
|
#flag -lws2_32
|
||||||
#include <winsock2.h>
|
#include <winsock2.h>
|
||||||
|
|
||||||
|
@ -309,24 +311,25 @@ pub fn exec(cmd string) ?Result {
|
||||||
}
|
}
|
||||||
C.CloseHandle(child_stdin)
|
C.CloseHandle(child_stdin)
|
||||||
C.CloseHandle(child_stdout_write)
|
C.CloseHandle(child_stdout_write)
|
||||||
buf := [1000]byte
|
buf := [4096]byte
|
||||||
mut bytes_read := u32(0)
|
mut bytes_read := u32(0)
|
||||||
mut read_data := ''
|
mut read_data := strings.new_builder(1024)
|
||||||
for {
|
for {
|
||||||
readfile_result := C.ReadFile(child_stdout_read, buf, 1000, voidptr(&bytes_read), 0)
|
readfile_result := C.ReadFile(child_stdout_read, buf, 1000, voidptr(&bytes_read), 0)
|
||||||
read_data += tos(buf, int(bytes_read))
|
read_data.write_bytes(buf, int(bytes_read))
|
||||||
if readfile_result == false || int(bytes_read) == 0 {
|
if readfile_result == false || int(bytes_read) == 0 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
read_data = read_data.trim_space()
|
soutput := read_data.str().trim_space()
|
||||||
|
read_data.free()
|
||||||
exit_code := u32(0)
|
exit_code := u32(0)
|
||||||
C.WaitForSingleObject(proc_info.hProcess, C.INFINITE)
|
C.WaitForSingleObject(proc_info.hProcess, C.INFINITE)
|
||||||
C.GetExitCodeProcess(proc_info.hProcess, voidptr(&exit_code))
|
C.GetExitCodeProcess(proc_info.hProcess, voidptr(&exit_code))
|
||||||
C.CloseHandle(proc_info.hProcess)
|
C.CloseHandle(proc_info.hProcess)
|
||||||
C.CloseHandle(proc_info.hThread)
|
C.CloseHandle(proc_info.hThread)
|
||||||
return Result {
|
return Result {
|
||||||
output: read_data
|
output: soutput
|
||||||
exit_code: int(exit_code)
|
exit_code: int(exit_code)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue