From 93f5fbc6d280db0adc15d9ee7cea944c4338224c Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Tue, 31 Mar 2020 11:28:34 -0700 Subject: [PATCH] Add convenience constructors: `vec2f`, `vec2i`, `Vector2F::zero()`, `Vector2I::zero()` --- canvas/src/lib.rs | 10 +- canvas/src/tests.rs | 8 +- content/src/dilation.rs | 8 +- content/src/outline.rs | 16 +- content/src/pattern.rs | 4 +- content/src/segment.rs | 13 +- demo/android/rust/src/lib.rs | 25 +- demo/common/src/lib.rs | 19 +- demo/common/src/ui.rs | 86 ++--- demo/magicleap/src/lib.rs | 13 +- demo/magicleap/src/magicleap.rs | 9 +- demo/native/src/main.rs | 12 +- examples/canvas_glutin_minimal/src/main.rs | 14 +- examples/canvas_metal_minimal/src/main.rs | 14 +- examples/canvas_minimal/src/main.rs | 14 +- examples/canvas_moire/src/main.rs | 11 +- examples/canvas_nanovg/src/main.rs | 399 ++++++++++----------- examples/canvas_text/src/main.rs | 8 +- examples/swf_basic/src/main.rs | 24 +- export/src/lib.rs | 4 +- geometry/src/transform2d.rs | 12 +- geometry/src/transform3d.rs | 4 +- geometry/src/vector.rs | 24 +- gpu/src/lib.rs | 4 +- metal/src/lib.rs | 8 +- renderer/src/allocator.rs | 32 +- renderer/src/builder.rs | 30 +- renderer/src/gpu/debug.rs | 34 +- renderer/src/gpu/renderer.rs | 12 +- renderer/src/paint.rs | 20 +- renderer/src/scene.rs | 6 +- renderer/src/tile_map.rs | 4 +- renderer/src/tiles.rs | 15 +- renderer/src/z_buffer.rs | 17 +- svg/src/lib.rs | 28 +- swf/src/lib.rs | 11 +- ui/src/lib.rs | 51 ++- 37 files changed, 473 insertions(+), 550 deletions(-) diff --git a/canvas/src/lib.rs b/canvas/src/lib.rs index 39b921ec..da53b1a1 100644 --- a/canvas/src/lib.rs +++ b/canvas/src/lib.rs @@ -21,9 +21,9 @@ use pathfinder_content::render_target::RenderTargetId; use pathfinder_content::stroke::{LineCap, LineJoin as StrokeLineJoin}; use pathfinder_content::stroke::{OutlineStrokeToFill, StrokeStyle}; use pathfinder_geometry::line_segment::LineSegment2F; -use pathfinder_geometry::vector::Vector2F; use pathfinder_geometry::rect::RectF; use pathfinder_geometry::transform2d::Transform2F; +use pathfinder_geometry::vector::{Vector2F, vec2f}; use pathfinder_renderer::paint::{Paint, PaintId}; use pathfinder_renderer::scene::{ClipPath, ClipPathId, DrawPath, RenderTarget, Scene}; use skribo::FontCollection; @@ -75,7 +75,7 @@ impl CanvasRenderingContext2D { #[inline] pub fn new(font_context: CanvasFontContext, size: Vector2F) -> CanvasRenderingContext2D { let mut scene = Scene::new(); - scene.set_view_box(RectF::new(Vector2F::default(), size)); + scene.set_view_box(RectF::new(Vector2F::zero(), size)); CanvasRenderingContext2D::from_scene(font_context, scene) } @@ -454,7 +454,7 @@ impl State { stroke_paint: Paint::black(), shadow_paint: Paint::transparent_black(), shadow_blur: 0.0, - shadow_offset: Vector2F::default(), + shadow_offset: Vector2F::zero(), text_align: TextAlign::Left, text_baseline: TextBaseline::Alphabetic, image_smoothing_enabled: true, @@ -561,8 +561,8 @@ impl Path2D { let transform = Transform2F::from_scale(Vector2F::splat(radius)).translate(center); - let chord = LineSegment2F::new(vu0.yx().scale_xy(Vector2F::new(-1.0, 1.0)), - vu1.yx().scale_xy(Vector2F::new(1.0, -1.0))); + let chord = LineSegment2F::new(vu0.yx().scale_xy(vec2f(-1.0, 1.0)), + vu1.yx().scale_xy(vec2f( 1.0, -1.0))); // FIXME(pcwalton): Is clockwise direction correct? self.current_contour.push_arc_from_unit_chord(&transform, chord, ArcDirection::CW); diff --git a/canvas/src/tests.rs b/canvas/src/tests.rs index 56b3c85b..6aad4818 100644 --- a/canvas/src/tests.rs +++ b/canvas/src/tests.rs @@ -3,16 +3,16 @@ // For this file only, any copyright is dedicated to the Public Domain. // https://creativecommons.org/publicdomain/zero/1.0/ -use pathfinder_geometry::vector::Vector2F; +use pathfinder_geometry::vector::{Vector2F, vec2f}; use super::Path2D; #[test] pub fn test_path2d_formatting() { let mut path = Path2D::new(); - path.move_to(Vector2F::new(0.0, 1.0)); - path.line_to(Vector2F::new(2.0, 3.0)); + path.move_to(vec2f(0.0, 1.0)); + path.line_to(vec2f(2.0, 3.0)); assert_eq!(format!("{:?}", path), "M 0 1 L 2 3"); - path.line_to(Vector2F::new(4.0, 5.0)); + path.line_to(vec2f(4.0, 5.0)); assert_eq!(format!("{:?}", path), "M 0 1 L 2 3 L 4 5"); path.close_path(); assert_eq!(format!("{:?}", path), "M 0 1 L 2 3 L 4 5 z"); diff --git a/content/src/dilation.rs b/content/src/dilation.rs index 40a1c729..d543fd77 100644 --- a/content/src/dilation.rs +++ b/content/src/dilation.rs @@ -10,7 +10,7 @@ use crate::orientation::Orientation; use crate::outline::Contour; -use pathfinder_geometry::vector::Vector2F; +use pathfinder_geometry::vector::{Vector2F, vec2f}; pub struct ContourDilator<'a> { contour: &'a mut Contour, @@ -34,8 +34,8 @@ impl<'a> ContourDilator<'a> { pub fn dilate(&mut self) { // Determine orientation. let scale = self.amount.scale_xy(match self.orientation { - Orientation::Ccw => Vector2F::new(1.0, -1.0), - Orientation::Cw => Vector2F::new(-1.0, 1.0), + Orientation::Ccw => vec2f( 1.0, -1.0), + Orientation::Cw => vec2f(-1.0, 1.0), }); // Find the starting and previous positions. @@ -84,7 +84,7 @@ impl<'a> ContourDilator<'a> { let bisector = prev_vector.yx() + next_vector.yx(); let bisector_length = bisector.length(); let scaled_bisector = if bisector_length == 0.0 { - Vector2F::default() + Vector2F::zero() } else { bisector.scale_xy(scale).scale(1.0 / bisector_length) }; diff --git a/content/src/outline.rs b/content/src/outline.rs index 421de7a9..13554dd9 100644 --- a/content/src/outline.rs +++ b/content/src/outline.rs @@ -19,7 +19,7 @@ use pathfinder_geometry::rect::RectF; use pathfinder_geometry::transform2d::Transform2F; use pathfinder_geometry::transform3d::Perspective; use pathfinder_geometry::unit_vector::UnitVector; -use pathfinder_geometry::vector::Vector2F; +use pathfinder_geometry::vector::{Vector2F, vec2f}; use std::f32::consts::PI; use std::fmt::{self, Debug, Formatter}; use std::mem; @@ -408,8 +408,8 @@ impl Contour { if end_angle - start_angle >= PI * 2.0 { self.push_ellipse(transform); } else { - let start = Vector2F::new(f32::cos(start_angle), f32::sin(start_angle)); - let end = Vector2F::new(f32::cos(end_angle), f32::sin(end_angle)); + let start = vec2f(start_angle.cos(), start_angle.sin()); + let end = vec2f(end_angle.cos(), end_angle.sin()); self.push_arc_from_unit_chord(transform, LineSegment2F::new(start, end), direction); } } @@ -421,7 +421,7 @@ impl Contour { let mut direction_transform = Transform2F::default(); if direction == ArcDirection::CCW { chord = chord.reversed(); - direction_transform = Transform2F::from_scale(Vector2F::new(1.0, -1.0)); + direction_transform = Transform2F::from_scale(vec2f(1.0, -1.0)); } let (mut vector, end_vector) = (UnitVector(chord.from()), UnitVector(chord.to())); @@ -433,7 +433,7 @@ impl Contour { let mut segment; if !last { - sweep_vector = UnitVector(Vector2F::new(0.0, 1.0)); + sweep_vector = UnitVector(vec2f(0.0, 1.0)); segment = Segment::quarter_circle_arc(); } else { segment = Segment::arc_from_cos(sweep_vector.0.x()); @@ -465,13 +465,13 @@ impl Contour { let mut rotation; self.push_segment(&segment.transform(transform), PushSegmentFlags::UPDATE_BOUNDS | PushSegmentFlags::INCLUDE_FROM_POINT); - rotation = Transform2F::from_rotation_vector(UnitVector(Vector2F::new( 0.0, 1.0))); + rotation = Transform2F::from_rotation_vector(UnitVector(vec2f( 0.0, 1.0))); self.push_segment(&segment.transform(&(*transform * rotation)), PushSegmentFlags::UPDATE_BOUNDS); - rotation = Transform2F::from_rotation_vector(UnitVector(Vector2F::new(-1.0, 0.0))); + rotation = Transform2F::from_rotation_vector(UnitVector(vec2f(-1.0, 0.0))); self.push_segment(&segment.transform(&(*transform * rotation)), PushSegmentFlags::UPDATE_BOUNDS); - rotation = Transform2F::from_rotation_vector(UnitVector(Vector2F::new( 0.0, -1.0))); + rotation = Transform2F::from_rotation_vector(UnitVector(vec2f( 0.0, -1.0))); self.push_segment(&segment.transform(&(*transform * rotation)), PushSegmentFlags::UPDATE_BOUNDS); } diff --git a/content/src/pattern.rs b/content/src/pattern.rs index 0801acba..958c4dc9 100644 --- a/content/src/pattern.rs +++ b/content/src/pattern.rs @@ -14,7 +14,7 @@ use crate::render_target::RenderTargetId; use crate::util; use pathfinder_color::{self as color, ColorU}; use pathfinder_geometry::transform2d::Transform2F; -use pathfinder_geometry::vector::Vector2I; +use pathfinder_geometry::vector::{Vector2I, vec2i}; use std::collections::hash_map::DefaultHasher; use std::fmt::{self, Debug, Formatter}; use std::hash::{Hash, Hasher}; @@ -79,7 +79,7 @@ impl Image { pub fn from_image_buffer(image_buffer: RgbaImage) -> Image { let (width, height) = image_buffer.dimensions(); let pixels = color::u8_vec_to_color_vec(image_buffer.into_raw()); - Image::new(Vector2I::new(width as i32, height as i32), pixels) + Image::new(vec2i(width as i32, height as i32), pixels) } #[inline] diff --git a/content/src/segment.rs b/content/src/segment.rs index 7cff4cb0..093ad518 100644 --- a/content/src/segment.rs +++ b/content/src/segment.rs @@ -13,7 +13,7 @@ use pathfinder_geometry::line_segment::LineSegment2F; use pathfinder_geometry::transform2d::Transform2F; use pathfinder_geometry::util::{self, EPSILON}; -use pathfinder_geometry::vector::Vector2F; +use pathfinder_geometry::vector::{Vector2F, vec2f}; use pathfinder_simd::default::F32x4; use std::f32::consts::SQRT_2; @@ -52,7 +52,7 @@ impl Segment { pub fn quadratic(baseline: LineSegment2F, ctrl: Vector2F) -> Segment { Segment { baseline, - ctrl: LineSegment2F::new(ctrl, Vector2F::default()), + ctrl: LineSegment2F::new(ctrl, Vector2F::zero()), kind: SegmentKind::Quadratic, flags: SegmentFlags::empty(), } @@ -97,8 +97,8 @@ impl Segment { #[inline] pub fn quarter_circle_arc() -> Segment { let p0 = Vector2F::splat(SQRT_2 * 0.5); - let p1 = Vector2F::new(-SQRT_2 / 6.0 + 4.0 / 3.0, 7.0 * SQRT_2 / 6.0 - 4.0 / 3.0); - let flip = Vector2F::new(1.0, -1.0); + let p1 = vec2f(-SQRT_2 / 6.0 + 4.0 / 3.0, 7.0 * SQRT_2 / 6.0 - 4.0 / 3.0); + let flip = vec2f(1.0, -1.0); let (p2, p3) = (p1.scale_xy(flip), p0.scale_xy(flip)); Segment::cubic(LineSegment2F::new(p3, p0), LineSegment2F::new(p2, p1)) } @@ -145,9 +145,8 @@ impl Segment { let mut new_segment = *self; let p1_2 = self.ctrl.from() + self.ctrl.from(); - new_segment.ctrl = - LineSegment2F::new(self.baseline.from() + p1_2, p1_2 + self.baseline.to()) - .scale(1.0 / 3.0); + new_segment.ctrl = LineSegment2F::new(self.baseline.from() + p1_2, + p1_2 + self.baseline.to()).scale(1.0 / 3.0); new_segment.kind = SegmentKind::Cubic; new_segment } diff --git a/demo/android/rust/src/lib.rs b/demo/android/rust/src/lib.rs index aa417190..2a129d7d 100644 --- a/demo/android/rust/src/lib.rs +++ b/demo/android/rust/src/lib.rs @@ -16,7 +16,7 @@ use jni::{JNIEnv, JavaVM}; use pathfinder_demo::window::{Event, SVGPath, View, Window, WindowSize}; use pathfinder_demo::DemoApp; use pathfinder_demo::Options; -use pathfinder_geometry::vector::Vector2I; +use pathfinder_geometry::vector::{Vector2I, vec2i}; use pathfinder_geometry::rect::RectI; use pathfinder_gl::GLVersion; use pathfinder_resources::ResourceLoader; @@ -48,7 +48,7 @@ pub unsafe extern "system" fn Java_graphics_pathfinder_pathfinderdemo_Pathfinder width: i32, height: i32, ) { - let logical_size = Vector2I::new(width, height); + let logical_size = vec2i(width, height); let window_size = WindowSize { logical_size, backing_scale_factor: 1.0, @@ -119,7 +119,7 @@ pub unsafe extern "system" fn Java_graphics_pathfinder_pathfinderdemo_Pathfinder .lock() .unwrap() .push(Event::WindowResized(WindowSize { - logical_size: Vector2I::new(width, height), + logical_size: vec2i(width, height), backing_scale_factor: 1.0, })) } @@ -131,10 +131,7 @@ pub unsafe extern "system" fn Java_graphics_pathfinder_pathfinderdemo_Pathfinder x: i32, y: i32, ) { - EVENT_QUEUE - .lock() - .unwrap() - .push(Event::MouseDown(Vector2I::new(x, y))) + EVENT_QUEUE.lock().unwrap().push(Event::MouseDown(vec2i(x, y))) } #[no_mangle] @@ -144,10 +141,7 @@ pub unsafe extern "system" fn Java_graphics_pathfinder_pathfinderdemo_Pathfinder x: i32, y: i32, ) { - EVENT_QUEUE - .lock() - .unwrap() - .push(Event::MouseDragged(Vector2I::new(x, y))) + EVENT_QUEUE.lock().unwrap().push(Event::MouseDragged(vec2i(x, y))) } #[no_mangle] @@ -158,10 +152,7 @@ pub unsafe extern "system" fn Java_graphics_pathfinder_pathfinderdemo_Pathfinder center_x: i32, center_y: i32, ) { - EVENT_QUEUE - .lock() - .unwrap() - .push(Event::Zoom(factor, Vector2I::new(center_x, center_y))) + EVENT_QUEUE.lock().unwrap().push(Event::Zoom(factor, vec2i(center_x, center_y))) } #[no_mangle] @@ -204,8 +195,8 @@ impl Window for WindowImpl { width = width / 2; offset_x = (index as i32) * width; } - let size = Vector2I::new(width, height); - let offset = Vector2I::new(offset_x, 0); + let size = vec2i(width, height); + let offset = vec2i(offset_x, 0); RectI::new(offset, size) } diff --git a/demo/common/src/lib.rs b/demo/common/src/lib.rs index 9d6e6b48..74eec271 100644 --- a/demo/common/src/lib.rs +++ b/demo/common/src/lib.rs @@ -28,7 +28,7 @@ use pathfinder_export::{Export, FileFormat}; use pathfinder_geometry::rect::RectF; use pathfinder_geometry::transform2d::Transform2F; use pathfinder_geometry::transform3d::Transform4F; -use pathfinder_geometry::vector::{Vector2F, Vector2I, Vector4F}; +use pathfinder_geometry::vector::{Vector2F, Vector2I, Vector4F, vec2f, vec2i}; use pathfinder_gpu::Device; use pathfinder_renderer::concurrent::scene_proxy::{RenderCommandStream, SceneProxy}; use pathfinder_renderer::gpu::options::{DestFramebuffer, RendererOptions}; @@ -256,9 +256,9 @@ impl DemoApp where W: Window { dilation: if self.ui_model.stem_darkening_effect_enabled { let font_size = APPROX_FONT_SIZE * self.window_size.backing_scale_factor; let (x, y) = (STEM_DARKENING_FACTORS[0], STEM_DARKENING_FACTORS[1]); - Vector2F::new(x, y).scale(font_size) + vec2f(x, y).scale(font_size) } else { - Vector2F::default() + Vector2F::zero() }, subpixel_aa_enabled: self.ui_model.subpixel_aa_effect_enabled, }; @@ -279,10 +279,9 @@ impl DemoApp where W: Window { Event::WindowResized(new_size) => { self.window_size = new_size; let viewport = self.window.viewport(self.ui_model.mode.view(0)); - self.scene_proxy.set_view_box(RectF::new(Vector2F::default(), - viewport.size().to_f32())); - self.renderer - .set_main_framebuffer_size(self.window_size.device_size()); + self.scene_proxy.set_view_box(RectF::new(Vector2F::zero(), + viewport.size().to_f32())); + self.renderer.set_main_framebuffer_size(self.window_size.device_size()); self.dirty = true; } Event::MouseDown(new_position) => { @@ -776,8 +775,8 @@ fn build_svg_tree(tree: &Tree, viewport_size: Vector2I, effects: Option None => None, Some(effects) => { let scale = match effects.filter { - Filter::Text { defringing_kernel: Some(_), .. } => Vector2I::new(3, 1), - _ => Vector2I::splat(1), + Filter::Text { defringing_kernel: Some(_), .. } => vec2i(3, 1), + _ => vec2i(1, 1), }; let name = "Text".to_owned(); let render_target = RenderTarget::new(viewport_size.scale_xy(scale), name); @@ -873,7 +872,7 @@ impl SceneMetadata { // Can we simplify this? fn new_clipping_view_box(scene: &mut Scene, viewport_size: Vector2I) -> SceneMetadata { let view_box = scene.view_box(); - scene.set_view_box(RectF::new(Vector2F::default(), viewport_size.to_f32())); + scene.set_view_box(RectF::new(Vector2F::zero(), viewport_size.to_f32())); SceneMetadata { view_box } } } diff --git a/demo/common/src/ui.rs b/demo/common/src/ui.rs index 4e4d76fb..8538e2b9 100644 --- a/demo/common/src/ui.rs +++ b/demo/common/src/ui.rs @@ -13,7 +13,7 @@ use crate::window::Window; use crate::{BackgroundColor, Options}; use pathfinder_color::ColorU; use pathfinder_geometry::rect::RectI; -use pathfinder_geometry::vector::Vector2I; +use pathfinder_geometry::vector::{Vector2I, vec2i}; use pathfinder_gpu::Device; use pathfinder_renderer::gpu::debug::DebugUIPresenter; use pathfinder_resources::ResourceLoader; @@ -165,9 +165,9 @@ where // Draw button strip. let bottom = debug_ui_presenter.ui_presenter.framebuffer_size().y() - PADDING; - let mut position = Vector2I::new(PADDING, bottom - BUTTON_HEIGHT); + let mut position = vec2i(PADDING, bottom - BUTTON_HEIGHT); - let button_size = Vector2I::new(BUTTON_WIDTH, BUTTON_HEIGHT); + let button_size = vec2i(BUTTON_WIDTH, BUTTON_HEIGHT); // Draw effects button. if debug_ui_presenter.ui_presenter.draw_button(device, position, &self.effects_texture) { @@ -180,7 +180,7 @@ where RectI::new(position, button_size), ); } - position += Vector2I::new(button_size.x() + PADDING, 0); + position += vec2i(button_size.x() + PADDING, 0); // Draw open button. if debug_ui_presenter.ui_presenter.draw_button(device, position, &self.open_texture) { @@ -191,7 +191,7 @@ where debug_ui_presenter.ui_presenter.draw_tooltip(device, "Open SVG", RectI::new(position, button_size)); - position += Vector2I::new(BUTTON_WIDTH + PADDING, 0); + position += vec2i(BUTTON_WIDTH + PADDING, 0); // Draw screenshot button. if debug_ui_presenter.ui_presenter.draw_button(device, @@ -209,7 +209,7 @@ where // Draw screenshot panel, if necessary. self.draw_screenshot_panel(device, window, debug_ui_presenter, position.x(), action); - position += Vector2I::new(button_size.x() + PADDING, 0); + position += vec2i(button_size.x() + PADDING, 0); // Draw mode switch. let new_mode = debug_ui_presenter.ui_presenter.draw_text_switch( @@ -227,13 +227,13 @@ where } let mode_switch_width = debug_ui_presenter.ui_presenter.measure_segmented_control(3); - let mode_switch_size = Vector2I::new(mode_switch_width, BUTTON_HEIGHT); + let mode_switch_size = vec2i(mode_switch_width, BUTTON_HEIGHT); debug_ui_presenter.ui_presenter.draw_tooltip( device, "2D/3D/VR Mode", RectI::new(position, mode_switch_size), ); - position += Vector2I::new(mode_switch_width + PADDING, 0); + position += vec2i(mode_switch_width + PADDING, 0); // Draw background switch. if debug_ui_presenter.ui_presenter.draw_button(device, @@ -251,7 +251,7 @@ where // Draw background panel, if necessary. self.draw_background_panel(device, debug_ui_presenter, position.x(), action, model); - position += Vector2I::new(button_size.x() + PADDING, 0); + position += vec2i(button_size.x() + PADDING, 0); // Draw effects panel, if necessary. self.draw_effects_panel(device, debug_ui_presenter, model, action); @@ -270,7 +270,7 @@ where RectI::new(position, button_size)); } self.draw_rotate_panel(device, debug_ui_presenter, position.x(), action, model); - position += Vector2I::new(BUTTON_WIDTH + PADDING, 0); + position += vec2i(BUTTON_WIDTH + PADDING, 0); // Draw zoom control. self.draw_zoom_control(device, debug_ui_presenter, position, action); @@ -286,7 +286,7 @@ where let zoom_segmented_control_width = debug_ui_presenter.ui_presenter.measure_segmented_control(3); let zoom_segmented_control_rect = - RectI::new(position, Vector2I::new(zoom_segmented_control_width, BUTTON_HEIGHT)); + RectI::new(position, vec2i(zoom_segmented_control_width, BUTTON_HEIGHT)); debug_ui_presenter.ui_presenter.draw_tooltip(device, "Zoom", zoom_segmented_control_rect); let zoom_textures = &[ @@ -315,8 +315,8 @@ where } let message_size = debug_ui_presenter.ui_presenter.measure_text(&model.message); - let window_origin = Vector2I::new(PADDING, PADDING); - let window_size = Vector2I::new(PADDING * 2 + message_size, TOOLTIP_HEIGHT); + let window_origin = vec2i(PADDING, PADDING); + let window_size = vec2i(PADDING * 2 + message_size, TOOLTIP_HEIGHT); debug_ui_presenter.ui_presenter.draw_solid_rounded_rect( device, RectI::new(window_origin, window_size), @@ -325,7 +325,7 @@ where debug_ui_presenter.ui_presenter.draw_text( device, &model.message, - window_origin + Vector2I::new(PADDING, PADDING + FONT_ASCENT), + window_origin + vec2i(PADDING, PADDING + FONT_ASCENT), false, ); } @@ -343,10 +343,8 @@ where let effects_panel_y = bottom - (BUTTON_HEIGHT + PADDING + EFFECTS_PANEL_HEIGHT); debug_ui_presenter.ui_presenter.draw_solid_rounded_rect( device, - RectI::new( - Vector2I::new(PADDING, effects_panel_y), - Vector2I::new(EFFECTS_PANEL_WIDTH, EFFECTS_PANEL_HEIGHT), - ), + RectI::new(vec2i(PADDING, effects_panel_y), + vec2i(EFFECTS_PANEL_WIDTH, EFFECTS_PANEL_HEIGHT)), WINDOW_COLOR, ); @@ -390,13 +388,10 @@ where let bottom = debug_ui_presenter.ui_presenter.framebuffer_size().y() - PADDING; let panel_y = bottom - (BUTTON_HEIGHT + PADDING + SCREENSHOT_PANEL_HEIGHT); - let panel_position = Vector2I::new(panel_x, panel_y); + let panel_position = vec2i(panel_x, panel_y); debug_ui_presenter.ui_presenter.draw_solid_rounded_rect( device, - RectI::new( - panel_position, - Vector2I::new(SCREENSHOT_PANEL_WIDTH, SCREENSHOT_PANEL_HEIGHT), - ), + RectI::new(panel_position, vec2i(SCREENSHOT_PANEL_WIDTH, SCREENSHOT_PANEL_HEIGHT)), WINDOW_COLOR, ); @@ -432,13 +427,10 @@ where let bottom = debug_ui_presenter.ui_presenter.framebuffer_size().y() - PADDING; let panel_y = bottom - (BUTTON_HEIGHT + PADDING + BACKGROUND_PANEL_HEIGHT); - let panel_position = Vector2I::new(panel_x, panel_y); + let panel_position = vec2i(panel_x, panel_y); debug_ui_presenter.ui_presenter.draw_solid_rounded_rect( device, - RectI::new( - panel_position, - Vector2I::new(BACKGROUND_PANEL_WIDTH, BACKGROUND_PANEL_HEIGHT), - ), + RectI::new(panel_position, vec2i(BACKGROUND_PANEL_WIDTH, BACKGROUND_PANEL_HEIGHT)), WINDOW_COLOR, ); @@ -482,8 +474,8 @@ where let bottom = debug_ui_presenter.ui_presenter.framebuffer_size().y() - PADDING; let rotate_panel_y = bottom - (BUTTON_HEIGHT + PADDING + ROTATE_PANEL_HEIGHT); - let rotate_panel_origin = Vector2I::new(rotate_panel_x, rotate_panel_y); - let rotate_panel_size = Vector2I::new(ROTATE_PANEL_WIDTH, ROTATE_PANEL_HEIGHT); + let rotate_panel_origin = vec2i(rotate_panel_x, rotate_panel_y); + let rotate_panel_size = vec2i(ROTATE_PANEL_WIDTH, ROTATE_PANEL_HEIGHT); debug_ui_presenter.ui_presenter.draw_solid_rounded_rect( device, RectI::new(rotate_panel_origin, rotate_panel_size), @@ -491,10 +483,8 @@ where ); let (widget_x, widget_y) = (rotate_panel_x + PADDING, rotate_panel_y + PADDING); - let widget_rect = RectI::new( - Vector2I::new(widget_x, widget_y), - Vector2I::new(SLIDER_WIDTH, SLIDER_KNOB_HEIGHT), - ); + let widget_rect = RectI::new(vec2i(widget_x, widget_y), + vec2i(SLIDER_WIDTH, SLIDER_KNOB_HEIGHT)); if let Some(position) = debug_ui_presenter .ui_presenter .event_queue @@ -506,17 +496,13 @@ where let slider_track_y = rotate_panel_y + PADDING + SLIDER_KNOB_HEIGHT / 2 - SLIDER_TRACK_HEIGHT / 2; - let slider_track_rect = RectI::new( - Vector2I::new(widget_x, slider_track_y), - Vector2I::new(SLIDER_WIDTH, SLIDER_TRACK_HEIGHT), - ); + let slider_track_rect = RectI::new(vec2i(widget_x, slider_track_y), + vec2i(SLIDER_WIDTH, SLIDER_TRACK_HEIGHT)); debug_ui_presenter.ui_presenter.draw_rect_outline(device, slider_track_rect, TEXT_COLOR); let slider_knob_x = widget_x + model.rotation - SLIDER_KNOB_WIDTH / 2; - let slider_knob_rect = RectI::new( - Vector2I::new(slider_knob_x, widget_y), - Vector2I::new(SLIDER_KNOB_WIDTH, SLIDER_KNOB_HEIGHT), - ); + let slider_knob_rect = RectI::new(vec2i(slider_knob_x, widget_y), + vec2i(SLIDER_KNOB_WIDTH, SLIDER_KNOB_HEIGHT)); debug_ui_presenter.ui_presenter.draw_solid_rect(device, slider_knob_rect, TEXT_COLOR); } @@ -532,8 +518,8 @@ where let index = screenshot_type as i32; let text = format!("Save as {}...", screenshot_type.as_str()); - let widget_size = Vector2I::new(BACKGROUND_PANEL_WIDTH, BUTTON_HEIGHT); - let widget_origin = panel_position + Vector2I::new(0, widget_size.y() * index); + let widget_size = vec2i(BACKGROUND_PANEL_WIDTH, BUTTON_HEIGHT); + let widget_origin = panel_position + vec2i(0, widget_size.y() * index); let widget_rect = RectI::new(widget_origin, widget_size); if self.draw_menu_item(device, @@ -561,8 +547,8 @@ where ) { let (text, index) = (color.as_str(), color as i32); - let widget_size = Vector2I::new(BACKGROUND_PANEL_WIDTH, BUTTON_HEIGHT); - let widget_origin = panel_position + Vector2I::new(0, widget_size.y() * index); + let widget_size = vec2i(BACKGROUND_PANEL_WIDTH, BUTTON_HEIGHT); + let widget_origin = panel_position + vec2i(0, widget_size.y() * index); let widget_rect = RectI::new(widget_origin, widget_size); let selected = color == model.background_color; @@ -590,7 +576,7 @@ where } let (text_x, text_y) = (PADDING * 2, BUTTON_TEXT_OFFSET); - let text_position = widget_rect.origin() + Vector2I::new(text_x, text_y); + let text_position = widget_rect.origin() + vec2i(text_x, text_y); debug_ui_presenter.ui_presenter.draw_text(device, text, text_position, selected); debug_ui_presenter.ui_presenter @@ -610,14 +596,12 @@ where value: &mut bool) { let text_x = PADDING * 2; let text_y = window_y + PADDING + BUTTON_TEXT_OFFSET + (BUTTON_HEIGHT + PADDING) * index; - debug_ui_presenter - .ui_presenter - .draw_text(device, text, Vector2I::new(text_x, text_y), false); + debug_ui_presenter.ui_presenter.draw_text(device, text, vec2i(text_x, text_y), false); let switch_width = debug_ui_presenter.ui_presenter.measure_segmented_control(2); let switch_x = PADDING + EFFECTS_PANEL_WIDTH - (switch_width + PADDING); let switch_y = window_y + PADDING + (BUTTON_HEIGHT + PADDING) * index; - let switch_position = Vector2I::new(switch_x, switch_y); + let switch_position = vec2i(switch_x, switch_y); let new_value = debug_ui_presenter diff --git a/demo/magicleap/src/lib.rs b/demo/magicleap/src/lib.rs index 9da86739..5d6c08f6 100644 --- a/demo/magicleap/src/lib.rs +++ b/demo/magicleap/src/lib.rs @@ -29,10 +29,11 @@ use pathfinder_demo::BackgroundColor; use pathfinder_demo::Mode; use pathfinder_demo::window::Event; use pathfinder_demo::window::SVGPath; -use pathfinder_geometry::vector::Vector2F; -use pathfinder_geometry::vector::Vector2I; use pathfinder_geometry::rect::RectI; use pathfinder_geometry::transform2d::Transform2F; +use pathfinder_geometry::vector::Vector2F; +use pathfinder_geometry::vector::Vector2I; +use pathfinder_geometry::vector::vec2i; use pathfinder_color::ColorF; use pathfinder_gl::GLDevice; use pathfinder_gl::GLVersion; @@ -191,10 +192,10 @@ pub unsafe extern "C" fn magicleap_pathfinder_render(pf: *mut c_void, options: * let mut height = 0; egl::query_surface(options.display, options.surface, egl::EGL_WIDTH, &mut width); egl::query_surface(options.display, options.surface, egl::EGL_HEIGHT, &mut height); - let size = Vector2I::new(width, height); + let size = vec2i(width, height); - let viewport_origin = Vector2I::new(options.viewport[0] as i32, options.viewport[1] as i32); - let viewport_size = Vector2I::new(options.viewport[2] as i32, options.viewport[3] as i32); + let viewport_origin = vec2i(options.viewport[0] as i32, options.viewport[1] as i32); + let viewport_size = vec2i(options.viewport[2] as i32, options.viewport[3] as i32); let viewport = RectI::new(viewport_origin, viewport_size); let bg_color = ColorF(F32x4::new(options.bg_color[0], options.bg_color[1], options.bg_color[2], options.bg_color[3])); @@ -222,7 +223,7 @@ pub unsafe extern "C" fn magicleap_pathfinder_render(pf: *mut c_void, options: * let render_options = RenderOptions { transform: RenderTransform::Transform2D(transform), - dilation: Vector2F::default(), + dilation: Vector2F::zero(), subpixel_aa_enabled: false, }; diff --git a/demo/magicleap/src/magicleap.rs b/demo/magicleap/src/magicleap.rs index 4fd2fc75..5342ca24 100644 --- a/demo/magicleap/src/magicleap.rs +++ b/demo/magicleap/src/magicleap.rs @@ -48,13 +48,14 @@ use pathfinder_demo::window::OcularTransform; use pathfinder_demo::window::View; use pathfinder_demo::window::Window; use pathfinder_demo::window::WindowSize; -use pathfinder_geometry::vector::Vector2I; -use pathfinder_geometry::vector::Vector2F; use pathfinder_geometry::rect::RectF; use pathfinder_geometry::rect::RectI; use pathfinder_geometry::transform3d::Perspective; use pathfinder_geometry::transform3d::Transform4F; use pathfinder_geometry::util; +use pathfinder_geometry::vector::Vector2I; +use pathfinder_geometry::vector::Vector2F; +use pathfinder_geometry::vector::vec2i; use pathfinder_gl::GLVersion; use pathfinder_resources::ResourceLoader; use pathfinder_resources::fs::FilesystemResourceLoader; @@ -117,7 +118,7 @@ impl Window for MagicLeapWindow { } fn viewport(&self, _view: View) -> RectI { - RectI::new(Vector2I::default(), self.size) + RectI::new(Vector2I::zero(), self.size) } fn make_current(&mut self, view: View) { @@ -184,7 +185,7 @@ impl MagicLeapWindow { MagicLeapWindow { framebuffer_id, graphics_client, - size: Vector2I::new(max_width, max_height), + size: vec2i(max_width, max_height), frame_handle: ML_HANDLE_INVALID, virtual_camera_array, initial_camera_transform: None, diff --git a/demo/native/src/main.rs b/demo/native/src/main.rs index 0718c592..96f9a40e 100644 --- a/demo/native/src/main.rs +++ b/demo/native/src/main.rs @@ -13,8 +13,8 @@ use nfd::Response; use pathfinder_demo::window::{Event, Keycode, SVGPath, View, Window, WindowSize}; use pathfinder_demo::{DemoApp, Options}; -use pathfinder_geometry::vector::Vector2I; use pathfinder_geometry::rect::RectI; +use pathfinder_geometry::vector::vec2i; use pathfinder_resources::ResourceLoader; use pathfinder_resources::fs::FilesystemResourceLoader; use sdl2::event::{Event as SDLEvent, WindowEvent}; @@ -125,7 +125,7 @@ impl Window for WindowImpl { width = width / 2; x_offset = width * (index as i32); } - RectI::new(Vector2I::new(x_offset, 0), Vector2I::new(width, height)) + RectI::new(vec2i(x_offset, 0), vec2i(width, height)) } #[cfg(any(not(target_os = "macos"), feature = "pf-gl"))] @@ -279,7 +279,7 @@ impl WindowImpl { let (logical_width, logical_height) = self.window().size(); let (drawable_width, _) = self.window().drawable_size(); WindowSize { - logical_size: Vector2I::new(logical_width as i32, logical_height as i32), + logical_size: vec2i(logical_width as i32, logical_height as i32), backing_scale_factor: drawable_width as f32 / logical_width as f32, } } @@ -311,11 +311,11 @@ impl WindowImpl { message_type: type_, message_data: code as u32, }), - SDLEvent::MouseButtonDown { x, y, .. } => Some(Event::MouseDown(Vector2I::new(x, y))), + SDLEvent::MouseButtonDown { x, y, .. } => Some(Event::MouseDown(vec2i(x, y))), SDLEvent::MouseMotion { x, y, mousestate, .. } => { - let position = Vector2I::new(x, y); + let position = vec2i(x, y); if mousestate.left() { Some(Event::MouseDragged(position)) } else { @@ -337,7 +337,7 @@ impl WindowImpl { } => self.convert_sdl_keycode(sdl_keycode).map(Event::KeyUp), SDLEvent::MultiGesture { d_dist, .. } => { let mouse_state = self.event_pump.mouse_state(); - let center = Vector2I::new(mouse_state.x(), mouse_state.y()); + let center = vec2i(mouse_state.x(), mouse_state.y()); Some(Event::Zoom(d_dist, center)) } _ => None, diff --git a/examples/canvas_glutin_minimal/src/main.rs b/examples/canvas_glutin_minimal/src/main.rs index 9cbc9102..d5f364cb 100644 --- a/examples/canvas_glutin_minimal/src/main.rs +++ b/examples/canvas_glutin_minimal/src/main.rs @@ -18,7 +18,7 @@ use glutin::window::WindowBuilder; use pathfinder_canvas::{CanvasFontContext, CanvasRenderingContext2D, Path2D}; use pathfinder_color::ColorF; use pathfinder_geometry::rect::RectF; -use pathfinder_geometry::vector::{Vector2F, Vector2I}; +use pathfinder_geometry::vector::{Vector2F, Vector2I, vec2f, vec2i}; use pathfinder_gl::{GLDevice, GLVersion}; use pathfinder_resources::fs::FilesystemResourceLoader; use pathfinder_renderer::concurrent::rayon::RayonExecutor; @@ -30,7 +30,7 @@ use pathfinder_renderer::options::BuildOptions; fn main() { // Calculate the right logical size of the window. let event_loop = EventLoop::new(); - let window_size = Vector2I::new(640, 480); + let window_size = vec2i(640, 480); let physical_window_size = PhysicalSize::new(window_size.x() as f64, window_size.y() as f64); // Open a window. @@ -61,16 +61,16 @@ fn main() { canvas.set_line_width(10.0); // Draw walls. - canvas.stroke_rect(RectF::new(Vector2F::new(75.0, 140.0), Vector2F::new(150.0, 110.0))); + canvas.stroke_rect(RectF::new(vec2f(75.0, 140.0), vec2f(150.0, 110.0))); // Draw door. - canvas.fill_rect(RectF::new(Vector2F::new(130.0, 190.0), Vector2F::new(40.0, 60.0))); + canvas.fill_rect(RectF::new(vec2f(130.0, 190.0), vec2f(40.0, 60.0))); // Draw roof. let mut path = Path2D::new(); - path.move_to(Vector2F::new(50.0, 140.0)); - path.line_to(Vector2F::new(150.0, 60.0)); - path.line_to(Vector2F::new(250.0, 140.0)); + path.move_to(vec2f(50.0, 140.0)); + path.line_to(vec2f(150.0, 60.0)); + path.line_to(vec2f(250.0, 140.0)); path.close_path(); canvas.stroke_path(path); diff --git a/examples/canvas_metal_minimal/src/main.rs b/examples/canvas_metal_minimal/src/main.rs index 498d6639..275ca766 100644 --- a/examples/canvas_metal_minimal/src/main.rs +++ b/examples/canvas_metal_minimal/src/main.rs @@ -12,7 +12,7 @@ use foreign_types::ForeignTypeRef; use metal::{CAMetalLayer, CoreAnimationLayerRef}; use pathfinder_canvas::{CanvasFontContext, CanvasRenderingContext2D, Path2D}; use pathfinder_color::ColorF; -use pathfinder_geometry::vector::{Vector2F, Vector2I}; +use pathfinder_geometry::vector::{Vector2F, Vector2I, vec2f, vec2i}; use pathfinder_geometry::rect::RectF; use pathfinder_metal::MetalDevice; use pathfinder_renderer::concurrent::rayon::RayonExecutor; @@ -33,7 +33,7 @@ fn main() { let video = sdl_context.video().unwrap(); // Open a window. - let window_size = Vector2I::new(640, 480); + let window_size = vec2i(640, 480); let window = video.window("Minimal example", window_size.x() as u32, window_size.y() as u32) .opengl() .build() @@ -59,16 +59,16 @@ fn main() { canvas.set_line_width(10.0); // Draw walls. - canvas.stroke_rect(RectF::new(Vector2F::new(75.0, 140.0), Vector2F::new(150.0, 110.0))); + canvas.stroke_rect(RectF::new(vec2f(75.0, 140.0), vec2f(150.0, 110.0))); // Draw door. - canvas.fill_rect(RectF::new(Vector2F::new(130.0, 190.0), Vector2F::new(40.0, 60.0))); + canvas.fill_rect(RectF::new(vec2f(130.0, 190.0), vec2f(40.0, 60.0))); // Draw roof. let mut path = Path2D::new(); - path.move_to(Vector2F::new(50.0, 140.0)); - path.line_to(Vector2F::new(150.0, 60.0)); - path.line_to(Vector2F::new(250.0, 140.0)); + path.move_to(vec2f(50.0, 140.0)); + path.line_to(vec2f(150.0, 60.0)); + path.line_to(vec2f(250.0, 140.0)); path.close_path(); canvas.stroke_path(path); diff --git a/examples/canvas_minimal/src/main.rs b/examples/canvas_minimal/src/main.rs index 99a3a9e7..b3ef74d7 100644 --- a/examples/canvas_minimal/src/main.rs +++ b/examples/canvas_minimal/src/main.rs @@ -11,7 +11,7 @@ use pathfinder_canvas::{CanvasFontContext, CanvasRenderingContext2D, Path2D}; use pathfinder_color::ColorF; use pathfinder_geometry::rect::RectF; -use pathfinder_geometry::vector::{Vector2F, Vector2I}; +use pathfinder_geometry::vector::{Vector2F, Vector2I, vec2i}; use pathfinder_gl::{GLDevice, GLVersion}; use pathfinder_renderer::concurrent::rayon::RayonExecutor; use pathfinder_renderer::concurrent::scene_proxy::SceneProxy; @@ -34,7 +34,7 @@ fn main() { gl_attributes.set_context_version(3, 3); // Open a window. - let window_size = Vector2I::new(640, 480); + let window_size = vec2i(640, 480); let window = video.window("Minimal example", window_size.x() as u32, window_size.y() as u32) .opengl() .build() @@ -59,16 +59,16 @@ fn main() { canvas.set_line_width(10.0); // Draw walls. - canvas.stroke_rect(RectF::new(Vector2F::new(75.0, 140.0), Vector2F::new(150.0, 110.0))); + canvas.stroke_rect(RectF::new(vec2f(75.0, 140.0), vec2f(150.0, 110.0))); // Draw door. - canvas.fill_rect(RectF::new(Vector2F::new(130.0, 190.0), Vector2F::new(40.0, 60.0))); + canvas.fill_rect(RectF::new(vec2f(130.0, 190.0), vec2f(40.0, 60.0))); // Draw roof. let mut path = Path2D::new(); - path.move_to(Vector2F::new(50.0, 140.0)); - path.line_to(Vector2F::new(150.0, 60.0)); - path.line_to(Vector2F::new(250.0, 140.0)); + path.move_to(vec2f(50.0, 140.0)); + path.line_to(vec2f(150.0, 60.0)); + path.line_to(vec2f(250.0, 140.0)); path.close_path(); canvas.stroke_path(path); diff --git a/examples/canvas_moire/src/main.rs b/examples/canvas_moire/src/main.rs index 7deca089..af54de2a 100644 --- a/examples/canvas_moire/src/main.rs +++ b/examples/canvas_moire/src/main.rs @@ -10,7 +10,7 @@ use pathfinder_canvas::{CanvasFontContext, CanvasRenderingContext2D, FillStyle, Path2D}; use pathfinder_color::{ColorF, ColorU}; -use pathfinder_geometry::vector::{Vector2F, Vector2I}; +use pathfinder_geometry::vector::{Vector2F, Vector2I, vec2i}; use pathfinder_gl::{GLDevice, GLVersion}; use pathfinder_renderer::concurrent::rayon::RayonExecutor; use pathfinder_renderer::concurrent::scene_proxy::SceneProxy; @@ -47,7 +47,7 @@ fn main() { gl_attributes.set_context_version(3, 3); // Open a window. - let window_size = Vector2I::new(1067, 800); + let window_size = vec2i(1067, 800); let window = video.window("Moire example", window_size.x() as u32, window_size.y() as u32) .opengl() .allow_highdpi() @@ -57,7 +57,7 @@ fn main() { // Get the real window size (for HiDPI). let (drawable_width, drawable_height) = window.drawable_size(); - let drawable_size = Vector2I::new(drawable_width as i32, drawable_height as i32); + let drawable_size = vec2i(drawable_width as i32, drawable_height as i32); // Create the GL context, and make it current. let gl_context = window.gl_create_context().unwrap(); @@ -120,9 +120,8 @@ impl MoireRenderer { // Calculate outer and inner circle centers (circle and Leminscate of Gerono respectively). let window_center = self.window_size.to_f32().scale(0.5); - let outer_center = window_center + Vector2F::new(sin_time, cos_time).scale(OUTER_RADIUS); - let inner_center = window_center + - Vector2F::new(1.0, sin_time).scale(cos_time * INNER_RADIUS); + let outer_center = window_center + vec2f(sin_time, cos_time).scale(OUTER_RADIUS); + let inner_center = window_center + vec2f(1.0, sin_time).scale(cos_time * INNER_RADIUS); // Clear to background color. self.renderer.set_options(RendererOptions { background_color: Some(background_color) }); diff --git a/examples/canvas_nanovg/src/main.rs b/examples/canvas_nanovg/src/main.rs index c481796c..0b0b929b 100644 --- a/examples/canvas_nanovg/src/main.rs +++ b/examples/canvas_nanovg/src/main.rs @@ -23,7 +23,7 @@ use pathfinder_geometry::line_segment::LineSegment2F; use pathfinder_geometry::rect::RectF; use pathfinder_geometry::transform2d::Transform2F; use pathfinder_geometry::util; -use pathfinder_geometry::vector::{Vector2F, Vector2I}; +use pathfinder_geometry::vector::{Vector2F, vec2f, vec2i}; use pathfinder_gl::{GLDevice, GLVersion}; use pathfinder_renderer::concurrent::rayon::RayonExecutor; use pathfinder_renderer::concurrent::scene_proxy::SceneProxy; @@ -42,6 +42,7 @@ use std::time::Instant; // TODO(pcwalton): See if we can reduce the amount of code by using the canvas shadow feature. const PI_2: f32 = PI * 2.0; +const FRAC_PI_2_3: f32 = PI * 2.0 / 3.0; static PARAGRAPH_TEXT: &'static str = "This is a longer chunk of text. @@ -54,76 +55,67 @@ fn render_demo(canvas: &mut CanvasRenderingContext2D, time: f32, data: &DemoData) { draw_eyes(canvas, - RectF::new(Vector2F::new(window_size.x() - 250.0, 50.0), - Vector2F::new(150.0, 100.0)), + RectF::new(vec2f(window_size.x() - 250.0, 50.0), vec2f(150.0, 100.0)), mouse_position, time); - draw_paragraph(canvas, - RectF::new(Vector2F::new(window_size.x() - 450.0, 50.0), - Vector2F::new(150.0, 100.0))); + draw_paragraph(canvas, RectF::new(vec2f(window_size.x() - 450.0, 50.0), vec2f(150.0, 100.0))); draw_graph(canvas, - RectF::new(window_size.scale_xy(Vector2F::new(0.0, 0.5)), - window_size.scale_xy(Vector2F::new(1.0, 0.5))), + RectF::new(window_size.scale_xy(vec2f(0.0, 0.5)), + window_size.scale_xy(vec2f(1.0, 0.5))), time); draw_color_wheel(canvas, - RectF::new(window_size - Vector2F::splat(300.0), Vector2F::splat(250.0)), + RectF::new(window_size - vec2f(300.0, 300.0), vec2f(250.0, 250.0)), time); - draw_lines(canvas, - RectF::new(Vector2F::new(120.0, window_size.y() - 50.0), - Vector2F::new(600.0, 50.0)), - time); - draw_caps(canvas, RectF::new(Vector2F::new(10.0, 300.0), Vector2F::new(30.0, 40.0))); - draw_clip(canvas, Vector2F::new(50.0, window_size.y() - 80.0), time); + draw_lines(canvas, RectF::new(vec2f(120.0, window_size.y() - 50.0), vec2f(600.0, 50.0)), time); + draw_caps(canvas, RectF::new(vec2f(10.0, 300.0), vec2f(30.0, 40.0))); + draw_clip(canvas, vec2f(50.0, window_size.y() - 80.0), time); canvas.save(); // Draw widgets. - draw_window(canvas, - "Widgets & Stuff", - RectF::new(Vector2F::splat(50.0), Vector2F::new(300.0, 400.0))); - let mut position = Vector2F::new(60.0, 95.0); - draw_search_box(canvas, "Search", RectF::new(position, Vector2F::new(280.0, 25.0))); - position += Vector2F::new(0.0, 40.0); - draw_dropdown(canvas, "Effects", RectF::new(position, Vector2F::new(280.0, 28.0))); - let popup_position = position + Vector2F::new(0.0, 14.0); - position += Vector2F::new(0.0, 45.0); + draw_window(canvas, "Widgets & Stuff", RectF::new(vec2f(50.0, 50.0), vec2f(300.0, 400.0))); + let mut position = vec2f(60.0, 95.0); + draw_search_box(canvas, "Search", RectF::new(position, vec2f(280.0, 25.0))); + position += vec2f(0.0, 40.0); + draw_dropdown(canvas, "Effects", RectF::new(position, vec2f(280.0, 28.0))); + let popup_position = position + vec2f(0.0, 14.0); + position += vec2f(0.0, 45.0); // Draw login form. - draw_label(canvas, "Login", RectF::new(position, Vector2F::new(280.0, 20.0))); - position += Vector2F::new(0.0, 25.0); - draw_text_edit_box(canvas, "E-mail address", RectF::new(position, Vector2F::new(280.0, 28.0))); - position += Vector2F::new(0.0, 35.0); - draw_text_edit_box(canvas, "Password", RectF::new(position, Vector2F::new(280.0, 28.0))); - position += Vector2F::new(0.0, 38.0); - draw_check_box(canvas, "Remember me", RectF::new(position, Vector2F::new(140.0, 28.0))); + draw_label(canvas, "Login", RectF::new(position, vec2f(280.0, 20.0))); + position += vec2f(0.0, 25.0); + draw_text_edit_box(canvas, "E-mail address", RectF::new(position, vec2f(280.0, 28.0))); + position += vec2f(0.0, 35.0); + draw_text_edit_box(canvas, "Password", RectF::new(position, vec2f(280.0, 28.0))); + position += vec2f(0.0, 38.0); + draw_check_box(canvas, "Remember me", RectF::new(position, vec2f(140.0, 28.0))); draw_button(canvas, "Sign In", - RectF::new(position + Vector2F::new(138.0, 0.0), Vector2F::new(140.0, 28.0)), + RectF::new(position + vec2f(138.0, 0.0), vec2f(140.0, 28.0)), ColorU::new(0, 96, 128, 255)); - position += Vector2F::new(0.0, 45.0); + position += vec2f(0.0, 45.0); // Draw slider form. - draw_label(canvas, "Diameter", RectF::new(position, Vector2F::new(280.0, 20.0))); - position += Vector2F::new(0.0, 25.0); - draw_numeric_edit_box(canvas, "123.00", "px", RectF::new(position + Vector2F::new(180.0, 0.0), - Vector2F::new(100.0, 28.0))); - draw_slider(canvas, 0.4, RectF::new(position, Vector2F::new(170.0, 28.0))); - position += Vector2F::new(0.0, 55.0); + draw_label(canvas, "Diameter", RectF::new(position, vec2f(280.0, 20.0))); + position += vec2f(0.0, 25.0); + draw_numeric_edit_box(canvas, "123.00", "px", RectF::new(position + vec2f(180.0, 0.0), + vec2f(100.0, 28.0))); + draw_slider(canvas, 0.4, RectF::new(position, vec2f(170.0, 28.0))); + position += vec2f(0.0, 55.0); // Draw dialog box buttons. draw_button(canvas, "Delete", - RectF::new(position, Vector2F::new(160.0, 28.0)), + RectF::new(position, vec2f(160.0, 28.0)), ColorU::new(128, 16, 8, 255)); draw_button(canvas, "Cancel", - RectF::new(position + Vector2F::new(170.0, 0.0), Vector2F::new(110.0, 28.0)), + RectF::new(position + vec2f(170.0, 0.0), vec2f(110.0, 28.0)), ColorU::transparent_black()); // Draw thumbnails. draw_thumbnails(canvas, - RectF::new(Vector2F::new(365.0, popup_position.y() - 30.0), - Vector2F::new(160.0, 300.0)), + RectF::new(vec2f(365.0, popup_position.y() - 30.0), vec2f(160.0, 300.0)), time, 12, &data.image); @@ -135,29 +127,26 @@ fn draw_eyes(canvas: &mut CanvasRenderingContext2D, rect: RectF, mouse_position: Vector2F, time: f32) { - let eyes_radii = rect.size().scale_xy(Vector2F::new(0.23, 0.5)); + let eyes_radii = rect.size().scale_xy(vec2f(0.23, 0.5)); let eyes_left_position = rect.origin() + eyes_radii; - let eyes_right_position = rect.origin() + Vector2F::new(rect.width() - eyes_radii.x(), - eyes_radii.y()); + let eyes_right_position = rect.origin() + vec2f(rect.width() - eyes_radii.x(), eyes_radii.y()); let eyes_center = f32::min(eyes_radii.x(), eyes_radii.y()) * 0.5; let blink = 1.0 - f32::powf(f32::sin(time * 0.5), 200.0) * 0.8; - let mut gradient = - Gradient::linear(LineSegment2F::new(Vector2F::new(0.0, rect.height() * 0.5), - rect.size().scale_xy(Vector2F::new(0.1, 1.0))) + - rect.origin()); + let mut gradient = Gradient::linear( + LineSegment2F::new(vec2f(0.0, rect.height() * 0.5), + rect.size().scale_xy(vec2f(0.1, 1.0))) + rect.origin()); gradient.add_color_stop(ColorU::new(0, 0, 0, 32), 0.0); gradient.add_color_stop(ColorU::new(0, 0, 0, 16), 1.0); let mut path = Path2D::new(); - path.ellipse(eyes_left_position + Vector2F::new(3.0, 16.0), eyes_radii, 0.0, 0.0, PI_2); - path.ellipse(eyes_right_position + Vector2F::new(3.0, 16.0), eyes_radii, 0.0, 0.0, PI_2); + path.ellipse(eyes_left_position + vec2f(3.0, 16.0), eyes_radii, 0.0, 0.0, PI_2); + path.ellipse(eyes_right_position + vec2f(3.0, 16.0), eyes_radii, 0.0, 0.0, PI_2); canvas.set_fill_style(gradient); canvas.fill_path(path, FillRule::Winding); - let mut gradient = - Gradient::linear(LineSegment2F::new(Vector2F::new(0.0, rect.height() * 0.25), - rect.size().scale_xy(Vector2F::new(0.1, 1.0))) + - rect.origin()); + let mut gradient = Gradient::linear( + LineSegment2F::new(vec2f(0.0, rect.height() * 0.25), + rect.size().scale_xy(vec2f(0.1, 1.0))) + rect.origin()); gradient.add_color_stop(ColorU::new(220, 220, 220, 255), 0.0); gradient.add_color_stop(ColorU::new(128, 128, 128, 255), 1.0); let mut path = Path2D::new(); @@ -171,26 +160,22 @@ fn draw_eyes(canvas: &mut CanvasRenderingContext2D, if distance > 1.0 { delta = delta.scale(1.0 / distance); } - delta = delta.scale_xy(eyes_radii).scale_xy(Vector2F::new(0.4, 0.5)); + delta = delta.scale_xy(eyes_radii).scale_xy(vec2f(0.4, 0.5)); let mut path = Path2D::new(); - path.ellipse(eyes_left_position + - delta + - Vector2F::new(0.0, eyes_radii.y() * 0.25 * (1.0 - blink)), - Vector2F::new(eyes_center, eyes_center * blink), + path.ellipse(eyes_left_position + delta + vec2f(0.0, eyes_radii.y() * 0.25 * (1.0 - blink)), + vec2f(eyes_center, eyes_center * blink), 0.0, 0.0, PI_2); - path.ellipse(eyes_right_position + - delta + - Vector2F::new(0.0, eyes_radii.y() * 0.25 * (1.0 - blink)), - Vector2F::new(eyes_center, eyes_center * blink), + path.ellipse(eyes_right_position + delta + vec2f(0.0, eyes_radii.y() * 0.25 * (1.0 - blink)), + vec2f(eyes_center, eyes_center * blink), 0.0, 0.0, PI_2); canvas.set_fill_style(ColorU::new(32, 32, 32, 255)); canvas.fill_path(path, FillRule::Winding); - let gloss_position = eyes_left_position - eyes_radii.scale_xy(Vector2F::new(0.25, 0.5)); + let gloss_position = eyes_left_position - eyes_radii.scale_xy(vec2f(0.25, 0.5)); let gloss_radii = F32x2::new(0.1, 0.75) * F32x2::splat(eyes_radii.x()); let mut gloss = Gradient::radial(gloss_position, gloss_radii); gloss.add_color_stop(ColorU::new(255, 255, 255, 128), 0.0); @@ -200,7 +185,7 @@ fn draw_eyes(canvas: &mut CanvasRenderingContext2D, path.ellipse(eyes_left_position, eyes_radii, 0.0, 0.0, PI_2); canvas.fill_path(path, FillRule::Winding); - let gloss_position = eyes_right_position - eyes_radii.scale_xy(Vector2F::new(0.25, 0.5)); + let gloss_position = eyes_right_position - eyes_radii.scale_xy(vec2f(0.25, 0.5)); let mut gloss = Gradient::radial(gloss_position, gloss_radii); gloss.add_color_stop(ColorU::new(255, 255, 255, 128), 0.0); gloss.add_color_stop(ColorU::new(255, 255, 255, 0), 1.0); @@ -236,13 +221,13 @@ fn draw_paragraph(canvas: &mut CanvasRenderingContext2D, rect: RectF) { if cursor.x() + space_width + word_width > rect.max_x() { next_line(canvas, &mut cursor, rect); } else if cursor.x() > rect.min_x() { - cursor = cursor + Vector2F::new(space_width, 0.0); + cursor = cursor + vec2f(space_width, 0.0); } canvas.set_fill_style(ColorU::white()); canvas.fill_text(word, cursor); - cursor = cursor + Vector2F::new(word_width, 0.0); + cursor = cursor + vec2f(word_width, 0.0); } } @@ -252,9 +237,9 @@ fn draw_paragraph(canvas: &mut CanvasRenderingContext2D, rect: RectF) { cursor.set_x(rect.min_x()); canvas.set_fill_style(ColorU::new(255, 255, 255, 16)); - canvas.fill_rect(RectF::new(*cursor, Vector2F::new(rect.width(), LINE_HEIGHT))); + canvas.fill_rect(RectF::new(*cursor, vec2f(rect.width(), LINE_HEIGHT))); - *cursor = *cursor + Vector2F::new(0.0, LINE_HEIGHT); + *cursor += vec2f(0.0, LINE_HEIGHT); } } @@ -270,21 +255,20 @@ fn draw_graph(canvas: &mut CanvasRenderingContext2D, rect: RectF, time: f32) { (1.0 + f32::sin(time * 0.345 + f32::cos(time * 0.03) * 0.6)) * 0.5, ]; - let sample_scale = Vector2F::new(sample_spread, rect.height() * 0.8); + let sample_scale = vec2f(sample_spread, rect.height() * 0.8); let sample_points: ArrayVec<[Vector2F; 6]> = samples.iter() .enumerate() .map(|(index, &sample)| { - rect.origin() + Vector2F::new(index as f32, sample).scale_xy(sample_scale) + rect.origin() + vec2f(index as f32, sample).scale_xy(sample_scale) }).collect(); // Draw graph background. - let mut background = Gradient::linear(LineSegment2F::new(Vector2F::default(), - Vector2F::new(0.0, rect.height())) + - rect.origin()); + let mut background = Gradient::linear( + LineSegment2F::new(vec2f(0.0, 0.0), vec2f(0.0, rect.height())) + rect.origin()); background.add_color_stop(ColorU::new(0, 160, 192, 0), 0.0); background.add_color_stop(ColorU::new(0, 160, 192, 64), 1.0); canvas.set_fill_style(background); - let mut path = create_graph_path(&sample_points, sample_spread, Vector2F::default()); + let mut path = create_graph_path(&sample_points, sample_spread, Vector2F::zero()); path.line_to(rect.lower_right()); path.line_to(rect.lower_left()); canvas.fill_path(path, FillRule::Winding); @@ -292,37 +276,36 @@ fn draw_graph(canvas: &mut CanvasRenderingContext2D, rect: RectF, time: f32) { // Draw graph line shadow. canvas.set_stroke_style(ColorU::new(0, 0, 0, 32)); canvas.set_line_width(3.0); - let path = create_graph_path(&sample_points, sample_spread, Vector2F::new(0.0, 2.0)); + let path = create_graph_path(&sample_points, sample_spread, vec2f(0.0, 2.0)); canvas.stroke_path(path); // Draw graph line. canvas.set_stroke_style(ColorU::new(0, 160, 192, 255)); canvas.set_line_width(3.0); - let path = create_graph_path(&sample_points, sample_spread, Vector2F::default()); + let path = create_graph_path(&sample_points, sample_spread, Vector2F::zero()); canvas.stroke_path(path); // Draw sample position highlights. for &sample_point in &sample_points { - let gradient_center = sample_point + Vector2F::new(0.0, 2.0); + let gradient_center = sample_point + vec2f(0.0, 2.0); let mut background = Gradient::radial(gradient_center, F32x2::new(3.0, 8.0)); background.add_color_stop(ColorU::new(0, 0, 0, 32), 0.0); background.add_color_stop(ColorU::transparent_black(), 1.0); canvas.set_fill_style(background); - canvas.fill_rect(RectF::new(sample_point + Vector2F::new(-10.0, -10.0 + 2.0), - Vector2F::splat(20.0))); + canvas.fill_rect(RectF::new(sample_point + vec2f(-10.0, -10.0 + 2.0), vec2f(20.0, 20.0))); } // Draw sample positions. canvas.set_fill_style(ColorU::new(0, 160, 192, 255)); let mut path = Path2D::new(); for &sample_point in &sample_points { - path.ellipse(sample_point, Vector2F::splat(4.0), 0.0, 0.0, PI_2); + path.ellipse(sample_point, vec2f(4.0, 4.0), 0.0, 0.0, PI_2); } canvas.fill_path(path, FillRule::Winding); canvas.set_fill_style(ColorU::new(220, 220, 220, 255)); let mut path = Path2D::new(); for &sample_point in &sample_points { - path.ellipse(sample_point, Vector2F::splat(2.0), 0.0, 0.0, PI_2); + path.ellipse(sample_point, vec2f(2.0, 2.0), 0.0, 0.0, PI_2); } canvas.fill_path(path, FillRule::Winding); @@ -346,8 +329,8 @@ fn draw_color_wheel(canvas: &mut CanvasRenderingContext2D, rect: RectF, time: f3 for segment in 0..6 { let start_angle = segment as f32 / 6.0 * PI_2 - half_arc_len; let end_angle = (segment + 1) as f32 / 6.0 * PI_2 + half_arc_len; - let line = LineSegment2F::new(Vector2F::new(f32::cos(start_angle), f32::sin(start_angle)), - Vector2F::new(f32::cos(end_angle), f32::sin(end_angle))); + let line = LineSegment2F::new(vec2f(f32::cos(start_angle), f32::sin(start_angle)), + vec2f(f32::cos(end_angle), f32::sin(end_angle))); let scale = util::lerp(inner_radius, outer_radius, 0.5); let mut gradient = Gradient::linear(line.scale(scale) + center); let start_color = ColorF::from_hsl(start_angle, 1.0, 0.55).to_u8(); @@ -377,20 +360,18 @@ fn draw_color_wheel(canvas: &mut CanvasRenderingContext2D, rect: RectF, time: f3 canvas.set_stroke_style(ColorU::new(255, 255, 255, 192)); canvas.set_line_width(2.0); - canvas.stroke_rect(RectF::new(Vector2F::new(inner_radius - 1.0, -3.0), - Vector2F::new(outer_radius - inner_radius + 2.0, 6.0))); + canvas.stroke_rect(RectF::new(vec2f(inner_radius - 1.0, -3.0), + vec2f(outer_radius - inner_radius + 2.0, 6.0))); // TODO(pcwalton): Marker fill with box gradient // Draw center triangle. let triangle_radius = inner_radius - 6.0; - let triangle_vertex_a = Vector2F::new(triangle_radius, 0.0); - let triangle_vertex_b = Vector2F::new(f32::cos(PI * 2.0 / 3.0), - f32::sin(PI * 2.0 / 3.0)).scale(triangle_radius); - let triangle_vertex_c = Vector2F::new(f32::cos(PI * -2.0 / 3.0), - f32::sin(PI * -2.0 / 3.0)).scale(triangle_radius); - let mut gradient_0 = Gradient::linear(LineSegment2F::new(triangle_vertex_a, - triangle_vertex_b)); + let triangle_vertex_a = vec2f(triangle_radius, 0.0); + let triangle_vertex_b = vec2f(FRAC_PI_2_3.cos(), FRAC_PI_2_3.sin()).scale(triangle_radius); + let triangle_vertex_c = vec2f((-FRAC_PI_2_3).cos(), + (-FRAC_PI_2_3).sin()).scale(triangle_radius); + let mut gradient_0 = Gradient::linear_from_points(triangle_vertex_a, triangle_vertex_b); gradient_0.add_color_stop(ColorF::from_hsl(hue, 1.0, 0.5).to_u8(), 0.0); gradient_0.add_color_stop(ColorU::white(), 1.0); let mut gradient_1 = @@ -412,25 +393,22 @@ fn draw_color_wheel(canvas: &mut CanvasRenderingContext2D, rect: RectF, time: f3 // Stroke the selection circle on the triangle. let selection_circle_center = - Vector2F::new(f32::cos(PI_2 / 3.0), - f32::sin(PI_2 / 3.0)).scale(triangle_radius) - .scale_xy(Vector2F::new(0.3, 0.4)); + vec2f(FRAC_PI_2_3.cos(), FRAC_PI_2_3.sin()).scale(triangle_radius) + .scale_xy(vec2f(0.3, 0.4)); canvas.set_stroke_style(ColorU::new(255, 255, 255, 192)); canvas.set_line_width(2.0); let mut path = Path2D::new(); - path.ellipse(selection_circle_center, Vector2F::splat(5.0), 0.0, 0.0, PI_2); + path.ellipse(selection_circle_center, vec2f(5.0, 5.0), 0.0, 0.0, PI_2); canvas.stroke_path(path); // Fill the selection circle. - let mut gradient = Gradient::radial(LineSegment2F::new(selection_circle_center, - selection_circle_center), - F32x2::new(7.0, 9.0)); + let mut gradient = Gradient::radial(selection_circle_center, F32x2::new(7.0, 9.0)); gradient.add_color_stop(ColorU::new(0, 0, 0, 64), 0.0); gradient.add_color_stop(ColorU::transparent_black(), 1.0); canvas.set_fill_style(gradient); let mut path = Path2D::new(); - path.rect(RectF::new(selection_circle_center - Vector2F::splat(20.0), Vector2F::splat(40.0))); - path.ellipse(selection_circle_center, Vector2F::splat(7.0), 0.0, 0.0, PI_2); + path.rect(RectF::new(selection_circle_center - vec2f(20.0, 20.0), vec2f(40.0, 40.0))); + path.ellipse(selection_circle_center, vec2f(7.0, 7.0), 0.0, 0.0, PI_2); canvas.fill_path(path, FillRule::EvenOdd); canvas.restore(); @@ -445,12 +423,12 @@ fn draw_lines(canvas: &mut CanvasRenderingContext2D, rect: RectF, time: f32) { canvas.save(); let points = [ - Vector2F::new(-spacing * 0.25 + f32::cos(time * 0.3) * spacing * 0.5, - f32::sin(time * 0.3) * spacing * 0.5), - Vector2F::new(-spacing * 0.25, 0.0), - Vector2F::new( spacing * 0.25, 0.0), - Vector2F::new( spacing * 0.25 + f32::cos(time * -0.3) * spacing * 0.5, - f32::sin(time * -0.3) * spacing * 0.5), + vec2f(-spacing * 0.25 + f32::cos(time * 0.3) * spacing * 0.5, + f32::sin(time * 0.3) * spacing * 0.5), + vec2f(-spacing * 0.25, 0.0), + vec2f( spacing * 0.25, 0.0), + vec2f( spacing * 0.25 + f32::cos(time * -0.3) * spacing * 0.5, + f32::sin(time * -0.3) * spacing * 0.5), ]; for (cap_index, &cap) in [LineCap::Butt, LineCap::Round, LineCap::Square].iter().enumerate() { @@ -458,9 +436,9 @@ fn draw_lines(canvas: &mut CanvasRenderingContext2D, rect: RectF, time: f32) { LineJoin::Miter, LineJoin::Miter /* FIXME(pcwalton): Round crashes */, LineJoin::Bevel ].iter().enumerate() { let origin = rect.origin() + - Vector2F::new(spacing, -spacing).scale(0.5) + - Vector2F::new((cap_index * 3 + join_index) as f32 / 9.0 * rect.width(), 0.0) + - Vector2F::splat(PADDING); + vec2f(spacing, -spacing).scale(0.5) + + vec2f((cap_index * 3 + join_index) as f32 / 9.0 * rect.width(), 0.0) + + vec2f(PADDING, PADDING); canvas.set_line_cap(cap); canvas.set_line_join(join); @@ -492,7 +470,7 @@ fn draw_caps(canvas: &mut CanvasRenderingContext2D, rect: RectF) { canvas.save(); canvas.set_fill_style(ColorU::new(255, 255, 255, 32)); - canvas.fill_rect(rect.dilate(Vector2F::new(LINE_WIDTH / 2.0, 0.0))); + canvas.fill_rect(rect.dilate(vec2f(LINE_WIDTH / 2.0, 0.0))); canvas.fill_rect(rect); canvas.set_line_width(LINE_WIDTH); @@ -501,8 +479,8 @@ fn draw_caps(canvas: &mut CanvasRenderingContext2D, rect: RectF) { canvas.set_stroke_style(ColorU::black()); let offset = cap_index as f32 * 10.0 + 5.0; let mut path = Path2D::new(); - path.move_to(rect.origin() + Vector2F::new(0.0, offset)); - path.line_to(rect.upper_right() + Vector2F::new(0.0, offset)); + path.move_to(rect.origin() + vec2f(0.0, offset)); + path.line_to(rect.upper_right() + vec2f(0.0, offset)); canvas.stroke_path(path); } @@ -518,15 +496,15 @@ fn draw_clip(canvas: &mut CanvasRenderingContext2D, origin: Vector2F, time: f32) canvas.set_current_transform(&transform_a); canvas.set_fill_style(ColorU::new(255, 0, 0, 255)); let mut clip_path = Path2D::new(); - clip_path.rect(RectF::new(Vector2F::splat(-20.0), Vector2F::new(60.0, 40.0))); + clip_path.rect(RectF::new(vec2f(-20.0, -20.0), vec2f(60.0, 40.0))); canvas.fill_path(clip_path.clone(), FillRule::Winding); // Draw second rectangle with no clip. - let transform_b = transform_a * Transform2F::from_translation(Vector2F::new(40.0, 0.0)) * + let transform_b = transform_a * Transform2F::from_translation(vec2f(40.0, 0.0)) * Transform2F::from_rotation(time); canvas.set_current_transform(&transform_b); canvas.set_fill_style(ColorU::new(255, 128, 0, 64)); - let fill_rect = RectF::new(Vector2F::new(-20.0, -10.0), Vector2F::new(60.0, 30.0)); + let fill_rect = RectF::new(vec2f(-20.0, -10.0), vec2f(60.0, 30.0)); canvas.fill_rect(fill_rect); // Draw second rectangle with clip. @@ -546,26 +524,25 @@ fn draw_window(canvas: &mut CanvasRenderingContext2D, title: &str, rect: RectF) // Draw window with shadow. canvas.set_fill_style(ColorU::new(28, 30, 34, 192)); - canvas.set_shadow_offset(Vector2F::new(0.0, 2.0)); + canvas.set_shadow_offset(vec2f(0.0, 2.0)); canvas.set_shadow_blur(10.0); canvas.set_shadow_color(ColorU::new(0, 0, 0, 128)); canvas.fill_path(create_rounded_rect_path(rect, CORNER_RADIUS), FillRule::Winding); canvas.set_shadow_color(ColorU::transparent_black()); // Header. - let mut header_gradient = Gradient::linear(LineSegment2F::new(Vector2F::default(), - Vector2F::new(0.0, 15.0)) + - rect.origin()); + let mut header_gradient = + Gradient::linear(LineSegment2F::new(Vector2F::zero(), vec2f(0.0, 15.0)) + rect.origin()); header_gradient.add_color_stop(ColorU::new(0, 0, 0, 128), 0.0); header_gradient.add_color_stop(ColorU::transparent_black(), 1.0); canvas.set_fill_style(header_gradient); - canvas.fill_path(create_rounded_rect_path(RectF::new(rect.origin() + Vector2F::splat(1.0), - Vector2F::new(rect.width() - 2.0, 30.0)), + canvas.fill_path(create_rounded_rect_path(RectF::new(rect.origin() + vec2f(1.0, 1.0), + vec2f(rect.width() - 2.0, 30.0)), CORNER_RADIUS - 1.0), FillRule::Winding); let mut path = Path2D::new(); - path.move_to(rect.origin() + Vector2F::new(0.5, 30.5)); - path.line_to(rect.origin() + Vector2F::new(rect.width() - 0.5, 30.5)); + path.move_to(rect.origin() + vec2f(0.5, 30.5)); + path.line_to(rect.origin() + vec2f(rect.width() - 0.5, 30.5)); canvas.set_stroke_style(ColorU::new(0, 0, 0, 32)); canvas.stroke_path(path); @@ -575,9 +552,9 @@ fn draw_window(canvas: &mut CanvasRenderingContext2D, title: &str, rect: RectF) canvas.set_text_baseline(TextBaseline::Middle); canvas.set_fill_style(ColorU::new(220, 220, 220, 160)); canvas.set_shadow_blur(2.0); - canvas.set_shadow_offset(Vector2F::new(0.0, 1.0)); + canvas.set_shadow_offset(vec2f(0.0, 1.0)); canvas.set_shadow_color(ColorU::new(0, 0, 0, 128)); - canvas.fill_text(title, rect.origin() + Vector2F::new(rect.width() * 0.5, 16.0)); + canvas.fill_text(title, rect.origin() + vec2f(rect.width() * 0.5, 16.0)); canvas.restore(); } @@ -588,7 +565,7 @@ fn draw_search_box(canvas: &mut CanvasRenderingContext2D, text: &str, rect: Rect fill_path_with_box_gradient(canvas, create_rounded_rect_path(rect, corner_radius), FillRule::Winding, - rect + Vector2F::new(0.0, 1.5), + rect + vec2f(0.0, 1.5), rect.height() * 0.5, 5.0, ColorU::new(0, 0, 0, 16), @@ -598,8 +575,7 @@ fn draw_search_box(canvas: &mut CanvasRenderingContext2D, text: &str, rect: Rect canvas.set_fill_style(ColorU::new(255, 255, 255, 64)); canvas.set_text_align(TextAlign::Left); canvas.set_text_baseline(TextBaseline::Middle); - canvas.fill_text(text, - rect.origin() + Vector2F::splat(rect.height()) * Vector2F::new(1.05, 0.5)); + canvas.fill_text(text, rect.origin() + Vector2F::splat(rect.height()) * vec2f(1.05, 0.5)); } fn draw_dropdown(canvas: &mut CanvasRenderingContext2D, text: &str, rect: RectF) { @@ -609,20 +585,18 @@ fn draw_dropdown(canvas: &mut CanvasRenderingContext2D, text: &str, rect: RectF) background_gradient.add_color_stop(ColorU::new(255, 255, 255, 16), 0.0); background_gradient.add_color_stop(ColorU::new(0, 0, 0, 16), 1.0); canvas.set_fill_style(background_gradient); - canvas.fill_path(create_rounded_rect_path(rect.contract(Vector2F::splat(1.0)), - CORNER_RADIUS - 1.0), + canvas.fill_path(create_rounded_rect_path(rect.contract(vec2f(1.0, 1.0)), CORNER_RADIUS - 1.0), FillRule::Winding); canvas.set_stroke_style(ColorU::new(0, 0, 0, 48)); - canvas.stroke_path(create_rounded_rect_path(rect.contract(Vector2F::splat(0.5)), + canvas.stroke_path(create_rounded_rect_path(rect.contract(vec2f(0.5, 0.5)), CORNER_RADIUS - 0.5)); canvas.set_font_size(17.0); canvas.set_fill_style(ColorU::new(255, 255, 255, 160)); canvas.set_text_align(TextAlign::Left); canvas.set_text_baseline(TextBaseline::Middle); - canvas.fill_text(text, - rect.origin() + Vector2F::splat(rect.height()) * Vector2F::new(0.3, 0.5)); + canvas.fill_text(text, rect.origin() + Vector2F::splat(rect.height()) * vec2f(0.3, 0.5)); } fn draw_label(canvas: &mut CanvasRenderingContext2D, text: &str, rect: RectF) { @@ -630,24 +604,24 @@ fn draw_label(canvas: &mut CanvasRenderingContext2D, text: &str, rect: RectF) { canvas.set_fill_style(ColorU::new(255, 255, 255, 128)); canvas.set_text_align(TextAlign::Left); canvas.set_text_baseline(TextBaseline::Middle); - canvas.fill_text(text, rect.origin() + Vector2F::new(0.0, rect.height() * 0.5)); + canvas.fill_text(text, rect.origin() + vec2f(0.0, rect.height() * 0.5)); } fn draw_edit_box(canvas: &mut CanvasRenderingContext2D, rect: RectF) { const CORNER_RADIUS: f32 = 4.0; fill_path_with_box_gradient(canvas, - create_rounded_rect_path(rect.contract(Vector2F::splat(1.0)), + create_rounded_rect_path(rect.contract(vec2f(1.0, 1.0)), CORNER_RADIUS - 1.0), FillRule::Winding, - rect.contract(Vector2F::splat(1.0)) + Vector2F::new(0.0, 1.5), + rect.contract(vec2f(1.0, 1.0)) + vec2f(0.0, 1.5), 3.0, 4.0, ColorU::new(255, 255, 255, 32), ColorU::new(32, 32, 32, 32)); canvas.set_stroke_style(ColorU::new(0, 0, 0, 48)); - canvas.stroke_path(create_rounded_rect_path(rect.contract(Vector2F::splat(0.5)), + canvas.stroke_path(create_rounded_rect_path(rect.contract(vec2f(0.5, 0.5)), CORNER_RADIUS - 0.5)); } @@ -658,8 +632,7 @@ fn draw_text_edit_box(canvas: &mut CanvasRenderingContext2D, text: &str, rect: R canvas.set_fill_style(ColorU::new(255, 255, 255, 64)); canvas.set_text_align(TextAlign::Left); canvas.set_text_baseline(TextBaseline::Middle); - canvas.fill_text(text, - rect.origin() + Vector2F::splat(rect.height()) * Vector2F::new(0.3, 0.5)); + canvas.fill_text(text, rect.origin() + Vector2F::splat(rect.height()) * vec2f(0.3, 0.5)); } fn draw_numeric_edit_box(canvas: &mut CanvasRenderingContext2D, @@ -674,17 +647,14 @@ fn draw_numeric_edit_box(canvas: &mut CanvasRenderingContext2D, canvas.set_fill_style(ColorU::new(255, 255, 255, 64)); canvas.set_text_align(TextAlign::Right); canvas.set_text_baseline(TextBaseline::Middle); - canvas.fill_text( - unit, - rect.upper_right() + Vector2F::new(-0.3, 0.5) * Vector2F::splat(rect.height())); + canvas.fill_text(unit, rect.upper_right() + vec2f(-0.3, 0.5) * Vector2F::splat(rect.height())); canvas.set_font_size(17.0); canvas.set_fill_style(ColorU::new(255, 255, 255, 128)); canvas.set_text_align(TextAlign::Right); canvas.set_text_baseline(TextBaseline::Middle); - canvas.fill_text(value, - rect.upper_right() + Vector2F::new(-unit_width - rect.height() * 0.5, - rect.height() * 0.5)); + canvas.fill_text(value, rect.upper_right() + vec2f(-unit_width - rect.height() * 0.5, + rect.height() * 0.5)); } fn draw_check_box(canvas: &mut CanvasRenderingContext2D, text: &str, rect: RectF) { @@ -694,15 +664,14 @@ fn draw_check_box(canvas: &mut CanvasRenderingContext2D, text: &str, rect: RectF canvas.set_fill_style(ColorU::new(255, 255, 255, 160)); canvas.set_text_align(TextAlign::Left); canvas.set_text_baseline(TextBaseline::Middle); - canvas.fill_text(text, rect.origin() + Vector2F::new(28.0, rect.height() * 0.5)); + canvas.fill_text(text, rect.origin() + vec2f(28.0, rect.height() * 0.5)); - let check_box_rect = - RectF::new(Vector2F::new(rect.origin_x(), rect.center().y().floor() - 9.0), - Vector2F::splat(20.0)).contract(Vector2F::splat(1.0)); + let check_box_rect = RectF::new(vec2f(rect.origin_x(), rect.center().y().floor() - 9.0), + vec2f(20.0, 20.0)).contract(Vector2F::splat(1.0)); fill_path_with_box_gradient(canvas, create_rounded_rect_path(check_box_rect, CORNER_RADIUS), FillRule::Winding, - check_box_rect + Vector2F::new(0.0, 1.0), + check_box_rect + vec2f(0.0, 1.0), CORNER_RADIUS, 3.0, ColorU::new(0, 0, 0, 32), @@ -714,7 +683,7 @@ fn draw_check_box(canvas: &mut CanvasRenderingContext2D, text: &str, rect: RectF fn draw_button(canvas: &mut CanvasRenderingContext2D, text: &str, rect: RectF, color: ColorU) { const CORNER_RADIUS: f32 = 4.0; - let path = create_rounded_rect_path(rect.contract(Vector2F::splat(1.0)), CORNER_RADIUS - 1.0); + let path = create_rounded_rect_path(rect.contract(vec2f(1.0, 1.0)), CORNER_RADIUS - 1.0); if color != ColorU::transparent_black() { canvas.set_fill_style(color); canvas.fill_path(path.clone(), FillRule::Winding); @@ -727,7 +696,7 @@ fn draw_button(canvas: &mut CanvasRenderingContext2D, text: &str, rect: RectF, c canvas.fill_path(path, FillRule::Winding); canvas.set_stroke_style(ColorU::new(0, 0, 0, 48)); - canvas.stroke_path(create_rounded_rect_path(rect.contract(Vector2F::splat(0.5)), + canvas.stroke_path(create_rounded_rect_path(rect.contract(vec2f(0.5, 0.5)), CORNER_RADIUS - 0.5)); // TODO(pcwalton): Bold font. @@ -737,11 +706,11 @@ fn draw_button(canvas: &mut CanvasRenderingContext2D, text: &str, rect: RectF, c let icon_width = 0.0; canvas.set_font_size(17.0); - let text_origin = rect.center() + Vector2F::new(icon_width * 0.25 - text_width * 0.5, 0.0); + let text_origin = rect.center() + vec2f(icon_width * 0.25 - text_width * 0.5, 0.0); canvas.set_fill_style(ColorU::new(0, 0, 0, 160)); canvas.set_text_align(TextAlign::Left); canvas.set_text_baseline(TextBaseline::Middle); - canvas.fill_text(text, text_origin - Vector2F::new(0.0, 1.0)); + canvas.fill_text(text, text_origin - vec2f(0.0, 1.0)); canvas.set_fill_style(ColorU::new(255, 255, 255, 160)); canvas.fill_text(text, text_origin); } @@ -753,36 +722,34 @@ fn draw_slider(canvas: &mut CanvasRenderingContext2D, value: f32, rect: RectF) { // Draw track. // TODO(pcwalton): Box gradient. - let track_rect = RectF::new(Vector2F::new(rect.origin_x(), center_y - 2.0), - Vector2F::new(rect.width(), 4.0)); + let track_rect = RectF::new(vec2f(rect.origin_x(), center_y - 2.0), vec2f(rect.width(), 4.0)); fill_path_with_box_gradient(canvas, create_rounded_rect_path(track_rect, 2.0), FillRule::Winding, - track_rect + Vector2F::new(0.0, 1.0), + track_rect + vec2f(0.0, 1.0), 2.0, 2.0, ColorU::new(0, 0, 0, 32), ColorU::new(0, 0, 0, 128)); // Draw knob shadow. - let knob_position = Vector2F::new(rect.origin_x() + (value * rect.width()).floor(), center_y); + let knob_position = vec2f(rect.origin_x() + (value * rect.width()).floor(), center_y); let mut background_gradient = - Gradient::radial(LineSegment2F::new(knob_position, - knob_position) + Vector2F::new(0.0, 1.0), + Gradient::radial(LineSegment2F::new(knob_position, knob_position) + vec2f(0.0, 1.0), F32x2::splat(knob_radius) * F32x2::new(-3.0, 3.0)); background_gradient.add_color_stop(ColorU::new(0, 0, 0, 64), 0.0); background_gradient.add_color_stop(ColorU::transparent_black(), 1.0); canvas.set_fill_style(background_gradient); let mut path = Path2D::new(); path.rect(RectF::new(knob_position, - Vector2F::default()).dilate(Vector2F::splat(knob_radius + 5.0))); + Vector2F::zero()).dilate(Vector2F::splat(knob_radius + 5.0))); path.ellipse(knob_position, Vector2F::splat(knob_radius), 0.0, 0.0, PI_2); canvas.fill_path(path, FillRule::EvenOdd); // Fill knob. let mut background_gradient = - Gradient::linear_from_points(knob_position - Vector2F::new(0.0, knob_radius), - knob_position + Vector2F::new(0.0, knob_radius)); + Gradient::linear_from_points(knob_position - vec2f(0.0, knob_radius), + knob_position + vec2f(0.0, knob_radius)); background_gradient.add_color_stop(ColorU::new(255, 255, 255, 16), 0.0); background_gradient.add_color_stop(ColorU::new(0, 0, 0, 16), 1.0); let mut path = Path2D::new(); @@ -821,12 +788,11 @@ fn draw_thumbnails(canvas: &mut CanvasRenderingContext2D, // Draw drop shadow. let mut path = create_rounded_rect_path(rect, CORNER_RADIUS); - path.rect(RectF::new(rect.origin() - Vector2F::splat(10.0), - rect.size() + Vector2F::new(20.0, 30.0))); + path.rect(RectF::new(rect.origin() - vec2f(10.0, 10.0), rect.size() + vec2f(20.0, 30.0))); fill_path_with_box_gradient(canvas, path, FillRule::EvenOdd, - rect + Vector2F::new(0.0, 4.0), + rect + vec2f(0.0, 4.0), CORNER_RADIUS * 2.0, 20.0, ColorU::new(0, 0, 0, 128), @@ -834,9 +800,9 @@ fn draw_thumbnails(canvas: &mut CanvasRenderingContext2D, // Draw window. let mut path = create_rounded_rect_path(rect, CORNER_RADIUS); - path.move_to(rect.origin() + Vector2F::new(-10.0, ARROW_Y_POSITION)); - path.line_to(rect.origin() + Vector2F::new(1.0, ARROW_Y_POSITION - 11.0)); - path.line_to(rect.origin() + Vector2F::new(1.0, ARROW_Y_POSITION + 11.0)); + path.move_to(rect.origin() + vec2f(-10.0, ARROW_Y_POSITION)); + path.line_to(rect.origin() + vec2f(1.0, ARROW_Y_POSITION - 11.0)); + path.line_to(rect.origin() + vec2f(1.0, ARROW_Y_POSITION + 11.0)); canvas.set_fill_style(ColorU::new(200, 200, 200, 255)); canvas.fill_path(path, FillRule::Winding); @@ -847,12 +813,12 @@ fn draw_thumbnails(canvas: &mut CanvasRenderingContext2D, clip_path.rect(rect); canvas.clip_path(clip_path, FillRule::Winding); canvas.set_current_transform(&Transform2F::from_translation( - Vector2F::new(0.0, -scroll_y * (stack_height - rect.height())))); + vec2f(0.0, -scroll_y * (stack_height - rect.height())))); for image_index in 0..image_count { - let image_origin = rect.origin() + Vector2F::splat(10.0) + - Vector2I::new(image_index as i32 % 2, - image_index as i32 / 2).to_f32().scale(THUMB_HEIGHT + 10.0); + let image_origin = rect.origin() + vec2f(10.0, 10.0) + + vec2i(image_index as i32 % 2, image_index as i32 / 2).to_f32() + .scale(THUMB_HEIGHT + 10.0); let image_rect = RectF::new(image_origin, Vector2F::splat(THUMB_HEIGHT)); let image_y = image_index as f32 * image_y_scale; @@ -863,10 +829,10 @@ fn draw_thumbnails(canvas: &mut CanvasRenderingContext2D, let image_path = create_rounded_rect_path(image_rect, 5.0); let pattern_transform = Transform2F::from_translation( - image_rect.origin() - - Vector2I::new((image_index % IMAGES_ACROSS) as i32, - (image_index / IMAGES_ACROSS) as i32).to_f32().scale(THUMB_HEIGHT)) * - Transform2F::from_scale(Vector2F::splat(0.5)); + image_rect.origin() - vec2i( + (image_index % IMAGES_ACROSS) as i32, + (image_index / IMAGES_ACROSS) as i32).to_f32().scale(THUMB_HEIGHT)) * + Transform2F::from_scale(vec2f(0.5, 0.5)); let pattern = Pattern::new(PatternSource::Image((*image).clone()), pattern_transform, PatternFlags::empty()); @@ -874,14 +840,14 @@ fn draw_thumbnails(canvas: &mut CanvasRenderingContext2D, canvas.fill_path(image_path, FillRule::Winding); let mut shadow_path = create_rounded_rect_path(image_rect, 6.0); - shadow_path.rect(image_rect.dilate(Vector2F::splat(5.0))); + shadow_path.rect(image_rect.dilate(vec2f(5.0, 5.0))); // TODO(pcwalton): Union clip paths. /* fill_path_with_box_gradient( canvas, shadow_path, FillRule::EvenOdd, - image_rect.dilate(Vector2F::splat(1.0)) + Vector2F::new(0.0, 1.0), + image_rect.dilate(Vector2F::splat(1.0)) + vec2f(0.0, 1.0), 5.0, 3.0, ColorU::new(0, 0, 0, 128), @@ -897,43 +863,40 @@ fn draw_thumbnails(canvas: &mut CanvasRenderingContext2D, // Draw fade-away gradients. let mut fade_gradient = Gradient::linear_from_points(rect.origin(), - rect.origin() + Vector2F::new(0.0, 6.0)); + rect.origin() + vec2f(0.0, 6.0)); fade_gradient.add_color_stop(ColorU::new(200, 200, 200, 255), 0.0); fade_gradient.add_color_stop(ColorU::new(200, 200, 200, 0), 1.0); canvas.set_fill_style(fade_gradient); - canvas.fill_rect(RectF::new(rect.origin() + Vector2F::new(4.0, 0.0), - Vector2F::new(rect.width() - 8.0, 6.0))); + canvas.fill_rect(RectF::new(rect.origin() + vec2f(4.0, 0.0), vec2f(rect.width() - 8.0, 6.0))); - let mut fade_gradient = - Gradient::linear(LineSegment2F::new(rect.lower_left(), - rect.lower_left() - Vector2F::new(0.0, 6.0))); + let mut fade_gradient = Gradient::linear_from_points(rect.lower_left(), + rect.lower_left() - vec2f(0.0, 6.0)); fade_gradient.add_color_stop(ColorU::new(200, 200, 200, 255), 0.0); fade_gradient.add_color_stop(ColorU::new(200, 200, 200, 0), 1.0); canvas.set_fill_style(fade_gradient); - canvas.fill_rect(RectF::new(rect.lower_left() + Vector2F::new(4.0, -6.0), - Vector2F::new(rect.width() - 8.0, 6.0))); + canvas.fill_rect(RectF::new(rect.lower_left() + vec2f(4.0, -6.0), + vec2f(rect.width() - 8.0, 6.0))); // Draw scroll bar. - let scroll_bar_rect = RectF::new(rect.upper_right() + Vector2F::new(-12.0, 4.0), - Vector2F::new(8.0, rect.height() - 8.0)); + let scroll_bar_rect = RectF::new(rect.upper_right() + vec2f(-12.0, 4.0), + vec2f(8.0, rect.height() - 8.0)); fill_path_with_box_gradient(canvas, create_rounded_rect_path(scroll_bar_rect, CORNER_RADIUS), FillRule::Winding, - scroll_bar_rect + Vector2F::new(0.0, 1.0), + scroll_bar_rect + vec2f(0.0, 1.0), CORNER_RADIUS, 4.0, ColorU::new(0, 0, 0, 32), ColorU::new(0, 0, 0, 92)); - let knob_rect = - RectF::new(rect.upper_right() + - Vector2F::new(-11.0, 5.0 + (rect.height() - 8.0 - scroll_height) * scroll_y), - Vector2F::new(6.0, scroll_height - 2.0)); + let knob_rect = RectF::new( + rect.upper_right() + vec2f(-11.0, 5.0 + (rect.height() - 8.0 - scroll_height) * scroll_y), + vec2f(6.0, scroll_height - 2.0)); fill_path_with_box_gradient(canvas, create_rounded_rect_path(knob_rect, 2.0), FillRule::Winding, - knob_rect.dilate(Vector2F::splat(2.0)) + Vector2F::new(0.0, 1.0), + knob_rect.dilate(vec2f(2.0, 2.0)) + vec2f(0.0, 1.0), 3.0, 4.0, ColorU::new(220, 220, 220, 255), @@ -955,8 +918,8 @@ fn draw_spinner(canvas: &mut CanvasRenderingContext2D, center: Vector2F, radius: path.close_path(); set_linear_gradient_fill_style( canvas, - center + Vector2F::new(outer_radius.cos(), outer_radius.sin()).scale(average_radius), - center + Vector2F::new(inner_radius.cos(), inner_radius.sin()).scale(average_radius), + center + vec2f(outer_radius.cos(), outer_radius.sin()).scale(average_radius), + center + vec2f(inner_radius.cos(), inner_radius.sin()).scale(average_radius), ColorU::transparent_black(), ColorU::new(0, 0, 0, 128)); canvas.fill_path(path, FillRule::Winding); @@ -974,7 +937,7 @@ fn fill_path_with_box_gradient(canvas: &mut CanvasRenderingContext2D, outer_color: ColorU) { // TODO(pcwalton): Fill the corners with radial gradients. - let window_rect = RectF::new(Vector2F::default(), Vector2F::new(800.0, 600.0)); + let window_rect = RectF::new(Vector2F::zero(), vec2f(800.0, 600.0)); let inner_rect = rect.contract(Vector2F::splat(blur_radius)); let outer_rect = rect.dilate(Vector2F::splat(blur_radius)); @@ -994,7 +957,7 @@ fn fill_path_with_box_gradient(canvas: &mut CanvasRenderingContext2D, section.close_path(); set_linear_gradient_fill_style(canvas, outer_rect.origin(), - Vector2F::new(inner_rect.min_x(), outer_rect.min_y()), + vec2f(inner_rect.min_x(), outer_rect.min_y()), outer_color, inner_color); canvas.fill_path(section, FillRule::Winding); @@ -1011,7 +974,7 @@ fn fill_path_with_box_gradient(canvas: &mut CanvasRenderingContext2D, section.close_path(); set_linear_gradient_fill_style(canvas, outer_rect.origin(), - Vector2F::new(outer_rect.min_x(), inner_rect.min_y()), + vec2f(outer_rect.min_x(), inner_rect.min_y()), outer_color, inner_color); canvas.fill_path(section, FillRule::Winding); @@ -1028,7 +991,7 @@ fn fill_path_with_box_gradient(canvas: &mut CanvasRenderingContext2D, section.close_path(); set_linear_gradient_fill_style(canvas, outer_rect.upper_right(), - Vector2F::new(inner_rect.max_x(), outer_rect.min_y()), + vec2f(inner_rect.max_x(), outer_rect.min_y()), outer_color, inner_color); canvas.fill_path(section, FillRule::Winding); @@ -1045,7 +1008,7 @@ fn fill_path_with_box_gradient(canvas: &mut CanvasRenderingContext2D, section.close_path(); set_linear_gradient_fill_style(canvas, outer_rect.lower_left(), - Vector2F::new(outer_rect.min_x(), inner_rect.max_y()), + vec2f(outer_rect.min_x(), inner_rect.max_y()), outer_color, inner_color); canvas.fill_path(section, FillRule::Winding); @@ -1066,10 +1029,10 @@ fn set_linear_gradient_fill_style(canvas: &mut CanvasRenderingContext2D, fn create_graph_path(sample_points: &[Vector2F], sample_spread: f32, offset: Vector2F) -> Path2D { let mut path = Path2D::new(); - path.move_to(sample_points[0] + Vector2F::new(0.0, 2.0)); + path.move_to(sample_points[0] + vec2f(0.0, 2.0)); for pair in sample_points.windows(2) { - path.bezier_curve_to(pair[0] + offset + Vector2F::new(sample_spread * 0.5, 0.0), - pair[1] + offset - Vector2F::new(sample_spread * 0.5, 0.0), + path.bezier_curve_to(pair[0] + offset + vec2f(sample_spread * 0.5, 0.0), + pair[1] + offset - vec2f(sample_spread * 0.5, 0.0), pair[1] + offset); } path @@ -1077,11 +1040,11 @@ fn create_graph_path(sample_points: &[Vector2F], sample_spread: f32, offset: Vec fn create_rounded_rect_path(rect: RectF, radius: f32) -> Path2D { let mut path = Path2D::new(); - path.move_to(rect.origin() + Vector2F::new(radius, 0.0)); - path.arc_to(rect.upper_right(), rect.upper_right() + Vector2F::new(0.0, radius), radius); - path.arc_to(rect.lower_right(), rect.lower_right() + Vector2F::new(-radius, 0.0), radius); - path.arc_to(rect.lower_left(), rect.lower_left() + Vector2F::new(0.0, -radius), radius); - path.arc_to(rect.origin(), rect.origin() + Vector2F::new(radius, 0.0), radius); + path.move_to(rect.origin() + vec2f(radius, 0.0)); + path.arc_to(rect.upper_right(), rect.upper_right() + vec2f(0.0, radius), radius); + path.arc_to(rect.lower_right(), rect.lower_right() + vec2f(-radius, 0.0), radius); + path.arc_to(rect.lower_left(), rect.lower_left() + vec2f(0.0, -radius), radius); + path.arc_to(rect.origin(), rect.origin() + vec2f(radius, 0.0), radius); path.close_path(); path } @@ -1110,7 +1073,7 @@ fn main() { gl_attributes.set_context_version(3, 3); // Open a window. - let window_size = Vector2I::new(800, 600); + let window_size = vec2i(800, 600); let window = video.window("NanoVG example port", window_size.x() as u32, window_size.y() as u32) .opengl() @@ -1136,7 +1099,7 @@ fn main() { // Initialize state. let mut event_pump = sdl_context.event_pump().unwrap(); - let mut mouse_position = Vector2F::default(); + let mut mouse_position = Vector2F::zero(); let start_time = Instant::now(); let font_context = CanvasFontContext::from_system_source(); @@ -1157,9 +1120,7 @@ fn main() { for event in event_pump.poll_iter() { match event { Event::Quit {..} | Event::KeyDown { keycode: Some(Keycode::Escape), .. } => return, - Event::MouseMotion { x, y, .. } => { - mouse_position = Vector2I::new(x, y).to_f32(); - } + Event::MouseMotion { x, y, .. } => mouse_position = vec2i(x, y).to_f32(), _ => {} } } diff --git a/examples/canvas_text/src/main.rs b/examples/canvas_text/src/main.rs index dd48d3ab..144ac3aa 100644 --- a/examples/canvas_text/src/main.rs +++ b/examples/canvas_text/src/main.rs @@ -11,7 +11,7 @@ use font_kit::handle::Handle; use pathfinder_canvas::{CanvasFontContext, CanvasRenderingContext2D, TextAlign}; use pathfinder_color::ColorF; -use pathfinder_geometry::vector::{Vector2F, Vector2I}; +use pathfinder_geometry::vector::{Vector2F, Vector2I, vec2f, vec2i}; use pathfinder_gl::{GLDevice, GLVersion}; use pathfinder_renderer::concurrent::rayon::RayonExecutor; use pathfinder_renderer::concurrent::scene_proxy::SceneProxy; @@ -37,7 +37,7 @@ fn main() { gl_attributes.set_context_version(3, 3); // Open a window. - let window_size = Vector2I::new(640, 480); + let window_size = vec2i(640, 480); let window = video.window("Text example", window_size.x() as u32, window_size.y() as u32) .opengl() .build() @@ -66,9 +66,9 @@ fn main() { // Draw the text. canvas.set_font_by_postscript_name("Overpass-Regular"); canvas.set_font_size(32.0); - canvas.fill_text("Hello Pathfinder!", Vector2F::new(32.0, 48.0)); + canvas.fill_text("Hello Pathfinder!", vec2f(32.0, 48.0)); canvas.set_text_align(TextAlign::Right); - canvas.stroke_text("Goodbye Pathfinder!", Vector2F::new(608.0, 464.0)); + canvas.stroke_text("Goodbye Pathfinder!", vec2f(608.0, 464.0)); // Render the canvas to screen. let scene = SceneProxy::from_scene(canvas.into_scene(), RayonExecutor); diff --git a/examples/swf_basic/src/main.rs b/examples/swf_basic/src/main.rs index 2d6ff01f..4ae8f31d 100644 --- a/examples/swf_basic/src/main.rs +++ b/examples/swf_basic/src/main.rs @@ -8,8 +8,9 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -use pathfinder_geometry::vector::{Vector2F, Vector2I}; use pathfinder_geometry::rect::RectF; +use pathfinder_geometry::transform2d::Transform2F; +use pathfinder_geometry::vector::{Vector2F, vec2f, vec2i}; use pathfinder_gl::{GLDevice, GLVersion}; use pathfinder_renderer::concurrent::rayon::RayonExecutor; use pathfinder_renderer::concurrent::scene_proxy::SceneProxy; @@ -25,7 +26,6 @@ use pathfinder_renderer::scene::Scene; use pathfinder_swf::{draw_paths_into_scene, process_swf_tags}; use std::env; use std::fs::read; -use pathfinder_geometry::transform2d::Transform2F; fn main() { let resource_loader = FilesystemResourceLoader::locate(); @@ -64,7 +64,8 @@ fn main() { swf_bytes = Vec::from(&default_tiger[..]); } - let (_, movie): (_, swf_types::Movie) = swf_parser::streaming::movie::parse_movie(&swf_bytes[..]).unwrap(); + let (_, movie): (_, swf_types::Movie) = + swf_parser::streaming::movie::parse_movie(&swf_bytes[..]).unwrap(); // Set up SDL2. let sdl_context = sdl2::init().unwrap(); @@ -81,17 +82,14 @@ fn main() { let (library, stage) = process_swf_tags(&movie); // Open a window. - let window_size = Vector2I::new(stage.width(), stage.height()); + let window_size = vec2i(stage.width(), stage.height()); let window = video.window("Minimal example", window_size.x() as u32, window_size.y() as u32) .opengl() .allow_highdpi() .build() .unwrap(); - let pixel_size = Vector2I::new( - window.drawable_size().0 as i32, - window.drawable_size().1 as i32 - ); + let pixel_size = vec2i(window.drawable_size().0 as i32, window.drawable_size().1 as i32); let device_pixel_ratio = pixel_size.x() as f32 / window_size.x() as f32; // Create the GL context, and make it current. @@ -109,19 +107,15 @@ fn main() { // Clear to swf stage background color. let mut scene = Scene::new(); scene.set_view_box(RectF::new( - Vector2F::default(), - Vector2F::new( - stage.width() as f32 * device_pixel_ratio, - stage.height() as f32 * device_pixel_ratio) + Vector2F::zero(), + vec2f(stage.width() as f32, stage.height() as f32).scale(device_pixel_ratio) )); draw_paths_into_scene(&library, &mut scene); // Render the canvas to screen. let scene = SceneProxy::from_scene(scene, RayonExecutor); let mut build_options = BuildOptions::default(); - let scale_transform = Transform2F::from_scale( - Vector2F::new(device_pixel_ratio, device_pixel_ratio) - ); + let scale_transform = Transform2F::from_scale(Vector2F::splat(device_pixel_ratio)); build_options.transform = RenderTransform::Transform2D(scale_transform); scene.build_and_render(&mut renderer, build_options); diff --git a/export/src/lib.rs b/export/src/lib.rs index 0ab54d49..4bbb671a 100644 --- a/export/src/lib.rs +++ b/export/src/lib.rs @@ -12,7 +12,7 @@ use pathfinder_content::outline::ContourIterFlags; use pathfinder_content::segment::SegmentKind; use pathfinder_renderer::paint::Paint; use pathfinder_renderer::scene::Scene; -use pathfinder_geometry::vector::Vector2F; +use pathfinder_geometry::vector::{Vector2F, vec2f}; use std::fmt; use std::io::{self, Write}; @@ -73,7 +73,7 @@ fn export_pdf(scene: &Scene, writer: &mut W) -> io::Result<()> { let height = view_box.size().y(); let tr = |v: Vector2F| -> Vector2F { let r = v - view_box.origin(); - Vector2F::new(r.x(), height - r.y()) + vec2f(r.x(), height - r.y()) }; for (paint, outline, _) in scene.paths() { diff --git a/geometry/src/transform2d.rs b/geometry/src/transform2d.rs index 7ef9a18f..daaa4a6b 100644 --- a/geometry/src/transform2d.rs +++ b/geometry/src/transform2d.rs @@ -14,7 +14,7 @@ use crate::line_segment::LineSegment2F; use crate::rect::RectF; use crate::transform3d::Transform4F; use crate::unit_vector::UnitVector; -use crate::vector::Vector2F; +use crate::vector::{Vector2F, vec2f}; use pathfinder_simd::default::F32x4; use std::ops::{Mul, MulAssign, Sub}; @@ -25,7 +25,7 @@ pub struct Matrix2x2F(pub F32x4); impl Default for Matrix2x2F { #[inline] fn default() -> Matrix2x2F { - Self::from_scale(Vector2F::splat(1.0)) + Self::from_scale(vec2f(1.0, 1.0)) } } @@ -131,7 +131,7 @@ pub struct Transform2F { impl Default for Transform2F { #[inline] fn default() -> Transform2F { - Self::from_scale(Vector2F::splat(1.0)) + Self::from_scale(vec2f(1.0, 1.0)) } } @@ -140,7 +140,7 @@ impl Transform2F { pub fn from_scale(scale: Vector2F) -> Transform2F { Transform2F { matrix: Matrix2x2F::from_scale(scale), - vector: Vector2F::default(), + vector: Vector2F::zero(), } } @@ -153,7 +153,7 @@ impl Transform2F { pub fn from_rotation(theta: f32) -> Transform2F { Transform2F { matrix: Matrix2x2F::from_rotation(theta), - vector: Vector2F::default(), + vector: Vector2F::zero(), } } @@ -161,7 +161,7 @@ impl Transform2F { pub fn from_rotation_vector(vector: UnitVector) -> Transform2F { Transform2F { matrix: Matrix2x2F::from_rotation_vector(vector), - vector: Vector2F::default(), + vector: Vector2F::zero(), } } diff --git a/geometry/src/transform3d.rs b/geometry/src/transform3d.rs index 99b60957..73230f67 100644 --- a/geometry/src/transform3d.rs +++ b/geometry/src/transform3d.rs @@ -10,9 +10,9 @@ //! 3D transforms that can be applied to paths. -use crate::vector::{Vector2F, Vector2I, Vector3F, Vector4F}; use crate::rect::RectF; use crate::transform2d::Matrix2x2F; +use crate::vector::{Vector2F, Vector2I, Vector3F, Vector4F, vec2f}; use pathfinder_simd::default::F32x4; use std::ops::{Add, Mul, MulAssign, Neg}; @@ -407,7 +407,7 @@ impl Mul for Perspective { #[inline] fn mul(self, vector: Vector2F) -> Vector2F { let point = (self.transform * vector.to_4d()).to_2d() * Vector2F::new(1.0, -1.0); - (point + Vector2F::splat(1.0)) * self.window_size.to_f32().scale(0.5) + (point + vec2f(1.0, 1.0)) * self.window_size.to_f32().scale(0.5) } } diff --git a/geometry/src/vector.rs b/geometry/src/vector.rs index 5a4566bf..3fd20b2c 100644 --- a/geometry/src/vector.rs +++ b/geometry/src/vector.rs @@ -29,6 +29,11 @@ impl Vector2F { Vector2F(F32x2::splat(value)) } + #[inline] + pub fn zero() -> Vector2F { + Vector2F::default() + } + #[inline] pub fn to_3d(self) -> Vector3F { Vector3F(self.0.to_f32x4().concat_xy_zw(F32x4::new(0.0, 0.0, 0.0, 0.0))) @@ -147,7 +152,7 @@ impl Vector2F { #[inline] pub fn is_zero(self) -> bool { - self == Vector2F::default() + self == Vector2F::zero() } #[inline] @@ -161,6 +166,12 @@ impl Vector2F { } } +/// A convenience alias for `Vector2F::new()`. +#[inline] +pub fn vec2f(x: f32, y: f32) -> Vector2F { + Vector2F::new(x, y) +} + impl PartialEq for Vector2F { #[inline] fn eq(&self, other: &Vector2F) -> bool { @@ -230,6 +241,11 @@ impl Vector2I { Vector2I(I32x2::splat(value)) } + #[inline] + pub fn zero() -> Vector2I { + Vector2I::default() + } + #[inline] pub fn x(self) -> i32 { self.0[0] @@ -276,6 +292,12 @@ impl Vector2I { } } +/// A convenience alias for `Vector2I::new()`. +#[inline] +pub fn vec2i(x: i32, y: i32) -> Vector2I { + Vector2I::new(x, y) +} + impl Add for Vector2I { type Output = Vector2I; #[inline] diff --git a/gpu/src/lib.rs b/gpu/src/lib.rs index 2a1dbf53..fa2885a6 100644 --- a/gpu/src/lib.rs +++ b/gpu/src/lib.rs @@ -18,7 +18,7 @@ use image::ImageFormat; use pathfinder_color::ColorF; use pathfinder_geometry::rect::RectI; use pathfinder_geometry::transform3d::Transform4F; -use pathfinder_geometry::vector::Vector2I; +use pathfinder_geometry::vector::{Vector2I, vec2i}; use pathfinder_resources::ResourceLoader; use pathfinder_simd::default::{F32x2, F32x4}; use std::os::raw::c_void; @@ -99,7 +99,7 @@ pub trait Device: Sized { let image = image::load_from_memory_with_format(&data, ImageFormat::Png) .unwrap() .to_luma(); - let size = Vector2I::new(image.width() as i32, image.height() as i32); + let size = vec2i(image.width() as i32, image.height() as i32); self.create_texture_from_data(TextureFormat::R8, size, TextureDataRef::U8(&image)) } diff --git a/metal/src/lib.rs b/metal/src/lib.rs index 67f6d41b..afc9986e 100644 --- a/metal/src/lib.rs +++ b/metal/src/lib.rs @@ -42,7 +42,7 @@ use metal::{StructTypeRef, TextureDescriptor, Texture, TextureRef, VertexAttribu use metal::{VertexAttributeRef, VertexDescriptor, VertexDescriptorRef}; use objc::runtime::{Class, Object}; use pathfinder_geometry::rect::RectI; -use pathfinder_geometry::vector::Vector2I; +use pathfinder_geometry::vector::{Vector2I, vec2i}; use pathfinder_gpu::{BlendFactor, BlendOp, BufferData, BufferTarget, BufferUploadMode, DepthFunc}; use pathfinder_gpu::{Device, Primitive, RenderState, RenderTarget, ShaderKind, StencilFunc}; use pathfinder_gpu::{TextureData, TextureDataRef, TextureFormat, TextureSamplingFlags}; @@ -123,8 +123,8 @@ impl MetalDevice { }).collect(); let main_color_texture = drawable.texture(); - let framebuffer_size = Vector2I::new(main_color_texture.width() as i32, - main_color_texture.height() as i32); + let framebuffer_size = vec2i(main_color_texture.width() as i32, + main_color_texture.height() as i32); let main_depth_stencil_texture = device.create_depth_stencil_texture(framebuffer_size); let shared_event = device.new_shared_event(); @@ -486,7 +486,7 @@ impl Device for MetalDevice { } fn texture_size(&self, texture: &MetalTexture) -> Vector2I { - Vector2I::new(texture.texture.width() as i32, texture.texture.height() as i32) + vec2i(texture.texture.width() as i32, texture.texture.height() as i32) } fn set_texture_sampling_mode(&self, texture: &MetalTexture, flags: TextureSamplingFlags) { diff --git a/renderer/src/allocator.rs b/renderer/src/allocator.rs index 2db36b9e..020f5e8f 100644 --- a/renderer/src/allocator.rs +++ b/renderer/src/allocator.rs @@ -12,7 +12,7 @@ use crate::gpu_data::{TextureLocation, TexturePageId}; use pathfinder_geometry::rect::RectI; -use pathfinder_geometry::vector::{Vector2F, Vector2I}; +use pathfinder_geometry::vector::{Vector2F, Vector2I, vec2f, vec2i}; const ATLAS_TEXTURE_LENGTH: u32 = 1024; @@ -98,7 +98,7 @@ impl TextureAllocator { } pub fn page_scale(&self, page_index: TexturePageId) -> Vector2F { - Vector2F::splat(1.0) / self.page_size(page_index).to_f32() + vec2f(1.0, 1.0) / self.page_size(page_index).to_f32() } #[inline] @@ -179,22 +179,20 @@ impl TreeNode { if let Some(origin) = kids[0].allocate(this_origin, kid_size, requested_size) { return Some(origin); } - if let Some(origin) = - kids[1].allocate(this_origin + Vector2I::new(kid_size as i32, 0), - kid_size, - requested_size) { + if let Some(origin) = kids[1].allocate(this_origin + vec2i(kid_size as i32, 0), + kid_size, + requested_size) { return Some(origin); } - if let Some(origin) = - kids[2].allocate(this_origin + Vector2I::new(0, kid_size as i32), - kid_size, - requested_size) { + if let Some(origin) = kids[2].allocate(this_origin + vec2i(0, kid_size as i32), + kid_size, + requested_size) { return Some(origin); } - if let Some(origin) = - kids[3].allocate(this_origin + Vector2I::splat(kid_size as i32), - kid_size, - requested_size) { + if let Some(origin) = kids[3].allocate( + this_origin + Vector2I::splat(kid_size as i32), + kid_size, + requested_size) { return Some(origin); } @@ -229,12 +227,12 @@ impl TreeNode { child_index = 0; } else { child_index = 1; - child_origin = child_origin + Vector2I::new(child_size as i32, 0); + child_origin += vec2i(child_size as i32, 0); } } else { if requested_origin.x() < this_center.x() { child_index = 2; - child_origin = child_origin + Vector2I::new(0, child_size as i32); + child_origin += vec2i(0, child_size as i32); } else { child_index = 3; child_origin = this_center; @@ -291,7 +289,7 @@ mod test { let mut allocator = TextureAtlasAllocator::with_length(length); let mut locations = vec![]; for &(width, height) in &sizes { - let size = Vector2I::new(width as i32, height as i32); + let size = vec2i(width as i32, height as i32); if let Some(location) = allocator.allocate(size) { locations.push(location); } diff --git a/renderer/src/builder.rs b/renderer/src/builder.rs index 9cded136..b6b4d1df 100644 --- a/renderer/src/builder.rs +++ b/renderer/src/builder.rs @@ -28,7 +28,7 @@ use pathfinder_geometry::line_segment::{LineSegment2F, LineSegmentU4, LineSegmen use pathfinder_geometry::rect::{RectF, RectI}; use pathfinder_geometry::transform2d::Transform2F; use pathfinder_geometry::util; -use pathfinder_geometry::vector::{Vector2F, Vector2I}; +use pathfinder_geometry::vector::{Vector2F, Vector2I, vec2f, vec2i}; use pathfinder_gpu::TextureSamplingFlags; use pathfinder_simd::default::{F32x4, I32x4}; use std::sync::atomic::{AtomicUsize, Ordering}; @@ -269,11 +269,11 @@ impl<'a> SceneBuilder<'a> { let tile_rect = tiles::round_rect_out_to_tile_bounds(effective_view_box); let layer_z_buffer = layer_z_buffers_stack.last().unwrap(); let mut tiles = vec![]; - let uv_scale = Vector2F::splat(1.0) / tile_rect.lower_right().to_f32(); + let uv_scale = vec2f(1.0, 1.0) / tile_rect.lower_right().to_f32(); let metadata = &render_target_metadata[render_target.0 as usize]; for tile_y in tile_rect.min_y()..tile_rect.max_y() { for tile_x in tile_rect.min_x()..tile_rect.max_x() { - let tile_coords = Vector2I::new(tile_x, tile_y); + let tile_coords = vec2i(tile_x, tile_y); if !layer_z_buffer.test(tile_coords, current_depth) { continue; } @@ -716,8 +716,8 @@ impl ObjectBuilder { tile_coords: Vector2I, ) { let tile_origin_y = (tile_coords.y() * TILE_HEIGHT as i32) as f32; - let left = Vector2F::new(left, tile_origin_y); - let right = Vector2F::new(right, tile_origin_y); + let left = vec2f(left, tile_origin_y); + let right = vec2f(right, tile_origin_y); let segment = if winding < 0 { LineSegment2F::new(left, right) @@ -792,7 +792,7 @@ impl ObjectBuilder { } let fill_segment = LineSegment2F::new(fill_from, fill_to); - let fill_tile_coords = Vector2I::new(subsegment_tile_x, tile_y); + let fill_tile_coords = vec2i(subsegment_tile_x, tile_y); self.add_fill(scene_builder, fill_segment, fill_tile_coords); } } @@ -825,28 +825,28 @@ impl<'a> PackedTile<'a> { fill_tile_backdrop, clip_tile_index, clip_tile_backdrop, - Vector2I::default(), + Vector2I::zero(), draw_tiling_path_info), upper_right: TileVertex::new_alpha(self.tile_coords, fill_tile_index, fill_tile_backdrop, clip_tile_index, clip_tile_backdrop, - Vector2I::new(1, 0), + vec2i(1, 0), draw_tiling_path_info), lower_left: TileVertex::new_alpha(self.tile_coords, fill_tile_index, fill_tile_backdrop, clip_tile_index, clip_tile_backdrop, - Vector2I::new(0, 1), + vec2i(0, 1), draw_tiling_path_info), lower_right: TileVertex::new_alpha(self.tile_coords, fill_tile_index, fill_tile_backdrop, clip_tile_index, clip_tile_backdrop, - Vector2I::splat(1), + vec2i(1, 1), draw_tiling_path_info), }); } @@ -886,20 +886,20 @@ impl TileVertex { #[inline] pub fn tile_position(&self) -> Vector2I { - Vector2I::new(self.tile_x as i32, self.tile_y as i32) + vec2i(self.tile_x as i32, self.tile_y as i32) } } fn calculate_mask_uv(tile_index: u16, tile_offset: Vector2I) -> Vector2F { let mask_u = tile_index as i32 % MASK_TILES_ACROSS as i32; let mask_v = tile_index as i32 / MASK_TILES_ACROSS as i32; - let scale = Vector2F::new(1.0 / MASK_TILES_ACROSS as f32, 1.0 / MASK_TILES_DOWN as f32); - (Vector2I::new(mask_u, mask_v) + tile_offset).to_f32().scale_xy(scale) + let scale = vec2f(1.0 / MASK_TILES_ACROSS as f32, 1.0 / MASK_TILES_DOWN as f32); + (vec2i(mask_u, mask_v) + tile_offset).to_f32().scale_xy(scale) } fn calculate_opacity_uv(draw_tiling_path_info: &DrawTilingPathInfo) -> Vector2F { let DrawTilingPathInfo { opacity_tile_transform, opacity, .. } = *draw_tiling_path_info; - let texel_coord = (Vector2I::new((opacity % 16) as i32, (opacity / 16) as i32).to_f32() + - Vector2F::splat(0.5)).scale(1.0 / 16.0); + let texel_coord = (vec2i((opacity % 16) as i32, (opacity / 16) as i32).to_f32() + + vec2f(0.5, 0.5)).scale(1.0 / 16.0); opacity_tile_transform * texel_coord } diff --git a/renderer/src/gpu/debug.rs b/renderer/src/gpu/debug.rs index d6a53d02..1c0b7f4d 100644 --- a/renderer/src/gpu/debug.rs +++ b/renderer/src/gpu/debug.rs @@ -16,7 +16,7 @@ //! The debug font atlas was generated using: https://evanw.github.io/font-texture-generator/ use crate::gpu::renderer::{RenderStats, RenderTime}; -use pathfinder_geometry::vector::Vector2I; +use pathfinder_geometry::vector::{Vector2I, vec2i}; use pathfinder_geometry::rect::RectI; use pathfinder_gpu::Device; use pathfinder_resources::ResourceLoader; @@ -85,16 +85,14 @@ where let framebuffer_size = self.ui_presenter.framebuffer_size(); let bottom = framebuffer_size.y() - PADDING; let window_rect = RectI::new( - Vector2I::new( - framebuffer_size.x() - PADDING - STATS_WINDOW_WIDTH, - bottom - PERFORMANCE_WINDOW_HEIGHT - PADDING - STATS_WINDOW_HEIGHT, - ), - Vector2I::new(STATS_WINDOW_WIDTH, STATS_WINDOW_HEIGHT), + vec2i(framebuffer_size.x() - PADDING - STATS_WINDOW_WIDTH, + bottom - PERFORMANCE_WINDOW_HEIGHT - PADDING - STATS_WINDOW_HEIGHT), + vec2i(STATS_WINDOW_WIDTH, STATS_WINDOW_HEIGHT), ); self.ui_presenter.draw_solid_rounded_rect(device, window_rect, WINDOW_COLOR); - let origin = window_rect.origin() + Vector2I::new(PADDING, PADDING + FONT_ASCENT); + let origin = window_rect.origin() + vec2i(PADDING, PADDING + FONT_ASCENT); self.ui_presenter.draw_text( device, &format!("Paths: {}", mean_cpu_sample.stats.path_count), @@ -104,19 +102,19 @@ where self.ui_presenter.draw_text( device, &format!("Solid Tiles: {}", mean_cpu_sample.stats.solid_tile_count), - origin + Vector2I::new(0, LINE_HEIGHT * 1), + origin + vec2i(0, LINE_HEIGHT * 1), false, ); self.ui_presenter.draw_text( device, &format!("Alpha Tiles: {}", mean_cpu_sample.stats.alpha_tile_count), - origin + Vector2I::new(0, LINE_HEIGHT * 2), + origin + vec2i(0, LINE_HEIGHT * 2), false, ); self.ui_presenter.draw_text( device, &format!("Fills: {}", mean_cpu_sample.stats.fill_count), - origin + Vector2I::new(0, LINE_HEIGHT * 3), + origin + vec2i(0, LINE_HEIGHT * 3), false, ); } @@ -125,16 +123,14 @@ where let framebuffer_size = self.ui_presenter.framebuffer_size(); let bottom = framebuffer_size.y() - PADDING; let window_rect = RectI::new( - Vector2I::new( - framebuffer_size.x() - PADDING - PERFORMANCE_WINDOW_WIDTH, - bottom - PERFORMANCE_WINDOW_HEIGHT, - ), - Vector2I::new(PERFORMANCE_WINDOW_WIDTH, PERFORMANCE_WINDOW_HEIGHT), + vec2i(framebuffer_size.x() - PADDING - PERFORMANCE_WINDOW_WIDTH, + bottom - PERFORMANCE_WINDOW_HEIGHT), + vec2i(PERFORMANCE_WINDOW_WIDTH, PERFORMANCE_WINDOW_HEIGHT), ); self.ui_presenter.draw_solid_rounded_rect(device, window_rect, WINDOW_COLOR); - let origin = window_rect.origin() + Vector2I::new(PADDING, PADDING + FONT_ASCENT); + let origin = window_rect.origin() + vec2i(PADDING, PADDING + FONT_ASCENT); self.ui_presenter.draw_text( device, &format!( @@ -152,7 +148,7 @@ where "Stage 0 GPU: {:.3} ms", duration_to_ms(mean_gpu_sample.time.stage_0) ), - origin + Vector2I::new(0, LINE_HEIGHT * 1), + origin + vec2i(0, LINE_HEIGHT * 1), false, ); self.ui_presenter.draw_text( @@ -161,7 +157,7 @@ where "Stage 1 GPU: {:.3} ms", duration_to_ms(mean_gpu_sample.time.stage_1) ), - origin + Vector2I::new(0, LINE_HEIGHT * 2), + origin + vec2i(0, LINE_HEIGHT * 2), false, ); @@ -171,7 +167,7 @@ where self.ui_presenter.draw_text( device, &format!("Wallclock: {:.3} ms", wallclock_time), - origin + Vector2I::new(0, LINE_HEIGHT * 3), + origin + vec2i(0, LINE_HEIGHT * 3), false, ); } diff --git a/renderer/src/gpu/renderer.rs b/renderer/src/gpu/renderer.rs index 92e9635b..9cd11cb3 100644 --- a/renderer/src/gpu/renderer.rs +++ b/renderer/src/gpu/renderer.rs @@ -25,7 +25,7 @@ use pathfinder_content::render_target::RenderTargetId; use pathfinder_geometry::line_segment::LineSegment2F; use pathfinder_geometry::rect::RectI; use pathfinder_geometry::transform3d::Transform4F; -use pathfinder_geometry::vector::{Vector2F, Vector2I, Vector4F}; +use pathfinder_geometry::vector::{Vector2F, Vector2I, Vector4F, vec2f, vec2i}; use pathfinder_gpu::{BlendFactor, BlendState, BufferData, BufferTarget, BufferUploadMode}; use pathfinder_gpu::{ClearOps, DepthFunc, DepthState, Device, Primitive, RenderOptions}; use pathfinder_gpu::{RenderState, RenderTarget, StencilFunc, StencilState, TextureDataRef}; @@ -213,8 +213,7 @@ where &quad_vertex_indices_buffer, ); - let fill_framebuffer_size = - Vector2I::new(MASK_FRAMEBUFFER_WIDTH, MASK_FRAMEBUFFER_HEIGHT); + let fill_framebuffer_size = vec2i(MASK_FRAMEBUFFER_WIDTH, MASK_FRAMEBUFFER_HEIGHT); let fill_framebuffer_texture = device.create_texture(TextureFormat::R16F, fill_framebuffer_size); let fill_framebuffer = device.create_framebuffer(fill_framebuffer_texture); @@ -907,8 +906,8 @@ where let gauss_coeff_z = gauss_coeff_y * gauss_coeff_y; let src_offset = match direction { - BlurDirection::X => Vector2F::new(1.0, 0.0), - BlurDirection::Y => Vector2F::new(0.0, 1.0), + BlurDirection::X => vec2f(1.0, 0.0), + BlurDirection::Y => vec2f(0.0, 1.0), }; let support = f32::ceil(1.5 * sigma) * 2.0; @@ -1016,8 +1015,7 @@ where } fn mask_viewport(&self) -> RectI { - RectI::new(Vector2I::default(), - Vector2I::new(MASK_FRAMEBUFFER_WIDTH, MASK_FRAMEBUFFER_HEIGHT)) + RectI::new(Vector2I::zero(), vec2i(MASK_FRAMEBUFFER_WIDTH, MASK_FRAMEBUFFER_HEIGHT)) } fn render_target_location(&self, render_target_id: RenderTargetId) -> TextureLocation { diff --git a/renderer/src/paint.rs b/renderer/src/paint.rs index d304814d..0c73ff84 100644 --- a/renderer/src/paint.rs +++ b/renderer/src/paint.rs @@ -22,7 +22,7 @@ use pathfinder_geometry::line_segment::LineSegment2F; use pathfinder_geometry::rect::{RectF, RectI}; use pathfinder_geometry::transform2d::{Matrix2x2F, Transform2F}; use pathfinder_geometry::util; -use pathfinder_geometry::vector::{Vector2F, Vector2I}; +use pathfinder_geometry::vector::{Vector2F, Vector2I, vec2f, vec2i}; use pathfinder_gpu::TextureSamplingFlags; use pathfinder_simd::default::{F32x2, F32x4}; use std::fmt::{self, Debug, Formatter}; @@ -314,7 +314,7 @@ impl Palette { let texture_origin_uv = rect_to_uv(metadata.location.rect, texture_scale).lower_left(); Transform2F::from_translation(texture_origin_uv) * - Transform2F::from_scale(texture_scale.scale_xy(Vector2F::new(1.0, -1.0))) * + Transform2F::from_scale(texture_scale.scale_xy(vec2f(1.0, -1.0))) * transform.inverse() } } @@ -400,7 +400,7 @@ impl Palette { // 1. Calculate ∇t up front and use differencing in the inner loop. // 2. Go four pixels at a time with SIMD. for x in 0..(GRADIENT_TILE_LENGTH as i32) { - let point = tex_rect.origin() + Vector2I::new(x, 0); + let point = tex_rect.origin() + vec2i(x, 0); let t = (x as f32 + 0.5) / GRADIENT_TILE_LENGTH as f32; texels.put_texel(point, gradient.sample(t)); } @@ -409,7 +409,7 @@ impl Palette { fn render_image(&self, image: &Image, tex_rect: RectI, texels: &mut Texels) { let image_size = image.size(); for y in 0..image_size.y() { - let dest_origin = tex_rect.origin() + Vector2I::new(0, y); + let dest_origin = tex_rect.origin() + vec2i(0, y); let src_start_index = y as usize * image_size.x() as usize; let src_end_index = src_start_index + image_size.x() as usize; texels.blit_scanline(dest_origin, &image.pixels()[src_start_index..src_end_index]); @@ -420,7 +420,7 @@ impl Palette { impl PaintMetadata { // TODO(pcwalton): Apply clamp/repeat to tile rect. pub(crate) fn calculate_tex_coords(&self, tile_position: Vector2I) -> Vector2F { - let tile_size = Vector2I::new(TILE_WIDTH as i32, TILE_HEIGHT as i32); + let tile_size = vec2i(TILE_WIDTH as i32, TILE_HEIGHT as i32); let position = tile_position.scale_xy(tile_size).to_f32(); let tex_coords = self.texture_transform * position; tex_coords @@ -501,7 +501,7 @@ impl OpacityTileBuilder { for y in 0..16 { for x in 0..16 { let color = ColorU::new(0xff, 0xff, 0xff, y * 16 + x); - let coords = self.tile_location.rect.origin() + Vector2I::new(x as i32, y as i32); + let coords = self.tile_location.rect.origin() + vec2i(x as i32, y as i32); texels.put_texel(coords, color); } } @@ -542,8 +542,8 @@ impl SolidColorTileBuilder { let (location, tile_full); { let mut data = self.0.as_mut().unwrap(); - let subtile_origin = Vector2I::new((data.next_index % SOLID_COLOR_TILE_LENGTH) as i32, - (data.next_index / SOLID_COLOR_TILE_LENGTH) as i32); + let subtile_origin = vec2i((data.next_index % SOLID_COLOR_TILE_LENGTH) as i32, + (data.next_index / SOLID_COLOR_TILE_LENGTH) as i32); location = TextureLocation { page: data.tile_location.page, rect: RectI::new(data.tile_location.rect.origin() + subtile_origin, @@ -589,8 +589,8 @@ impl GradientTileBuilder { let mut data = self.0.as_mut().unwrap(); location = TextureLocation { page: data.page, - rect: RectI::new(Vector2I::new(0, data.next_index as i32), - Vector2I::new(GRADIENT_TILE_LENGTH as i32, 1)), + rect: RectI::new(vec2i(0, data.next_index as i32), + vec2i(GRADIENT_TILE_LENGTH as i32, 1)), }; data.next_index += 1; tile_full = data.next_index == GRADIENT_TILE_LENGTH; diff --git a/renderer/src/scene.rs b/renderer/src/scene.rs index 16949855..8fa2642b 100644 --- a/renderer/src/scene.rs +++ b/renderer/src/scene.rs @@ -19,9 +19,9 @@ use pathfinder_content::effects::{BlendMode, Effects}; use pathfinder_content::fill::FillRule; use pathfinder_content::outline::Outline; use pathfinder_content::render_target::RenderTargetId; -use pathfinder_geometry::vector::{Vector2F, Vector2I}; use pathfinder_geometry::rect::RectF; use pathfinder_geometry::transform2d::Transform2F; +use pathfinder_geometry::vector::{Vector2I, vec2f}; #[derive(Clone)] pub struct Scene { @@ -156,7 +156,7 @@ impl Scene { PreparedRenderTransform::Perspective { .. } => unreachable!(), }; if options.subpixel_aa_enabled { - transform *= Transform2F::from_scale(Vector2F::new(3.0, 1.0)) + transform *= Transform2F::from_scale(vec2f(3.0, 1.0)) } outline.transform(&transform); } @@ -177,7 +177,7 @@ impl Scene { #[inline] pub(crate) fn effective_view_box(&self, render_options: &PreparedBuildOptions) -> RectF { if render_options.subpixel_aa_enabled { - self.view_box.scale_xy(Vector2F::new(3.0, 1.0)) + self.view_box.scale_xy(vec2f(3.0, 1.0)) } else { self.view_box } diff --git a/renderer/src/tile_map.rs b/renderer/src/tile_map.rs index 0c946944..8b86a858 100644 --- a/renderer/src/tile_map.rs +++ b/renderer/src/tile_map.rs @@ -8,8 +8,8 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -use pathfinder_geometry::vector::Vector2I; use pathfinder_geometry::rect::RectI; +use pathfinder_geometry::vector::{Vector2I, vec2i}; #[derive(Debug)] pub struct DenseTileMap { @@ -65,6 +65,6 @@ impl DenseTileMap { #[inline] pub fn index_to_coords(&self, index: usize) -> Vector2I { let (width, index) = (self.rect.size().x(), index as i32); - self.rect.origin() + Vector2I::new(index % width, index / width) + self.rect.origin() + vec2i(index % width, index / width) } } diff --git a/renderer/src/tiles.rs b/renderer/src/tiles.rs index 2c2a7da9..e3f5382e 100644 --- a/renderer/src/tiles.rs +++ b/renderer/src/tiles.rs @@ -19,7 +19,7 @@ use pathfinder_content::sorted_vector::SortedVector; use pathfinder_geometry::line_segment::LineSegment2F; use pathfinder_geometry::rect::{RectF, RectI}; use pathfinder_geometry::transform2d::Transform2F; -use pathfinder_geometry::vector::{Vector2F, Vector2I}; +use pathfinder_geometry::vector::{Vector2F, Vector2I, vec2f, vec2i}; use std::cmp::Ordering; use std::mem; @@ -223,7 +223,7 @@ impl<'a> Tiler<'a> { let current_x = (i32::from(current_tile_x) * TILE_WIDTH as i32) as f32 + current_subtile_x; let tile_right_x = ((i32::from(current_tile_x) + 1) * TILE_WIDTH as i32) as f32; - let current_tile_coords = Vector2I::new(current_tile_x, tile_y); + let current_tile_coords = vec2i(current_tile_x, tile_y); self.object_builder.add_active_fill( self.scene_builder, current_x, @@ -241,7 +241,7 @@ impl<'a> Tiler<'a> { "... emitting backdrop {} @ tile {}", current_winding, current_tile_x ); - let current_tile_coords = Vector2I::new(current_tile_x, tile_y); + let current_tile_coords = vec2i(current_tile_x, tile_y); if let Some(tile_index) = self.object_builder .tile_coords_to_local_index(current_tile_coords) { // FIXME(pcwalton): Handle winding overflow. @@ -260,7 +260,7 @@ impl<'a> Tiler<'a> { if segment_subtile_x > current_subtile_x { let current_x = (i32::from(current_tile_x) * TILE_WIDTH as i32) as f32 + current_subtile_x; - let current_tile_coords = Vector2I::new(current_tile_x, tile_y); + let current_tile_coords = vec2i(current_tile_x, tile_y); self.object_builder.add_active_fill( self.scene_builder, current_x, @@ -499,12 +499,7 @@ impl<'a> PackedTile<'a> { } pub fn round_rect_out_to_tile_bounds(rect: RectF) -> RectI { - rect.scale_xy(Vector2F::new( - 1.0 / TILE_WIDTH as f32, - 1.0 / TILE_HEIGHT as f32, - )) - .round_out() - .to_i32() + rect.scale_xy(vec2f(1.0 / TILE_WIDTH as f32, 1.0 / TILE_HEIGHT as f32)).round_out().to_i32() } fn process_active_segment( diff --git a/renderer/src/z_buffer.rs b/renderer/src/z_buffer.rs index 0010e243..51081cb2 100644 --- a/renderer/src/z_buffer.rs +++ b/renderer/src/z_buffer.rs @@ -17,7 +17,7 @@ use crate::tile_map::DenseTileMap; use crate::tiles; use pathfinder_content::effects::{BlendMode, Effects}; use pathfinder_geometry::rect::RectF; -use pathfinder_geometry::vector::{Vector2F, Vector2I}; +use pathfinder_geometry::vector::{Vector2F, Vector2I, vec2i}; use vec_map::VecMap; pub(crate) struct ZBuffer { @@ -116,14 +116,11 @@ impl Tile { -> Tile { Tile { upper_left: TileVertex::new_solid_from_paint_metadata(tile_position, paint_metadata), - upper_right: TileVertex::new_solid_from_paint_metadata(tile_position + - Vector2I::new(1, 0), + upper_right: TileVertex::new_solid_from_paint_metadata(tile_position + vec2i(1, 0), paint_metadata), - lower_left: TileVertex::new_solid_from_paint_metadata(tile_position + - Vector2I::new(0, 1), + lower_left: TileVertex::new_solid_from_paint_metadata(tile_position + vec2i(0, 1), paint_metadata), - lower_right: TileVertex::new_solid_from_paint_metadata(tile_position + - Vector2I::new(1, 1), + lower_right: TileVertex::new_solid_from_paint_metadata(tile_position + vec2i(1, 1), paint_metadata), } } @@ -132,11 +129,11 @@ impl Tile { -> Tile { Tile { upper_left: TileVertex::new_solid_from_uv(tile_position, texture_rect.origin()), - upper_right: TileVertex::new_solid_from_uv(tile_position + Vector2I::new(1, 0), + upper_right: TileVertex::new_solid_from_uv(tile_position + vec2i(1, 0), texture_rect.upper_right()), - lower_left: TileVertex::new_solid_from_uv(tile_position + Vector2I::new(0, 1), + lower_left: TileVertex::new_solid_from_uv(tile_position + vec2i(0, 1), texture_rect.lower_left()), - lower_right: TileVertex::new_solid_from_uv(tile_position + Vector2I::new(1, 1), + lower_right: TileVertex::new_solid_from_uv(tile_position + vec2i(1, 1), texture_rect.lower_right()), } } diff --git a/svg/src/lib.rs b/svg/src/lib.rs index 262f091f..4060ef6c 100644 --- a/svg/src/lib.rs +++ b/svg/src/lib.rs @@ -23,7 +23,7 @@ use pathfinder_content::transform::Transform2FPathIter; use pathfinder_geometry::line_segment::LineSegment2F; use pathfinder_geometry::rect::RectF; use pathfinder_geometry::transform2d::Transform2F; -use pathfinder_geometry::vector::Vector2F; +use pathfinder_geometry::vector::{Vector2F, vec2f}; use pathfinder_renderer::paint::Paint; use pathfinder_renderer::scene::{ClipPath, ClipPathId, DrawPath, Scene}; use std::fmt::{Display, Formatter, Result as FormatResult}; @@ -312,10 +312,8 @@ impl PaintExt for Paint { } fn usvg_rect_to_euclid_rect(rect: &UsvgRect) -> RectF { - RectF::new( - Vector2F::new(rect.x() as f32, rect.y() as f32), - Vector2F::new(rect.width() as f32, rect.height() as f32), - ) + RectF::new(vec2f(rect.x() as f32, rect.y() as f32), + vec2f(rect.width() as f32, rect.height() as f32)) } fn usvg_transform_to_transform_2d(transform: &UsvgTransform) -> Transform2F { @@ -346,8 +344,8 @@ where fn new(iter: I) -> UsvgPathToSegments { UsvgPathToSegments { iter, - first_subpath_point: Vector2F::default(), - last_subpath_point: Vector2F::default(), + first_subpath_point: Vector2F::zero(), + last_subpath_point: Vector2F::zero(), just_moved: false, } } @@ -362,14 +360,14 @@ where fn next(&mut self) -> Option { match self.iter.next()? { UsvgPathSegment::MoveTo { x, y } => { - let to = Vector2F::new(x as f32, y as f32); + let to = vec2f(x as f32, y as f32); self.first_subpath_point = to; self.last_subpath_point = to; self.just_moved = true; self.next() } UsvgPathSegment::LineTo { x, y } => { - let to = Vector2F::new(x as f32, y as f32); + let to = vec2f(x as f32, y as f32); let mut segment = Segment::line(LineSegment2F::new(self.last_subpath_point, to)); if self.just_moved { segment.flags.insert(SegmentFlags::FIRST_IN_SUBPATH); @@ -386,13 +384,11 @@ where x, y, } => { - let ctrl0 = Vector2F::new(x1 as f32, y1 as f32); - let ctrl1 = Vector2F::new(x2 as f32, y2 as f32); - let to = Vector2F::new(x as f32, y as f32); - let mut segment = Segment::cubic( - LineSegment2F::new(self.last_subpath_point, to), - LineSegment2F::new(ctrl0, ctrl1), - ); + let ctrl0 = vec2f(x1 as f32, y1 as f32); + let ctrl1 = vec2f(x2 as f32, y2 as f32); + let to = vec2f(x as f32, y as f32); + let mut segment = Segment::cubic(LineSegment2F::new(self.last_subpath_point, to), + LineSegment2F::new(ctrl0, ctrl1)); if self.just_moved { segment.flags.insert(SegmentFlags::FIRST_IN_SUBPATH); } diff --git a/swf/src/lib.rs b/swf/src/lib.rs index 0120a167..80565f68 100644 --- a/swf/src/lib.rs +++ b/swf/src/lib.rs @@ -13,7 +13,7 @@ use pathfinder_color::{ColorF, ColorU}; use pathfinder_content::fill::FillRule; use pathfinder_content::outline::{Outline, Contour}; use pathfinder_content::stroke::{OutlineStrokeToFill, StrokeStyle}; -use pathfinder_geometry::vector::Vector2F; +use pathfinder_geometry::vector::{Vector2F, vec2f}; use pathfinder_renderer::scene::{DrawPath, Scene}; use swf_types::tags::SetBackgroundColor; @@ -161,19 +161,16 @@ pub fn draw_paths_into_scene(library: &SymbolLibrary, scene: &mut Scene) { for shape in style_layer.shapes() { let mut contour = Contour::new(); let Point2 { x, y } = shape.outline.first().unwrap().from.as_f32(); - contour.push_endpoint(Vector2F::new(x, y)); + contour.push_endpoint(vec2f(x, y)); for segment in &shape.outline { let Point2 { x, y } = segment.to.as_f32(); match segment.ctrl { Some(ctrl) => { let Point2 { x: ctrl_x, y: ctrl_y } = ctrl.as_f32(); - contour.push_quadratic( - Vector2F::new(ctrl_x, ctrl_y), - Vector2F::new(x, y) - ); + contour.push_quadratic(vec2f(ctrl_x, ctrl_y), vec2f(x, y)); } None => { - contour.push_endpoint(Vector2F::new(x, y)); + contour.push_endpoint(vec2f(x, y)); }, } } diff --git a/ui/src/lib.rs b/ui/src/lib.rs index 533316a1..74803af0 100644 --- a/ui/src/lib.rs +++ b/ui/src/lib.rs @@ -19,7 +19,7 @@ extern crate serde_derive; use hashbrown::HashMap; use pathfinder_color::ColorU; use pathfinder_geometry::rect::RectI; -use pathfinder_geometry::vector::{Vector2F, Vector2I}; +use pathfinder_geometry::vector::{Vector2F, Vector2I, vec2i}; use pathfinder_gpu::{BlendFactor, BlendState, BufferData, BufferTarget, BufferUploadMode, Device}; use pathfinder_gpu::{Primitive, RenderOptions, RenderState, RenderTarget, UniformData}; use pathfinder_gpu::{VertexAttrClass, VertexAttrDescriptor, VertexAttrType}; @@ -98,7 +98,7 @@ impl UIPresenter where D: Device { UIPresenter { event_queue: UIEventQueue::new(), - mouse_position: Vector2F::default(), + mouse_position: Vector2F::zero(), framebuffer_size, @@ -205,10 +205,9 @@ impl UIPresenter where D: Device { let info = &self.font.characters[&character]; let position_rect = - RectI::new(Vector2I::new(next.x() - info.origin_x, next.y() - info.origin_y), - Vector2I::new(info.width as i32, info.height as i32)); - let tex_coord_rect = RectI::new(Vector2I::new(info.x, info.y), - Vector2I::new(info.width, info.height)); + RectI::new(vec2i(next.x() - info.origin_x, next.y() - info.origin_y), + vec2i(info.width as i32, info.height as i32)); + let tex_coord_rect = RectI::new(vec2i(info.x, info.y), vec2i(info.width, info.height)); let first_vertex_index = vertex_data.len(); vertex_data.extend_from_slice(&[ DebugTextureVertex::new(position_rect.origin(), tex_coord_rect.origin()), @@ -429,11 +428,11 @@ impl UIPresenter where D: Device { } pub fn draw_button(&mut self, device: &D, origin: Vector2I, texture: &D::Texture) -> bool { - let button_rect = RectI::new(origin, Vector2I::new(BUTTON_WIDTH, BUTTON_HEIGHT)); + let button_rect = RectI::new(origin, vec2i(BUTTON_WIDTH, BUTTON_HEIGHT)); self.draw_solid_rounded_rect(device, button_rect, WINDOW_COLOR); self.draw_rounded_rect_outline(device, button_rect, OUTLINE_COLOR); self.draw_texture(device, - origin + Vector2I::new(PADDING, PADDING), + origin + vec2i(PADDING, PADDING), texture, BUTTON_ICON_COLOR); self.event_queue.handle_mouse_down_in_rect(button_rect).is_some() @@ -452,15 +451,15 @@ impl UIPresenter where D: Device { value = new_value; } - origin = origin + Vector2I::new(0, BUTTON_TEXT_OFFSET); + origin = origin + vec2i(0, BUTTON_TEXT_OFFSET); for (segment_index, segment_label) in segment_labels.iter().enumerate() { let label_width = self.measure_text(segment_label); let offset = SEGMENT_SIZE / 2 - label_width / 2; self.draw_text(device, segment_label, - origin + Vector2I::new(offset, 0), + origin + vec2i(offset, 0), segment_index as u8 == value); - origin += Vector2I::new(SEGMENT_SIZE + 1, 0); + origin += vec2i(SEGMENT_SIZE + 1, 0); } value @@ -485,7 +484,7 @@ impl UIPresenter where D: Device { for (segment_index, segment_texture) in segment_textures.iter().enumerate() { let texture_width = device.texture_size(segment_texture).x(); - let offset = Vector2I::new(SEGMENT_SIZE / 2 - texture_width / 2, PADDING); + let offset = vec2i(SEGMENT_SIZE / 2 - texture_width / 2, PADDING); let color = if Some(segment_index as u8) == value { WINDOW_COLOR } else { @@ -493,7 +492,7 @@ impl UIPresenter where D: Device { }; self.draw_texture(device, origin + offset, segment_texture, color); - origin += Vector2I::new(SEGMENT_SIZE + 1, 0); + origin += vec2i(SEGMENT_SIZE + 1, 0); } clicked_segment @@ -506,7 +505,7 @@ impl UIPresenter where D: Device { segment_count: u8) -> Option { let widget_width = self.measure_segmented_control(segment_count); - let widget_rect = RectI::new(origin, Vector2I::new(widget_width, BUTTON_HEIGHT)); + let widget_rect = RectI::new(origin, vec2i(widget_width, BUTTON_HEIGHT)); let mut clicked_segment = None; if let Some(position) = self.event_queue.handle_mouse_down_in_rect(widget_rect) { @@ -521,15 +520,14 @@ impl UIPresenter where D: Device { self.draw_rounded_rect_outline(device, widget_rect, OUTLINE_COLOR); if let Some(value) = value { - let highlight_size = Vector2I::new(SEGMENT_SIZE, BUTTON_HEIGHT); + let highlight_size = vec2i(SEGMENT_SIZE, BUTTON_HEIGHT); let x_offset = value as i32 * SEGMENT_SIZE + (value as i32 - 1); self.draw_solid_rounded_rect(device, - RectI::new(origin + Vector2I::new(x_offset, 0), - highlight_size), + RectI::new(origin + vec2i(x_offset, 0), highlight_size), TEXT_COLOR); } - let mut segment_origin = origin + Vector2I::new(SEGMENT_SIZE + 1, 0); + let mut segment_origin = origin + vec2i(SEGMENT_SIZE + 1, 0); for next_segment_index in 1..segment_count { let prev_segment_index = next_segment_index - 1; match value { @@ -537,11 +535,11 @@ impl UIPresenter where D: Device { _ => { self.draw_line(device, segment_origin, - segment_origin + Vector2I::new(0, BUTTON_HEIGHT), + segment_origin + vec2i(0, BUTTON_HEIGHT), TEXT_COLOR); } } - segment_origin = segment_origin + Vector2I::new(SEGMENT_SIZE + 1, 0); + segment_origin += vec2i(SEGMENT_SIZE + 1, 0); } clicked_segment @@ -553,14 +551,11 @@ impl UIPresenter where D: Device { } let text_size = self.measure_text(string); - let window_size = Vector2I::new(text_size + PADDING * 2, TOOLTIP_HEIGHT); - let origin = rect.origin() - Vector2I::new(0, window_size.y() + PADDING); + let window_size = vec2i(text_size + PADDING * 2, TOOLTIP_HEIGHT); + let origin = rect.origin() - vec2i(0, window_size.y() + PADDING); self.draw_solid_rounded_rect(device, RectI::new(origin, window_size), WINDOW_COLOR); - self.draw_text(device, - string, - origin + Vector2I::new(PADDING, PADDING + FONT_ASCENT), - false); + self.draw_text(device, string, origin + vec2i(PADDING, PADDING + FONT_ASCENT), false); } } @@ -722,8 +717,8 @@ impl CornerRects { let size = device.texture_size(texture); CornerRects { upper_left: RectI::new(rect.origin(), size), - upper_right: RectI::new(rect.upper_right() - Vector2I::new(size.x(), 0), size), - lower_left: RectI::new(rect.lower_left() - Vector2I::new(0, size.y()), size), + upper_right: RectI::new(rect.upper_right() - vec2i(size.x(), 0), size), + lower_left: RectI::new(rect.lower_left() - vec2i(0, size.y()), size), lower_right: RectI::new(rect.lower_right() - size, size), } }