Revert "Introduce some font stuff"

This reverts commit 0db0f46582df75d23bfaaa424aa6a7e291f723ef.
This commit is contained in:
Richard Feldman 2020-05-12 21:46:07 -04:00
parent 3d0fa6e050
commit ceab15dffe
4 changed files with 51 additions and 240 deletions

58
Cargo.lock generated
View file

@ -764,31 +764,6 @@ dependencies = [
"tempfile", "tempfile",
] ]
[[package]]
name = "glyph_brush"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5fca6f9d679bff1322c76c9a1ad4b8553b30a94f3f75bea6936e19032c2f2ec3"
dependencies = [
"glyph_brush_layout",
"log",
"ordered-float",
"rustc-hash",
"rusttype 0.8.3",
"twox-hash",
]
[[package]]
name = "glyph_brush_layout"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b70adc570f1dc71b6b32e241cbcc2b42175f5aea71951fbf41e68b04aec24c7"
dependencies = [
"approx",
"rusttype 0.8.3",
"xi-unicode",
]
[[package]] [[package]]
name = "heck" name = "heck"
version = "0.3.1" version = "0.3.1"
@ -1020,12 +995,6 @@ dependencies = [
"num-traits", "num-traits",
] ]
[[package]]
name = "linked-hash-map"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8dd5a6d5999d9907cda8ed67bbd137d3af8085216c2ac62de5be860bd41f304a"
[[package]] [[package]]
name = "llvm-sys" name = "llvm-sys"
version = "100.0.1" version = "100.0.1"
@ -1861,7 +1830,6 @@ dependencies = [
"gfx-backend-vulkan", "gfx-backend-vulkan",
"gfx-hal", "gfx-hal",
"glsl-to-spirv", "glsl-to-spirv",
"glyph_brush",
"im", "im",
"im-rc", "im-rc",
"image", "image",
@ -2152,12 +2120,6 @@ dependencies = [
"roc_types", "roc_types",
] ]
[[package]]
name = "rustc-hash"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
[[package]] [[package]]
name = "rustc_version" name = "rustc_version"
version = "0.2.3" version = "0.2.3"
@ -2183,12 +2145,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f61411055101f7b60ecf1041d87fb74205fb20b0c7a723f07ef39174cf6b4c0" checksum = "9f61411055101f7b60ecf1041d87fb74205fb20b0c7a723f07ef39174cf6b4c0"
dependencies = [ dependencies = [
"approx", "approx",
"crossbeam-deque",
"crossbeam-utils",
"linked-hash-map",
"num_cpus",
"ordered-float", "ordered-float",
"rustc-hash",
"stb_truetype", "stb_truetype",
] ]
@ -2493,15 +2450,6 @@ dependencies = [
"winapi 0.3.8", "winapi 0.3.8",
] ]
[[package]]
name = "twox-hash"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3bfd5b7557925ce778ff9b9ef90e3ade34c524b5ff10e239c69a42d546d2af56"
dependencies = [
"rand 0.7.3",
]
[[package]] [[package]]
name = "typed-arena" name = "typed-arena"
version = "2.0.1" version = "2.0.1"
@ -2848,12 +2796,6 @@ version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57" checksum = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57"
[[package]]
name = "xi-unicode"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7395cdb9d0a6219fa0ea77d08c946adf9c1984c72fcd443ace30365f3daadef7"
[[package]] [[package]]
name = "xml-rs" name = "xml-rs"
version = "0.8.3" version = "0.8.3"

View file

@ -51,7 +51,6 @@ target-lexicon = "0.10"
winit = "0.22" winit = "0.22"
image = "0.23" image = "0.23"
gfx-hal = "0.5" gfx-hal = "0.5"
glyph_brush = "0.6"
glsl-to-spirv = "0.1" glsl-to-spirv = "0.1"
bincode = "1.2" bincode = "1.2"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }

Binary file not shown.

View file

