1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00
v/vlib/gg/image.v
Alexander Medvednikov ecaccafd31 gg: image cache
2020-08-05 16:00:24 +02:00

143 lines
3.0 KiB
V

// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
// Use of this source code is governed by an MIT license that can be found in the LICENSE file.
module gg
import gx
import os
import sokol
import sokol.sapp
import sokol.sgl
import sokol.gfx
import stbi
pub struct Image {
pub mut:
id int
width int
height int
nr_channels int
ok bool
data voidptr
ext string
simg_ok bool
simg C.sg_image
path string
}
fn C.sg_isvalid() bool
pub fn (mut ctx Context) create_image(file string) Image {
if !C.sg_isvalid() {
//ctx.image_queue << file
stb_img := stbi.load(file)
img := Image{
width: stb_img.width
height: stb_img.height
nr_channels: stb_img.nr_channels
ok: false
data: stb_img.data
ext: stb_img.ext
path: file
id: ctx.image_cache.len
}
ctx.image_cache << img
return img
}
mut img := create_image(file)
img.id = ctx.image_cache.len
ctx.image_cache << img
return img
}
// TODO remove this
fn create_image(file string) Image {
if !os.exists(file) {
println('gg.create_image(): file not found: $file')
return Image{} // none
}
stb_img := stbi.load(file)
mut img := Image{
width: stb_img.width
height: stb_img.height
nr_channels: stb_img.nr_channels
ok: stb_img.ok
data: stb_img.data
ext: stb_img.ext
path: file
}
img.init_sokol_image()
return img
}
pub fn create_image_from_memory(buf byteptr, bufsize int) Image {
stb_img := stbi.load_from_memory(buf, bufsize)
mut img := Image{
width: stb_img.width
height: stb_img.height
nr_channels: stb_img.nr_channels
ok: stb_img.ok
data: stb_img.data
ext: stb_img.ext
}
return img
}
pub fn create_image_from_byte_array(b []byte) Image {
return create_image_from_memory(b.data, b.len)
}
pub fn (mut img Image) init_sokol_image() &Image {
//println('\n init sokol image $img.path ok=$img.simg_ok')
mut img_desc := C.sg_image_desc{
width: img.width
height: img.height
num_mipmaps: 0
wrap_u: .clamp_to_edge
wrap_v: .clamp_to_edge
label: &byte(0)
d3d11_texture: 0
}
img_desc.content.subimage[0][0] = C.sg_subimage_content{
ptr: img.data
size: img.nr_channels * img.width * img.height
}
img.simg = C.sg_make_image(&img_desc)
img.simg_ok = true
img.ok = true
return img
}
pub fn (ctx &Context) draw_image(x, y, width, height f32, img_ &Image) {
img := ctx.image_cache[img_.id] // fetch the image from cache
if !img.simg_ok {
return
}
u0 := f32(0.0)
v0 := f32(0.0)
u1 := f32(1.0)
v1 := f32(1.0)
x0 := f32(x) * ctx.scale
y0 := f32(y) * ctx.scale
x1 := f32(x + width) * ctx.scale
y1 := f32(y + height) * ctx.scale
//
sgl.load_pipeline(ctx.timage_pip)
sgl.enable_texture()
sgl.texture(img.simg)
sgl.begin_quads()
sgl.c4b(255, 255, 255, 255)
sgl.v2f_t2f(x0, y0, u0, v0)
sgl.v2f_t2f(x1, y0, u1, v0)
sgl.v2f_t2f(x1, y1, u1, v1)
sgl.v2f_t2f(x0, y1, u0, v1)
sgl.end()
sgl.disable_texture()
}
pub fn (ctx &Context) draw_image_by_id(x, y, width, height f32, id int) {
img := ctx.image_cache[id]
ctx.draw_image(x,y,width,height,img)
}