/** * Absolute point placement for spreadsheet drawings (charts, images). * * Public `top` / `left` are points from the sheet origin (row 1 / column A), * matching Syncfusion XlsIO `IShape.Top` / `IShape.Left`. Storage remains the * DrawingML `xdr:from` marker: 0-based `col`/`row` plus `colOff`/`rowOff` EMU * (dml-spreadsheetDrawing.xsd `CT_Marker`). * * When worksheet row height or column width is unset (`getRowHeight` / * `getColumnWidth` return `0`), Excel-like defaults are used: * - row height: {@link DEFAULT_ROW_HEIGHT_PT} (15 pt) * - column width: {@link DEFAULT_COLUMN_WIDTH_CHARS} (8.43 character units) * - max digit width: {@link DEFAULT_MAX_DIGIT_WIDTH_PX} (7 px, Calibri 11) * * Column character units convert to pixels with the ECMA-376 width formula, * then to EMU at 96 DPI ({@link EMU_PER_PX_96DPI}). * * Citations: * - dml-spreadsheetDrawing.xsd `CT_Marker` / `CT_OneCellAnchor` * - ECMA-376-1 column width (max digit width) conversion * - docs/api/API-RULES.md R4.1 (drawing geometry in points) * - src/xlsx/core/length.ts EMU constants * * @private */ /** Excel default row height in points when `@ht` is absent. */ export declare const DEFAULT_ROW_HEIGHT_PT = 15; /** * Excel default column width in character units when `col@width` is absent * (UI default ~8.43 for Calibri 11). */ export declare const DEFAULT_COLUMN_WIDTH_CHARS = 8.43; /** * Maximum digit width in pixels for the default font (Calibri 11 → 7). * Used only for character-width → physical conversion for placement. */ export declare const DEFAULT_MAX_DIGIT_WIDTH_PX = 7; /** * Optional live sheet metrics. Missing methods or `0` values mean “unset” and * fall back to {@link DEFAULT_ROW_HEIGHT_PT} / {@link DEFAULT_COLUMN_WIDTH_CHARS}. * * @private */ export interface SheetMetrics { /** 1-based row height in points; `0` or absent → default. */ getRowHeightPt(row: number): number; /** 1-based column width in OOXML character units; `0` or absent → default. */ getColumnWidthChars(column: number): number; } /** * Cell + offset placement stored on drawing entries. * * @private */ export interface CellAnchorPlacement { /** 1-based anchor row. */ readonly row: number; /** 1-based anchor column. */ readonly column: number; /** Offset below the top of {@link row}, in EMU. */ readonly rowOffEmu: number; /** Offset right of the left of {@link column}, in EMU. */ readonly colOffEmu: number; } /** Convert points (1/72 in) to EMU. @private */ export declare function pointsToEmu(points: number): number; /** Convert EMU to points. @private */ export declare function emuToPoints(emu: number): number; /** * Convert OOXML column width (character units) to EMU using the ECMA pixel * formula and 96 DPI. * * `px = Truncate(((256 * chars + Truncate(128 / mdw)) / 256) * mdw)` * * @private */ export declare function columnWidthCharsToEmu(chars: number, mdwPx?: number): number; /** Resolve stored row height (`0` → default). @private */ export declare function resolveRowHeightPt(heightPt: number): number; /** Resolve stored column width chars (`0` → default). @private */ export declare function resolveColumnWidthChars(widthChars: number): number; /** * Map absolute top/left points (sheet origin) to cell + EMU offsets. * * @private */ export declare function absolutePointsToAnchor(topPt: number, leftPt: number, metrics?: SheetMetrics): CellAnchorPlacement; /** * Absolute top in points from a cell + offset placement. * * @private */ export declare function anchorToAbsoluteTopPt(placement: Pick, metrics?: SheetMetrics): number; /** * Absolute left in points from a cell + offset placement. * * @private */ export declare function anchorToAbsoluteLeftPt(placement: Pick, metrics?: SheetMetrics): number; /** * Apply absolute top: rewrite row + rowOffEmu; keep column offsets. * * @private */ export declare function applyAbsoluteTop(entry: { row: number; rowOffEmu: number; }, topPt: number, metrics?: SheetMetrics): void; /** * Apply absolute left: rewrite column + colOffEmu; keep row offsets. * * @private */ export declare function applyAbsoluteLeft(entry: { column: number; colOffEmu: number; }, leftPt: number, metrics?: SheetMetrics): void; /** Finite points ≥ 0 (Top/Left allow 0). @private */ export declare function requireNonNegativePoints(value: number, label: string): void; /** Finite points > 0 (width/height). @private */ export declare function requirePositivePoints(value: number, label: string): void; /** Positive integer (row/column). @private */ export declare function requirePositiveInt(value: number, label: string): void;