/** * BitmapBuilder: Fluent builder for raster bitmap operations * * All operations are eager (applied immediately) and return new builder instances */ import { type Gradient } from "../raster/gradient.ts"; import { type Bitmap, PixelMode, type RasterizedGlyph } from "../raster/types.ts"; import type { Matrix2D, Matrix3x3 } from "../render/outline-transform.ts"; /** * BitmapBuilder provides a fluent interface for bitmap manipulations */ export declare class BitmapBuilder { private readonly _bitmap; private readonly _bearingX; private readonly _bearingY; private constructor(); /** * Create from existing bitmap */ static fromBitmap(bitmap: Bitmap): BitmapBuilder; /** * Create from existing bitmap with bearing info */ static fromBitmapWithBearing(bitmap: Bitmap, bearingX: number, bearingY: number): BitmapBuilder; /** * Create from rasterized glyph result */ static fromRasterizedGlyph(glyph: RasterizedGlyph): BitmapBuilder; /** * Create empty bitmap */ static create(width: number, height: number, pixelMode?: PixelMode): BitmapBuilder; /** * Create gradient bitmap */ static fromGradient(width: number, height: number, gradient: Gradient): BitmapBuilder; /** * Gaussian blur */ blur(radius: number): BitmapBuilder; /** * Box blur (faster, less smooth) */ boxBlur(radius: number): BitmapBuilder; /** * Cascade blur (fast for large radii, O(1) per pixel) */ cascadeBlur(radiusX: number, radiusY?: number): BitmapBuilder; /** * Adaptive blur (auto-selects best algorithm based on radius) */ adaptiveBlur(radiusX: number, radiusY?: number): BitmapBuilder; /** * Fast Gaussian blur using cascade algorithm * Recommended for large radii (> 3 pixels) */ fastBlur(radius: number): BitmapBuilder; /** * Embolden (dilate) bitmap */ embolden(xStrength: number, yStrength?: number): BitmapBuilder; /** * Embolden bitmap and update bearing to avoid clipping */ emboldenWithBearing(xStrength: number, yStrength?: number): BitmapBuilder; /** * Apply 2D affine transform to bitmap (bearing-aware) */ transform2D(matrix: Matrix2D, options?: { offsetX26?: number; offsetY26?: number; }): BitmapBuilder; /** * Apply 3D perspective transform to bitmap (bearing-aware) */ transform3D(matrix: Matrix3x3, options?: { offsetX26?: number; offsetY26?: number; }): BitmapBuilder; /** * Shear bitmap horizontally (synthetic italic) */ shearX(amount: number, options?: { offsetX26?: number; offsetY26?: number; }): BitmapBuilder; /** * Shear bitmap vertically */ shearY(amount: number, options?: { offsetX26?: number; offsetY26?: number; }): BitmapBuilder; /** * Shift bitmap position */ shift(dx: number, dy: number): BitmapBuilder; /** * Resize with nearest-neighbor interpolation */ resize(width: number, height: number): BitmapBuilder; /** * Resize with bilinear interpolation (smoother, better for downsampling) */ resizeBilinear(width: number, height: number): BitmapBuilder; /** * Pad bitmap with empty space */ pad(left: number, top: number, right: number, bottom: number): BitmapBuilder; pad(all: number): BitmapBuilder; /** * Measure ascent/descent from bitmap coverage */ measure(): { ascent: number; descent: number; }; /** * Get raster metrics for this bitmap (includes ascent/descent) */ metrics(): { width: number; height: number; bearingX: number; bearingY: number; ascent: number; descent: number; }; /** * Expand raster metrics for blur/border/shadow padding */ expandMetrics(options: { blur?: number; be?: number; border?: number; shadowX?: number; shadowY?: number; }): { width: number; height: number; bearingX: number; bearingY: number; ascent: number; descent: number; padLeft: number; padRight: number; padTop: number; padBottom: number; }; /** * Alpha blend another bitmap onto this one at position */ blend(other: BitmapBuilder | Bitmap, x: number, y: number, opacity?: number): BitmapBuilder; /** * Composite another bitmap using Porter-Duff "over" operation */ composite(other: BitmapBuilder | Bitmap, x?: number, y?: number): BitmapBuilder; /** * Additive blend: result = clamp(this + other, 0, 255) */ add(other: BitmapBuilder | Bitmap, x?: number, y?: number): BitmapBuilder; /** * Subtractive blend: result = clamp(this - other, 0, 255) */ subtract(other: BitmapBuilder | Bitmap, x?: number, y?: number): BitmapBuilder; /** * Multiplicative blend: result = (this * other) / 255 */ multiply(other: BitmapBuilder | Bitmap, x?: number, y?: number): BitmapBuilder; /** * Maximum blend: result = max(this, other) */ max(other: BitmapBuilder | Bitmap, x?: number, y?: number): BitmapBuilder; /** * Convert to different pixel mode */ convert(targetMode: PixelMode): BitmapBuilder; /** * Get RGBA pixel array (for canvas ImageData, WebGL textures) */ toRGBA(): Uint8Array; /** * Get grayscale array */ toGray(): Uint8Array; /** * Get raw bitmap (cloned) */ toBitmap(): Bitmap; /** * Get bitmap with bearing info */ toRasterizedGlyph(): RasterizedGlyph; /** * Clone this builder */ clone(): BitmapBuilder; /** * Get bitmap width */ get width(): number; /** * Get bitmap height (rows) */ get height(): number; /** * Get pixel mode */ get pixelMode(): PixelMode; /** * Get horizontal bearing */ get bearingX(): number; /** * Get vertical bearing */ get bearingY(): number; }