// Copyright 2022 The piet-gpu authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // Also licensed under MIT license, at your choice. use super::geometry::{Point, Rect}; /// Action of a path element. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum Verb { MoveTo, LineTo, QuadTo, CurveTo, Close, } /// Element of a path represented by a verb and its associated points. #[derive(Copy, Clone, PartialEq, Debug)] pub enum Element { MoveTo(Point), LineTo(Point), QuadTo(Point, Point), CurveTo(Point, Point, Point), Close, } impl Element { /// Returns the verb that describes the action of the path element. pub fn verb(&self) -> Verb { match self { Self::MoveTo(..) => Verb::MoveTo, Self::LineTo(..) => Verb::LineTo, Self::QuadTo(..) => Verb::QuadTo, Self::CurveTo(..) => Verb::CurveTo, Self::Close => Verb::Close, } } } impl Rect { pub fn elements(&self) -> impl Iterator + Clone { let elements = [ Element::MoveTo((self.min.x, self.min.y).into()), Element::LineTo((self.max.x, self.min.y).into()), Element::LineTo((self.max.x, self.max.y).into()), Element::LineTo((self.min.x, self.max.y).into()), Element::Close, ]; (0..5).map(move |i| elements[i]) } }