// Copyright 2022 Google LLC // // 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. struct TagMonoid { trans_ix: u32, pathseg_ix: u32, pathseg_offset: u32, // Note: piet-gpu has linewidth and path, but not needed here } let PATH_TAG_SEG_TYPE = 3u; let PATH_TAG_LINETO = 1u; let PATH_TAG_QUADTO = 2u; let PATH_TAG_CUBICTO = 3u; let PATH_TAG_F32 = 8u; let PATH_TAG_PATH = 0x10u; let PATH_TAG_TRANSFORM = 0x20u; fn tag_monoid_identity() -> TagMonoid { var c: TagMonoid; c.trans_ix = 0u; c.pathseg_ix = 0u; c.pathseg_offset = 0u; return c; } fn combine_tag_monoid(a: TagMonoid, b: TagMonoid) -> TagMonoid { var c: TagMonoid; c.trans_ix = a.trans_ix + b.trans_ix; c.pathseg_ix = a.pathseg_ix + b.pathseg_ix; c.pathseg_offset = a.pathseg_offset + b.pathseg_offset; return c; } fn reduce_tag(tag_word: u32) -> TagMonoid { var c: TagMonoid; let point_count = tag_word & 0x3030303u; c.pathseg_ix = countOneBits((point_count * 7u) & 0x4040404u); c.trans_ix = countOneBits(tag_word & (PATH_TAG_TRANSFORM * 0x1010101u)); let n_points = point_count + ((tag_word >> 2u) & 0x1010101u); var a = n_points + (n_points & (((tag_word >> 3u) & 0x1010101u) * 15u)); a += a >> 8u; a += a >> 16u; c.pathseg_offset = a & 0xffu; return c; }