Use HiDPI and a larger window size in the NanoVG demo

This commit is contained in:
Patrick Walton 2020-03-31 20:18:25 -07:00
parent e6d8aab974
commit 7c5c43b50f
1 changed files with 24 additions and 8 deletions

View File

@ -44,6 +44,9 @@ use std::time::Instant;
const PI_2: f32 = PI * 2.0; const PI_2: f32 = PI * 2.0;
const FRAC_PI_2_3: f32 = PI * 2.0 / 3.0; const FRAC_PI_2_3: f32 = PI * 2.0 / 3.0;
const WINDOW_WIDTH: i32 = 1024;
const WINDOW_HEIGHT: i32 = 768;
static PARAGRAPH_TEXT: &'static str = "This is a longer chunk of text. static PARAGRAPH_TEXT: &'static str = "This is a longer chunk of text.
I would have used lorem ipsum, but she was busy jumping over the lazy dog with the fox and all \ I would have used lorem ipsum, but she was busy jumping over the lazy dog with the fox and all \
@ -355,7 +358,9 @@ fn draw_color_wheel(canvas: &mut CanvasRenderingContext2D, rect: RectF, time: f3
// Prepare to draw the selector. // Prepare to draw the selector.
canvas.save(); canvas.save();
canvas.set_current_transform(&(Transform2F::from_translation(center) * let original_transform = canvas.current_transform();
canvas.set_current_transform(&(original_transform *
Transform2F::from_translation(center) *
Transform2F::from_rotation(hue))); Transform2F::from_rotation(hue)));
canvas.set_stroke_style(ColorU::new(255, 255, 255, 192)); canvas.set_stroke_style(ColorU::new(255, 255, 255, 192));
@ -491,7 +496,9 @@ fn draw_clip(canvas: &mut CanvasRenderingContext2D, origin: Vector2F, time: f32)
canvas.save(); canvas.save();
// Draw first rect. // Draw first rect.
let transform_a = Transform2F::from_translation(origin) * let original_transform = canvas.current_transform();
let transform_a = original_transform *
Transform2F::from_translation(origin) *
Transform2F::from_rotation(angle::angle_from_degrees(5.0)); Transform2F::from_rotation(angle::angle_from_degrees(5.0));
canvas.set_current_transform(&transform_a); canvas.set_current_transform(&transform_a);
canvas.set_fill_style(ColorU::new(255, 0, 0, 255)); canvas.set_fill_style(ColorU::new(255, 0, 0, 255));
@ -812,8 +819,9 @@ fn draw_thumbnails(canvas: &mut CanvasRenderingContext2D,
let mut clip_path = Path2D::new(); let mut clip_path = Path2D::new();
clip_path.rect(rect); clip_path.rect(rect);
canvas.clip_path(clip_path, FillRule::Winding); canvas.clip_path(clip_path, FillRule::Winding);
canvas.set_current_transform(&Transform2F::from_translation( let original_transform = canvas.current_transform();
vec2f(0.0, -scroll_y * (stack_height - rect.height())))); canvas.set_current_transform(&(original_transform * Transform2F::from_translation(
vec2f(0.0, -scroll_y * (stack_height - rect.height())))));
for image_index in 0..image_count { for image_index in 0..image_count {
let image_origin = rect.origin() + vec2f(10.0, 10.0) + let image_origin = rect.origin() + vec2f(10.0, 10.0) +
@ -939,7 +947,7 @@ fn fill_path_with_box_gradient(canvas: &mut CanvasRenderingContext2D,
outer_color: ColorU) { outer_color: ColorU) {
// TODO(pcwalton): Fill the corners with radial gradients. // TODO(pcwalton): Fill the corners with radial gradients.
let window_rect = RectF::new(Vector2F::zero(), vec2f(800.0, 600.0)); let window_rect = RectF::new(Vector2F::zero(), vec2i(WINDOW_WIDTH, WINDOW_HEIGHT).to_f32());
let inner_rect = rect.contract(Vector2F::splat(blur_radius)); let inner_rect = rect.contract(Vector2F::splat(blur_radius));
let outer_rect = rect.dilate(Vector2F::splat(blur_radius)); let outer_rect = rect.dilate(Vector2F::splat(blur_radius));
@ -1075,10 +1083,11 @@ fn main() {
gl_attributes.set_context_version(3, 3); gl_attributes.set_context_version(3, 3);
// Open a window. // Open a window.
let window_size = vec2i(800, 600); let window_size = vec2i(WINDOW_WIDTH, WINDOW_HEIGHT);
let window = let window =
video.window("NanoVG example port", window_size.x() as u32, window_size.y() as u32) video.window("NanoVG example port", window_size.x() as u32, window_size.y() as u32)
.opengl() .opengl()
.allow_highdpi()
.build() .build()
.unwrap(); .unwrap();
@ -1087,6 +1096,11 @@ fn main() {
gl::load_with(|name| video.gl_get_proc_address(name) as *const _); gl::load_with(|name| video.gl_get_proc_address(name) as *const _);
window.gl_make_current(&gl_context).unwrap(); window.gl_make_current(&gl_context).unwrap();
// Get the real window size (for HiDPI).
let (drawable_width, drawable_height) = window.drawable_size();
let drawable_size = vec2i(drawable_width as i32, drawable_height as i32);
let hidpi_factor = drawable_size.to_f32() / window_size.to_f32();
// Load demo data. // Load demo data.
let resources = FilesystemResourceLoader::locate(); let resources = FilesystemResourceLoader::locate();
let demo_data = DemoData::load(&resources); let demo_data = DemoData::load(&resources);
@ -1094,7 +1108,7 @@ fn main() {
// Create a Pathfinder renderer. // Create a Pathfinder renderer.
let mut renderer = Renderer::new(GLDevice::new(GLVersion::GL3, 0), let mut renderer = Renderer::new(GLDevice::new(GLVersion::GL3, 0),
&resources, &resources,
DestFramebuffer::full_window(window_size), DestFramebuffer::full_window(drawable_size),
RendererOptions { RendererOptions {
background_color: Some(ColorF::new(0.3, 0.3, 0.32, 1.0)), background_color: Some(ColorF::new(0.3, 0.3, 0.32, 1.0)),
}); });
@ -1108,10 +1122,12 @@ fn main() {
// Enter the main loop. // Enter the main loop.
loop { loop {
// Make a canvas. // Make a canvas.
let mut canvas = CanvasRenderingContext2D::new(font_context.clone(), window_size.to_f32()); let mut canvas = CanvasRenderingContext2D::new(font_context.clone(),
drawable_size.to_f32());
// Render the demo. // Render the demo.
let time = (Instant::now() - start_time).as_secs_f32(); let time = (Instant::now() - start_time).as_secs_f32();
canvas.set_current_transform(&Transform2F::from_scale(hidpi_factor));
render_demo(&mut canvas, mouse_position, window_size.to_f32(), time, &demo_data); render_demo(&mut canvas, mouse_position, window_size.to_f32(), time, &demo_data);
// Render the canvas to screen. // Render the canvas to screen.