/* * Copyright 2023 Comcast Cable Communications Management, 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 * * http://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. * * SPDX-License-Identifier: Apache-2.0 */ import type { CoreShaderType } from '../../renderers/CoreShaderNode.js'; import type { Vec4 } from '../../renderers/webgl/internal/ShaderUtils.js'; import { validateArrayLength4, type PrefixedType } from '../utils.js'; /** * Properties of the {@link Border} shader */ export interface BorderProps { /** * Width of the border in pixels * * @default 0 */ w: number | [number, number, number, number]; /** * Color of the border in 0xRRGGBBAA * * @default 0xffffffff */ color: number; /** * Alignment of the border * * @default 'inside' */ align: number | 'inside' | 'center' | 'outside'; /** * Gap between node and border baseline. Default is 0. and generally edge of node) */ gap: number; /** * Top width */ top: number; /** * Right width */ right: number; /** * Bottom width */ bottom: number; /** * Left width */ left: number; } export function getBorderProps

( prefix?: P, ): PrefixedType { const pf = prefix && prefix.length > 0 ? `${prefix}-` : ''; const w = pf + 'w'; return { [w]: { default: [0, 0, 0, 0], resolve(value) { if (value !== undefined) { return validateArrayLength4(value); } return ([] as number[]).concat(this.default); }, }, [pf + 'color']: 0xffffffff, [pf + 'align']: { default: 0, //inside, resolve(value) { if (!isNaN(value)) { return value as number; } if (typeof value === 'string') { switch (value) { case 'inside': return 0; case 'center': return 0.5; case 'outside': return 1; } } return this.default; }, }, [pf + 'gap']: 0, [pf + 'top']: { default: 0, set(value, props) { (props[w] as Vec4)[0] = value; }, get(props) { return (props[w] as Vec4)[0]; }, }, [pf + 'right']: { default: 0, set(value, props) { (props[w] as Vec4)[1] = value; }, get(props) { return (props[w] as Vec4)[1]; }, }, [pf + 'bottom']: { default: 0, set(value, props) { (props[w] as Vec4)[2] = value; }, get(props) { return (props[w] as Vec4)[2]; }, }, [pf + 'left']: { default: 0, set(value, props) { (props[w] as Vec4)[3] = value; }, get(props) { return (props[w] as Vec4)[3]; }, }, } as PrefixedType; } type PlainBorderProps = PrefixedType; export const BorderTemplate: CoreShaderType = { props: getBorderProps() as PlainBorderProps, };