mirror of
https://github.com/italicsjenga/vello.git
synced 2025-01-11 04:51:32 +11:00
60 lines
1.8 KiB
GLSL
60 lines
1.8 KiB
GLSL
|
// 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;
|
||
|
}
|