Source

EffectsNative.ts

import Module from "module";
import path from "path";
import { 
    FontMetrics, 
    FontMetricsMultiline
} from "./util/FontMetrics";
import {
    ParamsAdaptiveBlur,
    ParamsAdaptiveResize,
    ParamsAdaptiveSharpen,
    ParamsAdaptiveSharpenChannel,
    ParamsAdaptiveThreshold,
    ParamsAddBorder,
    ParamsAddRoundRectangle,
    ParamsAddSource,
    ParamsAddText,
    ParamsAnnotate,
    ParamsAttribute,
    ParamsBlur,
    ParamsColorize,
    ParamsColorMatrix,
    ParamsFloodFillAlpha,
    ParamsFloodFillColor,
    ParamsModulate,
    ParamsOpaque,
    ParamsProcess,
    ParamsRead
} from "./params"; 
import {
    IAutoThresholdMethod,
    IChannelType,
    ICompositeOperator,
    IDirectionType,
    IFillRule,
    IGravityType,
    ILineCap,
    ILineJoin,
    IMetricType,
    INoiseType,
    IPixelInterpolateMethod,
    IRenderingIntent,
    IVirtualPixelMethod
} from "./types";
import { Pos } from "./util/Pos"; 
import { Geometry } from "./util/Geometry";
import { Color } from "./util/Color"; 

const dirnameNative = import.meta.url; 

export function createRequire() {
    return Module.createRequire(path.dirname(dirnameNative));
} 

const requireNative = createRequire(); 
const binding = requireNative("./napi/GraphicsNative.node");

/**
 * @class
 */
export class EffectsNative {
    private _image: any;

    /**
     * 
     * @param {Buffer | string | any} value 
     * @constructor
     */
    constructor(value: Buffer | string | any) {
        if (value instanceof binding.EffectsNative) this._image = value; 
        else this._image = new binding.EffectsNative(value);
    }

    /**
     * 
     * @param {number} w 
     * @param {number} h 
     * @return {EffectsNative}
     */
    static createImage(w: number, h: number) {
        const data = Buffer.alloc(w * h * 3);
        return new EffectsNative(new binding.EffectsNative(w, h, "RGB", data));
    } 

    /**
     * @type {number}
     */
    get strokeWidth(): number { 
        return this._image.getStrokeWidth();
    }
    /**
     * @type {number}
     */
    get width(): number {
        return this._image.getWidth();
    }
    /**
     * @type {number}
     */
    get height(): number {
        return this._image.getHeight();
    }
    
    /**
     * @type {any}
     */
    get context() {
        return this._image;
    }

