interfaces fixes; freetype.text_width(); gl and stbi fixes
parent
938f27e391
commit
b6c0b22742
|
@ -529,3 +529,10 @@ fn test_in_struct() {
|
||||||
baz.bar[0]++
|
baz.bar[0]++
|
||||||
assert baz.bar[0] == 3
|
assert baz.bar[0] == 3
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn test_bools() {
|
||||||
|
println('test b')
|
||||||
|
mut a := [true, false]
|
||||||
|
a << true
|
||||||
|
println(a)
|
||||||
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ module clipboard
|
||||||
|
|
||||||
#flag -framework Cocoa
|
#flag -framework Cocoa
|
||||||
|
|
||||||
struct Clipboard {
|
pub struct Clipboard {
|
||||||
pb voidptr
|
pb voidptr
|
||||||
last_cb_serial i64
|
last_cb_serial i64
|
||||||
mut:
|
mut:
|
||||||
|
|
|
@ -97,7 +97,7 @@ enum atom_type {
|
||||||
text_html = 9
|
text_html = 9
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Clipboard {
|
pub struct Clipboard {
|
||||||
display &Display
|
display &Display
|
||||||
mut:
|
mut:
|
||||||
selection Atom //the selection atom
|
selection Atom //the selection atom
|
||||||
|
|
|
@ -36,7 +36,7 @@ fn C.SetLastError(error i64)
|
||||||
fn C.OpenClipboard(hwnd HWND) int
|
fn C.OpenClipboard(hwnd HWND) int
|
||||||
fn C.DestroyWindow(hwnd HWND)
|
fn C.DestroyWindow(hwnd HWND)
|
||||||
|
|
||||||
struct Clipboard {
|
pub struct Clipboard {
|
||||||
max_retries int
|
max_retries int
|
||||||
retry_delay int
|
retry_delay int
|
||||||
mut:
|
mut:
|
||||||
|
|
|
@ -2639,6 +2639,9 @@ fn (p mut Parser) array_init() string {
|
||||||
new_arr_ph := p.cgen.add_placeholder()
|
new_arr_ph := p.cgen.add_placeholder()
|
||||||
mut i := 0
|
mut i := 0
|
||||||
for p.tok != .rsbr {
|
for p.tok != .rsbr {
|
||||||
|
if expected_array_type.starts_with('array_') {
|
||||||
|
p.expected_type = expected_array_type[6..]
|
||||||
|
}
|
||||||
val_typ := p.bool_expression()
|
val_typ := p.bool_expression()
|
||||||
// Get the type of the first expression
|
// Get the type of the first expression
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
|
|
|
@ -53,8 +53,13 @@ fn (p mut Parser) bool_expression() string {
|
||||||
// `window.widget = button`, widget is an interface
|
// `window.widget = button`, widget is an interface
|
||||||
if expected != typ && expected.ends_with('er') && expected.contains('I') {
|
if expected != typ && expected.ends_with('er') && expected.contains('I') {
|
||||||
tt := typ.replace('*', '_ptr')
|
tt := typ.replace('*', '_ptr')
|
||||||
|
/*
|
||||||
|
if p.fileis('button') || p.fileis('textbox') {
|
||||||
|
p.warn('exp="$expected" typ="$typ" tt="$tt"')
|
||||||
|
}
|
||||||
|
*/
|
||||||
p.cgen.set_placeholder(start_ph,
|
p.cgen.set_placeholder(start_ph,
|
||||||
'($expected) { ._interface_idx = _${expected}_${tt}_index, ._object = ' )
|
'($expected) { ._interface_idx = /* :) */ _${expected}_${tt}_index, ._object = ' )
|
||||||
p.gen('}')
|
p.gen('}')
|
||||||
//p.satisfies_interface(expected, typ, true)
|
//p.satisfies_interface(expected, typ, true)
|
||||||
}
|
}
|
||||||
|
@ -537,6 +542,9 @@ fn (p mut Parser) expression() string {
|
||||||
// _PUSH(&a, expression(), tmp, string)
|
// _PUSH(&a, expression(), tmp, string)
|
||||||
tmp := p.get_tmp()
|
tmp := p.get_tmp()
|
||||||
tmp_typ := parse_pointer(typ[6..]) // skip "array_"
|
tmp_typ := parse_pointer(typ[6..]) // skip "array_"
|
||||||
|
//p.warn('arr typ $tmp_typ')
|
||||||
|
p.expected_type = tmp_typ
|
||||||
|
//println('set expr to $tmp_typ')
|
||||||
p.check_space(.left_shift)
|
p.check_space(.left_shift)
|
||||||
// Get the value we are pushing
|
// Get the value we are pushing
|
||||||
p.gen(', (')
|
p.gen(', (')
|
||||||
|
@ -552,7 +560,7 @@ fn (p mut Parser) expression() string {
|
||||||
}
|
}
|
||||||
p.gen('/*typ = $typ tmp_typ=$tmp_typ*/')
|
p.gen('/*typ = $typ tmp_typ=$tmp_typ*/')
|
||||||
ph_clone := p.cgen.add_placeholder()
|
ph_clone := p.cgen.add_placeholder()
|
||||||
expr_type := p.expression()
|
expr_type := p.bool_expression()
|
||||||
// Need to clone the string when appending it to an array?
|
// Need to clone the string when appending it to an array?
|
||||||
if p.pref.autofree && typ == 'array_string' && expr_type == 'string' {
|
if p.pref.autofree && typ == 'array_string' && expr_type == 'string' {
|
||||||
p.cgen.set_placeholder(ph_clone, 'string_clone(')
|
p.cgen.set_placeholder(ph_clone, 'string_clone(')
|
||||||
|
|
|
@ -1094,7 +1094,7 @@ fn (p mut Parser) fn_call_args(f mut Fn, generic_param_types []string) {
|
||||||
// _interface_idx = _Speaker_Dog_index })
|
// _interface_idx = _Speaker_Dog_index })
|
||||||
concrete_type_name := typ.replace('*', '_ptr')
|
concrete_type_name := typ.replace('*', '_ptr')
|
||||||
p.cgen.set_placeholder(ph, '($arg.typ) { ._object = &')
|
p.cgen.set_placeholder(ph, '($arg.typ) { ._object = &')
|
||||||
p.gen(', ._interface_idx = _${arg.typ}_${concrete_type_name}_index} /* i. arg*/')
|
p.gen(', /*OLD*/ ._interface_idx = _${arg.typ}_${concrete_type_name}_index} /* i. arg*/')
|
||||||
p.table.add_gen_type(arg.typ, typ)
|
p.table.add_gen_type(arg.typ, typ)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
glm
|
glm
|
||||||
gl
|
gl
|
||||||
filepath
|
filepath
|
||||||
|
time
|
||||||
)
|
)
|
||||||
|
|
||||||
#flag windows -I @VROOT/thirdparty/freetype/include
|
#flag windows -I @VROOT/thirdparty/freetype/include
|
||||||
|
@ -352,3 +353,44 @@ pub fn (ctx mut FreeType) draw_text_def(x, y int, text string) {
|
||||||
}
|
}
|
||||||
ctx.draw_text(x, y, text, cfg)
|
ctx.draw_text(x, y, text, cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn (ctx mut FreeType) text_width(s string) int {
|
||||||
|
//t := time.ticks()
|
||||||
|
utext := s.ustring()
|
||||||
|
mut x := f64(0)
|
||||||
|
for i := 0; i < utext.len; i++ {
|
||||||
|
_rune := utext.at(i)
|
||||||
|
mut ch := Character{}
|
||||||
|
mut found := false
|
||||||
|
if _rune.len == 1 {
|
||||||
|
idx := _rune[0]
|
||||||
|
if idx < 0 || idx >= ctx.chars.len {
|
||||||
|
println('BADE RUNE $_rune')
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
found = true
|
||||||
|
ch = ctx.chars[_rune[0]]
|
||||||
|
}
|
||||||
|
else if _rune.len > 1 {
|
||||||
|
// TODO O(1) use map
|
||||||
|
for j := 0; j < ctx.utf_runes.len; j++ {
|
||||||
|
rune_j := ctx.utf_runes[j]
|
||||||
|
if rune_j==_rune {
|
||||||
|
ch = ctx.utf_chars[j]
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !found && _rune.len > 0 && _rune[0] > 32 {
|
||||||
|
ch = ft_load_char(ctx.face, _rune.utf32_code())
|
||||||
|
ctx.utf_runes << _rune
|
||||||
|
ctx.utf_chars << ch
|
||||||
|
}
|
||||||
|
x += ch.advance >> u32(6)
|
||||||
|
}
|
||||||
|
//println('text width "$s" = ${time.ticks() - t} ms')
|
||||||
|
return int(x) / ctx.scale
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
26
vlib/gg/gg.v
26
vlib/gg/gg.v
|
@ -372,11 +372,22 @@ pub fn create_image(file string) u32 {
|
||||||
img.tex_image_2d()
|
img.tex_image_2d()
|
||||||
gl.generate_mipmap(C.GL_TEXTURE_2D)
|
gl.generate_mipmap(C.GL_TEXTURE_2D)
|
||||||
img.free()
|
img.free()
|
||||||
// println('gg end')
|
return texture
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn create_image_from_memory(buf byteptr) u32 {
|
||||||
|
texture := gl.gen_texture()
|
||||||
|
img := stbi.load_from_memory(buf)
|
||||||
|
// TODO copy pasta
|
||||||
|
gl.bind_2d_texture(texture)
|
||||||
|
img.tex_image_2d()
|
||||||
|
gl.generate_mipmap(C.GL_TEXTURE_2D)
|
||||||
|
img.free()
|
||||||
return texture
|
return texture
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (ctx &GG) draw_line_c(x, y, x2, y2 f32, color gx.Color) {
|
pub fn (ctx &GG) draw_line_c(x, y, x2, y2 f32, color gx.Color) {
|
||||||
|
ctx.shader.set_int('has_texture', 0)
|
||||||
C.glDeleteBuffers(1, &ctx.vao)
|
C.glDeleteBuffers(1, &ctx.vao)
|
||||||
C.glDeleteBuffers(1, &ctx.vbo)
|
C.glDeleteBuffers(1, &ctx.vbo)
|
||||||
ctx.shader.use()
|
ctx.shader.use()
|
||||||
|
@ -403,6 +414,12 @@ pub fn (c &GG) draw_vertical(x, y, height int) {
|
||||||
|
|
||||||
// fn (ctx &GG) draw_image(x, y, w, h f32, img stbi.Image) {
|
// fn (ctx &GG) draw_image(x, y, w, h f32, img stbi.Image) {
|
||||||
pub fn (ctx &GG) draw_image(x, y, w, h f32, tex_id u32) {
|
pub fn (ctx &GG) draw_image(x, y, w, h f32, tex_id u32) {
|
||||||
|
|
||||||
|
last_array_buffer := 0
|
||||||
|
last_texture := 0
|
||||||
|
C.glGetIntegerv(C.GL_ARRAY_BUFFER_BINDING, &last_array_buffer)
|
||||||
|
C.glGetIntegerv(C.GL_TEXTURE_BINDING_2D, &last_texture)
|
||||||
|
|
||||||
// println('DRAW IMAGE $x $y $w $h $tex_id')
|
// println('DRAW IMAGE $x $y $w $h $tex_id')
|
||||||
ctx.shader.use()
|
ctx.shader.use()
|
||||||
// ctx.shader.set_color('color', c)
|
// ctx.shader.set_color('color', c)
|
||||||
|
@ -422,6 +439,7 @@ pub fn (ctx &GG) draw_image(x, y, w, h f32, tex_id u32) {
|
||||||
] !
|
] !
|
||||||
// VAO := gl.gen_vertex_array()
|
// VAO := gl.gen_vertex_array()
|
||||||
// VBO := gl.gen_buffer()
|
// VBO := gl.gen_buffer()
|
||||||
|
C.glEnable(C.GL_TEXTURE_2D)
|
||||||
gl.bind_vao(ctx.vao)
|
gl.bind_vao(ctx.vao)
|
||||||
gl.set_vbo(ctx.vbo, vertices, C.GL_STATIC_DRAW)
|
gl.set_vbo(ctx.vbo, vertices, C.GL_STATIC_DRAW)
|
||||||
ebo := gl.gen_buffer()
|
ebo := gl.gen_buffer()
|
||||||
|
@ -435,9 +453,13 @@ pub fn (ctx &GG) draw_image(x, y, w, h f32, tex_id u32) {
|
||||||
gl.bind_2d_texture(tex_id)
|
gl.bind_2d_texture(tex_id)
|
||||||
gl.bind_vao(ctx.vao)
|
gl.bind_vao(ctx.vao)
|
||||||
gl.draw_elements(C.GL_TRIANGLES, 6, C.GL_UNSIGNED_INT, 0)
|
gl.draw_elements(C.GL_TRIANGLES, 6, C.GL_UNSIGNED_INT, 0)
|
||||||
|
C.glDisable(C.GL_TEXTURE_2D)
|
||||||
|
// restore state
|
||||||
|
C.glBindBuffer(C.GL_ARRAY_BUFFER, last_array_buffer)
|
||||||
|
C. glBindTexture(C.GL_TEXTURE_2D, last_texture)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (c &GG) draw_empty_rect(x, y, w, h int, color gx.Color) {
|
pub fn (c &GG) draw_empty_rect(x, y, w, h f32, color gx.Color) {
|
||||||
c.draw_line_c(x, y, x + w, y, color)
|
c.draw_line_c(x, y, x + w, y, color)
|
||||||
c.draw_line_c(x, y, x, y + h, color)
|
c.draw_line_c(x, y, x, y + h, color)
|
||||||
c.draw_line_c(x, y + h, x + w, y + h, color)
|
c.draw_line_c(x, y + h, x + w, y + h, color)
|
||||||
|
|
|
@ -76,6 +76,23 @@ void main() {
|
||||||
// FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
|
// FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
|
||||||
// FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);
|
// FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);
|
||||||
if (has_texture) {
|
if (has_texture) {
|
||||||
|
/*
|
||||||
|
vec3 chromaKeyColor = texture(ourTexture,TexCoord.xy).xyz;
|
||||||
|
|
||||||
|
float alpha;
|
||||||
|
bool is_cyan = ((chromaKeyColor.x == 0)); // && chromaKeyColor.x <= 1) && (chromaKeyColor.y <= 255) &&
|
||||||
|
bool is_pink= ((chromaKeyColor.y == 0));
|
||||||
|
//bool is_pink= ((chromaKeyColor.x <= 255) && (chromaKeyColor.y == 0) &&(chromaKeyColor.z <= 255));
|
||||||
|
if (is_cyan || is_pink) {
|
||||||
|
alpha = 0.;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
alpha = 1.0;
|
||||||
|
}
|
||||||
|
FragColor= vec4(texture(ourTexture,TexCoord.xy).xyz,alpha);
|
||||||
|
*/
|
||||||
|
|
||||||
FragColor = texture(ourTexture, TexCoord);
|
FragColor = texture(ourTexture, TexCoord);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -220,6 +220,13 @@ pub fn (w &Window) set_clipboard_text(s string) {
|
||||||
C.glfwSetClipboardString(w.data, s.str)
|
C.glfwSetClipboardString(w.data, s.str)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_cursor_pos(glfw_window voidptr) (f64, f64) {
|
||||||
|
x := f64(0)
|
||||||
|
y := f64(0)
|
||||||
|
C.glfwGetCursorPos(glfw_window, &x, &y)
|
||||||
|
return x,y
|
||||||
|
}
|
||||||
|
|
||||||
pub fn (w &Window) get_cursor_pos() Pos {
|
pub fn (w &Window) get_cursor_pos() Pos {
|
||||||
x := f64(0)
|
x := f64(0)
|
||||||
y := f64(0)
|
y := f64(0)
|
||||||
|
@ -230,6 +237,21 @@ pub fn (w &Window) get_cursor_pos() Pos {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum Cursor {
|
||||||
|
arrow
|
||||||
|
ibeam
|
||||||
|
hand
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_cursor(c Cursor) {
|
||||||
|
C.glfwSetCursor(0, C.GLFW_IBEAM_CURSOR)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn (w &Window) set_cursor(c Cursor) {
|
||||||
|
C.glfwSetCursor(w.data, C.GLFW_IBEAM_CURSOR)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
pub fn (w &Window) user_ptr() voidptr {
|
pub fn (w &Window) user_ptr() voidptr {
|
||||||
return C.glfwGetWindowUserPointer(w.data)
|
return C.glfwGetWindowUserPointer(w.data)
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,21 +75,19 @@ pub fn (f File) is_opened() bool {
|
||||||
return f.opened
|
return f.opened
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
// read_bytes reads an amount of bytes from the beginning of the file
|
// read_bytes reads an amount of bytes from the beginning of the file
|
||||||
pub fn (f mut File) read_bytes(size int) []byte {
|
pub fn (f &File) read_bytes(size int) []byte {
|
||||||
return f.read_bytes_at(size, 0)
|
return f.read_bytes_at(size, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// read_bytes_at reads an amount of bytes at the given position in the file
|
// read_bytes_at reads an amount of bytes at the given position in the file
|
||||||
pub fn (f mut File) read_bytes_at(size, pos int) []byte {
|
pub fn (f &File) read_bytes_at(size, pos int) []byte {
|
||||||
mut arr := [`0`].repeat(size)
|
mut arr := [`0`].repeat(size)
|
||||||
C.fseek(f.cfile, pos, C.SEEK_SET)
|
C.fseek(f.cfile, pos, C.SEEK_SET)
|
||||||
nreadbytes := C.fread(arr.data, 1, size, f.cfile)
|
nreadbytes := C.fread(arr.data, 1, size, f.cfile)
|
||||||
C.fseek(f.cfile, 0, C.SEEK_SET)
|
C.fseek(f.cfile, 0, C.SEEK_SET)
|
||||||
return arr[0..nreadbytes]
|
return arr[0..nreadbytes]
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
pub fn read_bytes(path string) ?[]byte {
|
pub fn read_bytes(path string) ?[]byte {
|
||||||
|
|
|
@ -22,6 +22,7 @@ mut:
|
||||||
}
|
}
|
||||||
|
|
||||||
fn C.stbi_load() voidptr
|
fn C.stbi_load() voidptr
|
||||||
|
fn C.stbi_load_from_memory() voidptr
|
||||||
fn C.stbi_image_free()
|
fn C.stbi_image_free()
|
||||||
fn C.stbi_set_flip_vertically_on_load()
|
fn C.stbi_set_flip_vertically_on_load()
|
||||||
|
|
||||||
|
@ -41,6 +42,22 @@ pub fn load(path string) Image {
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//pub fn load_from_memory(buf []byte) Image {
|
||||||
|
pub fn load_from_memory(buf byteptr) Image {
|
||||||
|
mut res := Image {
|
||||||
|
ok: true
|
||||||
|
data: 0
|
||||||
|
}
|
||||||
|
flag := C.STBI_rgb_alpha
|
||||||
|
res.data = C.stbi_load_from_memory(buf, 3812, &res.width, &res.height, &res.nr_channels, flag)
|
||||||
|
if isnil(res.data) {
|
||||||
|
println('stbi image failed to load from memory')
|
||||||
|
exit(1)
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
pub fn (img Image) free() {
|
pub fn (img Image) free() {
|
||||||
C.stbi_image_free(img.data)
|
C.stbi_image_free(img.data)
|
||||||
}
|
}
|
||||||
|
|
|
@ -245,8 +245,8 @@ pub fn (t mut Table) register_type(typ types.Type, name string, idx int) {
|
||||||
}
|
}
|
||||||
t.type_idxs[name] = idx
|
t.type_idxs[name] = idx
|
||||||
t.types << typ
|
t.types << typ
|
||||||
efn := []Fn
|
e := []Fn
|
||||||
t.methods << efn // TODO [] breaks V
|
t.methods << e // TODO [] breaks V
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (t mut Table) register_struct(typ types.Struct) int {
|
pub fn (t mut Table) register_struct(typ types.Struct) int {
|
||||||
|
|
Loading…
Reference in New Issue