@ -4,10 +4,6 @@ use gfx_hal::{
Instance, Instance,
}; };
use glsl_to_spirv::ShaderType; use glsl_to_spirv::ShaderType;
use glyph_brush::rusttype::Scale;
use glyph_brush::{
BrushAction, BrushError, GlyphBrushBuilder, HorizontalAlign, Layout, Section, VerticalAlign,
};
use std::io; use std::io;
use std::mem::ManuallyDrop; use std::mem::ManuallyDrop;
use std::path::Path; use std::path::Path;
@ -81,6 +77,9 @@ struct PushConstants {
} }
fn run_event_loop() { fn run_event_loop() {
// TODO do a better window size
const WINDOW_SIZE: [u32; 2] = [512, 512];
// TODO try configuring the swapchain explicitly, in particular in order // TODO try configuring the swapchain explicitly, in particular in order
// to experiment with different PresentMode settings to see how they // to experiment with different PresentMode settings to see how they
// affect input latency. // affect input latency.
@ -88,18 +87,11 @@ fn run_event_loop() {
// https://rust-tutorials.github.io/learn-gfx-hal/03_clear_the_window.html // https://rust-tutorials.github.io/learn-gfx-hal/03_clear_the_window.html
let event_loop = EventLoop::new(); let event_loop = EventLoop::new();
let window = WindowBuilder::new()
.with_title("roc")
.build(&event_loop)
.unwrap();
let font_size = 16.0;
let scale_factor = 1.0f32; // TODO very unsure if this is being used correctly! Audit each of its uses.
let (logical_window_size, physical_window_size) = { let (logical_window_size, physical_window_size) = {
use winit::dpi::{LogicalSize, PhysicalSize}; use winit::dpi::{LogicalSize, PhysicalSize};
let dpi = event_loop.primary_monitor().scale_factor(); let dpi = event_loop.primary_monitor().scale_factor();
let logical: LogicalSize<u32> = window.inner_size().to_logical(scale_factor as f64); let logical: LogicalSize<u32> = WINDOW_SIZE.into();
let physical: PhysicalSize<u32> = logical.to_physical(dpi); let physical: PhysicalSize<u32> = logical.to_physical(dpi);
(logical, physical) (logical, physical)
@ -110,6 +102,12 @@ fn run_event_loop() {
height: physical_window_size.height, height: physical_window_size.height,
}; };
let window = WindowBuilder::new()
.with_title("roc")
.with_inner_size(logical_window_size)
.build(&event_loop)
.unwrap();
let mut should_configure_swapchain = true; let mut should_configure_swapchain = true;
let (instance, surface, adapter) = { let (instance, surface, adapter) = {
@ -218,20 +216,6 @@ fn run_event_loop() {
let vertex_shader = include_str!("../shaders/triangle.vert"); let vertex_shader = include_str!("../shaders/triangle.vert");
let fragment_shader = include_str!("../shaders/triangle.frag"); let fragment_shader = include_str!("../shaders/triangle.frag");
let dejavu: &[u8] = include_bytes!("../fonts/OpenSans-Light.ttf");
let mut glyph_brush = GlyphBrushBuilder::using_font_bytes(dejavu).build();
let max_image_dimension = {
let mut value = 0 as gl::types::GLint;
unsafe { gl::GetIntegerv(gl::MAX_TEXTURE_SIZE, &mut value) };
value as u32
};
let mut vao = 0;
let mut vbo = 0;
let mut texture = GlyphTexture::new(glyph_brush.texture_dimensions());
let mut dimensions = logical_window_size;
/// Create a pipeline with the given layout and shaders. /// Create a pipeline with the given layout and shaders.
unsafe fn make_pipeline<B: gfx_hal::Backend>( unsafe fn make_pipeline<B: gfx_hal::Backend>(
@ -395,6 +379,47 @@ fn run_event_loop() {
// between 0.0 and 1.0. // between 0.0 and 1.0.
let anim = start_time.elapsed().as_secs_f32().sin() * 0.5 + 0.5; let anim = start_time.elapsed().as_secs_f32().sin() * 0.5 + 0.5;
let small = [0.33, 0.33];
let triangles = &[
// Red triangle
PushConstants {
color: [1.0, 0.0, 0.0, 1.0],
pos: [-0.5, -0.5],
scale: small,
},
// Green triangle
PushConstants {
color: [0.0, 1.0, 0.0, 1.0],
pos: [0.0, -0.5],
scale: small,
},
// Blue triangle
PushConstants {
color: [0.0, 0.0, 1.0, 1.0],
pos: [0.5, -0.5],
scale: small,
},
// Blue <-> cyan animated triangle
PushConstants {
color: [0.0, anim, 1.0, 1.0],
pos: [-0.5, 0.5],
scale: small,
},
// Down <-> up animated triangle
PushConstants {
color: [1.0, 1.0, 1.0, 1.0],
pos: [0.0, 0.5 - anim * 0.5],
scale: small,
},
// Small <-> big animated triangle
PushConstants {
color: [1.0, 1.0, 1.0, 1.0],
pos: [0.5, 0.5],
scale: [0.33 + anim * 0.33, 0.33 + anim * 0.33],
},
];
let triangles = text_state.chars().enumerate().map(|(index, char)| { let triangles = text_state.chars().enumerate().map(|(index, char)| {
if char == ' ' { if char == ' ' {
PushConstants { PushConstants {
@ -411,118 +436,6 @@ fn run_event_loop() {
} }
}); });
// Render font glyphs
// see https://github.com/alexheretic/glyph-brush/blob/b18161533321cbdf85cf31729517d0a336394e80/glyph-brush/examples/opengl.rs
let dimensions = window.inner_size();
let width = dimensions.width as f32;
let height = dimensions.height as _;
let scale = Scale::uniform((font_size * scale_factor).round());
glyph_brush.queue(Section {
text: &text_state,
scale,
screen_position: (0.0, 0.0),
bounds: (width / 3.15, height),
color: [0.9, 0.3, 0.3, 1.0],
..Section::default()
});
glyph_brush.queue(Section {
text: &text_state,
scale,
screen_position: (width / 2.0, height / 2.0),
bounds: (width / 3.15, height),
color: [0.3, 0.9, 0.3, 1.0],
layout: Layout::default()
.h_align(HorizontalAlign::Center)
.v_align(VerticalAlign::Center),
..Section::default()
});
glyph_brush.queue(Section {
text: &text_state,
scale,
screen_position: (width, height),
bounds: (width / 3.15, height),
color: [0.3, 0.3, 0.9, 1.0],
layout: Layout::default()
.h_align(HorizontalAlign::Right)
.v_align(VerticalAlign::Bottom),
..Section::default()
});
let mut brush_action;
loop {
brush_action = glyph_brush.process_queued(
|rect, tex_data| unsafe {
// Update part of gpu texture with new glyph alpha values
gl::BindTexture(gl::TEXTURE_2D, texture.name);
gl::TexSubImage2D(
gl::TEXTURE_2D,
0,
rect.min.x as _,
rect.min.y as _,
rect.width() as _,
rect.height() as _,
gl::RED,
gl::UNSIGNED_BYTE,
tex_data.as_ptr() as _,
);
gl_assert_ok!();
},
to_vertex,
);
match brush_action {
Ok(_) => break,
Err(BrushError::TextureTooSmall { suggested, .. }) => {
let (new_width, new_height) = if (suggested.0 > max_image_dimension
|| suggested.1 > max_image_dimension)
&& (glyph_brush.texture_dimensions().0 < max_image_dimension
|| glyph_brush.texture_dimensions().1 < max_image_dimension)
{
(max_image_dimension, max_image_dimension)
} else {
suggested
};
eprint!("\r \r");
eprintln!("Resizing glyph texture -> {}x{}", new_width, new_height);
// Recreate texture as a larger size to fit more
texture = GlyphTexture::new((new_width, new_height));
glyph_brush.resize_texture(new_width, new_height);
}
}
}
match brush_action.unwrap() {
BrushAction::Draw(vertices) => {
// Draw new vertices
vertex_count = vertices.len();
unsafe {
if vertex_max < vertex_count {
gl::BufferData(
gl::ARRAY_BUFFER,
(vertex_count * mem::size_of::<Vertex>()) as GLsizeiptr,
vertices.as_ptr() as _,
gl::DYNAMIC_DRAW,
);
} else {
gl::BufferSubData(
gl::ARRAY_BUFFER,
0,
(vertex_count * mem::size_of::<Vertex>()) as GLsizeiptr,
vertices.as_ptr() as _,
);
}
}
vertex_max = vertex_max.max(vertex_count);
}
BrushAction::ReDraw => {}
}
unsafe { unsafe {
use gfx_hal::pool::CommandPool; use gfx_hal::pool::CommandPool;
@ -823,46 +736,3 @@ fn handle_text_input(
} }
} }
} }
struct GlyphTexture {
name: GLuint,
}
impl GlyphTexture {
fn new((width, height): (u32, u32)) -> Self {
let mut name = 0;
unsafe {
// Create a texture for the glyphs
// The texture holds 1 byte per pixel as alpha data
gl::PixelStorei(gl::UNPACK_ALIGNMENT, 1);
gl::GenTextures(1, &mut name);
gl::BindTexture(gl::TEXTURE_2D, name);
gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_WRAP_S, gl::CLAMP_TO_EDGE as _);
gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_WRAP_T, gl::CLAMP_TO_EDGE as _);
gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MIN_FILTER, gl::LINEAR as _);
gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MAG_FILTER, gl::LINEAR as _);
gl::TexImage2D(
gl::TEXTURE_2D,
0,
gl::RED as _,
width as _,
height as _,
0,
gl::RED,
gl::UNSIGNED_BYTE,
ptr::null(),
);
gl_assert_ok!();
Self { name }
}
}
}
impl Drop for GlyphTexture {
fn drop(&mut self) {
unsafe {
gl::DeleteTextures(1, &self.name);
}
}
}