    /**
     * 
     * @param {ParamsAdaptiveBlur | number} value 
     * @param {number} sigma 
     */
    adaptiveBlur(value: ParamsAdaptiveBlur | number, sigma?: number): void { 
        if (arguments.length == 1) {
            this._image.adaptiveBlur(value);
        } else {
            this._image.adaptiveBlur(value, sigma);
        }
    }
    /**
     * 
     * @param {ParamsAdaptiveResize | number | string} value 
     * @param {number} height 
     * @param {number} x 
     * @param {number} y 
     */
    adaptiveResize(value: ParamsAdaptiveResize | number | string, height?: number, x?: number, y?: number): void {
        if (arguments.length == 1) {
            this._image.adaptiveResize(value);
        } else {
            this._image.adaptiveResize(value, height, x, y);
        }
    }
    /**
     * 
     * @param {ParamsAdaptiveSharpen | number} value 
     * @param {number} sigma 
     * @return {void}
     */
    adaptiveSharpen(value: ParamsAdaptiveSharpen | number, sigma?: number): void {
        if (arguments.length == 1) {
            this._image.adaptiveSharpen(value);
        } else {
            this._image.adaptiveSharpen(value, sigma);
        }
    }
    /**
     * 
     * @param {ParamsAdaptiveSharpenChannel | IChannelType} value 
     * @param {number} radius 
     * @param {number} sigma 
     * @return {void}
     */
    adaptiveSharpenChannel(value: ParamsAdaptiveSharpenChannel | IChannelType, radius?: number, sigma?: number): void {
        if (arguments.length == 1) {
            this._image.adaptiveSharpenChannel(value);
        } else {
            this._image.adaptiveSharpenChannel(value, radius, sigma);
        }
    }
    /**
     * 
     * @param {ParamsAdaptiveThreshold | number} value 
     * @param {number} height 
     * @param {number} bias 
     * @return {void}
     */
    adaptiveThreshold(value: ParamsAdaptiveThreshold | number, height?: number, bias?: number): void {
        if (arguments.length == 1) {
            this._image.adaptiveThreshold(value);
        } else {
            this._image.adaptiveThreshold(value, height, bias);
        }
    }
    /**
     * 
     * @param {number} sx 
     * @param {number} sy 
     * @param {number} rx 
     * @param {number} ry 
     * @param {number} tx 
     * @param {number} ty 
     * @return {void}
     */
    addAffine(sx: number, sy: number, rx: number, ry: number, tx: number, ty: number): void {
        this._image.addAffine(sx, sy, rx, ry, tx, ty);
    }
    /**
     * 
     * @param {number} startX 
     * @param {number} startY 
     * @param {number} endX 
     * @param {number} endY 
     * @param {number} startDegrees 
     * @param {number} endDegrees 
     * @return {void}
     */
    addArc(startX: number, startY: number, endX: number, endY: number, startDegrees: number, endDegrees: number): void {
        this._image.addArc(startX, startY, endX, endY, startDegrees, endDegrees);
    }
    /**
     * 
     * @param {ParamsAddBorder | number} value 
     * @param {number} height 
     * @param {number} x 
     * @param {number} y 
     * @return {void}
     */
    addBorder(value: ParamsAddBorder | number, height?: number, x?: number, y?: number): void {
        if (arguments.length == 1) {
            this._image.addBorder(value);
        } else {
            this._image.addBorder(value, height, x, y);
        }
    }
    /**
     * 
     * @param {number} originX 
     * @param {number} originY 
     * @param {number} perimX 
     * @param {number} perimY
     * @return {void}
     */
    addCircle(originX: number, originY: number, perimX: number, perimY: number): void {
        this._image.addCircle(originX, originY, perimX, perimY);
    }
    /**
     * 
     * @param {EffectsNative} source 
     * @return {void}
     */
    addFrame(source: EffectsNative): void { 
        if (source instanceof binding.EffectsNative) {
            this._image.addFrame(source);
        } else if (source instanceof EffectsNative) {
            this._image.addFrame(source.context);
        }
    }
    /**
     * 
     * @param {INoiseType} type 
     * @return {void}
     */
    addNoise(type: INoiseType): void {
        this._image.addNoise(type);
    }
    /**
     * 
     * @param {IChannelType} channel 
     * @param {INoiseType} type 
     * @return {void}
     */
    addNoiseChannel(channel: IChannelType, type: INoiseType): void { 
        this._image.addNoiseChannel(channel, type);
    }
    /**
     * 
     * @param {Pos[][]} polygons
     * @return {void}
     */
    addPolygon(...polygons: Pos[][]): void {
        this._image.addPolygon(...polygons);
    }
    /**
     * 
     * @param {ParamsAddRoundRectangle | number} value 
     * @param {number} upperLeftY 
     * @param {number} lowerRightX 
     * @param {number} lowerRightY 
     * @param {number} cornerWidth 
     * @param {number} cornerHeight 
     * @return {void}
     */
    addRoundRectangle(value: ParamsAddRoundRectangle | number, upperLeftY?: number, lowerRightX?: number, lowerRightY?: number, cornerWidth?: number, cornerHeight?: number): void {
        if (arguments.length == 1) {
            this._image.addRoundRectangle(value);
        } else {
            this._image.addRoundRectangle(value, upperLeftY, lowerRightX, lowerRightY, cornerWidth, cornerHeight); 
        }
    }
    /**
     * 
     * @param {ParamsAddSource<EffectsNative | any> | number} value 
     * @param {number} height 
     * @param {number} x 
     * @param {number} y 
     * @return {void}
     */
    addSource(value: ParamsAddSource<EffectsNative | any> | number, height?: number, x?: number, y?: number): void {
        if (arguments.length == 1) {
            this._image.addSource(value);
        } else {
            this._image.addSource(value, height, x, y);
        }
    }
    /**
     * 
     * @param {ParamsAddText} value 
     * @return {void}
     */
    addText(value: ParamsAddText): void {
        this._image.addText(value);
    }
    /**
     * 
     * @param {boolean} flag 
     * @return {void}
     */
    adjoin(flag: boolean): void {
        this._image.adjoin(flag);
    } 
    /**
     * 
     * @param {number} value
     * @param {number} sy 
     * @param {number} rx 
     * @param {number} ry 
     * @param {number} tx 
     * @param {number} ty 
     * @return {void}
     */
    affineTransform(value: number, sy: number, rx: number, ry: number, tx: number, ty: number): void {
        if (arguments.length == 1) {
            this._image.affineTransform(value);
        } else {
            this._image.affineTransform(value, sy, rx, ry, tx, ty);
        }
    }
    /**
     * 
     * @param {boolean | number} flag 
     * @return {void}
     */
    alpha(flag: boolean | number): void {
        this._image.alpha(flag);
    }
    /**
     * 
     * @param {number} delay 
     * @return {void}
     */
    animationDelay(delay: number): void {
        this._image.animationDelay(delay);
    }
    /**
     * 
     * @param {number} iterations 
     * @return {void}
     */
    animationIterations(iterations: number): void {
        this._image.animationIterations(iterations); 
    }
    /**
     * 
     * @param {ParamsAnnotate | string} value 
     * @param {IGravityType} gravity 
     * @return {void}
     */
    annotate(value: ParamsAnnotate | string, gravity?: IGravityType): void {
        if (arguments.length == 1) {
            this._image.annotate(value);
        } else {
            this._image.annotate(value, gravity);
        }
    }
    /**
     * 
     * @param {string} name 
     * @return {void}
     */
    artifact(name: string): void {
        this._image.artifact(name);
    }
    /**
     * 
     * @param {ParamsAttribute | string} key 
     * @param {string} value 
     * @return {void}
     */
    attribute(key: ParamsAttribute | string, value?: string): void {
        if (arguments.length == 1) {
            this._image.attribute(key);
        } else {
            this._image.attribute(key, value);
        }
    }
    /**
     * @return {void}
     */
    autoGamma(): void {
        this._image.autoGamma();
    }
    /**
     * 
     * @param {IChannelType} channel 
     * @return {void}
     */
    autoGammaChannel(channel: IChannelType): void {
        this._image.autoGammaChannel(channel);
    }
    /**
     * @return {void}
     */
    autoLevel(): void {
        this._image.autoLevel();
    }
    /**
     * 
     * @param {IChannelType} channel 
     * @return {void}
     */
    autoLevelChannel(channel: IChannelType): void {
        this._image.autoLevelChannel(channel);
    }
    /**
     * @return {void}
     */
    autoOrient(): void {
        this._image.autoOrient();
    }
    /**
     * 
     * @param {IAutoThresholdMethod} type 
     * @return {void}
     */
    autoThreshold(type: IAutoThresholdMethod): void {
        this._image.autoThreshold(type); 
    }
    /**
     * 
     * @param {string} color 
     * @return {void}
     */
    backgroundColor(color: string): void {
        this._image.backgroundColor(color);
    }
    /**
     * 
     * @param {string} name 
     * @return {void}
     */
    backgroundTexture(name: string): void {
        this._image.backgroundTexture(name);
    }
    /**
     * 
     * @param {string} threshold 
     * @return {void}
     */
    blackThreshold(threshold: string): void {
        this._image.blackThreshold(threshold);
    }
    /**
     * 
     * @param {IChannelType} channel 
     * @param {string} threshold 
     * @return {void}
     */
    blackThresholdChannel(channel: IChannelType, threshold: string): void {
        this._image.blackThresholdChannel(channel, threshold);
    }
    /**
     * 
     * @param {number} radius 
     * @return {void}
     */
    blueShift(radius?: number): void {
        this._image.blueShift(typeof(radius)=="number"?radius:2.5);
    }
    /**
     * 
     * @param {ParamsBlur | number} value 
     * @param {number} sigma 
     * @return {void}
     */
    blur(value: ParamsBlur | number, sigma?: number): void {
        if (arguments.length == 1) {
            this._image.blur(value);
        } else {
            this._image.blur(value, sigma);
        }
    }
    /**
     * 
     * @param {IChannelType} channel 
     * @param {number} radius 
     * @param {number} sigma 
     * @return {void}
     */
    blurChannel(channel: IChannelType, radius: number, sigma: number): void {
        this._image.blurChannel(channel, radius, sigma);
    }
    /**
     * 
     * @param {number | string} value
     * @param {number} height 
     * @param {number} x 
     * @param {number} y 
     * @return {void}
     */
    border(value: number | string, height?: number, x?: number, y?: number): void {
        if (arguments.length == 1) {
            this._image.border(value);
        } else {
            this._image.border(value, height, x, y);
        }
    }
    /**
     * 
     * @param {string} color 
     * @return {void}
     */
    borderColor(color: string): void {
        this._image.borderColor(color);
    }
    /**
     * 
     * @return {Geometry & { less: boolean, limitPixels: boolean }}
     */
    boundingBox(): Geometry & { less: boolean, limitPixels: boolean } {
        return this._image.boundingBox();
    }
    /**
     * 
     * @param {string} color 
     * @return {void}
     */
    boxColor(color: string): void {
        this._image.boxColor(color);
    }
    /**
     * 
     * @param {number} radius 
     * @param {number} sigma 
     * @param {number} lower 
     * @param {number} upper 
     * @return {void}
     */
    cannyEdge(radius?: number, sigma?: number, lower?: number, upper?: number): void {
        this._image.cannyEdge(radius, sigma, lower, upper);
    }
    /**
     * 
     * @param {string} cdl 
     * @return {void}
     */
    cdl(cdl: string): void {
        this._image.cdl(cdl);
    }
    /**
     * 
     * @param {IChannelType} channel 
     * @return {void}
     */
    channel(channel: IChannelType): void {
        this._image.channel(channel);
    }
    /**
     * 
     * @param {IChannelType} channel 
     * @param {number} depth 
     * @return {void}
     */
    channelDepth(channel: IChannelType, depth: number): void {
        this._image.channelDepth(channel, depth);
    }
    /**
     * 
     * @param {number} radius 
     * @param {number} sigma 
     * @return {void}
     */
    charcoal(radius: number, sigma: number): void {
        this._image.charcoal(radius, sigma);
    }
    /**
     * 
     * @param {IChannelType} channel 
     * @param {number} radius 
     * @param {number} sigma 
     * @return {void}
     */
    charcoalChannel(channel: IChannelType, radius: number, sigma: number): void {
        this._image.charcoalChannel(channel, radius, sigma);
    }
    /**
     * 
     * @param {string | number | Partial<Geometry & { value: string }>} value 
     * @param {number} height 
     * @param {number} x 
     * @param {number} y 
     * @return {void}
     */
    chop(value: string | number | Partial<Geometry & { value: string }>, height?: number, x?: number, y?: number): void {
        if (arguments.length == 1) {
            this._image.chop(value);
        } else {
            this._image.chop(value, height, x, y);
        }
    }
    /**
     * @return {void}
     */
    clamp(): void {
        this._image.clamp();
    }
    /**
     * 
     * @param {IChannelType} channel 
     * @return {void}
     */
    clampChannel(channel: IChannelType): void {
        this._image.clampChannel(channel);
    }
    /**
     * @return {void}
     */
    clip(): void {
        this._image.clip();
    }
    /**
     * 
     * @param {string} pathname 
     * @param {string} inside 
     * @return {void}
     */
    clipPath(pathname: string, inside: boolean): void {
        this._image.clipPath(pathname, inside);
    }
    /**
     * 
     * @param {EffectsNative | any} source 
     * @param {IPixelInterpolateMethod} pixel_interpolate
     * @return {void} 
     */
    clut(source: EffectsNative | any, pixel_interpolate: IPixelInterpolateMethod): void {
        if (source instanceof binding.EffectsNative) this._image.clut(source, pixel_interpolate);
        else if (source instanceof EffectsNative) this._image.clut(source.context, pixel_interpolate);
    }
    /**
     * 
     * @param {IChannelType} channel 
     * @param {EffectsNative | any} source 
     * @param {IPixelInterpolateMethod} pixel_interpolate 
     * @return {void}
     */
    clutChannel(channel: IChannelType, source: EffectsNative | any, pixel_interpolate: IPixelInterpolateMethod): void { 
        if (source instanceof binding.EffectsNative) this._image.clutChannel(channel, source, pixel_interpolate);
        else if (source instanceof EffectsNative) this._image.clutChannel(channel, source.context, pixel_interpolate);
    }
    /**
     * 
     * @param {number} fuzz 
     * @return {void}
     */
    colorFuzz(fuzz: number): void {
        this._image.colorFuzz(fuzz);
    }
    /**
     * 
     * @param {ParamsColorize | number} value 
     * @param {Partial<Color> | string} color 
     * @return {void}
     */
    colorize(value: ParamsColorize | number, color?: Partial<Color> | string): void {
        if (arguments.length == 0) {
            this._image.colorize(value);
        } else {
            this._image.colorize(value, color);
        }
    }
    /**
     * 
     * @param {ParamsColorMatrix | number} value 
     * @param {number[]} matrix 
     * @return {void}
     */
    colorMatrix(value: ParamsColorMatrix | number, matrix?: number[]): void {
        if (arguments.length == 1) {
            this._image.colorMatrix(value);
        } else {
            this._image.colorMatrix(value, matrix);
        }
    }
    /**
     * 
     * @param {EffectsNative | any} source 
     * @return {void}
     */
    compare(source: EffectsNative | any, metric?: IMetricType, distortion?: number[]): void {
        if (arguments.length == 1) {
            if (source instanceof binding.EffectsNative) this._image.compare(source); 
            else if (source instanceof EffectsNative) this._image.compare(source.context);
        } else {
            if (source instanceof binding.EffectsNative) this._image.compare(source, metric, distortion); 
            else if (source instanceof EffectsNative) this._image.compare(source.context, metric, distortion);
        }
    }
    /**
     * 
     * @param {ICompositeOperator} type 
     * @return {void}
     */
    compose(type: ICompositeOperator): void {
        this._image.compose(type);
    }
    /**
     * 
     * @param {"gravity" | "geometry"} type 
     * @param {EffectsNative | any} source 
     * @param {string} value
     * @return {void} 
     */
    composite(type: "gravity" | "geometry", source: EffectsNative | any, value: string): void { 
        if (source instanceof binding.EffectsNative) this._image.composite(type, source, value); 
        else if (source instanceof EffectsNative) this._image.composite(type, source.context, value);
    }
    /**
     * 
     * @param {number} sharpen 
     * @return {void} 
     */
    contrast(sharpen: number): void {
        this._image.contrast(sharpen);
    }
    /**
     * 
     * @param {number} blackPoint 
     * @param {number} whitePoint 
     * @return {void}
     */
    contrastStretch(blackPoint: number, whitePoint: number): void {
        this._image.contrastStretch(blackPoint, whitePoint);
    }
    /**
     * 
     * @param {IChannelType} channel 
     * @param {number} blackPoint 
     * @param {number} whitePoint
     * @return {void} 
     */
    contrastStretchChannel(channel: IChannelType, blackPoint: number, whitePoint: number): void {
        this._image.contrastStretchChannel(channel, blackPoint, whitePoint);
    }
    /**
     * 
     * @param {string | number | Partial<Geometry & { value: string }>} value 
     * @param {number} height 
     * @param {number} x 
     * @param {number} y 
     * @return {void}
     */
    crop(value: string | number | Partial<Geometry & { value: string }>, height?: number, x?: number, y?: number): void {
        if (arguments.length == 1) {
            this._image.crop(value);
        } else {
            this._image.crop(value, height, x, y);
        }
    }
    /**
     * 
     * @param {string} magick 
     * @param {string} key 
     * @param {boolean} flag 
     * @return {void}
     */
    defineSet(magick: string, key: string, flag?: boolean): void {
        this._image.defineSet(magick, key, flag);
    }
    /**
     * 
     * @param {string} magick 
     * @param {string} key 
     * @param {string} value 
     * @return {void}
     */
    defineValue(magick: string, key: string, value: string): void {
        this._image.defineValue(magick, key, value); 
    }
    /**
     * 
     * @param {string} title 
     * @return {void}
     */
    display(title: string): void {
        this._image.display(title);
    }
    /**
     * 
     * @param {string} passphrase 
     * @return {void}
     */
    encipher(passphrase: string): void {
        this._image.encipher(passphrase);
    }
    /**
     * @return {void}
     */
    enhance(): void {
        this._image.enhance();
    }
    /**
     * 
     * @param {string | number | Partial<Geometry & { value: string }>} value 
     * @param {number} height 
     * @param {number} x 
     * @param {number} y 
     * @return {void}
     */
    extent(value: string | number | Partial<Geometry & { value: string }>, height?: number, x?: number, y?: number): void {
        if (arguments.length == 1) {
            this._image.extent(value);
        } else {
            this._image.extent(value, height, x, y);
        }
    }
    /**
     * 
     * @param {string} color 
     * @return {void}
     */
    fillColor(color: string): void { 
        this._image.fillColor(color);
    }
    /**
     * 
     * @param {EffectsNative | any} source 
     * @return {void}
     */
    fillPattern(source: EffectsNative | any): void {
        if (source instanceof binding.EffectsNative) {
            this._image.fillPattern(source);
        } else if (source instanceof EffectsNative) {
            this._image.fillPattern(source.context);
        }
    }
    /**
     * 
     * @param {IFillRule} rule 
     * @return {void}
     */
    fillRule(rule: IFillRule): void {
        this._image.fillRule(rule);
    }
    /**
     * @return {void}
     */
    flip(): void {
        this._image.flip();
    }
    /**
     * 
     * @param {ParamsFloodFillAlpha | number} value 
     * @param {number} y 
     * @param {number} alpha 
     * @param {...args[]} args 
     * @return {void}
     */
    floodFillAlpha(value: ParamsFloodFillAlpha | number, y?: number, alpha?: number, ...args: any[]): void {
        if (arguments.length == 1) {
            this._image.floodFillAlpha(value);
        } else {
            this._image.floodFillAlpha(value, y, alpha, ...args);
        }
    }
    /**
     * 
     * @param {ParamsFloodFillColor | string} value 
     * @param {string} color 
     * @param {...args[]} args 
     * @return {void}
     */
    floodFillColor(value: ParamsFloodFillColor | string, color?: string, ...args: any[]): void {
        if (arguments.length == 1) {
            this._image.floodFillColor(value);
        } else {
            this._image.floodFillColor(value, color, ...args);
        }
    }
    /**
     * 
     * @param {string} point 
     * @param {EffectsNative | any} source 
     * @param {...args[]} args 
     * @return {void}
     */
    floodFillTexture(point: string, source: EffectsNative | any, ...args: any[]): void {
        if (source instanceof binding.EffectsNative) {
            this._image.floodFillTexture(point, source, ...args);
        } else if (source instanceof EffectsNative) {
            this._image.floodFillTexture(point, source.context, ...args);
        }
    }
    /**
     * 
     * @param {string} name 
     * @return {void}
     */
    font(name: string): void {
        this._image.font(name);
    }
    /**
     * 
     * @param {string} family 
     * @return {void}
     */
    fontFamily(family: string): void {
        this._image.fontFamily(family);
    }
    /**
     * 
     * @param {number} size 
     * @return {void}
     */
    fontPointsize(size: number): void {
        this._image.fontPointSize(size);
    }
    /**
     * 
     * @param style 
     * @return {void}
     */
    fontStyle(style: string): void {
        this._image.fontStyle(style);
    }
    /**
     * 
     * @return {FontMetrics}
     */
    fontTypeMetrics(): FontMetrics {
        return this._image.fontTypeMetrics();
    }
    /**
     * 
     * @return {FontMetricsMultiline}
     */
    fontTypeMetricsMultiline(): FontMetricsMultiline {
        return this._image.fontTypeMetricsMultiline();
    } 
    /**
     * 
     * @param {number} weight 
     * @return {void}
     */
    fontWeight(weight: number): void {
        this._image.fontWeight(weight);
    }
    /**
     * 
     * @param {string} expression 
     * @param {IChannelType} channel 
     * @return {void}
     */
    fx(expression: string, channel?: IChannelType): void {
        this._image.fx(expression, channel);
    }
    /**
     * 
     * @param {number} gamma 
     * @return {void}
     */
    gamma(gamma: number): void {
        this._image.gamma(gamma);
    }
    /**
     * @return {Buffer}
     */
    getPixels(): Buffer {
        return this._image.getPixels();
    }
    /**
     * 
     * @param {EffectsNative | any} source 
     * @return {void}
     */
    haldClut(source: EffectsNative | any): void {
        if (source instanceof binding.EffectsNative) {
            this._image.haldClut(source);
        } else if (source instanceof EffectsNative) {
            this._image.haldClut(source.context);
        }
    }
    /**
     * 
     * @param {number} radius 
     * @return {void}
     */
    implode(radius: number): void {
        this._image.implode(radius);
    }
    /**
     * 
     * @param {string} label 
     * @return {void}
     */
    label(label: string): void {
        this._image.label(label);
    }
    /**
     * 
     * @param {string | number | Partial<Geometry & { value: string }>} value 
     * @param {number} height 
     * @param {number} x 
     * @param {number} y 
     * @return {void}
     */
    liquid(value: string | number | Partial<Geometry & { value: string }>, height?: number, x?: number, y?: number): void {
        if (arguments.length == 1) {
            this._image.liquidRescale(value);
        } else {
            this._image.liquidRescale(value, height, x, y);
        }
    }
    /**
     * 
     * @param {number} radius 
     * @return {void}
     */
    medianFilter(radius: number): void {
        this._image.medianFilter(radius);
    }
    /**
     * @return {void}
     */
    modify(): void {
        this._image.modify();
    }
    /**
     * 
     * @param {ParamsModulate | number} value 
     * @param {number} saturation 
     * @param {number} hue 
     * @return {void}
     */
    modulate(value: ParamsModulate | number, saturation?: number, hue?: number): void {
        if (arguments.length == 1) {
            this._image.modulate(value);
        } else {
            this._image.modulate(value, saturation, hue);
        }
    }
    /**
     * 
     * @param {number} radius 
     * @param {number} sigma 
     * @param {number} angle 
     * @return {void}
     */
    motionBlur(radius: number, sigma: number, angle: number): void {
        this._image.motionBlur(radius, sigma, angle);
    }
    /**
     * 
     * @param {boolean} grayscale
     * @return {void}
     */
    negate(grayscale?: boolean): void {
        this._image.negate(grayscale);
    }
    /**
     * 
     * @param {IChannelType} channel 
     * @param {boolean} grayscale
     * @return {void} 
     */
    negateChannel(channel: IChannelType, grayscale?: boolean): void {
        this._image.negateChannel(channel, grayscale);
    }
    /**
     * 
     * @param {ParamsOpaque | string} value 
     * @param {string} pen 
     * @param {boolean} invert
     * @return {void} 
     */
    opaque(value: ParamsOpaque | string, pen?: string, invert?: boolean): void {
        if (arguments.length == 1) {
            this._image.opaque(value);
        } else {
            this._image.opaque(value, pen, invert);
        }
    }
    /**
     * 
     * @param {string} thresholdMap 
     * @return {void}
     */
    orderedDither(thresholdMap: string): void {
        this._image.orderedDither(thresholdMap);
    }
    /**
     * 
     * @param {IChannelType} channel 
     * @param {string} thresholdMap
     * @return {void} 
     */
    orderedDitherChannel(channel: IChannelType, thresholdMap: string): void {
        this._image.orderedDitherChannel(channel, thresholdMap);
    }
    /**
     * 
     * @param {number} epsilon 
     * @return {void}
     */
    perceptible(epsilon: number): void {
        this._image.perceptible(epsilon);
    }
    /**
     * 
     * @param {IChannelType} channel 
     * @param {number} epsilon 
     * @return {void}
     */
    perceptibleChannel(channel: IChannelType, epsilon: number): void {
        this._image.perceptibleChannel(channel, epsilon);
    }
    /**
     * 
     * @param {ParamsProcess | string} value 
     * @param {string[]} args 
     * @return {void}
     */
    process(value: ParamsProcess | string, args: string[]): void {
        if (arguments.length == 1) {
            this._image.process(value);
        } else {
            this._image.process(value, args);
        }
    }
    /**
     * 
     * @param {Buffer} pixels 
     * @return {void}
     */
    putPixels(pixels: Buffer): void {
        this._image.putPixels(pixels);
    }
    /**
     * 
     * @param {number} quality 
     * @return {void}
     */
    quality(quality: number): void {
        this._image.quality(quality);
    }
    /**
     * 
     * @param {boolean} measureError 
     * @return {void}
     */
    quantize(measureError: boolean): void {
        this._image.quantize(measureError);
    }
    /**
     * 
     * @param {ParamsRead | number} value 
     * @param {number} height 
     * @param {string} format 
     * @param {Buffer} buffer
     * @return {void} 
     */
    read(value: ParamsRead | number, height?: number, format?: string, buffer?: Buffer): void {
        if (arguments.length == 1) {
            this._image.read(value);
        } else {
            this._image.read(value, height, format, buffer);
        }
    }
    /**
     * 
     * @param {IRenderingIntent} type 
     * @return {void}
     */
    renderingIntent(type: IRenderingIntent): void {
        this._image.renderingIntent(type);
    }
    /**
     * @return {void}
     */
    repage(): void {
        this._image.repage();
    }
    /**
     * 
     * @param {string | number | Partial<Geometry & { value: string }>} value 
     * @param {number} height 
     * @param {number} x 
     * @param {number} y 
     * @return {void}
     */
    resize(value: string | number | Partial<Geometry & { value: string }>, height?: number, x?: number, y?: number): void {
        if (arguments.length == 1) {
            this._image.resize(value);
        } else {
            this._image.resize(value, height, x, y);
        }
    }
    /**
     * 
     * @param {string | number | Partial<Geometry & { value: string }>} value 
     * @param {number} height 
     * @param {number} x 
     * @param {number} y 
     * @return {void}
     */
    roll(value: string | number | Partial<Geometry & { value: string }>, height?: number, x?: number, y?: number): void {
        if (arguments.length == 1) {
            this._image.roll(value);
        } else {
            this._image.roll(value, height, x, y);
        }
    }
    /**
     * 
     * @param {number} degrees 
     * @return {void}
     */
    rotate(degrees: number): void {
        degrees %= 360;
        this._image.rotate(degrees);
    }
    /**
     * 
     * @param {number} angle 
     * @return {void}
     */
    rotationalBlur(angle: number): void {
        this._image.angle(angle);
    }
    /**
     * 
     * @param {IChannelType} channel 
     * @param {number} angle 
     * @return {void}
     */
    rotationalBlurChannel(channel: IChannelType, angle: number): void {
        this._image.rotationalBlurChannel(channel, angle);
    }
    /**
     * 
     * @param {string | number | Partial<Geometry & { value: string }>} value 
     * @param {number} height 
     * @param {number} x 
     * @param {number} y 
     * @return {void}
     */
    scale(value: string | number | Partial<Geometry & { value: string }>, height?: number, x?: number, y?: number): void {
        if (arguments.length == 1) {
            this._image.scale(value);
        } else {
            this._image.scale(value, height, x, y);
        }
    }
    /**
     * 
     * @param {string | number | Partial<Geometry & { value: string }>} value 
     * @param {number} height 
     * @param {number} x 
     * @param {number} y 
     * @return {void}
     */
    size(value: string | number | Partial<Geometry & { value: string }>, height?: number, x?: number, y?: number): void {
        if (arguments.length == 1) {
            this._image.size(value);
        } else {
            this._image.size(value, height, x, y);
        }
    }
    /**
     * 
     * @param {...any[]} args 
     * @return {void}
     */
    splice(...args: any[]): void {
        this._image.splice(...args);
    }
    /**
     * 
     * @param {EffectsNative | any} source 
     * @return {void}
     */
    stereo(source: EffectsNative | any): void {
        if (source instanceof binding.EffectsNative) {
            this._image.stereo(source);
        } else if (source instanceof EffectsNative) {
            this._image.stereo(source.context);
        }
    }
    /**
     * 
     * @param {boolean} flag 
     * @return {void}
     */
    strokeAntiAlias(flag?: boolean): void {
        this._image.strokeAntiAlias(flag);
    }
    /**
     * 
     * @param {string} color 
     * @return {void}
     */
    strokeColor(color: string): void {
        this._image.strokeColor(color);
    }
    /**
     * 
     * @param {number[]} dash_array 
     * @return {void}
     */
    strokeDashArray(dash_array: number[]): void {
        this._image.strokeDashArray(dash_array);
    }
    /**
     * 
     * @param {number} dash_offset 
     * @return {void}
     */
    strokeDashOffset(dash_offset: number): void {
        this._image.strokeDashOffset(dash_offset);
    }
    /**
     * 
     * @param {ILineCap} lineCap 
     * @return {void}
     */
    strokeLineCap(lineCap: ILineCap): void {
        this._image.strokeLineCap(lineCap);
    } 
    /**
     * 
     * @param {ILineJoin} lineJoin 
     * @return {void}
     */
    strokeLineJoin(lineJoin: ILineJoin): void {
        this._image.strokeLineJoin(lineJoin);
    }
    /**
     * 
     * @param {number} miter_limit 
     * @return {void}
     */
    strokeMiterLimit(miter_limit: number): void {
        this._image.strokeMiterLimit(miter_limit);
    }
    /**
     * 
     * @param {EffectsNative | any} source 
     * @return {void}
     */
    strokePattern(source: EffectsNative | any): void {
        if (source instanceof binding.EffectsNative) {
            this._image.strokePattern(source);
        } else if (source instanceof EffectsNative) {
            this._image.strokePattern(source.context);
        }
    }
    /**
     * 
     * @param {number} sub_image 
     * @return {void}
     */
    subImage(sub_image: number): void {
        this._image.subImage(sub_image);
    }
    /**
     * 
     * @param {number} sub_range 
     * @return {void}
     */
    subRange(sub_range: number): void {
        this._image.subRange(sub_range);
    }
    /**
     * 
     * @param {boolean} flag 
     * @return {void}
     */
    textAntiAlias(flag: boolean): void {
        this._image.textAntiAlias(flag);
    } 
    /**
     * 
     * @param {IDirectionType} direction 
     * @return {void}
     */
    textDirection(direction: IDirectionType): void {
        this._image.textDirection(direction);
    }
    /**
     * 
     * @param {IGravityType} gravity 
     * @return {void}
     */
    textGravity(gravity: IGravityType): void {
        this._image.textGravity(gravity);
    }
    /**
     * 
     * @param {number} spacing 
     * @return {void}
     */
    textInterlineSpacing(spacing: number): void {
        this._image.textInterlineSpacing(spacing);
    }
    /**
     * 
     * @param {number} spacing 
     * @return {void}
     */
    textInterwordSpacing(spacing: number): void {
        this._image.textInterwordSpacing(spacing);
    } 
    /**
     * 
     * @param {number} kerning 
     * @return {void}
     */
    textKerning(kerning: number): void {
        this._image.textKerning(kerning);
    }
    /**
     * 
     * @param {string} color 
     * @return {void}
     */
    textUnderColor(color: string): void {
        this._image.textUnderColor(color);
    }
    /**
     * 
     * @param {EffectsNative | any} source 
     * @return {void}
     */
    texture(source: EffectsNative | any): void {
        if (source instanceof binding.EffectsNative) {
            this._image.texture(source);
        } else if (source instanceof EffectsNative) {
            this._image.texture(source.context);
        }
    }
    /**
     * 
     * @param {string | number | Partial<Geometry & { value: string }>} value 
     * @param {number} height 
     * @param {number} x 
     * @param {number} y 
     * @return {void}
     */
    thumbnail(value: string | number | Partial<Geometry & { value: string }>, height?: number, x?: number, y?: number): void {
        if (arguments.length == 1) {
            this._image.thumbnail(value);
        } else {
            this._image.thumbnail(value, height, x, y);
        }
    }
    /**
     * 
     * @param {number} opacity 
     * @return {void}
     */
    tint(opacity: number): void {
        this._image.tint(opacity);
    }
    /**
     * 
     * @param {string} format 
     * @return {string}
     */
    toBase64(format?: string): string {
        return this._image.toBase64(format);
    }
    /**
     * 
     * @param {string} format 
     * @return {Buffer}
     */
    toBuffer(format?: string): Buffer {
        return this._image.toBuffer(format);
    }
    /**
     * 
     * @param {number} x 
     * @param {number} y 
     * @return {void}
     */
    transformOrigin(x: number, y: number): void {
        this._image.transformOrigin(x, y);
    }
    /**
     * @return {void}
     */
    transformReset(): void {
        this._image.transformReset();
    }
    /**
     * 
     * @param {number} angle 
     * @return {void}
     */
    transformRotation(angle: number): void {
        this._image.transformRotation(angle);
    }
    /**
     * 
     * @param {number} sx 
     * @param {number} sy 
     * @return {void}
     */
    transformScale(sx: number, sy: number): void {
        this._image.transformScale(sx, sy);
    }
    /**
     * 
     * @param {number} x 
     * @return {void}
     */
    transformSkewX(x: number): void {
        this._image.transformSkewX(x);
    }
    /**
     * 
     * @param {number} y 
     * @return {void}
     */
    transformSkewY(y: number): void {
        this._image.transformSkewY(y);
    }
    /**
     * 
     * @param {string} color 
     * @param {boolean} inverse
     * @return {void} 
     */
    transparent(color: string, inverse?: boolean): void {
        this._image.transparent(color, inverse);
    }
    /**
     * 
     * @param {string} low 
     * @param {string} high
     * @return {void} 
     */
    transparentChroma(low: string, high: string): void {
        this._image.transparentChroma(low, high);
    }
    /**
     * @return {void}
     */
    transpose(): void {
        this._image.transpose();
    }
    /**
     * @return {void}
     */
    transverse(): void {
        this._image.transverse();
    }
    /**
     * @return {void}
     */
    trim(): void {
        this._image.trim();
    }
    /**
     * 
     * @param {number} radius 
     * @param {number} sigma 
     * @param {number} amount 
     * @param {number} threshold
     * @return {void} 
     */
    unsharpmask(radius: number, sigma: number, amount: number, threshold: number): void {
        this._image.unsharpmask(radius, sigma, amount, threshold);
    }
    /**
     * 
     * @param {IChannelType} channel 
     * @param {number} radius 
     * @param {number} sigma 
     * @param {number} amount 
     * @param {number} threshold 
     * @return {void}
     */
    unsharpmaskChannel(channel: IChannelType, radius: number, sigma: number, amount: number, threshold: number): void {
        this._image.unsharpmaskChannel(channel, radius, sigma, amount, threshold);
    }
    /**
     * 
     * @param {boolean} flag 
     * @return {void}
     */
    verbose(flag: boolean): void {
        this._image.verbose(flag);
    }
    /**
     * 
     * @param {number} radius 
     * @param {number} sigma 
     * @param {number} x 
     * @param {number} y 
     * @return {void}
     */
    vignette(radius: number, sigma: number, x: number, y: number): void {
        this._image.vignette(radius, sigma, x, y);
    }
    /**
     * 
     * @param {IVirtualPixelMethod} method 
     * @return {void}
     */
    virtualPixel(method: IVirtualPixelMethod): void {
        this._image.virtualPixelMethod(method);
    }
    /**
     * 
     * @param {number} amplitude 
     * @param {number} wavelength
     * @return {void} 
     */
    wave(amplitude?: number, wavelength?: number): void {
        this._image.wave(amplitude, wavelength);
    }
    /**
     * 
     * @param {number} threshold 
     * @param {number} softness 
     * @return {void}
     */
    waveletDenoise(threshold: number, softness: number): void {
        this._image.waveletDenoise(threshold, softness);
    }
    /**
     * 
     * @param {string} threshold 
     * @return {void}
     */
    whiteThreshold(threshold: string): void {
        this._image.whiteThreshold(threshold);
    }
    /**
     * 
     * @param {IChannelType} channel 
     * @param {string} threshold
     * @return {void} 
     */
    whiteThresholdChannel(channel: IChannelType, threshold: string): void {
        this._image.whiteThresholdChannel(channel, threshold);
    }
    /**
     * 
     * @param {string} path 
     * @param {string} format
     * @return {void} 
     */
    write(path: string, format?: string): void {
        this._image.write(path, format);
    }
    /**
     * 
     * @param {string} path 
     * @return {void}
     */
    writeFrames(path: string): void {
        this._image.writeFrames(path);
    }
    /**
     * 
     * @param {string | number | Partial<Geometry & { value: string }>} value 
     * @param {number} height 
     * @param {number} x 
     * @param {number} y 
     * @return {void}
     */
    zoom(value: string | number | Partial<Geometry & { value: string }>, height?: number, x?: number, y?: number): void {
        if (arguments.length == 1) {
            this._image.zoom(value);
        } else {
            this._image.zoom(value, height, x, y);
        }
    }
}