import type { Fn2 } from "@thi.ng/api";
import type { FloatTerm, Vec4Sym } from "@thi.ng/shader-ast";
/**
 * Higher-order Porter-Duff alpha compositing operator. See
 * [thi.ng/porter-duff](https://thi.ng/porter-duff) for reference. Returns an
 * optimized AST function which accepts 2 RGBA colors (vec4) and returns blended
 * & clamped result (also a vec4).
 *
 * @remarks
 * All built-in PD operators are defined via this HOF. The two given coefficient
 * functions are used to extract blending coefficients for src/dest colors and
 * are called with the alpha components of both colors.
 *
 * - `blendSrcOver(src, dest)`
 * - `blendDestOver(src, dest)`
 * - `blendSrcIn(src, dest)`
 * - `blendDestIn(src, dest)`
 * - `blendSrcOut(src, dest)`
 * - `blendDestOut(src, dest)`
 * - `blendSrcAtop(src, dest)`
 * - `blendDestAtop(src, dest)`
 * - `blendXor(src, dest)`
 * - `blendPlus(src, dest)`
 *
 * Optimization only happens for cases where either `fa` and/or `fb` are
 * {@link ZERO} or {@link ONE}.
 *
 * *IMPORTANT*: Both colors MUST be use pre-multiplied alpha for correct
 * results. If needed, use {@link premultiplyAlpha} and
 * {@link postmultiplyAlpha}.
 *
 * @param name - function name
 * @param fa - src coeff fn
 * @param fb - dest coeff fn
 */
export declare const porterDuff: (name: string, fa: Fn2<FloatTerm, FloatTerm, FloatTerm>, fb: Fn2<FloatTerm, FloatTerm, FloatTerm>) => import("@thi.ng/shader-ast").TaggedFn2<"vec4", "vec4", "vec4">;
/**
 * Multiplies RGB channels by alpha. Returns `vec4(col.r*col.a, col.g*col.a,
 * col.b*col.a, col.a)`. See {@link postmultiplyAlpha} for reverse op.
 *
 * @param col
 */
export declare const premultiplyAlpha: (col: Vec4Sym) => import("@thi.ng/shader-ast").Lit<"vec4">;
/**
 * Divides RGB channels by alpha. Returns `vec4(col.r/col.a, col.g/col.a,
 * col.b/col.a, col.a)`. See {@link premultiplyAlpha} for reverse op.
 *
 * @param col
 */
export declare const postmultiplyAlpha: (col: Vec4Sym) => import("@thi.ng/shader-ast").Lit<"vec4">;
export declare const ZERO: () => import("@thi.ng/shader-ast").Lit<"float">;
export declare const ONE: () => import("@thi.ng/shader-ast").Lit<"float">;
export declare const A: (a: FloatTerm) => FloatTerm;
export declare const B: (_: FloatTerm, b: FloatTerm) => FloatTerm;
export declare const ONE_MINUS_A: (a: FloatTerm) => import("@thi.ng/shader-ast").Op2<"float">;
export declare const ONE_MINUS_B: (_: FloatTerm, b: FloatTerm) => import("@thi.ng/shader-ast").Op2<"float">;
export declare const blendSrcOver: import("@thi.ng/shader-ast").TaggedFn2<"vec4", "vec4", "vec4">;
export declare const blendDestOver: import("@thi.ng/shader-ast").TaggedFn2<"vec4", "vec4", "vec4">;
export declare const blendSrcIn: import("@thi.ng/shader-ast").TaggedFn2<"vec4", "vec4", "vec4">;
export declare const blendDestIn: import("@thi.ng/shader-ast").TaggedFn2<"vec4", "vec4", "vec4">;
export declare const blendSrcOut: import("@thi.ng/shader-ast").TaggedFn2<"vec4", "vec4", "vec4">;
export declare const blendDestOut: import("@thi.ng/shader-ast").TaggedFn2<"vec4", "vec4", "vec4">;
export declare const blendSrcAtop: import("@thi.ng/shader-ast").TaggedFn2<"vec4", "vec4", "vec4">;
export declare const blendDestAtop: import("@thi.ng/shader-ast").TaggedFn2<"vec4", "vec4", "vec4">;
export declare const blendXor: import("@thi.ng/shader-ast").TaggedFn2<"vec4", "vec4", "vec4">;
export declare const blendPlus: import("@thi.ng/shader-ast").TaggedFn2<"vec4", "vec4", "vec4">;
//# sourceMappingURL=porter-duff.d.ts.map