// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview Definitions for export-safe ink.Canvas wrapper.
*
* This file defines types and an interface, drawings.Canvas, that are safe for
* export and satisfy the usage in the Chrome PDF annotation mode.
*
* See
* https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/resources/pdf/ink/ink_api.js
* for usage.
*/
declare namespace drawings {
/**
* A simple rectangle type. The coordinate system depends on context.
*/
export interface Box {
left: number;
top: number;
right: number;
bottom: number;
}
/**
* A PointerEvent-like record type that can be used to pass PointerEvents or
* an equivalent object with adjusted fields to the Ink engine.
*
* Ink depends on the timestamps of events and offsetX/Y, none of which can be
* set in the synthetic PointerEvent constructor.
*/
export interface InputEvent {
type: string;
timeStamp: number;
pointerType: string;
pointerId: number;
offsetX: number;
offsetY: number;
pressure: number;
button: number;
buttons: number;
}
/**
* Tool types supported in the Ink engine.
*
* See http://go/ink-tools for details on each tool.
*
* Note: These values map to the AnnotationTool definition in Chromium.
*/
enum ToolType {
MARKER = 'marker',
PEN = 'pen',
HIGHLIGHTER = 'highlighter',
ERASER = 'eraser',
}
export interface UndoState {
canUndo: boolean;
canRedo: boolean;
}
interface ToolParams {
tool: ToolType|string;
color?: string;
size?: number;
}
/**
* The main interface to Ink.
*
* Many of these functions ultimately delegate to C++ compiled to WebAssembly.
* The WebAssembly module depends on global state, thus it is only safe to
* have one instance at a time.
*
* Use the static execute function to get an instance of the class.
*/
export interface Canvas {
/**
* Notifies the attached listener when the undo/redo state changes.
*/
addUndoRedoListener(listener: (undoState: UndoState) => void): void;
/**
* Sets the PDF to edit in the Ink engine. This resets any existing
* annotations, the camera, and any other state in the engine.
*/
setPDF(buffer: ArrayBuffer|Uint8Array): Promise<void>;
/**
* Returns a copy of the currently-edited PDF with the Ink annotations
* serialized into it.
*/
getPDF(): Promise<Uint8Array>;
/**
* Returns the currently-edited PDF with the Ink annotations serialized into
* it. This destructively moves the PDF out of the Ink engine, and the
* engine should not be issued any further strokes or functions calls until
* setPDF is called again.
*/
getPDFDestructive(): Promise<Uint8Array>;
/**
* Set the camera to the provided box in PDF coordinates.
*/
setCamera(camera: Box): void;
/**
* Set the tool parameters in the Ink engine.
*
* See AnnotationTool in Chromium.
*/
setTool({tool, color, size}: ToolParams): void;
/**
* Returns a Promise that is resolved when all previous asynchronous engine
* operations are completed. Use this prior to calling getPDF to ensure all
* Ink strokes are serialized.
*/
flush(): Promise<void>;
/**
* Returns a Promise that is resolved when no new frames will be requested.
*/
waitForZeroFps(): Promise<void>;
/**
* Set the out of bounds color drawn around the PDF and between pages.
*/
setOutOfBoundsColor(color: string): void;
/**
* Set the image used as the page border around each page. Must be a data
* or Object URL to a nine-patch PNG image.
*/
setBorderImage(url: string): void;
/**
* Set the page layout to vertical (default) and the given spacing.
*/
setVerticalPageLayout(spacing: number): void;
/**
* Dispatch the given PointerEvent-like to the Ink engine.
*
* This will cause the engine to draw a line, erase, etc. depending on the
* current tool parameters. Note that the Ink engine depends on the
* timestamp when processing events, but synthetic PointerEvents have the
* timestamp set to the creation time and can't be changed. Instead
* dispatch an object literal with the same fields with the desired
* timestamp.
*/
dispatchInput(event: InputEvent): void;
/** Undo the most recent operation. */
undo(): void;
/** Redo the last undone operation. */
redo(): void;
}
// Workaround for TypeScript's lack of support on static methods on
// interfaces. https://github.com/microsoft/TypeScript/issues/13462
export namespace Canvas {
/**
* Factory function for the Canvas instance.
*
* @param parent Element to render the canvas into.
*/
function execute(parent: Element): Promise<Canvas>;
}
}