docxmlater 10.3.5 → 10.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/Document.d.ts +5 -0
- package/dist/core/Document.d.ts.map +1 -1
- package/dist/core/Document.js +48 -0
- package/dist/core/Document.js.map +1 -1
- package/dist/core/DocumentParser.d.ts.map +1 -1
- package/dist/core/DocumentParser.js +15 -1
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/elements/Image.d.ts +1 -0
- package/dist/elements/Image.d.ts.map +1 -1
- package/dist/elements/Image.js +14 -2
- package/dist/elements/Image.js.map +1 -1
- package/package.json +1 -1
- package/src/core/Document.ts +82 -1
- package/src/core/DocumentParser.ts +21 -1
- package/src/elements/Image.ts +23 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Image.js","sourceRoot":"","sources":["../../src/elements/Image.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Image - Represents an embedded image in a Word document\n *\n * Images use DrawingML (a:) and WordprocessingML Drawing (wp:) namespaces\n * for proper positioning and formatting in Word documents.\n */\n\nimport { promises as fs } from 'fs';\nimport { defaultLogger } from '../utils/logger';\nimport { inchesToEmus, UNITS } from '../utils/units';\nimport { XMLBuilder, XMLElement } from '../xml/XMLBuilder';\n\n/**\n * Supported image formats\n */\nexport type ImageFormat = 'png' | 'jpeg' | 'jpg' | 'gif' | 'bmp' | 'tiff' | 'svg' | 'emf' | 'wmf';\n\n/**\n * Preset geometry shape type (ECMA-376 §20.1.9.18)\n */\nexport type PresetGeometry = 'rect' | 'roundRect' | 'ellipse' | string;\n\n/**\n * Blip compression state (ECMA-376 §20.1.8.15)\n */\nexport type BlipCompressionState = 'none' | 'print' | 'email' | 'hqprint' | 'screen';\n\n/**\n * Picture lock attribute names (ECMA-376 §20.1.2.2.31)\n */\nexport type PicLockAttribute =\n | 'noChangeAspect'\n | 'noChangeArrowheads'\n | 'noSelect'\n | 'noMove'\n | 'noResize'\n | 'noEditPoints'\n | 'noAdjustHandles'\n | 'noRot'\n | 'noChangeShapeType'\n | 'noCrop'\n | 'noGrp';\n\n/**\n * Non-visual picture properties (ECMA-376 §19.3.1.12)\n */\nexport interface PicNonVisualProperties {\n id: string;\n name: string;\n descr: string;\n}\n\n/**\n * Image border definition (full a:ln support per ECMA-376)\n */\nexport interface ImageBorder {\n /** Border width in points */\n width: number;\n /** Line cap style */\n cap?: 'flat' | 'rnd' | 'sq';\n /** Compound line type */\n compound?: 'sng' | 'dbl' | 'thickThin' | 'thinThick' | 'tri';\n /** Alignment relative to shape */\n alignment?: 'ctr' | 'in';\n /** Fill specification */\n fill?: {\n type: 'srgbClr' | 'schemeClr';\n value: string;\n modifiers?: { name: string; val: string }[];\n };\n /** Raw XML for non-solid fills (gradFill, pattFill, etc.) */\n rawFillXml?: string;\n /** Preset dash pattern */\n dashPattern?: string;\n /** Line join style */\n join?: 'round' | 'bevel' | 'miter';\n /** Miter limit (percentage * 1000) */\n miterLimit?: number;\n /** Head end decoration */\n headEnd?: { type?: string; width?: string; length?: string };\n /** Tail end decoration */\n tailEnd?: { type?: string; width?: string; length?: string };\n}\n\n/**\n * Image extent (dimensions)\n */\nexport interface ImageExtent {\n /** Width in EMUs */\n width: number;\n /** Height in EMUs */\n height: number;\n}\n\n/**\n * Effect extent (additional space for shadows, reflections, glows)\n * Specifies additional space to add to each edge to prevent clipping of effects\n */\nexport interface EffectExtent {\n /** Left extent in EMUs */\n left: number;\n /** Top extent in EMUs */\n top: number;\n /** Right extent in EMUs */\n right: number;\n /** Bottom extent in EMUs */\n bottom: number;\n}\n\n/**\n * Text wrapping type\n */\nexport type WrapType = 'square' | 'tight' | 'through' | 'topAndBottom' | 'none';\n\n/**\n * Text wrapping side\n */\nexport type WrapSide = 'bothSides' | 'left' | 'right' | 'largest';\n\n/**\n * Text wrap settings\n */\nexport interface TextWrapSettings {\n /** Wrap type */\n type: WrapType;\n /** Which side(s) to wrap text */\n side?: WrapSide;\n /** Distance from top in EMUs */\n distanceTop?: number;\n /** Distance from bottom in EMUs */\n distanceBottom?: number;\n /** Distance from left in EMUs */\n distanceLeft?: number;\n /** Distance from right in EMUs */\n distanceRight?: number;\n}\n\n/**\n * Position anchor type (what to position relative to)\n */\nexport type PositionAnchor = 'page' | 'margin' | 'column' | 'character' | 'paragraph';\n\n/**\n * Horizontal alignment options\n */\nexport type HorizontalAlignment = 'left' | 'center' | 'right' | 'inside' | 'outside';\n\n/**\n * Vertical alignment options\n */\nexport type VerticalAlignment = 'top' | 'center' | 'bottom' | 'inside' | 'outside';\n\n/**\n * Image position configuration\n */\nexport interface ImagePosition {\n /** Horizontal positioning */\n horizontal: {\n /** Anchor point */\n anchor: PositionAnchor;\n /** Offset in EMUs (absolute positioning) */\n offset?: number;\n /** Alignment (relative positioning) */\n alignment?: HorizontalAlignment;\n };\n /** Vertical positioning */\n vertical: {\n /** Anchor point */\n anchor: PositionAnchor;\n /** Offset in EMUs (absolute positioning) */\n offset?: number;\n /** Alignment (relative positioning) */\n alignment?: VerticalAlignment;\n };\n}\n\n/**\n * Image anchor configuration (floating images)\n */\nexport interface ImageAnchor {\n /** Position behind text */\n behindDoc: boolean;\n /** Lock anchor (prevent movement) */\n locked: boolean;\n /** Layout in table cell */\n layoutInCell: boolean;\n /** Allow overlap with other objects */\n allowOverlap: boolean;\n /** Z-order (higher = in front) */\n relativeHeight: number;\n /** Use simple positioning (wp:simplePos coordinates) */\n simplePos?: boolean;\n /** Distance from text - top (EMUs) */\n distT?: number;\n /** Distance from text - bottom (EMUs) */\n distB?: number;\n /** Distance from text - left (EMUs) */\n distL?: number;\n /** Distance from text - right (EMUs) */\n distR?: number;\n}\n\n/**\n * Image crop settings (percentage-based)\n */\nexport interface ImageCrop {\n /** Left crop percentage (0-100) */\n left: number;\n /** Top crop percentage (0-100) */\n top: number;\n /** Right crop percentage (0-100) */\n right: number;\n /** Bottom crop percentage (0-100) */\n bottom: number;\n}\n\n/**\n * Image visual effects\n */\nexport interface ImageEffects {\n /** Brightness adjustment (-100 to +100) */\n brightness?: number;\n /** Contrast adjustment (-100 to +100) */\n contrast?: number;\n /** Convert to grayscale */\n grayscale?: boolean;\n /** Transparency (0-100, percentage) via a:alphaModFix */\n transparency?: number;\n}\n\n/**\n * Image properties\n */\nexport interface ImageProperties {\n /** Image source (file path or buffer) */\n source: string | Buffer;\n /** Image width in EMUs (optional - will auto-detect) */\n width?: number;\n /** Image height in EMUs (optional - will auto-detect) */\n height?: number;\n /** Maintain aspect ratio when resizing */\n maintainAspectRatio?: boolean;\n /** Alt text / description */\n description?: string;\n /** Image name/title */\n name?: string;\n /** Image title (wp:docPr title attribute for accessibility) */\n title?: string;\n /** Relationship ID (will be set by ImageManager) */\n relationshipId?: string;\n /** Effect extent (space for shadows/glows) */\n effectExtent?: EffectExtent;\n /** Text wrapping configuration */\n wrap?: TextWrapSettings;\n /** Position configuration (floating images) */\n position?: ImagePosition;\n /** Anchor configuration (floating images) */\n anchor?: ImageAnchor;\n /** Crop settings */\n crop?: ImageCrop;\n /** Visual effects */\n effects?: ImageEffects;\n /** Border settings */\n border?: ImageBorder | { width: number };\n /** Rotation angle in degrees (0-360) */\n rotation?: number;\n /** Horizontal flip (ECMA-376 §20.1.7.6) */\n flipH?: boolean;\n /** Vertical flip (ECMA-376 §20.1.7.6) */\n flipV?: boolean;\n /** Preset geometry shape (ECMA-376 §20.1.9.18) */\n presetGeometry?: PresetGeometry;\n /** Blip compression state (ECMA-376 §20.1.8.15) */\n compressionState?: BlipCompressionState;\n /** Black-and-white mode (ECMA-376 §20.1.2.2.35) */\n bwMode?: string;\n /** Inline distance from text - top (EMUs, ECMA-376 §20.4.2.8) */\n inlineDistT?: number;\n /** Inline distance from text - bottom (EMUs) */\n inlineDistB?: number;\n /** Inline distance from text - left (EMUs) */\n inlineDistL?: number;\n /** Inline distance from text - right (EMUs) */\n inlineDistR?: number;\n /** Whether aspect ratio lock is enabled (ECMA-376 §20.4.2.4) */\n noChangeAspect?: boolean;\n /** Hidden attribute on docPr (ECMA-376 §20.4.2.3) */\n hidden?: boolean;\n /** BlipFill DPI override (ECMA-376 §20.1.8.14) */\n blipFillDpi?: number;\n /** BlipFill rotate with shape flag (ECMA-376 §20.1.8.14) */\n blipFillRotWithShape?: boolean;\n /** Picture locks (ECMA-376 §20.1.2.2.31) */\n picLocks?: Partial<Record<PicLockAttribute, boolean>>;\n /** Non-visual picture properties (ECMA-376 §19.3.1.12) */\n picNonVisualProps?: PicNonVisualProperties;\n /** Whether image is linked (r:link) vs embedded (r:embed) */\n isLinked?: boolean;\n /** SVG relationship ID for Word 365 dual-relationship approach */\n svgRelationshipId?: string;\n}\n\n/**\n * Image validation result\n */\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n}\n\nexport class Image {\n private source: string | Buffer;\n private width: number;\n private height: number;\n private description: string;\n private name: string;\n private title?: string;\n private relationshipId?: string;\n private imageData?: Buffer;\n private extension: string;\n private docPrId = 1;\n private dpi = 96; // Default DPI\n\n // Advanced image properties\n private effectExtent?: EffectExtent;\n private wrap?: TextWrapSettings;\n private position?: ImagePosition;\n private anchor?: ImageAnchor;\n private crop?: ImageCrop;\n private effects?: ImageEffects;\n private rotation = 0;\n private flipH = false;\n private flipV = false;\n private border?: ImageBorder;\n\n // Group A: Simple attribute preservation (ECMA-376 compliance)\n private presetGeometry: PresetGeometry = 'rect';\n private compressionState: BlipCompressionState = 'none';\n private bwMode = 'auto';\n private inlineDistT = 0;\n private inlineDistB = 0;\n private inlineDistL = 0;\n private inlineDistR = 0;\n private noChangeAspect = true;\n private hidden = false;\n private blipFillDpi?: number;\n private blipFillRotWithShape?: boolean;\n private picLocks: Partial<Record<PicLockAttribute, boolean>> = {\n noChangeAspect: true,\n noChangeArrowheads: true,\n };\n private picNonVisualProps: PicNonVisualProperties = { id: '0', name: '', descr: '' };\n private isLinked = false;\n private svgRelationshipId?: string;\n\n // Group B: Raw XML passthrough for complex subtrees\n private _rawPassthrough = new Map<string, string>();\n\n /**\n * Creates a new image from file path (async factory)\n * @param path File path\n * @param properties Additional properties\n * @returns Promise<Image>\n */\n static async fromFile(path: string, properties: Partial<ImageProperties> = {}): Promise<Image> {\n const image = new Image({ source: path, ...properties });\n await image.loadImageDataForDimensions();\n return image;\n }\n\n /**\n * Creates a new image from buffer (async factory)\n * Supports both modern and legacy API signatures\n *\n * @param buffer Image buffer\n * @param mimeTypeOrProperties MIME type string ('png', 'jpeg', etc.) or properties object\n * @param width Optional width in EMUs (legacy API)\n * @param height Optional height in EMUs (legacy API)\n * @returns Promise<Image>\n *\n * @example\n * // Modern API (recommended)\n * const img = await Image.fromBuffer(buffer, { mimeType: 'png', width: 914400, height: 914400 });\n *\n * // Legacy API (still supported)\n * const img = await Image.fromBuffer(buffer, 'png', 914400, 914400);\n */\n static async fromBuffer(\n buffer: Buffer,\n mimeTypeOrProperties?: string | Partial<ImageProperties>,\n width?: number,\n height?: number\n ): Promise<Image> {\n let properties: Partial<ImageProperties>;\n\n // Detect API signature\n if (typeof mimeTypeOrProperties === 'string') {\n // Legacy 4-parameter signature: fromBuffer(buffer, 'png', 914400, 914400)\n // Note: mimeType is ignored - extension is auto-detected from buffer\n properties = {\n width: width,\n height: height,\n };\n } else {\n // Modern API: fromBuffer(buffer, { width: 914400, height: 914400 })\n properties = mimeTypeOrProperties || {};\n }\n\n const image = new Image({ source: buffer, ...properties });\n await image.loadImageDataForDimensions();\n return image;\n }\n\n /**\n * Unified create method for images (async factory)\n * @param properties Image properties including source (path or buffer)\n * @returns Promise<Image>\n */\n static async create(properties: ImageProperties): Promise<Image> {\n if (Buffer.isBuffer(properties.source)) {\n return Image.fromBuffer(properties.source, properties);\n } else if (typeof properties.source === 'string') {\n return Image.fromFile(properties.source, properties);\n } else {\n throw new Error('Invalid source: must be file path or Buffer');\n }\n }\n\n /**\n * Private constructor\n * @param properties Image properties\n */\n private constructor(properties: ImageProperties) {\n this.source = properties.source;\n this.description = properties.description || 'Image';\n this.name = properties.name || 'image';\n this.title = properties.title;\n this.relationshipId = properties.relationshipId;\n\n // Detect image extension\n this.extension = this.detectExtension();\n\n // Set default dimensions (6 inches x 4 inches) if not provided\n this.width = properties.width || inchesToEmus(6);\n this.height = properties.height || inchesToEmus(4);\n\n // Initialize advanced properties\n this.effectExtent = properties.effectExtent;\n this.wrap = properties.wrap;\n this.position = properties.position;\n this.anchor = properties.anchor;\n this.crop = properties.crop;\n this.effects = properties.effects;\n // Border: accept both legacy { width } and full ImageBorder\n if (properties.border) {\n this.border = properties.border as ImageBorder;\n }\n // Apply rotation if provided (normalize to 0-360)\n if (properties.rotation !== undefined && properties.rotation !== 0) {\n this.rotation = ((properties.rotation % 360) + 360) % 360;\n }\n // Apply flip attributes (ECMA-376 §20.1.7.6)\n this.flipH = properties.flipH || false;\n this.flipV = properties.flipV || false;\n\n // Group A: Simple attribute preservation\n if (properties.presetGeometry !== undefined) this.presetGeometry = properties.presetGeometry;\n if (properties.compressionState !== undefined)\n this.compressionState = properties.compressionState;\n if (properties.bwMode !== undefined) this.bwMode = properties.bwMode;\n if (properties.inlineDistT !== undefined) this.inlineDistT = properties.inlineDistT;\n if (properties.inlineDistB !== undefined) this.inlineDistB = properties.inlineDistB;\n if (properties.inlineDistL !== undefined) this.inlineDistL = properties.inlineDistL;\n if (properties.inlineDistR !== undefined) this.inlineDistR = properties.inlineDistR;\n if (properties.noChangeAspect !== undefined) this.noChangeAspect = properties.noChangeAspect;\n if (properties.hidden !== undefined) this.hidden = properties.hidden;\n if (properties.blipFillDpi !== undefined) this.blipFillDpi = properties.blipFillDpi;\n if (properties.blipFillRotWithShape !== undefined)\n this.blipFillRotWithShape = properties.blipFillRotWithShape;\n if (properties.picLocks !== undefined) this.picLocks = properties.picLocks;\n if (properties.picNonVisualProps !== undefined)\n this.picNonVisualProps = properties.picNonVisualProps;\n if (properties.isLinked !== undefined) this.isLinked = properties.isLinked;\n if (properties.svgRelationshipId !== undefined)\n this.svgRelationshipId = properties.svgRelationshipId;\n\n // Set default DPI\n this.dpi = 96;\n }\n\n /**\n * Loads image data temporarily for dimension detection only\n * Data is released after detection to save memory\n * @private\n */\n private async loadImageDataForDimensions(): Promise<void> {\n let tempData: Buffer | undefined;\n\n try {\n if (Buffer.isBuffer(this.source)) {\n tempData = this.source;\n } else if (typeof this.source === 'string') {\n await fs.access(this.source);\n tempData = await fs.readFile(this.source);\n }\n\n if (tempData) {\n this.imageData = tempData; // Temporarily store\n\n // Only auto-detect dimensions if they weren't explicitly provided\n // This preserves wp:extent values from parsed documents\n const defaultWidth = inchesToEmus(6);\n const defaultHeight = inchesToEmus(4);\n const hasExplicitDimensions = this.width !== defaultWidth || this.height !== defaultHeight;\n\n if (!hasExplicitDimensions) {\n const dimensions = this.detectDimensions();\n if (dimensions) {\n this.dpi = this.detectDPI() || 96;\n const emuPerInch = 914400;\n const pixelsPerInch = this.dpi;\n this.width = Math.round((dimensions.width / pixelsPerInch) * emuPerInch);\n this.height = Math.round((dimensions.height / pixelsPerInch) * emuPerInch);\n }\n }\n\n if (typeof this.source === 'string') {\n this.imageData = undefined; // Release\n }\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n defaultLogger.error(`Failed to load image for dimensions: ${message}`);\n throw new Error(`Image loading failed: ${message}`);\n }\n }\n\n /**\n * Ensures image data is loaded (lazy loading)\n */\n async ensureDataLoaded(): Promise<void> {\n if (this.imageData) return;\n\n try {\n if (Buffer.isBuffer(this.source)) {\n this.imageData = this.source;\n } else if (typeof this.source === 'string') {\n await fs.access(this.source);\n this.imageData = await fs.readFile(this.source);\n } else {\n throw new Error('Invalid image source');\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n defaultLogger.error(`Failed to load image data: ${message}`);\n throw new Error(`Image data loading failed: ${message}`);\n }\n }\n\n /**\n * Releases image data from memory\n */\n releaseData(): void {\n if (typeof this.source === 'string') {\n this.imageData = undefined;\n }\n }\n\n /**\n * Validates the image data integrity\n */\n validateImageData(): ValidationResult {\n // Skip validation for linked images (no data in package)\n if (this.isLinked) {\n return { valid: true };\n }\n\n if (!this.imageData || this.imageData.length === 0) {\n return { valid: false, error: 'Empty image data' };\n }\n\n // Skip signature validation for text-based formats (SVG)\n if (this.extension === 'svg') {\n return { valid: true };\n }\n\n const signatures: Record<string, number[]> = {\n png: [0x89, 0x50, 0x4e, 0x47],\n jpg: [0xff, 0xd8],\n jpeg: [0xff, 0xd8],\n gif: [0x47, 0x49, 0x46],\n bmp: [0x42, 0x4d],\n tiff: [0x49, 0x49, 0x2a, 0x00],\n tif: [0x49, 0x49, 0x2a, 0x00],\n };\n\n // EMF: check for ENHMETAHEADER signature at offset 40\n if (this.extension === 'emf') {\n if (\n this.imageData.length >= 44 &&\n this.imageData[40] === 0x20 &&\n this.imageData[41] === 0x45 &&\n this.imageData[42] === 0x4d &&\n this.imageData[43] === 0x46\n ) {\n return { valid: true };\n }\n return { valid: false, error: 'Invalid EMF signature' };\n }\n\n // WMF: check for placeable or standard header\n if (this.extension === 'wmf') {\n if (this.imageData.length >= 4) {\n // Placeable WMF\n if (\n this.imageData[0] === 0xd7 &&\n this.imageData[1] === 0xcd &&\n this.imageData[2] === 0xc6 &&\n this.imageData[3] === 0x9a\n ) {\n return { valid: true };\n }\n // Standard WMF\n if (\n this.imageData[0] === 0x01 &&\n this.imageData[1] === 0x00 &&\n this.imageData[2] === 0x09 &&\n this.imageData[3] === 0x00\n ) {\n return { valid: true };\n }\n }\n return { valid: false, error: 'Invalid WMF signature' };\n }\n\n const sig = signatures[this.extension];\n if (sig) {\n for (let i = 0; i < sig.length; i++) {\n if (this.imageData[i] !== sig[i]) {\n return { valid: false, error: `Invalid ${this.extension.toUpperCase()} signature` };\n }\n }\n }\n\n return { valid: true };\n }\n\n /**\n * Detects image extension from source (path or buffer)\n */\n private detectExtension(): string {\n // Try path-based detection first\n if (typeof this.source === 'string') {\n const match = /\\.([a-z]+)$/i.exec(this.source);\n if (match?.[1]) {\n return match[1].toLowerCase();\n }\n }\n\n // Buffer-based detection using magic bytes\n if (Buffer.isBuffer(this.source) && this.source.length >= 4) {\n const buf = this.source;\n // PNG\n if (buf[0] === 0x89 && buf[1] === 0x50 && buf[2] === 0x4e && buf[3] === 0x47) return 'png';\n // JPEG\n if (buf[0] === 0xff && buf[1] === 0xd8) return 'jpeg';\n // GIF\n if (buf[0] === 0x47 && buf[1] === 0x49 && buf[2] === 0x46) return 'gif';\n // BMP\n if (buf[0] === 0x42 && buf[1] === 0x4d) return 'bmp';\n // TIFF LE\n if (buf[0] === 0x49 && buf[1] === 0x49 && buf[2] === 0x2a && buf[3] === 0x00) return 'tiff';\n // TIFF BE\n if (buf[0] === 0x4d && buf[1] === 0x4d && buf[2] === 0x00 && buf[3] === 0x2a) return 'tiff';\n // EMF: byte 0 = 0x01,0x00,0x00,0x00 AND ' EMF' at offset 40\n if (\n buf.length >= 44 &&\n buf[0] === 0x01 &&\n buf[1] === 0x00 &&\n buf[2] === 0x00 &&\n buf[3] === 0x00 &&\n buf[40] === 0x20 &&\n buf[41] === 0x45 &&\n buf[42] === 0x4d &&\n buf[43] === 0x46\n )\n return 'emf';\n // WMF placeable\n if (buf[0] === 0xd7 && buf[1] === 0xcd && buf[2] === 0xc6 && buf[3] === 0x9a) return 'wmf';\n // WMF standard\n if (buf[0] === 0x01 && buf[1] === 0x00 && buf[2] === 0x09 && buf[3] === 0x00) return 'wmf';\n // SVG: starts with '<' or UTF-8 BOM + '<'\n if (\n buf[0] === 0x3c ||\n (buf[0] === 0xef && buf[1] === 0xbb && buf[2] === 0xbf && buf.length > 3 && buf[3] === 0x3c)\n )\n return 'svg';\n }\n\n return 'png';\n }\n\n /**\n * Attempts to detect image dimensions from buffer\n */\n private detectDimensions(): { width: number; height: number } | null {\n if (!this.imageData || this.imageData.length < 24) return null;\n\n if (\n this.imageData[0] === 0x89 &&\n this.imageData[1] === 0x50 &&\n this.imageData[2] === 0x4e &&\n this.imageData[3] === 0x47\n ) {\n return this.detectPngDimensions();\n }\n if (this.imageData[0] === 0xff && this.imageData[1] === 0xd8) {\n return this.detectJpegDimensions();\n }\n if (this.imageData[0] === 0x47 && this.imageData[1] === 0x49 && this.imageData[2] === 0x46) {\n return this.detectGifDimensions();\n }\n if (this.imageData[0] === 0x42 && this.imageData[1] === 0x4d) {\n return this.detectBmpDimensions();\n }\n if (\n (this.imageData[0] === 0x49 && this.imageData[1] === 0x49 && this.imageData[2] === 0x2a) ||\n (this.imageData[0] === 0x4d && this.imageData[1] === 0x4d && this.imageData[2] === 0x00)\n ) {\n return this.detectTiffDimensions();\n }\n // EMF: ENHMETAHEADER has ' EMF' at offset 40\n if (\n this.imageData.length >= 44 &&\n this.imageData[40] === 0x20 &&\n this.imageData[41] === 0x45 &&\n this.imageData[42] === 0x4d &&\n this.imageData[43] === 0x46\n ) {\n return this.detectEmfDimensions();\n }\n // WMF placeable\n if (\n this.imageData[0] === 0xd7 &&\n this.imageData[1] === 0xcd &&\n this.imageData[2] === 0xc6 &&\n this.imageData[3] === 0x9a\n ) {\n return this.detectWmfDimensions();\n }\n // SVG (text-based)\n if (\n this.imageData[0] === 0x3c ||\n (this.imageData[0] === 0xef && this.imageData[1] === 0xbb && this.imageData[2] === 0xbf)\n ) {\n return this.detectSvgDimensions();\n }\n return null;\n }\n\n // Dimension detection helpers (as before, keeping them the same)\n\n private detectPngDimensions(): { width: number; height: number } | null {\n if (!this.imageData || this.imageData.length < 24) return null;\n const width = this.imageData.readUInt32BE(16);\n const height = this.imageData.readUInt32BE(20);\n return { width, height };\n }\n\n private detectGifDimensions(): { width: number; height: number } | null {\n if (!this.imageData || this.imageData.length < 10) return null;\n const width = this.imageData.readUInt16LE(6);\n const height = this.imageData.readUInt16LE(8);\n if (width > 0 && height > 0) return { width, height };\n return null;\n }\n\n private detectBmpDimensions(): { width: number; height: number } | null {\n if (!this.imageData || this.imageData.length < 26) return null;\n const width = this.imageData.readInt32LE(18);\n const height = Math.abs(this.imageData.readInt32LE(22));\n if (width > 0 && height > 0) return { width, height };\n return null;\n }\n\n private detectTiffDimensions(): { width: number; height: number } | null {\n // Implementation as before\n if (!this.imageData || this.imageData.length < 14) return null;\n const isLittleEndian = this.imageData[0] === 0x49;\n const ifdOffset = isLittleEndian\n ? this.imageData.readUInt32LE(4)\n : this.imageData.readUInt32BE(4);\n if (ifdOffset + 14 > this.imageData.length) return null;\n const numEntries = isLittleEndian\n ? this.imageData.readUInt16LE(ifdOffset)\n : this.imageData.readUInt16BE(ifdOffset);\n let width = 0;\n let height = 0;\n for (let i = 0; i < numEntries; i++) {\n const entryOffset = ifdOffset + 2 + i * 12;\n if (entryOffset + 12 > this.imageData.length) break;\n const tag = isLittleEndian\n ? this.imageData.readUInt16LE(entryOffset)\n : this.imageData.readUInt16BE(entryOffset);\n const value = isLittleEndian\n ? this.imageData.readUInt32LE(entryOffset + 8)\n : this.imageData.readUInt32BE(entryOffset + 8);\n if (tag === 256) width = value;\n if (tag === 257) height = value;\n if (width > 0 && height > 0) break;\n }\n if (width > 0 && height > 0) return { width, height };\n return null;\n }\n\n private detectJpegDimensions(): { width: number; height: number } | null {\n // Implementation as before\n if (!this.imageData || this.imageData.length < 12) return null;\n let offset = 2;\n while (offset < this.imageData.length - 1) {\n if (this.imageData[offset] !== 0xff) break;\n const marker = this.imageData[offset + 1];\n if (marker === undefined) break;\n if (marker === 0x00 || marker === 0xff) {\n offset++;\n continue;\n }\n const isSOF =\n marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc;\n if (isSOF) {\n if (offset + 9 > this.imageData.length) break;\n const height = this.imageData.readUInt16BE(offset + 5);\n const width = this.imageData.readUInt16BE(offset + 7);\n if (width > 0 && height > 0) return { width, height };\n }\n if (marker === 0xda || marker === 0xd9) break;\n const segmentLength = this.imageData.readUInt16BE(offset + 2);\n if (segmentLength < 2 || offset + 2 + segmentLength > this.imageData.length) break;\n offset += 2 + segmentLength;\n }\n return null;\n }\n\n /**\n * Detects SVG dimensions from width/height attributes or viewBox\n */\n private detectSvgDimensions(): { width: number; height: number } | null {\n if (!this.imageData) return null;\n try {\n const svgText = this.imageData.toString('utf-8').substring(0, 2000);\n // Try width/height attributes on <svg> element\n const widthMatch = /<svg[^>]*\\bwidth\\s*=\\s*[\"']?(\\d+(?:\\.\\d+)?)/i.exec(svgText);\n const heightMatch = /<svg[^>]*\\bheight\\s*=\\s*[\"']?(\\d+(?:\\.\\d+)?)/i.exec(svgText);\n if (widthMatch?.[1] && heightMatch?.[1]) {\n return {\n width: Math.round(parseFloat(widthMatch[1])),\n height: Math.round(parseFloat(heightMatch[1])),\n };\n }\n // Try viewBox attribute\n const viewBoxMatch =\n /<svg[^>]*\\bviewBox\\s*=\\s*[\"']?\\s*[\\d.]+\\s+[\\d.]+\\s+([\\d.]+)\\s+([\\d.]+)/i.exec(svgText);\n if (viewBoxMatch?.[1] && viewBoxMatch?.[2]) {\n return {\n width: Math.round(parseFloat(viewBoxMatch[1])),\n height: Math.round(parseFloat(viewBoxMatch[2])),\n };\n }\n } catch {\n // SVG parsing failed\n }\n return null;\n }\n\n /**\n * Detects EMF dimensions from ENHMETAHEADER rclFrame (offsets 24-36, 0.01mm units)\n */\n private detectEmfDimensions(): { width: number; height: number } | null {\n if (!this.imageData || this.imageData.length < 40) return null;\n try {\n // rclFrame: left(24), top(28), right(32), bottom(36) in 0.01mm units\n const left = this.imageData.readInt32LE(24);\n const top = this.imageData.readInt32LE(28);\n const right = this.imageData.readInt32LE(32);\n const bottom = this.imageData.readInt32LE(36);\n const widthMm = (right - left) / 100;\n const heightMm = (bottom - top) / 100;\n // Convert mm to pixels at 96 DPI (1 inch = 25.4mm)\n const width = Math.round((widthMm / 25.4) * 96);\n const height = Math.round((heightMm / 25.4) * 96);\n if (width > 0 && height > 0) return { width, height };\n } catch {\n // EMF header parsing failed\n }\n return null;\n }\n\n /**\n * Detects WMF dimensions from placeable WMF header bounding box (offsets 6-14)\n */\n private detectWmfDimensions(): { width: number; height: number } | null {\n if (!this.imageData || this.imageData.length < 22) return null;\n try {\n // Placeable WMF header: left(6), top(8), right(10), bottom(12), inch(14)\n const left = this.imageData.readInt16LE(6);\n const top = this.imageData.readInt16LE(8);\n const right = this.imageData.readInt16LE(10);\n const bottom = this.imageData.readInt16LE(12);\n const unitsPerInch = this.imageData.readUInt16LE(14);\n if (unitsPerInch > 0) {\n const width = Math.round(((right - left) / unitsPerInch) * 96);\n const height = Math.round(((bottom - top) / unitsPerInch) * 96);\n if (width > 0 && height > 0) return { width, height };\n }\n } catch {\n // WMF header parsing failed\n }\n return null;\n }\n\n /**\n * Gets the image data buffer asynchronously\n */\n async getImageDataAsync(): Promise<Buffer> {\n await this.ensureDataLoaded();\n if (!this.imageData) throw new Error('Failed to load image data');\n return this.imageData;\n }\n\n /**\n * Gets the image data buffer synchronously\n */\n getImageData(): Buffer {\n if (!this.imageData) throw new Error('Image data not loaded. Call ensureDataLoaded first.');\n return this.imageData;\n }\n\n getExtension(): string {\n return this.extension;\n }\n\n getDPI(): number {\n return this.dpi;\n }\n\n getWidth(): number {\n return this.width;\n }\n\n getHeight(): number {\n return this.height;\n }\n\n getImageDataSafe(): Buffer | null {\n return this.imageData ?? null;\n }\n\n setWidth(width: number, maintainAspectRatio = true): this {\n if (maintainAspectRatio && this.height > 0) {\n const ratio = this.height / this.width;\n this.height = Math.round(width * ratio);\n }\n this.width = width;\n return this;\n }\n\n setHeight(height: number, maintainAspectRatio = true): this {\n if (maintainAspectRatio && this.width > 0) {\n const ratio = this.width / this.height;\n this.width = Math.round(height * ratio);\n }\n this.height = height;\n return this;\n }\n\n setSize(width: number, height: number): this {\n this.width = width;\n this.height = height;\n return this;\n }\n\n async updateImageData(newSource: string | Buffer): Promise<void> {\n this.source = newSource;\n this.imageData = undefined;\n await this.loadImageDataForDimensions();\n this.extension = this.detectExtension();\n this.dpi = this.detectDPI() || 96;\n }\n\n setRelationshipId(relationshipId: string): this {\n this.relationshipId = relationshipId;\n return this;\n }\n\n getRelationshipId(): string | undefined {\n return this.relationshipId;\n }\n\n setDocPrId(id: number): this {\n this.docPrId = id;\n return this;\n }\n\n setAltText(altText: string): this {\n this.description = altText;\n return this;\n }\n\n getAltText(): string {\n return this.description;\n }\n\n setTitle(title: string): this {\n this.title = title;\n return this;\n }\n\n getTitle(): string | undefined {\n return this.title;\n }\n\n rotate(degrees: number): this {\n this.rotation = ((degrees % 360) + 360) % 360;\n if (this.rotation === 90 || this.rotation === 270) {\n [this.width, this.height] = [this.height, this.width];\n }\n return this;\n }\n\n getRotation(): number {\n return this.rotation;\n }\n\n setFlipH(flip: boolean): this {\n this.flipH = flip;\n return this;\n }\n\n getFlipH(): boolean {\n return this.flipH;\n }\n\n setFlipV(flip: boolean): this {\n this.flipV = flip;\n return this;\n }\n\n getFlipV(): boolean {\n return this.flipV;\n }\n\n // --- Group A: Simple attribute getters/setters ---\n\n getPresetGeometry(): PresetGeometry {\n return this.presetGeometry;\n }\n setPresetGeometry(geom: PresetGeometry): this {\n this.presetGeometry = geom;\n return this;\n }\n\n getCompressionState(): BlipCompressionState {\n return this.compressionState;\n }\n setCompressionState(state: BlipCompressionState): this {\n this.compressionState = state;\n return this;\n }\n\n getBwMode(): string {\n return this.bwMode;\n }\n setBwMode(mode: string): this {\n this.bwMode = mode;\n return this;\n }\n\n getInlineDistT(): number {\n return this.inlineDistT;\n }\n getInlineDistB(): number {\n return this.inlineDistB;\n }\n getInlineDistL(): number {\n return this.inlineDistL;\n }\n getInlineDistR(): number {\n return this.inlineDistR;\n }\n setInlineDist(distT: number, distB: number, distL: number, distR: number): this {\n this.inlineDistT = distT;\n this.inlineDistB = distB;\n this.inlineDistL = distL;\n this.inlineDistR = distR;\n return this;\n }\n\n getNoChangeAspect(): boolean {\n return this.noChangeAspect;\n }\n setNoChangeAspect(val: boolean): this {\n this.noChangeAspect = val;\n return this;\n }\n\n getHidden(): boolean {\n return this.hidden;\n }\n setHidden(val: boolean): this {\n this.hidden = val;\n return this;\n }\n\n getBlipFillDpi(): number | undefined {\n return this.blipFillDpi;\n }\n setBlipFillDpi(dpi: number | undefined): this {\n this.blipFillDpi = dpi;\n return this;\n }\n\n getBlipFillRotWithShape(): boolean | undefined {\n return this.blipFillRotWithShape;\n }\n setBlipFillRotWithShape(val: boolean | undefined): this {\n this.blipFillRotWithShape = val;\n return this;\n }\n\n getPicLocks(): Partial<Record<PicLockAttribute, boolean>> {\n return { ...this.picLocks };\n }\n setPicLocks(locks: Partial<Record<PicLockAttribute, boolean>>): this {\n this.picLocks = locks;\n return this;\n }\n\n getPicNonVisualProps(): PicNonVisualProperties {\n return { ...this.picNonVisualProps };\n }\n setPicNonVisualProps(props: PicNonVisualProperties): this {\n this.picNonVisualProps = props;\n return this;\n }\n\n getIsLinked(): boolean {\n return this.isLinked;\n }\n setIsLinked(val: boolean): this {\n this.isLinked = val;\n return this;\n }\n\n getSvgRelationshipId(): string | undefined {\n return this.svgRelationshipId;\n }\n setSvgRelationshipId(id: string | undefined): this {\n this.svgRelationshipId = id;\n return this;\n }\n\n // --- Group B: Raw passthrough storage ---\n\n /** @internal */\n _setRawPassthrough(slot: string, xml: string): void {\n this._rawPassthrough.set(slot, xml);\n }\n\n /** @internal */\n _getRawPassthrough(slot: string): string | undefined {\n return this._rawPassthrough.get(slot);\n }\n\n /** @internal */\n _hasRawPassthrough(slot: string): boolean {\n return this._rawPassthrough.has(slot);\n }\n\n // --- Group C: Enhanced border ---\n\n getBorder(): ImageBorder | undefined {\n return this.border;\n }\n\n setEffectExtent(left: number, top: number, right: number, bottom: number): this {\n this.effectExtent = { left, top, right, bottom };\n return this;\n }\n\n getEffectExtent(): EffectExtent | undefined {\n return this.effectExtent;\n }\n\n setWrap(\n type: WrapType,\n side?: WrapSide,\n distances?: { top?: number; bottom?: number; left?: number; right?: number }\n ): this {\n this.wrap = {\n type,\n side,\n distanceTop: distances?.top,\n distanceBottom: distances?.bottom,\n distanceLeft: distances?.left,\n distanceRight: distances?.right,\n };\n return this;\n }\n\n getWrap(): TextWrapSettings | undefined {\n return this.wrap;\n }\n\n /**\n * Validates a position offset value\n * @param offset - Offset value in EMUs\n * @param axis - 'horizontal' or 'vertical' for error messages\n * @throws {Error} If offset exceeds maximum reasonable value\n * @private\n */\n private validatePositionOffset(offset: number | undefined, axis: string): void {\n if (offset === undefined) return;\n\n // Maximum reasonable offset: 50 inches = 45,720,000 EMUs\n const MAX_OFFSET_EMUS = 45720000;\n if (Math.abs(offset) > MAX_OFFSET_EMUS) {\n throw new Error(\n `Invalid ${axis} position offset: ${offset} EMUs exceeds maximum of ${MAX_OFFSET_EMUS} EMUs (50 inches).`\n );\n }\n }\n\n /**\n * Sets the position for a floating image\n *\n * Position can be specified using either:\n * - Absolute offset (in EMUs from the anchor point)\n * - Relative alignment (left, center, right / top, center, bottom)\n *\n * @param horizontal - Horizontal positioning configuration\n * @param vertical - Vertical positioning configuration\n * @returns This image for chaining\n * @throws {Error} If offset values exceed maximum\n *\n * @example\n * ```typescript\n * // Absolute positioning (100,000 EMUs from page edges)\n * image.setPosition(\n * { anchor: 'page', offset: 100000 },\n * { anchor: 'page', offset: 100000 }\n * );\n *\n * // Relative alignment (centered on page)\n * image.setPosition(\n * { anchor: 'page', alignment: 'center' },\n * { anchor: 'page', alignment: 'center' }\n * );\n * ```\n */\n setPosition(horizontal: ImagePosition['horizontal'], vertical: ImagePosition['vertical']): this {\n // Validate offset values\n this.validatePositionOffset(horizontal.offset, 'horizontal');\n this.validatePositionOffset(vertical.offset, 'vertical');\n\n this.position = { horizontal, vertical };\n return this;\n }\n\n getPosition(): ImagePosition | undefined {\n return this.position;\n }\n\n /**\n * Validates the current image position configuration\n *\n * Checks for common configuration issues:\n * - Missing anchor when offset is used\n * - Conflicting offset and alignment values\n * - Invalid combinations\n *\n * @returns Validation result with details\n *\n * @example\n * ```typescript\n * const result = image.validatePosition();\n * if (!result.isValid) {\n * console.log(result.warnings); // Array of warning messages\n * }\n * ```\n */\n validatePosition(): {\n isValid: boolean;\n warnings: string[];\n } {\n const warnings: string[] = [];\n\n if (!this.position) {\n return { isValid: true, warnings };\n }\n\n // Check if both offset and alignment are specified (unusual but not invalid)\n if (this.position.horizontal.offset !== undefined && this.position.horizontal.alignment) {\n warnings.push(\n 'Horizontal position has both offset and alignment. Word will use alignment and ignore offset.'\n );\n }\n\n if (this.position.vertical.offset !== undefined && this.position.vertical.alignment) {\n warnings.push(\n 'Vertical position has both offset and alignment. Word will use alignment and ignore offset.'\n );\n }\n\n // Check for floating image without anchor settings\n if (this.position && !this.anchor) {\n warnings.push(\n 'Position is set but anchor is not. Consider setting anchor properties for proper floating behavior.'\n );\n }\n\n return {\n isValid: warnings.length === 0,\n warnings,\n };\n }\n\n setAnchor(options: ImageAnchor): this {\n this.anchor = options;\n return this;\n }\n\n getAnchor(): ImageAnchor | undefined {\n return this.anchor;\n }\n\n setCrop(left: number, top: number, right: number, bottom: number): this {\n const clamp = (val: number) => Math.max(0, Math.min(100, val));\n this.crop = { left: clamp(left), top: clamp(top), right: clamp(right), bottom: clamp(bottom) };\n return this;\n }\n\n getCrop(): ImageCrop | undefined {\n return this.crop;\n }\n\n setEffects(options: ImageEffects): this {\n const clamp = (val?: number) =>\n val !== undefined ? Math.max(-100, Math.min(100, val)) : undefined;\n this.effects = {\n brightness: clamp(options.brightness),\n contrast: clamp(options.contrast),\n grayscale: options.grayscale,\n transparency:\n options.transparency !== undefined\n ? Math.max(0, Math.min(100, options.transparency))\n : undefined,\n };\n return this;\n }\n\n getEffects(): ImageEffects | undefined {\n return this.effects;\n }\n\n private detectDPI(): number | undefined {\n if (!this.imageData) return undefined;\n\n try {\n if (this.extension === 'png') {\n const physIndex = this.imageData.indexOf(Buffer.from([0x70, 0x48, 0x59, 0x73]));\n if (physIndex !== -1 && physIndex + 12 < this.imageData.length) {\n const xPixelsPerMeter = this.imageData.readUInt32BE(physIndex + 4);\n const yPixelsPerMeter = this.imageData.readUInt32BE(physIndex + 8);\n const unit = this.imageData[physIndex + 12];\n if (unit === 1) {\n const dpiX = Math.round(xPixelsPerMeter * 0.0254);\n const dpiY = Math.round(yPixelsPerMeter * 0.0254);\n return Math.min(dpiX, dpiY);\n }\n }\n } else if (this.extension === 'jpg' || this.extension === 'jpeg') {\n let offset = 2;\n while (offset < this.imageData.length) {\n if (this.imageData[offset] !== 0xff) break;\n const marker = this.imageData[offset + 1];\n if (marker === 0xe0) {\n const length = this.imageData.readUInt16BE(offset + 2);\n if (\n length >= 16 &&\n this.imageData.slice(offset + 4, offset + 9).toString('ascii') === 'JFIF\\0'\n ) {\n const units = this.imageData[offset + 11];\n const xDensity = this.imageData.readUInt16BE(offset + 12);\n const yDensity = this.imageData.readUInt16BE(offset + 14);\n if (units === 1) return Math.min(xDensity, yDensity);\n if (units === 2)\n return Math.min(Math.round(xDensity * 2.54), Math.round(yDensity * 2.54));\n }\n offset += 2 + length;\n continue;\n }\n offset += 2 + this.imageData.readUInt16BE(offset + 2);\n }\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n defaultLogger.warn(`DPI detection failed: ${message}`);\n }\n return undefined;\n }\n\n isFloating(): boolean {\n return !!this.anchor || !!this.position;\n }\n\n floatTopLeft(marginTop = 0, marginLeft = 0): this {\n this.setPosition({ anchor: 'page', offset: marginLeft }, { anchor: 'page', offset: marginTop });\n this.setAnchor({\n behindDoc: false,\n locked: false,\n layoutInCell: true,\n allowOverlap: true,\n relativeHeight: 251658240,\n });\n this.setWrap('square', 'bothSides');\n return this;\n }\n\n floatTopRight(marginTop = 0, marginRight = 0): this {\n this.setPosition(\n { anchor: 'page', alignment: 'right', offset: -marginRight },\n { anchor: 'page', offset: marginTop }\n );\n this.setAnchor({\n behindDoc: false,\n locked: false,\n layoutInCell: true,\n allowOverlap: true,\n relativeHeight: 251658240,\n });\n this.setWrap('square', 'bothSides');\n return this;\n }\n\n floatCenter(): this {\n this.setPosition(\n { anchor: 'page', alignment: 'center' },\n { anchor: 'page', alignment: 'center' }\n );\n this.setAnchor({\n behindDoc: false,\n locked: false,\n layoutInCell: true,\n allowOverlap: true,\n relativeHeight: 251658240,\n });\n this.setWrap('square', 'bothSides');\n return this;\n }\n\n setBehindText(behind = true): this {\n if (this.anchor) {\n this.anchor.behindDoc = behind;\n } else {\n this.setAnchor({\n behindDoc: behind,\n locked: false,\n layoutInCell: true,\n allowOverlap: true,\n relativeHeight: 251658240,\n });\n }\n return this;\n }\n\n /**\n * Applies a border around the image\n * @param thicknessOrOptions Border thickness in points (number) or full ImageBorder options\n * @returns This image for chaining\n *\n * Note: effectExtent is set to accommodate the border width so it renders\n * properly without being clipped. The border is drawn centered on the image\n * edge, so half the border width extends outside the image bounds.\n */\n setBorder(thicknessOrOptions: number | ImageBorder = 2): this {\n if (typeof thicknessOrOptions === 'number') {\n this.border = { width: thicknessOrOptions };\n } else {\n this.border = thicknessOrOptions;\n }\n\n // Calculate space needed for border (half-width on each side)\n // Border is drawn centered on the edge\n const borderEmu = this.border.width * UNITS.EMUS_PER_POINT;\n const halfBorderEmu = Math.ceil(borderEmu / 2);\n\n // Ensure effectExtent has at least enough space for the border\n if (!this.effectExtent) {\n this.effectExtent = { left: 0, top: 0, right: 0, bottom: 0 };\n }\n this.effectExtent.left = Math.max(this.effectExtent.left, halfBorderEmu);\n this.effectExtent.top = Math.max(this.effectExtent.top, halfBorderEmu);\n this.effectExtent.right = Math.max(this.effectExtent.right, halfBorderEmu);\n this.effectExtent.bottom = Math.max(this.effectExtent.bottom, halfBorderEmu);\n\n return this;\n }\n\n /**\n * Removes the border from the image\n * @returns This image for chaining\n */\n removeBorder(): this {\n this.border = undefined;\n return this;\n }\n\n /**\n * @deprecated Use setBorder() instead. This method will be removed in a future version.\n * Applies a 2-point black border around the image.\n * @returns This image for chaining\n */\n applyTwoPixelBlackBorder(): this {\n return this.setBorder(2);\n }\n\n toXML(): XMLElement {\n const isFloating = this.isFloating();\n\n // Common elements - must include wp: namespace prefix\n const extent = XMLBuilder.wp('extent', {\n cx: this.width.toString(),\n cy: this.height.toString(),\n });\n\n // --- Build blip element with effects ---\n const blipChildren: XMLElement[] = [];\n\n // Add luminance effect for brightness/contrast (per ECMA-376 §20.1.8.43)\n if (this.effects?.brightness !== undefined || this.effects?.contrast !== undefined) {\n const lumAttrs: Record<string, string> = {};\n if (this.effects.brightness !== undefined) {\n lumAttrs.bright = Math.round(this.effects.brightness * 1000).toString();\n }\n if (this.effects.contrast !== undefined) {\n lumAttrs.contrast = Math.round(this.effects.contrast * 1000).toString();\n }\n blipChildren.push(XMLBuilder.aSelf('lum', lumAttrs));\n }\n\n // Add grayscale effect (per ECMA-376 §20.1.8.37)\n if (this.effects?.grayscale) {\n blipChildren.push(XMLBuilder.aSelf('grayscl'));\n }\n\n // Add transparency effect via a:alphaModFix (ECMA-376 §20.1.8.4)\n if (this.effects?.transparency !== undefined && this.effects.transparency > 0) {\n // transparency is 0-100%, alphaModFix amt is in 1/1000ths of percent\n // e.g., 50% transparency = 50000 amt (= 50% opacity)\n const amt = Math.round((100 - this.effects.transparency) * 1000);\n blipChildren.push(XMLBuilder.aSelf('alphaModFix', { amt: amt.toString() }));\n }\n\n // Group B: Inject raw blip effects passthrough (a:clrChange, a:duotone, etc.)\n if (this._rawPassthrough.has('blip-effects')) {\n blipChildren.push({\n name: '__rawXml',\n rawXml: this._rawPassthrough.get('blip-effects')!,\n } as XMLElement);\n }\n\n // Group B: Inject raw blip extLst passthrough (must come last per schema)\n if (this._rawPassthrough.has('blip-extLst')) {\n blipChildren.push({\n name: '__rawXml',\n rawXml: this._rawPassthrough.get('blip-extLst')!,\n } as XMLElement);\n } else if (this.svgRelationshipId) {\n // SVG dual-relationship: add asvg:svgBlip reference in extLst\n blipChildren.push({\n name: '__rawXml',\n rawXml: `<a:extLst><a:ext uri=\"{96DAC541-7B7A-43D3-8B79-37D633B846F1}\"><asvg:svgBlip xmlns:asvg=\"http://schemas.microsoft.com/office/drawing/2016/SVG/main\" r:embed=\"${this.svgRelationshipId}\"/></a:ext></a:extLst>`,\n } as XMLElement);\n }\n\n // Build blip attributes: r:embed or r:link, cstate\n const blipAttrs: Record<string, string | undefined> = {\n cstate: this.compressionState,\n };\n if (this.isLinked) {\n blipAttrs['r:link'] = this.relationshipId;\n } else {\n blipAttrs['r:embed'] = this.relationshipId;\n }\n\n const blip =\n blipChildren.length > 0\n ? XMLBuilder.a('blip', blipAttrs, blipChildren)\n : XMLBuilder.a('blip', blipAttrs);\n\n // --- Build transform (a:xfrm) ---\n const xfrmAttrs: Record<string, string> | undefined = (() => {\n const attrs: Record<string, string> = {};\n if (this.rotation > 0) attrs.rot = Math.round(this.rotation * 60000).toString();\n if (this.flipH) attrs.flipH = '1';\n if (this.flipV) attrs.flipV = '1';\n return Object.keys(attrs).length > 0 ? attrs : undefined;\n })();\n const xfrm = XMLBuilder.a('xfrm', xfrmAttrs, [\n XMLBuilder.a('off', { x: '0', y: '0' }),\n XMLBuilder.a('ext', { cx: this.width.toString(), cy: this.height.toString() }),\n ]);\n\n // --- Build shape properties (pic:spPr) ---\n const spPrChildren: XMLElement[] = [xfrm];\n\n // Geometry: use passthrough for custGeom or prstGeom with avLst, otherwise default\n if (this._rawPassthrough.has('geometry')) {\n spPrChildren.push({\n name: '__rawXml',\n rawXml: this._rawPassthrough.get('geometry')!,\n } as XMLElement);\n } else {\n spPrChildren.push(\n XMLBuilder.a('prstGeom', { prst: this.presetGeometry }, [XMLBuilder.a('avLst')])\n );\n }\n\n // Border (a:ln) - full model (Group C)\n if (this.border) {\n // Add noFill element before the border line (required by Word)\n spPrChildren.push(XMLBuilder.a('noFill'));\n\n const ptToEmu = 12700;\n const widthEmu = this.border.width * ptToEmu;\n const lnAttrs: Record<string, string> = { w: widthEmu.toString() };\n if (this.border.cap) lnAttrs.cap = this.border.cap;\n if (this.border.compound) lnAttrs.cmpd = this.border.compound;\n if (this.border.alignment) lnAttrs.algn = this.border.alignment;\n\n const lnChildren: XMLElement[] = [];\n\n // Fill\n if (this.border.rawFillXml) {\n lnChildren.push({ name: '__rawXml', rawXml: this.border.rawFillXml } as XMLElement);\n } else if (this.border.fill) {\n const colorChildren: XMLElement[] = [];\n if (this.border.fill.modifiers) {\n for (const mod of this.border.fill.modifiers) {\n colorChildren.push(XMLBuilder.aSelf(mod.name, { val: mod.val }));\n }\n }\n const colorEl =\n colorChildren.length > 0\n ? XMLBuilder.a(this.border.fill.type, { val: this.border.fill.value }, colorChildren)\n : XMLBuilder.a(this.border.fill.type, { val: this.border.fill.value });\n lnChildren.push(XMLBuilder.a('solidFill', undefined, [colorEl]));\n } else {\n // Default: scheme color tx1 (backward compat)\n lnChildren.push(\n XMLBuilder.a('solidFill', undefined, [XMLBuilder.a('schemeClr', { val: 'tx1' })])\n );\n }\n\n // Dash pattern\n if (this.border.dashPattern) {\n lnChildren.push(XMLBuilder.aSelf('prstDash', { val: this.border.dashPattern }));\n }\n\n // Join\n if (this.border.join === 'round') {\n lnChildren.push(XMLBuilder.aSelf('round'));\n } else if (this.border.join === 'bevel') {\n lnChildren.push(XMLBuilder.aSelf('bevel'));\n } else if (this.border.join === 'miter') {\n const miterAttrs: Record<string, string> = {};\n if (this.border.miterLimit) miterAttrs.lim = this.border.miterLimit.toString();\n lnChildren.push(XMLBuilder.aSelf('miter', miterAttrs));\n }\n\n // Head/tail end\n if (this.border.headEnd) {\n lnChildren.push(XMLBuilder.aSelf('headEnd', this.border.headEnd as Record<string, string>));\n }\n if (this.border.tailEnd) {\n lnChildren.push(XMLBuilder.aSelf('tailEnd', this.border.tailEnd as Record<string, string>));\n }\n\n spPrChildren.push(XMLBuilder.a('ln', lnAttrs, lnChildren));\n }\n\n // Group B: Inject raw spPr effects passthrough (effectLst, scene3d, sp3d, etc.)\n if (this._rawPassthrough.has('spPr-effects')) {\n spPrChildren.push({\n name: '__rawXml',\n rawXml: this._rawPassthrough.get('spPr-effects')!,\n } as XMLElement);\n }\n\n // --- Build pic:cNvPr with passthrough ---\n const cNvPrChildren: XMLElement[] = [];\n if (this._rawPassthrough.has('cNvPr-extra')) {\n cNvPrChildren.push({\n name: '__rawXml',\n rawXml: this._rawPassthrough.get('cNvPr-extra')!,\n } as XMLElement);\n }\n const cNvPr =\n cNvPrChildren.length > 0\n ? XMLBuilder.pic(\n 'cNvPr',\n {\n id: this.picNonVisualProps.id,\n name: this.picNonVisualProps.name,\n descr: this.picNonVisualProps.descr,\n },\n cNvPrChildren\n )\n : XMLBuilder.pic('cNvPr', {\n id: this.picNonVisualProps.id,\n name: this.picNonVisualProps.name,\n descr: this.picNonVisualProps.descr,\n });\n\n // --- Build picLocks from map ---\n const picLocksAttrs: Record<string, string> = {};\n for (const [key, val] of Object.entries(this.picLocks)) {\n if (val) picLocksAttrs[key] = '1';\n }\n\n // --- Build blipFill ---\n const blipFillAttrs: Record<string, string> = {};\n if (this.blipFillDpi !== undefined) blipFillAttrs.dpi = this.blipFillDpi.toString();\n if (this.blipFillRotWithShape !== undefined)\n blipFillAttrs.rotWithShape = this.blipFillRotWithShape ? '1' : '0';\n\n const blipFillChildren: XMLElement[] = [blip];\n // Crop values are stored as percentages (0-100), serialized as per-mille (0-100000)\n if (this.crop) {\n blipFillChildren.push(\n XMLBuilder.a('srcRect', {\n l: Math.round(this.crop.left * 1000).toString(),\n t: Math.round(this.crop.top * 1000).toString(),\n r: Math.round(this.crop.right * 1000).toString(),\n b: Math.round(this.crop.bottom * 1000).toString(),\n })\n );\n }\n // Group B: Use tile passthrough instead of stretch when present\n if (this._rawPassthrough.has('blipFill-extra')) {\n blipFillChildren.push({\n name: '__rawXml',\n rawXml: this._rawPassthrough.get('blipFill-extra')!,\n } as XMLElement);\n } else {\n blipFillChildren.push(XMLBuilder.a('stretch', undefined, [XMLBuilder.a('fillRect')]));\n }\n\n const blipFillAttrsObj = Object.keys(blipFillAttrs).length > 0 ? blipFillAttrs : undefined;\n\n const graphicData = XMLBuilder.a(\n 'graphicData',\n { uri: 'http://schemas.openxmlformats.org/drawingml/2006/picture' },\n [\n XMLBuilder.pic('pic', undefined, [\n XMLBuilder.pic('nvPicPr', undefined, [\n cNvPr,\n XMLBuilder.pic('cNvPicPr', undefined, [\n XMLBuilder.a(\n 'picLocks',\n Object.keys(picLocksAttrs).length > 0 ? picLocksAttrs : undefined\n ),\n ]),\n ]),\n XMLBuilder.pic('blipFill', blipFillAttrsObj, blipFillChildren),\n XMLBuilder.pic('spPr', { bwMode: this.bwMode }, spPrChildren),\n ]),\n ]\n );\n\n const graphic = XMLBuilder.a('graphic', undefined, [graphicData]);\n\n // --- Build docPr element (shared between inline and floating) ---\n const buildDocPr = (idVal: string | number): XMLElement => {\n const attrs: Record<string, any> = { id: idVal, name: this.name, descr: this.description };\n if (this.title) attrs.title = this.title;\n if (this.hidden) attrs.hidden = '1';\n const children: XMLElement[] = [];\n if (this._rawPassthrough.has('docPr-extra')) {\n children.push({\n name: '__rawXml',\n rawXml: this._rawPassthrough.get('docPr-extra')!,\n } as XMLElement);\n }\n return children.length > 0\n ? XMLBuilder.wp('docPr', attrs, children)\n : XMLBuilder.wp('docPr', attrs);\n };\n\n // --- Build cNvGraphicFramePr element (shared between inline and floating) ---\n const buildCNvGraphicFramePr = (): XMLElement => {\n return XMLBuilder.wp('cNvGraphicFramePr', undefined, [\n XMLBuilder.a('graphicFrameLocks', {\n 'xmlns:a': 'http://schemas.openxmlformats.org/drawingml/2006/main',\n noChangeAspect: this.noChangeAspect ? '1' : '0',\n }),\n ]);\n };\n\n if (isFloating) {\n // Floating image (anchor)\n const positionHChildren: XMLElement[] = [];\n if (this.position?.horizontal.alignment) {\n positionHChildren.push(\n XMLBuilder.wp('align', undefined, [this.position.horizontal.alignment])\n );\n } else {\n positionHChildren.push(\n XMLBuilder.wp('posOffset', undefined, [\n (this.position?.horizontal.offset || 0).toString(),\n ])\n );\n }\n const positionH = XMLBuilder.wp(\n 'positionH',\n { relativeFrom: this.position?.horizontal.anchor || 'page' },\n positionHChildren\n );\n\n const positionVChildren: XMLElement[] = [];\n if (this.position?.vertical.alignment) {\n positionVChildren.push(\n XMLBuilder.wp('align', undefined, [this.position.vertical.alignment])\n );\n } else {\n positionVChildren.push(\n XMLBuilder.wp('posOffset', undefined, [(this.position?.vertical.offset || 0).toString()])\n );\n }\n const positionV = XMLBuilder.wp(\n 'positionV',\n { relativeFrom: this.position?.vertical.anchor || 'page' },\n positionVChildren\n );\n\n // Effect extent for floating images (required by Word)\n const floatEffectExt = this.effectExtent || { left: 0, top: 0, right: 0, bottom: 0 };\n const effectExtentElement = XMLBuilder.wp('effectExtent', {\n t: floatEffectExt.top.toString(),\n r: floatEffectExt.right.toString(),\n b: floatEffectExt.bottom.toString(),\n l: floatEffectExt.left.toString(),\n });\n\n const anchorChildren: XMLElement[] = [positionH, positionV, extent, effectExtentElement];\n\n // Wrap element (required by CT_Anchor per ECMA-376 — defaults to wrapNone)\n if (this.wrap) {\n const wrapAttrs: Record<string, any> = {};\n if (this.wrap.distanceTop !== undefined) wrapAttrs.distT = this.wrap.distanceTop;\n if (this.wrap.distanceBottom !== undefined) wrapAttrs.distB = this.wrap.distanceBottom;\n if (this.wrap.distanceLeft !== undefined) wrapAttrs.distL = this.wrap.distanceLeft;\n if (this.wrap.distanceRight !== undefined) wrapAttrs.distR = this.wrap.distanceRight;\n if (this.wrap.side) wrapAttrs.wrapText = this.wrap.side;\n\n let wrapElementName: string;\n switch (this.wrap.type) {\n case 'square':\n wrapElementName = 'wrapSquare';\n break;\n case 'tight':\n wrapElementName = 'wrapTight';\n break;\n case 'through':\n wrapElementName = 'wrapThrough';\n break;\n case 'topAndBottom':\n wrapElementName = 'wrapTopAndBottom';\n break;\n case 'none':\n wrapElementName = 'wrapNone';\n break;\n default:\n wrapElementName = 'wrapSquare';\n }\n\n // Group B: Include wrap polygon passthrough as children\n const wrapChildren: XMLElement[] = [];\n if (this._rawPassthrough.has('wrap-polygon')) {\n wrapChildren.push({\n name: '__rawXml',\n rawXml: this._rawPassthrough.get('wrap-polygon')!,\n } as XMLElement);\n } else if (wrapElementName === 'wrapTight' || wrapElementName === 'wrapThrough') {\n // CT_WrapTight/CT_WrapThrough require a wp:wrapPolygon child.\n // Generate a default rectangular polygon covering the full image extents.\n wrapChildren.push({\n name: 'wp:wrapPolygon',\n attributes: { edited: '0' },\n children: [\n { name: 'wp:start', attributes: { x: '0', y: '0' }, selfClosing: true },\n { name: 'wp:lineTo', attributes: { x: '21600', y: '0' }, selfClosing: true },\n { name: 'wp:lineTo', attributes: { x: '21600', y: '21600' }, selfClosing: true },\n { name: 'wp:lineTo', attributes: { x: '0', y: '21600' }, selfClosing: true },\n { name: 'wp:lineTo', attributes: { x: '0', y: '0' }, selfClosing: true },\n ],\n });\n }\n\n anchorChildren.push(\n wrapChildren.length > 0\n ? XMLBuilder.wp(wrapElementName, wrapAttrs, wrapChildren)\n : XMLBuilder.wp(wrapElementName, wrapAttrs)\n );\n } else {\n // Default: wrapNone (required choice element per CT_Anchor)\n anchorChildren.push(XMLBuilder.wp('wrapNone', {}));\n }\n\n anchorChildren.push(buildDocPr(this.docPrId));\n anchorChildren.push(buildCNvGraphicFramePr());\n anchorChildren.push(graphic);\n\n // Group B: Inject anchor extras (wp14:sizeRelH, wp14:sizeRelV)\n if (this._rawPassthrough.has('anchor-extra')) {\n anchorChildren.push({\n name: '__rawXml',\n rawXml: this._rawPassthrough.get('anchor-extra')!,\n } as XMLElement);\n }\n\n // Build anchor attributes including simplePos and distance from text\n const anchorAttrs: Record<string, any> = {\n behindDoc: this.anchor?.behindDoc ? 1 : 0,\n locked: this.anchor?.locked ? 1 : 0,\n layoutInCell: this.anchor?.layoutInCell ? 1 : 0,\n allowOverlap: this.anchor?.allowOverlap ? 1 : 0,\n relativeHeight: this.anchor?.relativeHeight,\n simplePos: this.anchor?.simplePos ? '1' : '0',\n distT: (this.anchor?.distT ?? 0).toString(),\n distB: (this.anchor?.distB ?? 0).toString(),\n distL: (this.anchor?.distL ?? 0).toString(),\n distR: (this.anchor?.distR ?? 0).toString(),\n };\n if (this.hidden) anchorAttrs.hidden = '1';\n\n // Add wp:simplePos child element (required by ECMA-376 even when simplePos=\"0\")\n anchorChildren.unshift(XMLBuilder.wp('simplePos', { x: '0', y: '0' }));\n\n return XMLBuilder.w('drawing', undefined, [\n XMLBuilder.wp('anchor', anchorAttrs, anchorChildren),\n ]);\n } else {\n // Inline image\n const effectExt = this.effectExtent || { left: 0, top: 0, right: 0, bottom: 0 };\n\n return XMLBuilder.w('drawing', undefined, [\n XMLBuilder.wp(\n 'inline',\n {\n distT: this.inlineDistT.toString(),\n distB: this.inlineDistB.toString(),\n distL: this.inlineDistL.toString(),\n distR: this.inlineDistR.toString(),\n },\n [\n extent,\n XMLBuilder.wp('effectExtent', {\n t: effectExt.top.toString(),\n r: effectExt.right.toString(),\n b: effectExt.bottom.toString(),\n l: effectExt.left.toString(),\n }),\n buildDocPr(this.docPrId.toString()),\n buildCNvGraphicFramePr(),\n graphic,\n ]\n ),\n ]);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Image.js","sourceRoot":"","sources":["../../src/elements/Image.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Image - Represents an embedded image in a Word document\n *\n * Images use DrawingML (a:) and WordprocessingML Drawing (wp:) namespaces\n * for proper positioning and formatting in Word documents.\n */\n\nimport { promises as fs } from 'fs';\nimport { defaultLogger } from '../utils/logger';\nimport { inchesToEmus, UNITS } from '../utils/units';\nimport { XMLBuilder, XMLElement } from '../xml/XMLBuilder';\n\n/**\n * Supported image formats\n */\nexport type ImageFormat = 'png' | 'jpeg' | 'jpg' | 'gif' | 'bmp' | 'tiff' | 'svg' | 'emf' | 'wmf';\n\n/**\n * Preset geometry shape type (ECMA-376 §20.1.9.18)\n */\nexport type PresetGeometry = 'rect' | 'roundRect' | 'ellipse' | string;\n\n/**\n * Blip compression state (ECMA-376 §20.1.8.15)\n */\nexport type BlipCompressionState = 'none' | 'print' | 'email' | 'hqprint' | 'screen';\n\n/**\n * Picture lock attribute names (ECMA-376 §20.1.2.2.31)\n */\nexport type PicLockAttribute =\n | 'noChangeAspect'\n | 'noChangeArrowheads'\n | 'noSelect'\n | 'noMove'\n | 'noResize'\n | 'noEditPoints'\n | 'noAdjustHandles'\n | 'noRot'\n | 'noChangeShapeType'\n | 'noCrop'\n | 'noGrp';\n\n/**\n * Non-visual picture properties (ECMA-376 §19.3.1.12)\n */\nexport interface PicNonVisualProperties {\n id: string;\n name: string;\n descr: string;\n}\n\n/**\n * Image border definition (full a:ln support per ECMA-376)\n */\nexport interface ImageBorder {\n /** Border width in points */\n width: number;\n /** Line cap style */\n cap?: 'flat' | 'rnd' | 'sq';\n /** Compound line type */\n compound?: 'sng' | 'dbl' | 'thickThin' | 'thinThick' | 'tri';\n /** Alignment relative to shape */\n alignment?: 'ctr' | 'in';\n /** Fill specification */\n fill?: {\n type: 'srgbClr' | 'schemeClr';\n value: string;\n modifiers?: { name: string; val: string }[];\n };\n /** Raw XML for non-solid fills (gradFill, pattFill, etc.) */\n rawFillXml?: string;\n /** Preset dash pattern */\n dashPattern?: string;\n /** Line join style */\n join?: 'round' | 'bevel' | 'miter';\n /** Miter limit (percentage * 1000) */\n miterLimit?: number;\n /** Head end decoration */\n headEnd?: { type?: string; width?: string; length?: string };\n /** Tail end decoration */\n tailEnd?: { type?: string; width?: string; length?: string };\n /** @internal Set by parser to suppress default fill in generator */\n _fromParsed?: boolean;\n}\n\n/**\n * Image extent (dimensions)\n */\nexport interface ImageExtent {\n /** Width in EMUs */\n width: number;\n /** Height in EMUs */\n height: number;\n}\n\n/**\n * Effect extent (additional space for shadows, reflections, glows)\n * Specifies additional space to add to each edge to prevent clipping of effects\n */\nexport interface EffectExtent {\n /** Left extent in EMUs */\n left: number;\n /** Top extent in EMUs */\n top: number;\n /** Right extent in EMUs */\n right: number;\n /** Bottom extent in EMUs */\n bottom: number;\n}\n\n/**\n * Text wrapping type\n */\nexport type WrapType = 'square' | 'tight' | 'through' | 'topAndBottom' | 'none';\n\n/**\n * Text wrapping side\n */\nexport type WrapSide = 'bothSides' | 'left' | 'right' | 'largest';\n\n/**\n * Text wrap settings\n */\nexport interface TextWrapSettings {\n /** Wrap type */\n type: WrapType;\n /** Which side(s) to wrap text */\n side?: WrapSide;\n /** Distance from top in EMUs */\n distanceTop?: number;\n /** Distance from bottom in EMUs */\n distanceBottom?: number;\n /** Distance from left in EMUs */\n distanceLeft?: number;\n /** Distance from right in EMUs */\n distanceRight?: number;\n}\n\n/**\n * Position anchor type (what to position relative to)\n */\nexport type PositionAnchor = 'page' | 'margin' | 'column' | 'character' | 'paragraph';\n\n/**\n * Horizontal alignment options\n */\nexport type HorizontalAlignment = 'left' | 'center' | 'right' | 'inside' | 'outside';\n\n/**\n * Vertical alignment options\n */\nexport type VerticalAlignment = 'top' | 'center' | 'bottom' | 'inside' | 'outside';\n\n/**\n * Image position configuration\n */\nexport interface ImagePosition {\n /** Horizontal positioning */\n horizontal: {\n /** Anchor point */\n anchor: PositionAnchor;\n /** Offset in EMUs (absolute positioning) */\n offset?: number;\n /** Alignment (relative positioning) */\n alignment?: HorizontalAlignment;\n };\n /** Vertical positioning */\n vertical: {\n /** Anchor point */\n anchor: PositionAnchor;\n /** Offset in EMUs (absolute positioning) */\n offset?: number;\n /** Alignment (relative positioning) */\n alignment?: VerticalAlignment;\n };\n}\n\n/**\n * Image anchor configuration (floating images)\n */\nexport interface ImageAnchor {\n /** Position behind text */\n behindDoc: boolean;\n /** Lock anchor (prevent movement) */\n locked: boolean;\n /** Layout in table cell */\n layoutInCell: boolean;\n /** Allow overlap with other objects */\n allowOverlap: boolean;\n /** Z-order (higher = in front) */\n relativeHeight: number;\n /** Use simple positioning (wp:simplePos coordinates) */\n simplePos?: boolean;\n /** Distance from text - top (EMUs) */\n distT?: number;\n /** Distance from text - bottom (EMUs) */\n distB?: number;\n /** Distance from text - left (EMUs) */\n distL?: number;\n /** Distance from text - right (EMUs) */\n distR?: number;\n}\n\n/**\n * Image crop settings (percentage-based)\n */\nexport interface ImageCrop {\n /** Left crop percentage (0-100) */\n left: number;\n /** Top crop percentage (0-100) */\n top: number;\n /** Right crop percentage (0-100) */\n right: number;\n /** Bottom crop percentage (0-100) */\n bottom: number;\n}\n\n/**\n * Image visual effects\n */\nexport interface ImageEffects {\n /** Brightness adjustment (-100 to +100) */\n brightness?: number;\n /** Contrast adjustment (-100 to +100) */\n contrast?: number;\n /** Convert to grayscale */\n grayscale?: boolean;\n /** Transparency (0-100, percentage) via a:alphaModFix */\n transparency?: number;\n}\n\n/**\n * Image properties\n */\nexport interface ImageProperties {\n /** Image source (file path or buffer) */\n source: string | Buffer;\n /** Image width in EMUs (optional - will auto-detect) */\n width?: number;\n /** Image height in EMUs (optional - will auto-detect) */\n height?: number;\n /** Maintain aspect ratio when resizing */\n maintainAspectRatio?: boolean;\n /** Alt text / description */\n description?: string;\n /** Image name/title */\n name?: string;\n /** Image title (wp:docPr title attribute for accessibility) */\n title?: string;\n /** Relationship ID (will be set by ImageManager) */\n relationshipId?: string;\n /** Effect extent (space for shadows/glows) */\n effectExtent?: EffectExtent;\n /** Text wrapping configuration */\n wrap?: TextWrapSettings;\n /** Position configuration (floating images) */\n position?: ImagePosition;\n /** Anchor configuration (floating images) */\n anchor?: ImageAnchor;\n /** Crop settings */\n crop?: ImageCrop;\n /** Visual effects */\n effects?: ImageEffects;\n /** Border settings */\n border?: ImageBorder | { width: number };\n /** Rotation angle in degrees (0-360) */\n rotation?: number;\n /** Horizontal flip (ECMA-376 §20.1.7.6) */\n flipH?: boolean;\n /** Vertical flip (ECMA-376 §20.1.7.6) */\n flipV?: boolean;\n /** Preset geometry shape (ECMA-376 §20.1.9.18) */\n presetGeometry?: PresetGeometry;\n /** Blip compression state (ECMA-376 §20.1.8.15) */\n compressionState?: BlipCompressionState;\n /** Black-and-white mode (ECMA-376 §20.1.2.2.35) */\n bwMode?: string;\n /** Inline distance from text - top (EMUs, ECMA-376 §20.4.2.8) */\n inlineDistT?: number;\n /** Inline distance from text - bottom (EMUs) */\n inlineDistB?: number;\n /** Inline distance from text - left (EMUs) */\n inlineDistL?: number;\n /** Inline distance from text - right (EMUs) */\n inlineDistR?: number;\n /** Whether aspect ratio lock is enabled (ECMA-376 §20.4.2.4) */\n noChangeAspect?: boolean;\n /** Hidden attribute on docPr (ECMA-376 §20.4.2.3) */\n hidden?: boolean;\n /** BlipFill DPI override (ECMA-376 §20.1.8.14) */\n blipFillDpi?: number;\n /** BlipFill rotate with shape flag (ECMA-376 §20.1.8.14) */\n blipFillRotWithShape?: boolean;\n /** Picture locks (ECMA-376 §20.1.2.2.31) */\n picLocks?: Partial<Record<PicLockAttribute, boolean>>;\n /** Non-visual picture properties (ECMA-376 §19.3.1.12) */\n picNonVisualProps?: PicNonVisualProperties;\n /** Whether image is linked (r:link) vs embedded (r:embed) */\n isLinked?: boolean;\n /** SVG relationship ID for Word 365 dual-relationship approach */\n svgRelationshipId?: string;\n}\n\n/**\n * Image validation result\n */\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n}\n\nexport class Image {\n private source: string | Buffer;\n private width: number;\n private height: number;\n private description: string;\n private name: string;\n private title?: string;\n private relationshipId?: string;\n private imageData?: Buffer;\n private extension: string;\n private docPrId = 1;\n private dpi = 96; // Default DPI\n\n // Advanced image properties\n private effectExtent?: EffectExtent;\n private wrap?: TextWrapSettings;\n private position?: ImagePosition;\n private anchor?: ImageAnchor;\n private crop?: ImageCrop;\n private effects?: ImageEffects;\n private rotation = 0;\n private flipH = false;\n private flipV = false;\n private border?: ImageBorder;\n\n // Group A: Simple attribute preservation (ECMA-376 compliance)\n private presetGeometry: PresetGeometry = 'rect';\n private compressionState: BlipCompressionState = 'none';\n private bwMode = 'auto';\n private inlineDistT = 0;\n private inlineDistB = 0;\n private inlineDistL = 0;\n private inlineDistR = 0;\n private noChangeAspect = true;\n private hidden = false;\n private blipFillDpi?: number;\n private blipFillRotWithShape?: boolean;\n private picLocks: Partial<Record<PicLockAttribute, boolean>> = {\n noChangeAspect: true,\n noChangeArrowheads: true,\n };\n private picNonVisualProps: PicNonVisualProperties = { id: '0', name: '', descr: '' };\n private isLinked = false;\n private svgRelationshipId?: string;\n\n // Group B: Raw XML passthrough for complex subtrees\n private _rawPassthrough = new Map<string, string>();\n\n /**\n * Creates a new image from file path (async factory)\n * @param path File path\n * @param properties Additional properties\n * @returns Promise<Image>\n */\n static async fromFile(path: string, properties: Partial<ImageProperties> = {}): Promise<Image> {\n const image = new Image({ source: path, ...properties });\n await image.loadImageDataForDimensions();\n return image;\n }\n\n /**\n * Creates a new image from buffer (async factory)\n * Supports both modern and legacy API signatures\n *\n * @param buffer Image buffer\n * @param mimeTypeOrProperties MIME type string ('png', 'jpeg', etc.) or properties object\n * @param width Optional width in EMUs (legacy API)\n * @param height Optional height in EMUs (legacy API)\n * @returns Promise<Image>\n *\n * @example\n * // Modern API (recommended)\n * const img = await Image.fromBuffer(buffer, { mimeType: 'png', width: 914400, height: 914400 });\n *\n * // Legacy API (still supported)\n * const img = await Image.fromBuffer(buffer, 'png', 914400, 914400);\n */\n static async fromBuffer(\n buffer: Buffer,\n mimeTypeOrProperties?: string | Partial<ImageProperties>,\n width?: number,\n height?: number\n ): Promise<Image> {\n let properties: Partial<ImageProperties>;\n\n // Detect API signature\n if (typeof mimeTypeOrProperties === 'string') {\n // Legacy 4-parameter signature: fromBuffer(buffer, 'png', 914400, 914400)\n // Note: mimeType is ignored - extension is auto-detected from buffer\n properties = {\n width: width,\n height: height,\n };\n } else {\n // Modern API: fromBuffer(buffer, { width: 914400, height: 914400 })\n properties = mimeTypeOrProperties || {};\n }\n\n const image = new Image({ source: buffer, ...properties });\n await image.loadImageDataForDimensions();\n return image;\n }\n\n /**\n * Unified create method for images (async factory)\n * @param properties Image properties including source (path or buffer)\n * @returns Promise<Image>\n */\n static async create(properties: ImageProperties): Promise<Image> {\n if (Buffer.isBuffer(properties.source)) {\n return Image.fromBuffer(properties.source, properties);\n } else if (typeof properties.source === 'string') {\n return Image.fromFile(properties.source, properties);\n } else {\n throw new Error('Invalid source: must be file path or Buffer');\n }\n }\n\n /**\n * Private constructor\n * @param properties Image properties\n */\n private constructor(properties: ImageProperties) {\n this.source = properties.source;\n this.description = properties.description || 'Image';\n this.name = properties.name || 'image';\n this.title = properties.title;\n this.relationshipId = properties.relationshipId;\n\n // Detect image extension\n this.extension = this.detectExtension();\n\n // Set default dimensions (6 inches x 4 inches) if not provided\n this.width = properties.width || inchesToEmus(6);\n this.height = properties.height || inchesToEmus(4);\n\n // Initialize advanced properties\n this.effectExtent = properties.effectExtent;\n this.wrap = properties.wrap;\n this.position = properties.position;\n this.anchor = properties.anchor;\n this.crop = properties.crop;\n this.effects = properties.effects;\n // Border: accept both legacy { width } and full ImageBorder\n if (properties.border) {\n this.border = properties.border as ImageBorder;\n }\n // Apply rotation if provided (normalize to 0-360)\n if (properties.rotation !== undefined && properties.rotation !== 0) {\n this.rotation = ((properties.rotation % 360) + 360) % 360;\n }\n // Apply flip attributes (ECMA-376 §20.1.7.6)\n this.flipH = properties.flipH || false;\n this.flipV = properties.flipV || false;\n\n // Group A: Simple attribute preservation\n if (properties.presetGeometry !== undefined) this.presetGeometry = properties.presetGeometry;\n if (properties.compressionState !== undefined)\n this.compressionState = properties.compressionState;\n if (properties.bwMode !== undefined) this.bwMode = properties.bwMode;\n if (properties.inlineDistT !== undefined) this.inlineDistT = properties.inlineDistT;\n if (properties.inlineDistB !== undefined) this.inlineDistB = properties.inlineDistB;\n if (properties.inlineDistL !== undefined) this.inlineDistL = properties.inlineDistL;\n if (properties.inlineDistR !== undefined) this.inlineDistR = properties.inlineDistR;\n if (properties.noChangeAspect !== undefined) this.noChangeAspect = properties.noChangeAspect;\n if (properties.hidden !== undefined) this.hidden = properties.hidden;\n if (properties.blipFillDpi !== undefined) this.blipFillDpi = properties.blipFillDpi;\n if (properties.blipFillRotWithShape !== undefined)\n this.blipFillRotWithShape = properties.blipFillRotWithShape;\n if (properties.picLocks !== undefined) this.picLocks = properties.picLocks;\n if (properties.picNonVisualProps !== undefined)\n this.picNonVisualProps = properties.picNonVisualProps;\n if (properties.isLinked !== undefined) this.isLinked = properties.isLinked;\n if (properties.svgRelationshipId !== undefined)\n this.svgRelationshipId = properties.svgRelationshipId;\n\n // Set default DPI\n this.dpi = 96;\n }\n\n /**\n * Loads image data temporarily for dimension detection only\n * Data is released after detection to save memory\n * @private\n */\n private async loadImageDataForDimensions(): Promise<void> {\n let tempData: Buffer | undefined;\n\n try {\n if (Buffer.isBuffer(this.source)) {\n tempData = this.source;\n } else if (typeof this.source === 'string') {\n await fs.access(this.source);\n tempData = await fs.readFile(this.source);\n }\n\n if (tempData) {\n this.imageData = tempData; // Temporarily store\n\n // Only auto-detect dimensions if they weren't explicitly provided\n // This preserves wp:extent values from parsed documents\n const defaultWidth = inchesToEmus(6);\n const defaultHeight = inchesToEmus(4);\n const hasExplicitDimensions = this.width !== defaultWidth || this.height !== defaultHeight;\n\n if (!hasExplicitDimensions) {\n const dimensions = this.detectDimensions();\n if (dimensions) {\n this.dpi = this.detectDPI() || 96;\n const emuPerInch = 914400;\n const pixelsPerInch = this.dpi;\n this.width = Math.round((dimensions.width / pixelsPerInch) * emuPerInch);\n this.height = Math.round((dimensions.height / pixelsPerInch) * emuPerInch);\n }\n }\n\n if (typeof this.source === 'string') {\n this.imageData = undefined; // Release\n }\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n defaultLogger.error(`Failed to load image for dimensions: ${message}`);\n throw new Error(`Image loading failed: ${message}`);\n }\n }\n\n /**\n * Ensures image data is loaded (lazy loading)\n */\n async ensureDataLoaded(): Promise<void> {\n if (this.imageData) return;\n\n try {\n if (Buffer.isBuffer(this.source)) {\n this.imageData = this.source;\n } else if (typeof this.source === 'string') {\n await fs.access(this.source);\n this.imageData = await fs.readFile(this.source);\n } else {\n throw new Error('Invalid image source');\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n defaultLogger.error(`Failed to load image data: ${message}`);\n throw new Error(`Image data loading failed: ${message}`);\n }\n }\n\n /**\n * Releases image data from memory\n */\n releaseData(): void {\n if (typeof this.source === 'string') {\n this.imageData = undefined;\n }\n }\n\n /**\n * Validates the image data integrity\n */\n validateImageData(): ValidationResult {\n // Skip validation for linked images (no data in package)\n if (this.isLinked) {\n return { valid: true };\n }\n\n if (!this.imageData || this.imageData.length === 0) {\n return { valid: false, error: 'Empty image data' };\n }\n\n // Skip signature validation for text-based formats (SVG)\n if (this.extension === 'svg') {\n return { valid: true };\n }\n\n const signatures: Record<string, number[]> = {\n png: [0x89, 0x50, 0x4e, 0x47],\n jpg: [0xff, 0xd8],\n jpeg: [0xff, 0xd8],\n gif: [0x47, 0x49, 0x46],\n bmp: [0x42, 0x4d],\n tiff: [0x49, 0x49, 0x2a, 0x00],\n tif: [0x49, 0x49, 0x2a, 0x00],\n };\n\n // EMF: check for ENHMETAHEADER signature at offset 40\n if (this.extension === 'emf') {\n if (\n this.imageData.length >= 44 &&\n this.imageData[40] === 0x20 &&\n this.imageData[41] === 0x45 &&\n this.imageData[42] === 0x4d &&\n this.imageData[43] === 0x46\n ) {\n return { valid: true };\n }\n return { valid: false, error: 'Invalid EMF signature' };\n }\n\n // WMF: check for placeable or standard header\n if (this.extension === 'wmf') {\n if (this.imageData.length >= 4) {\n // Placeable WMF\n if (\n this.imageData[0] === 0xd7 &&\n this.imageData[1] === 0xcd &&\n this.imageData[2] === 0xc6 &&\n this.imageData[3] === 0x9a\n ) {\n return { valid: true };\n }\n // Standard WMF\n if (\n this.imageData[0] === 0x01 &&\n this.imageData[1] === 0x00 &&\n this.imageData[2] === 0x09 &&\n this.imageData[3] === 0x00\n ) {\n return { valid: true };\n }\n }\n return { valid: false, error: 'Invalid WMF signature' };\n }\n\n const sig = signatures[this.extension];\n if (sig) {\n for (let i = 0; i < sig.length; i++) {\n if (this.imageData[i] !== sig[i]) {\n return { valid: false, error: `Invalid ${this.extension.toUpperCase()} signature` };\n }\n }\n }\n\n return { valid: true };\n }\n\n /**\n * Detects image extension from source (path or buffer)\n */\n private detectExtension(): string {\n // Try path-based detection first\n if (typeof this.source === 'string') {\n const match = /\\.([a-z]+)$/i.exec(this.source);\n if (match?.[1]) {\n return match[1].toLowerCase();\n }\n }\n\n // Buffer-based detection using magic bytes\n if (Buffer.isBuffer(this.source) && this.source.length >= 4) {\n const buf = this.source;\n // PNG\n if (buf[0] === 0x89 && buf[1] === 0x50 && buf[2] === 0x4e && buf[3] === 0x47) return 'png';\n // JPEG\n if (buf[0] === 0xff && buf[1] === 0xd8) return 'jpeg';\n // GIF\n if (buf[0] === 0x47 && buf[1] === 0x49 && buf[2] === 0x46) return 'gif';\n // BMP\n if (buf[0] === 0x42 && buf[1] === 0x4d) return 'bmp';\n // TIFF LE\n if (buf[0] === 0x49 && buf[1] === 0x49 && buf[2] === 0x2a && buf[3] === 0x00) return 'tiff';\n // TIFF BE\n if (buf[0] === 0x4d && buf[1] === 0x4d && buf[2] === 0x00 && buf[3] === 0x2a) return 'tiff';\n // EMF: byte 0 = 0x01,0x00,0x00,0x00 AND ' EMF' at offset 40\n if (\n buf.length >= 44 &&\n buf[0] === 0x01 &&\n buf[1] === 0x00 &&\n buf[2] === 0x00 &&\n buf[3] === 0x00 &&\n buf[40] === 0x20 &&\n buf[41] === 0x45 &&\n buf[42] === 0x4d &&\n buf[43] === 0x46\n )\n return 'emf';\n // WMF placeable\n if (buf[0] === 0xd7 && buf[1] === 0xcd && buf[2] === 0xc6 && buf[3] === 0x9a) return 'wmf';\n // WMF standard\n if (buf[0] === 0x01 && buf[1] === 0x00 && buf[2] === 0x09 && buf[3] === 0x00) return 'wmf';\n // SVG: starts with '<' or UTF-8 BOM + '<'\n if (\n buf[0] === 0x3c ||\n (buf[0] === 0xef && buf[1] === 0xbb && buf[2] === 0xbf && buf.length > 3 && buf[3] === 0x3c)\n )\n return 'svg';\n }\n\n return 'png';\n }\n\n /**\n * Attempts to detect image dimensions from buffer\n */\n private detectDimensions(): { width: number; height: number } | null {\n if (!this.imageData || this.imageData.length < 24) return null;\n\n if (\n this.imageData[0] === 0x89 &&\n this.imageData[1] === 0x50 &&\n this.imageData[2] === 0x4e &&\n this.imageData[3] === 0x47\n ) {\n return this.detectPngDimensions();\n }\n if (this.imageData[0] === 0xff && this.imageData[1] === 0xd8) {\n return this.detectJpegDimensions();\n }\n if (this.imageData[0] === 0x47 && this.imageData[1] === 0x49 && this.imageData[2] === 0x46) {\n return this.detectGifDimensions();\n }\n if (this.imageData[0] === 0x42 && this.imageData[1] === 0x4d) {\n return this.detectBmpDimensions();\n }\n if (\n (this.imageData[0] === 0x49 && this.imageData[1] === 0x49 && this.imageData[2] === 0x2a) ||\n (this.imageData[0] === 0x4d && this.imageData[1] === 0x4d && this.imageData[2] === 0x00)\n ) {\n return this.detectTiffDimensions();\n }\n // EMF: ENHMETAHEADER has ' EMF' at offset 40\n if (\n this.imageData.length >= 44 &&\n this.imageData[40] === 0x20 &&\n this.imageData[41] === 0x45 &&\n this.imageData[42] === 0x4d &&\n this.imageData[43] === 0x46\n ) {\n return this.detectEmfDimensions();\n }\n // WMF placeable\n if (\n this.imageData[0] === 0xd7 &&\n this.imageData[1] === 0xcd &&\n this.imageData[2] === 0xc6 &&\n this.imageData[3] === 0x9a\n ) {\n return this.detectWmfDimensions();\n }\n // SVG (text-based)\n if (\n this.imageData[0] === 0x3c ||\n (this.imageData[0] === 0xef && this.imageData[1] === 0xbb && this.imageData[2] === 0xbf)\n ) {\n return this.detectSvgDimensions();\n }\n return null;\n }\n\n // Dimension detection helpers (as before, keeping them the same)\n\n private detectPngDimensions(): { width: number; height: number } | null {\n if (!this.imageData || this.imageData.length < 24) return null;\n const width = this.imageData.readUInt32BE(16);\n const height = this.imageData.readUInt32BE(20);\n return { width, height };\n }\n\n private detectGifDimensions(): { width: number; height: number } | null {\n if (!this.imageData || this.imageData.length < 10) return null;\n const width = this.imageData.readUInt16LE(6);\n const height = this.imageData.readUInt16LE(8);\n if (width > 0 && height > 0) return { width, height };\n return null;\n }\n\n private detectBmpDimensions(): { width: number; height: number } | null {\n if (!this.imageData || this.imageData.length < 26) return null;\n const width = this.imageData.readInt32LE(18);\n const height = Math.abs(this.imageData.readInt32LE(22));\n if (width > 0 && height > 0) return { width, height };\n return null;\n }\n\n private detectTiffDimensions(): { width: number; height: number } | null {\n // Implementation as before\n if (!this.imageData || this.imageData.length < 14) return null;\n const isLittleEndian = this.imageData[0] === 0x49;\n const ifdOffset = isLittleEndian\n ? this.imageData.readUInt32LE(4)\n : this.imageData.readUInt32BE(4);\n if (ifdOffset + 14 > this.imageData.length) return null;\n const numEntries = isLittleEndian\n ? this.imageData.readUInt16LE(ifdOffset)\n : this.imageData.readUInt16BE(ifdOffset);\n let width = 0;\n let height = 0;\n for (let i = 0; i < numEntries; i++) {\n const entryOffset = ifdOffset + 2 + i * 12;\n if (entryOffset + 12 > this.imageData.length) break;\n const tag = isLittleEndian\n ? this.imageData.readUInt16LE(entryOffset)\n : this.imageData.readUInt16BE(entryOffset);\n const value = isLittleEndian\n ? this.imageData.readUInt32LE(entryOffset + 8)\n : this.imageData.readUInt32BE(entryOffset + 8);\n if (tag === 256) width = value;\n if (tag === 257) height = value;\n if (width > 0 && height > 0) break;\n }\n if (width > 0 && height > 0) return { width, height };\n return null;\n }\n\n private detectJpegDimensions(): { width: number; height: number } | null {\n // Implementation as before\n if (!this.imageData || this.imageData.length < 12) return null;\n let offset = 2;\n while (offset < this.imageData.length - 1) {\n if (this.imageData[offset] !== 0xff) break;\n const marker = this.imageData[offset + 1];\n if (marker === undefined) break;\n if (marker === 0x00 || marker === 0xff) {\n offset++;\n continue;\n }\n const isSOF =\n marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc;\n if (isSOF) {\n if (offset + 9 > this.imageData.length) break;\n const height = this.imageData.readUInt16BE(offset + 5);\n const width = this.imageData.readUInt16BE(offset + 7);\n if (width > 0 && height > 0) return { width, height };\n }\n if (marker === 0xda || marker === 0xd9) break;\n const segmentLength = this.imageData.readUInt16BE(offset + 2);\n if (segmentLength < 2 || offset + 2 + segmentLength > this.imageData.length) break;\n offset += 2 + segmentLength;\n }\n return null;\n }\n\n /**\n * Detects SVG dimensions from width/height attributes or viewBox\n */\n private detectSvgDimensions(): { width: number; height: number } | null {\n if (!this.imageData) return null;\n try {\n const svgText = this.imageData.toString('utf-8').substring(0, 2000);\n // Try width/height attributes on <svg> element\n const widthMatch = /<svg[^>]*\\bwidth\\s*=\\s*[\"']?(\\d+(?:\\.\\d+)?)/i.exec(svgText);\n const heightMatch = /<svg[^>]*\\bheight\\s*=\\s*[\"']?(\\d+(?:\\.\\d+)?)/i.exec(svgText);\n if (widthMatch?.[1] && heightMatch?.[1]) {\n return {\n width: Math.round(parseFloat(widthMatch[1])),\n height: Math.round(parseFloat(heightMatch[1])),\n };\n }\n // Try viewBox attribute\n const viewBoxMatch =\n /<svg[^>]*\\bviewBox\\s*=\\s*[\"']?\\s*[\\d.]+\\s+[\\d.]+\\s+([\\d.]+)\\s+([\\d.]+)/i.exec(svgText);\n if (viewBoxMatch?.[1] && viewBoxMatch?.[2]) {\n return {\n width: Math.round(parseFloat(viewBoxMatch[1])),\n height: Math.round(parseFloat(viewBoxMatch[2])),\n };\n }\n } catch {\n // SVG parsing failed\n }\n return null;\n }\n\n /**\n * Detects EMF dimensions from ENHMETAHEADER rclFrame (offsets 24-36, 0.01mm units)\n */\n private detectEmfDimensions(): { width: number; height: number } | null {\n if (!this.imageData || this.imageData.length < 40) return null;\n try {\n // rclFrame: left(24), top(28), right(32), bottom(36) in 0.01mm units\n const left = this.imageData.readInt32LE(24);\n const top = this.imageData.readInt32LE(28);\n const right = this.imageData.readInt32LE(32);\n const bottom = this.imageData.readInt32LE(36);\n const widthMm = (right - left) / 100;\n const heightMm = (bottom - top) / 100;\n // Convert mm to pixels at 96 DPI (1 inch = 25.4mm)\n const width = Math.round((widthMm / 25.4) * 96);\n const height = Math.round((heightMm / 25.4) * 96);\n if (width > 0 && height > 0) return { width, height };\n } catch {\n // EMF header parsing failed\n }\n return null;\n }\n\n /**\n * Detects WMF dimensions from placeable WMF header bounding box (offsets 6-14)\n */\n private detectWmfDimensions(): { width: number; height: number } | null {\n if (!this.imageData || this.imageData.length < 22) return null;\n try {\n // Placeable WMF header: left(6), top(8), right(10), bottom(12), inch(14)\n const left = this.imageData.readInt16LE(6);\n const top = this.imageData.readInt16LE(8);\n const right = this.imageData.readInt16LE(10);\n const bottom = this.imageData.readInt16LE(12);\n const unitsPerInch = this.imageData.readUInt16LE(14);\n if (unitsPerInch > 0) {\n const width = Math.round(((right - left) / unitsPerInch) * 96);\n const height = Math.round(((bottom - top) / unitsPerInch) * 96);\n if (width > 0 && height > 0) return { width, height };\n }\n } catch {\n // WMF header parsing failed\n }\n return null;\n }\n\n /**\n * Gets the image data buffer asynchronously\n */\n async getImageDataAsync(): Promise<Buffer> {\n await this.ensureDataLoaded();\n if (!this.imageData) throw new Error('Failed to load image data');\n return this.imageData;\n }\n\n /**\n * Gets the image data buffer synchronously\n */\n getImageData(): Buffer {\n if (!this.imageData) throw new Error('Image data not loaded. Call ensureDataLoaded first.');\n return this.imageData;\n }\n\n getExtension(): string {\n return this.extension;\n }\n\n getDPI(): number {\n return this.dpi;\n }\n\n getWidth(): number {\n return this.width;\n }\n\n getHeight(): number {\n return this.height;\n }\n\n getImageDataSafe(): Buffer | null {\n return this.imageData ?? null;\n }\n\n setWidth(width: number, maintainAspectRatio = true): this {\n if (maintainAspectRatio && this.height > 0) {\n const ratio = this.height / this.width;\n this.height = Math.round(width * ratio);\n }\n this.width = width;\n return this;\n }\n\n setHeight(height: number, maintainAspectRatio = true): this {\n if (maintainAspectRatio && this.width > 0) {\n const ratio = this.width / this.height;\n this.width = Math.round(height * ratio);\n }\n this.height = height;\n return this;\n }\n\n setSize(width: number, height: number): this {\n this.width = width;\n this.height = height;\n return this;\n }\n\n async updateImageData(newSource: string | Buffer): Promise<void> {\n this.source = newSource;\n this.imageData = undefined;\n await this.loadImageDataForDimensions();\n this.extension = this.detectExtension();\n this.dpi = this.detectDPI() || 96;\n }\n\n setRelationshipId(relationshipId: string): this {\n this.relationshipId = relationshipId;\n return this;\n }\n\n getRelationshipId(): string | undefined {\n return this.relationshipId;\n }\n\n setDocPrId(id: number): this {\n this.docPrId = id;\n return this;\n }\n\n setAltText(altText: string): this {\n this.description = altText;\n return this;\n }\n\n getAltText(): string {\n return this.description;\n }\n\n setTitle(title: string): this {\n this.title = title;\n return this;\n }\n\n getTitle(): string | undefined {\n return this.title;\n }\n\n rotate(degrees: number): this {\n this.rotation = ((degrees % 360) + 360) % 360;\n if (this.rotation === 90 || this.rotation === 270) {\n [this.width, this.height] = [this.height, this.width];\n }\n return this;\n }\n\n getRotation(): number {\n return this.rotation;\n }\n\n setFlipH(flip: boolean): this {\n this.flipH = flip;\n return this;\n }\n\n getFlipH(): boolean {\n return this.flipH;\n }\n\n setFlipV(flip: boolean): this {\n this.flipV = flip;\n return this;\n }\n\n getFlipV(): boolean {\n return this.flipV;\n }\n\n // --- Group A: Simple attribute getters/setters ---\n\n getPresetGeometry(): PresetGeometry {\n return this.presetGeometry;\n }\n setPresetGeometry(geom: PresetGeometry): this {\n this.presetGeometry = geom;\n return this;\n }\n\n getCompressionState(): BlipCompressionState {\n return this.compressionState;\n }\n setCompressionState(state: BlipCompressionState): this {\n this.compressionState = state;\n return this;\n }\n\n getBwMode(): string {\n return this.bwMode;\n }\n setBwMode(mode: string): this {\n this.bwMode = mode;\n return this;\n }\n\n getInlineDistT(): number {\n return this.inlineDistT;\n }\n getInlineDistB(): number {\n return this.inlineDistB;\n }\n getInlineDistL(): number {\n return this.inlineDistL;\n }\n getInlineDistR(): number {\n return this.inlineDistR;\n }\n setInlineDist(distT: number, distB: number, distL: number, distR: number): this {\n this.inlineDistT = distT;\n this.inlineDistB = distB;\n this.inlineDistL = distL;\n this.inlineDistR = distR;\n return this;\n }\n\n getNoChangeAspect(): boolean {\n return this.noChangeAspect;\n }\n setNoChangeAspect(val: boolean): this {\n this.noChangeAspect = val;\n return this;\n }\n\n getHidden(): boolean {\n return this.hidden;\n }\n setHidden(val: boolean): this {\n this.hidden = val;\n return this;\n }\n\n getBlipFillDpi(): number | undefined {\n return this.blipFillDpi;\n }\n setBlipFillDpi(dpi: number | undefined): this {\n this.blipFillDpi = dpi;\n return this;\n }\n\n getBlipFillRotWithShape(): boolean | undefined {\n return this.blipFillRotWithShape;\n }\n setBlipFillRotWithShape(val: boolean | undefined): this {\n this.blipFillRotWithShape = val;\n return this;\n }\n\n getPicLocks(): Partial<Record<PicLockAttribute, boolean>> {\n return { ...this.picLocks };\n }\n setPicLocks(locks: Partial<Record<PicLockAttribute, boolean>>): this {\n this.picLocks = locks;\n return this;\n }\n\n getPicNonVisualProps(): PicNonVisualProperties {\n return { ...this.picNonVisualProps };\n }\n setPicNonVisualProps(props: PicNonVisualProperties): this {\n this.picNonVisualProps = props;\n return this;\n }\n\n getIsLinked(): boolean {\n return this.isLinked;\n }\n setIsLinked(val: boolean): this {\n this.isLinked = val;\n return this;\n }\n\n getSvgRelationshipId(): string | undefined {\n return this.svgRelationshipId;\n }\n setSvgRelationshipId(id: string | undefined): this {\n this.svgRelationshipId = id;\n return this;\n }\n\n // --- Group B: Raw passthrough storage ---\n\n /** @internal */\n _setRawPassthrough(slot: string, xml: string): void {\n this._rawPassthrough.set(slot, xml);\n }\n\n /** @internal */\n _getRawPassthrough(slot: string): string | undefined {\n return this._rawPassthrough.get(slot);\n }\n\n /** @internal */\n _hasRawPassthrough(slot: string): boolean {\n return this._rawPassthrough.has(slot);\n }\n\n // --- Group C: Enhanced border ---\n\n getBorder(): ImageBorder | undefined {\n return this.border;\n }\n\n setEffectExtent(left: number, top: number, right: number, bottom: number): this {\n this.effectExtent = { left, top, right, bottom };\n return this;\n }\n\n getEffectExtent(): EffectExtent | undefined {\n return this.effectExtent;\n }\n\n setWrap(\n type: WrapType,\n side?: WrapSide,\n distances?: { top?: number; bottom?: number; left?: number; right?: number }\n ): this {\n this.wrap = {\n type,\n side,\n distanceTop: distances?.top,\n distanceBottom: distances?.bottom,\n distanceLeft: distances?.left,\n distanceRight: distances?.right,\n };\n return this;\n }\n\n getWrap(): TextWrapSettings | undefined {\n return this.wrap;\n }\n\n /**\n * Validates a position offset value\n * @param offset - Offset value in EMUs\n * @param axis - 'horizontal' or 'vertical' for error messages\n * @throws {Error} If offset exceeds maximum reasonable value\n * @private\n */\n private validatePositionOffset(offset: number | undefined, axis: string): void {\n if (offset === undefined) return;\n\n // Maximum reasonable offset: 50 inches = 45,720,000 EMUs\n const MAX_OFFSET_EMUS = 45720000;\n if (Math.abs(offset) > MAX_OFFSET_EMUS) {\n throw new Error(\n `Invalid ${axis} position offset: ${offset} EMUs exceeds maximum of ${MAX_OFFSET_EMUS} EMUs (50 inches).`\n );\n }\n }\n\n /**\n * Sets the position for a floating image\n *\n * Position can be specified using either:\n * - Absolute offset (in EMUs from the anchor point)\n * - Relative alignment (left, center, right / top, center, bottom)\n *\n * @param horizontal - Horizontal positioning configuration\n * @param vertical - Vertical positioning configuration\n * @returns This image for chaining\n * @throws {Error} If offset values exceed maximum\n *\n * @example\n * ```typescript\n * // Absolute positioning (100,000 EMUs from page edges)\n * image.setPosition(\n * { anchor: 'page', offset: 100000 },\n * { anchor: 'page', offset: 100000 }\n * );\n *\n * // Relative alignment (centered on page)\n * image.setPosition(\n * { anchor: 'page', alignment: 'center' },\n * { anchor: 'page', alignment: 'center' }\n * );\n * ```\n */\n setPosition(horizontal: ImagePosition['horizontal'], vertical: ImagePosition['vertical']): this {\n // Validate offset values\n this.validatePositionOffset(horizontal.offset, 'horizontal');\n this.validatePositionOffset(vertical.offset, 'vertical');\n\n this.position = { horizontal, vertical };\n return this;\n }\n\n getPosition(): ImagePosition | undefined {\n return this.position;\n }\n\n /**\n * Validates the current image position configuration\n *\n * Checks for common configuration issues:\n * - Missing anchor when offset is used\n * - Conflicting offset and alignment values\n * - Invalid combinations\n *\n * @returns Validation result with details\n *\n * @example\n * ```typescript\n * const result = image.validatePosition();\n * if (!result.isValid) {\n * console.log(result.warnings); // Array of warning messages\n * }\n * ```\n */\n validatePosition(): {\n isValid: boolean;\n warnings: string[];\n } {\n const warnings: string[] = [];\n\n if (!this.position) {\n return { isValid: true, warnings };\n }\n\n // Check if both offset and alignment are specified (unusual but not invalid)\n if (this.position.horizontal.offset !== undefined && this.position.horizontal.alignment) {\n warnings.push(\n 'Horizontal position has both offset and alignment. Word will use alignment and ignore offset.'\n );\n }\n\n if (this.position.vertical.offset !== undefined && this.position.vertical.alignment) {\n warnings.push(\n 'Vertical position has both offset and alignment. Word will use alignment and ignore offset.'\n );\n }\n\n // Check for floating image without anchor settings\n if (this.position && !this.anchor) {\n warnings.push(\n 'Position is set but anchor is not. Consider setting anchor properties for proper floating behavior.'\n );\n }\n\n return {\n isValid: warnings.length === 0,\n warnings,\n };\n }\n\n setAnchor(options: ImageAnchor): this {\n this.anchor = options;\n return this;\n }\n\n getAnchor(): ImageAnchor | undefined {\n return this.anchor;\n }\n\n setCrop(left: number, top: number, right: number, bottom: number): this {\n const clamp = (val: number) => Math.max(0, Math.min(100, val));\n this.crop = { left: clamp(left), top: clamp(top), right: clamp(right), bottom: clamp(bottom) };\n return this;\n }\n\n getCrop(): ImageCrop | undefined {\n return this.crop;\n }\n\n setEffects(options: ImageEffects): this {\n const clamp = (val?: number) =>\n val !== undefined ? Math.max(-100, Math.min(100, val)) : undefined;\n this.effects = {\n brightness: clamp(options.brightness),\n contrast: clamp(options.contrast),\n grayscale: options.grayscale,\n transparency:\n options.transparency !== undefined\n ? Math.max(0, Math.min(100, options.transparency))\n : undefined,\n };\n return this;\n }\n\n getEffects(): ImageEffects | undefined {\n return this.effects;\n }\n\n private detectDPI(): number | undefined {\n if (!this.imageData) return undefined;\n\n try {\n if (this.extension === 'png') {\n const physIndex = this.imageData.indexOf(Buffer.from([0x70, 0x48, 0x59, 0x73]));\n if (physIndex !== -1 && physIndex + 12 < this.imageData.length) {\n const xPixelsPerMeter = this.imageData.readUInt32BE(physIndex + 4);\n const yPixelsPerMeter = this.imageData.readUInt32BE(physIndex + 8);\n const unit = this.imageData[physIndex + 12];\n if (unit === 1) {\n const dpiX = Math.round(xPixelsPerMeter * 0.0254);\n const dpiY = Math.round(yPixelsPerMeter * 0.0254);\n return Math.min(dpiX, dpiY);\n }\n }\n } else if (this.extension === 'jpg' || this.extension === 'jpeg') {\n let offset = 2;\n while (offset < this.imageData.length) {\n if (this.imageData[offset] !== 0xff) break;\n const marker = this.imageData[offset + 1];\n if (marker === 0xe0) {\n const length = this.imageData.readUInt16BE(offset + 2);\n if (\n length >= 16 &&\n this.imageData.slice(offset + 4, offset + 9).toString('ascii') === 'JFIF\\0'\n ) {\n const units = this.imageData[offset + 11];\n const xDensity = this.imageData.readUInt16BE(offset + 12);\n const yDensity = this.imageData.readUInt16BE(offset + 14);\n if (units === 1) return Math.min(xDensity, yDensity);\n if (units === 2)\n return Math.min(Math.round(xDensity * 2.54), Math.round(yDensity * 2.54));\n }\n offset += 2 + length;\n continue;\n }\n offset += 2 + this.imageData.readUInt16BE(offset + 2);\n }\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n defaultLogger.warn(`DPI detection failed: ${message}`);\n }\n return undefined;\n }\n\n isFloating(): boolean {\n return !!this.anchor || !!this.position;\n }\n\n floatTopLeft(marginTop = 0, marginLeft = 0): this {\n this.setPosition({ anchor: 'page', offset: marginLeft }, { anchor: 'page', offset: marginTop });\n this.setAnchor({\n behindDoc: false,\n locked: false,\n layoutInCell: true,\n allowOverlap: true,\n relativeHeight: 251658240,\n });\n this.setWrap('square', 'bothSides');\n return this;\n }\n\n floatTopRight(marginTop = 0, marginRight = 0): this {\n this.setPosition(\n { anchor: 'page', alignment: 'right', offset: -marginRight },\n { anchor: 'page', offset: marginTop }\n );\n this.setAnchor({\n behindDoc: false,\n locked: false,\n layoutInCell: true,\n allowOverlap: true,\n relativeHeight: 251658240,\n });\n this.setWrap('square', 'bothSides');\n return this;\n }\n\n floatCenter(): this {\n this.setPosition(\n { anchor: 'page', alignment: 'center' },\n { anchor: 'page', alignment: 'center' }\n );\n this.setAnchor({\n behindDoc: false,\n locked: false,\n layoutInCell: true,\n allowOverlap: true,\n relativeHeight: 251658240,\n });\n this.setWrap('square', 'bothSides');\n return this;\n }\n\n setBehindText(behind = true): this {\n if (this.anchor) {\n this.anchor.behindDoc = behind;\n } else {\n this.setAnchor({\n behindDoc: behind,\n locked: false,\n layoutInCell: true,\n allowOverlap: true,\n relativeHeight: 251658240,\n });\n }\n return this;\n }\n\n /**\n * Applies a border around the image\n * @param thicknessOrOptions Border thickness in points (number) or full ImageBorder options\n * @returns This image for chaining\n *\n * Note: effectExtent is set to accommodate the border width so it renders\n * properly without being clipped. The border is drawn centered on the image\n * edge, so half the border width extends outside the image bounds.\n */\n setBorder(thicknessOrOptions: number | ImageBorder = 2): this {\n if (typeof thicknessOrOptions === 'number') {\n this.border = { width: thicknessOrOptions };\n } else {\n this.border = { ...thicknessOrOptions };\n delete this.border._fromParsed;\n }\n\n // Calculate space needed for border (half-width on each side)\n // Border is drawn centered on the edge\n const borderEmu = this.border.width * UNITS.EMUS_PER_POINT;\n const halfBorderEmu = Math.ceil(borderEmu / 2);\n\n // Ensure effectExtent has at least enough space for the border\n if (!this.effectExtent) {\n this.effectExtent = { left: 0, top: 0, right: 0, bottom: 0 };\n }\n this.effectExtent.left = Math.max(this.effectExtent.left, halfBorderEmu);\n this.effectExtent.top = Math.max(this.effectExtent.top, halfBorderEmu);\n this.effectExtent.right = Math.max(this.effectExtent.right, halfBorderEmu);\n this.effectExtent.bottom = Math.max(this.effectExtent.bottom, halfBorderEmu);\n\n return this;\n }\n\n /**\n * Removes the border from the image\n * @returns This image for chaining\n */\n removeBorder(): this {\n this.border = undefined;\n return this;\n }\n\n /**\n * @deprecated Use setBorder() instead. This method will be removed in a future version.\n * Applies a 2-point black border around the image.\n * @returns This image for chaining\n */\n applyTwoPixelBlackBorder(): this {\n return this.setBorder(2);\n }\n\n toXML(): XMLElement {\n const isFloating = this.isFloating();\n\n // Common elements - must include wp: namespace prefix\n const extent = XMLBuilder.wp('extent', {\n cx: this.width.toString(),\n cy: this.height.toString(),\n });\n\n // --- Build blip element with effects ---\n const blipChildren: XMLElement[] = [];\n\n // Add luminance effect for brightness/contrast (per ECMA-376 §20.1.8.43)\n if (this.effects?.brightness !== undefined || this.effects?.contrast !== undefined) {\n const lumAttrs: Record<string, string> = {};\n if (this.effects.brightness !== undefined) {\n lumAttrs.bright = Math.round(this.effects.brightness * 1000).toString();\n }\n if (this.effects.contrast !== undefined) {\n lumAttrs.contrast = Math.round(this.effects.contrast * 1000).toString();\n }\n blipChildren.push(XMLBuilder.aSelf('lum', lumAttrs));\n }\n\n // Add grayscale effect (per ECMA-376 §20.1.8.37)\n if (this.effects?.grayscale) {\n blipChildren.push(XMLBuilder.aSelf('grayscl'));\n }\n\n // Add transparency effect via a:alphaModFix (ECMA-376 §20.1.8.4)\n if (this.effects?.transparency !== undefined && this.effects.transparency > 0) {\n // transparency is 0-100%, alphaModFix amt is in 1/1000ths of percent\n // e.g., 50% transparency = 50000 amt (= 50% opacity)\n const amt = Math.round((100 - this.effects.transparency) * 1000);\n blipChildren.push(XMLBuilder.aSelf('alphaModFix', { amt: amt.toString() }));\n }\n\n // Group B: Inject raw blip effects passthrough (a:clrChange, a:duotone, etc.)\n if (this._rawPassthrough.has('blip-effects')) {\n blipChildren.push({\n name: '__rawXml',\n rawXml: this._rawPassthrough.get('blip-effects')!,\n } as XMLElement);\n }\n\n // Group B: Inject raw blip extLst passthrough (must come last per schema)\n if (this._rawPassthrough.has('blip-extLst')) {\n blipChildren.push({\n name: '__rawXml',\n rawXml: this._rawPassthrough.get('blip-extLst')!,\n } as XMLElement);\n } else if (this.svgRelationshipId) {\n // SVG dual-relationship: add asvg:svgBlip reference in extLst\n blipChildren.push({\n name: '__rawXml',\n rawXml: `<a:extLst><a:ext uri=\"{96DAC541-7B7A-43D3-8B79-37D633B846F1}\"><asvg:svgBlip xmlns:asvg=\"http://schemas.microsoft.com/office/drawing/2016/SVG/main\" r:embed=\"${this.svgRelationshipId}\"/></a:ext></a:extLst>`,\n } as XMLElement);\n }\n\n // Build blip attributes: r:embed or r:link, cstate\n const blipAttrs: Record<string, string | undefined> = {\n cstate: this.compressionState,\n };\n if (this.isLinked) {\n blipAttrs['r:link'] = this.relationshipId;\n } else {\n blipAttrs['r:embed'] = this.relationshipId;\n }\n\n const blip =\n blipChildren.length > 0\n ? XMLBuilder.a('blip', blipAttrs, blipChildren)\n : XMLBuilder.a('blip', blipAttrs);\n\n // --- Build transform (a:xfrm) ---\n const xfrmAttrs: Record<string, string> | undefined = (() => {\n const attrs: Record<string, string> = {};\n if (this.rotation > 0) attrs.rot = Math.round(this.rotation * 60000).toString();\n if (this.flipH) attrs.flipH = '1';\n if (this.flipV) attrs.flipV = '1';\n return Object.keys(attrs).length > 0 ? attrs : undefined;\n })();\n const xfrm = XMLBuilder.a('xfrm', xfrmAttrs, [\n XMLBuilder.a('off', { x: '0', y: '0' }),\n XMLBuilder.a('ext', { cx: this.width.toString(), cy: this.height.toString() }),\n ]);\n\n // --- Build shape properties (pic:spPr) ---\n const spPrChildren: XMLElement[] = [xfrm];\n\n // Geometry: use passthrough for custGeom or prstGeom with avLst, otherwise default\n if (this._rawPassthrough.has('geometry')) {\n spPrChildren.push({\n name: '__rawXml',\n rawXml: this._rawPassthrough.get('geometry')!,\n } as XMLElement);\n } else {\n spPrChildren.push(\n XMLBuilder.a('prstGeom', { prst: this.presetGeometry }, [XMLBuilder.a('avLst')])\n );\n }\n\n // Fill group: a:noFill (before a:ln per ECMA-376 CT_ShapeProperties ordering)\n if (this.border) {\n // Bordered images use noFill for shape fill\n spPrChildren.push(XMLBuilder.a('noFill'));\n } else if (this._rawPassthrough.has('spPr-noFill')) {\n // Preserve spPr-level a:noFill from loaded document (Bug C fix)\n spPrChildren.push(XMLBuilder.a('noFill'));\n }\n\n // Border (a:ln) - full model (Group C)\n if (this.border) {\n const ptToEmu = 12700;\n const widthEmu = this.border.width * ptToEmu;\n const lnAttrs: Record<string, string> = { w: widthEmu.toString() };\n if (this.border.cap) lnAttrs.cap = this.border.cap;\n if (this.border.compound) lnAttrs.cmpd = this.border.compound;\n if (this.border.alignment) lnAttrs.algn = this.border.alignment;\n\n const lnChildren: XMLElement[] = [];\n\n // Fill\n if (this.border.rawFillXml) {\n lnChildren.push({ name: '__rawXml', rawXml: this.border.rawFillXml } as XMLElement);\n } else if (this.border.fill) {\n const colorChildren: XMLElement[] = [];\n if (this.border.fill.modifiers) {\n for (const mod of this.border.fill.modifiers) {\n colorChildren.push(XMLBuilder.aSelf(mod.name, { val: mod.val }));\n }\n }\n const colorEl =\n colorChildren.length > 0\n ? XMLBuilder.a(this.border.fill.type, { val: this.border.fill.value }, colorChildren)\n : XMLBuilder.a(this.border.fill.type, { val: this.border.fill.value });\n lnChildren.push(XMLBuilder.a('solidFill', undefined, [colorEl]));\n } else if (!this.border._fromParsed) {\n // Default fill for programmatic borders only (setBorder API backward compat).\n // Parsed borders without fill are intentionally left as-is.\n lnChildren.push(\n XMLBuilder.a('solidFill', undefined, [XMLBuilder.a('schemeClr', { val: 'tx1' })])\n );\n }\n\n // Dash pattern\n if (this.border.dashPattern) {\n lnChildren.push(XMLBuilder.aSelf('prstDash', { val: this.border.dashPattern }));\n }\n\n // Join\n if (this.border.join === 'round') {\n lnChildren.push(XMLBuilder.aSelf('round'));\n } else if (this.border.join === 'bevel') {\n lnChildren.push(XMLBuilder.aSelf('bevel'));\n } else if (this.border.join === 'miter') {\n const miterAttrs: Record<string, string> = {};\n if (this.border.miterLimit) miterAttrs.lim = this.border.miterLimit.toString();\n lnChildren.push(XMLBuilder.aSelf('miter', miterAttrs));\n }\n\n // Head/tail end\n if (this.border.headEnd) {\n lnChildren.push(XMLBuilder.aSelf('headEnd', this.border.headEnd as Record<string, string>));\n }\n if (this.border.tailEnd) {\n lnChildren.push(XMLBuilder.aSelf('tailEnd', this.border.tailEnd as Record<string, string>));\n }\n\n spPrChildren.push(XMLBuilder.a('ln', lnAttrs, lnChildren));\n }\n\n // Zero-width a:ln passthrough (e.g., <a:ln><a:noFill/></a:ln>) (BUG 8 fix)\n if (!this.border && this._rawPassthrough.has('zero-width-ln')) {\n spPrChildren.push({\n name: '__rawXml',\n rawXml: this._rawPassthrough.get('zero-width-ln')!,\n } as XMLElement);\n }\n\n // Group B: Inject raw spPr effects passthrough (effectLst, scene3d, sp3d, etc.)\n if (this._rawPassthrough.has('spPr-effects')) {\n spPrChildren.push({\n name: '__rawXml',\n rawXml: this._rawPassthrough.get('spPr-effects')!,\n } as XMLElement);\n }\n\n // --- Build pic:cNvPr with passthrough ---\n const cNvPrChildren: XMLElement[] = [];\n if (this._rawPassthrough.has('cNvPr-extra')) {\n cNvPrChildren.push({\n name: '__rawXml',\n rawXml: this._rawPassthrough.get('cNvPr-extra')!,\n } as XMLElement);\n }\n const cNvPr =\n cNvPrChildren.length > 0\n ? XMLBuilder.pic(\n 'cNvPr',\n {\n id: this.picNonVisualProps.id,\n name: this.picNonVisualProps.name,\n descr: this.picNonVisualProps.descr,\n },\n cNvPrChildren\n )\n : XMLBuilder.pic('cNvPr', {\n id: this.picNonVisualProps.id,\n name: this.picNonVisualProps.name,\n descr: this.picNonVisualProps.descr,\n });\n\n // --- Build picLocks from map ---\n const picLocksAttrs: Record<string, string> = {};\n for (const [key, val] of Object.entries(this.picLocks)) {\n if (val) picLocksAttrs[key] = '1';\n }\n\n // --- Build blipFill ---\n const blipFillAttrs: Record<string, string> = {};\n if (this.blipFillDpi !== undefined) blipFillAttrs.dpi = this.blipFillDpi.toString();\n if (this.blipFillRotWithShape !== undefined)\n blipFillAttrs.rotWithShape = this.blipFillRotWithShape ? '1' : '0';\n\n const blipFillChildren: XMLElement[] = [blip];\n // Crop values are stored as percentages (0-100), serialized as per-mille (0-100000)\n if (this.crop) {\n blipFillChildren.push(\n XMLBuilder.a('srcRect', {\n l: Math.round(this.crop.left * 1000).toString(),\n t: Math.round(this.crop.top * 1000).toString(),\n r: Math.round(this.crop.right * 1000).toString(),\n b: Math.round(this.crop.bottom * 1000).toString(),\n })\n );\n }\n // Group B: Use tile passthrough instead of stretch when present\n if (this._rawPassthrough.has('blipFill-extra')) {\n blipFillChildren.push({\n name: '__rawXml',\n rawXml: this._rawPassthrough.get('blipFill-extra')!,\n } as XMLElement);\n } else {\n blipFillChildren.push(XMLBuilder.a('stretch', undefined, [XMLBuilder.a('fillRect')]));\n }\n\n const blipFillAttrsObj = Object.keys(blipFillAttrs).length > 0 ? blipFillAttrs : undefined;\n\n const graphicData = XMLBuilder.a(\n 'graphicData',\n { uri: 'http://schemas.openxmlformats.org/drawingml/2006/picture' },\n [\n XMLBuilder.pic('pic', undefined, [\n XMLBuilder.pic('nvPicPr', undefined, [\n cNvPr,\n XMLBuilder.pic('cNvPicPr', undefined, [\n XMLBuilder.a(\n 'picLocks',\n Object.keys(picLocksAttrs).length > 0 ? picLocksAttrs : undefined\n ),\n ]),\n ]),\n XMLBuilder.pic('blipFill', blipFillAttrsObj, blipFillChildren),\n XMLBuilder.pic('spPr', { bwMode: this.bwMode }, spPrChildren),\n ]),\n ]\n );\n\n const graphic = XMLBuilder.a('graphic', undefined, [graphicData]);\n\n // --- Build docPr element (shared between inline and floating) ---\n const buildDocPr = (idVal: string | number): XMLElement => {\n const attrs: Record<string, any> = { id: idVal, name: this.name, descr: this.description };\n if (this.title) attrs.title = this.title;\n if (this.hidden) attrs.hidden = '1';\n const children: XMLElement[] = [];\n if (this._rawPassthrough.has('docPr-extra')) {\n children.push({\n name: '__rawXml',\n rawXml: this._rawPassthrough.get('docPr-extra')!,\n } as XMLElement);\n }\n return children.length > 0\n ? XMLBuilder.wp('docPr', attrs, children)\n : XMLBuilder.wp('docPr', attrs);\n };\n\n // --- Build cNvGraphicFramePr element (shared between inline and floating) ---\n const buildCNvGraphicFramePr = (): XMLElement => {\n return XMLBuilder.wp('cNvGraphicFramePr', undefined, [\n XMLBuilder.a('graphicFrameLocks', {\n 'xmlns:a': 'http://schemas.openxmlformats.org/drawingml/2006/main',\n noChangeAspect: this.noChangeAspect ? '1' : '0',\n }),\n ]);\n };\n\n if (isFloating) {\n // Floating image (anchor)\n const positionHChildren: XMLElement[] = [];\n if (this.position?.horizontal.alignment) {\n positionHChildren.push(\n XMLBuilder.wp('align', undefined, [this.position.horizontal.alignment])\n );\n } else {\n positionHChildren.push(\n XMLBuilder.wp('posOffset', undefined, [\n (this.position?.horizontal.offset || 0).toString(),\n ])\n );\n }\n const positionH = XMLBuilder.wp(\n 'positionH',\n { relativeFrom: this.position?.horizontal.anchor || 'page' },\n positionHChildren\n );\n\n const positionVChildren: XMLElement[] = [];\n if (this.position?.vertical.alignment) {\n positionVChildren.push(\n XMLBuilder.wp('align', undefined, [this.position.vertical.alignment])\n );\n } else {\n positionVChildren.push(\n XMLBuilder.wp('posOffset', undefined, [(this.position?.vertical.offset || 0).toString()])\n );\n }\n const positionV = XMLBuilder.wp(\n 'positionV',\n { relativeFrom: this.position?.vertical.anchor || 'page' },\n positionVChildren\n );\n\n // Effect extent for floating images (required by Word)\n const floatEffectExt = this.effectExtent || { left: 0, top: 0, right: 0, bottom: 0 };\n const effectExtentElement = XMLBuilder.wp('effectExtent', {\n t: floatEffectExt.top.toString(),\n r: floatEffectExt.right.toString(),\n b: floatEffectExt.bottom.toString(),\n l: floatEffectExt.left.toString(),\n });\n\n const anchorChildren: XMLElement[] = [positionH, positionV, extent, effectExtentElement];\n\n // Wrap element (required by CT_Anchor per ECMA-376 — defaults to wrapNone)\n if (this.wrap) {\n const wrapAttrs: Record<string, any> = {};\n if (this.wrap.distanceTop !== undefined) wrapAttrs.distT = this.wrap.distanceTop;\n if (this.wrap.distanceBottom !== undefined) wrapAttrs.distB = this.wrap.distanceBottom;\n if (this.wrap.distanceLeft !== undefined) wrapAttrs.distL = this.wrap.distanceLeft;\n if (this.wrap.distanceRight !== undefined) wrapAttrs.distR = this.wrap.distanceRight;\n if (this.wrap.side) wrapAttrs.wrapText = this.wrap.side;\n\n let wrapElementName: string;\n switch (this.wrap.type) {\n case 'square':\n wrapElementName = 'wrapSquare';\n break;\n case 'tight':\n wrapElementName = 'wrapTight';\n break;\n case 'through':\n wrapElementName = 'wrapThrough';\n break;\n case 'topAndBottom':\n wrapElementName = 'wrapTopAndBottom';\n break;\n case 'none':\n wrapElementName = 'wrapNone';\n break;\n default:\n wrapElementName = 'wrapSquare';\n }\n\n // Group B: Include wrap polygon passthrough as children\n const wrapChildren: XMLElement[] = [];\n if (this._rawPassthrough.has('wrap-polygon')) {\n wrapChildren.push({\n name: '__rawXml',\n rawXml: this._rawPassthrough.get('wrap-polygon')!,\n } as XMLElement);\n } else if (wrapElementName === 'wrapTight' || wrapElementName === 'wrapThrough') {\n // CT_WrapTight/CT_WrapThrough require a wp:wrapPolygon child.\n // Generate a default rectangular polygon covering the full image extents.\n wrapChildren.push({\n name: 'wp:wrapPolygon',\n attributes: { edited: '0' },\n children: [\n { name: 'wp:start', attributes: { x: '0', y: '0' }, selfClosing: true },\n { name: 'wp:lineTo', attributes: { x: '21600', y: '0' }, selfClosing: true },\n { name: 'wp:lineTo', attributes: { x: '21600', y: '21600' }, selfClosing: true },\n { name: 'wp:lineTo', attributes: { x: '0', y: '21600' }, selfClosing: true },\n { name: 'wp:lineTo', attributes: { x: '0', y: '0' }, selfClosing: true },\n ],\n });\n }\n\n anchorChildren.push(\n wrapChildren.length > 0\n ? XMLBuilder.wp(wrapElementName, wrapAttrs, wrapChildren)\n : XMLBuilder.wp(wrapElementName, wrapAttrs)\n );\n } else {\n // Default: wrapNone (required choice element per CT_Anchor)\n anchorChildren.push(XMLBuilder.wp('wrapNone', {}));\n }\n\n anchorChildren.push(buildDocPr(this.docPrId));\n anchorChildren.push(buildCNvGraphicFramePr());\n anchorChildren.push(graphic);\n\n // Group B: Inject anchor extras (wp14:sizeRelH, wp14:sizeRelV)\n if (this._rawPassthrough.has('anchor-extra')) {\n anchorChildren.push({\n name: '__rawXml',\n rawXml: this._rawPassthrough.get('anchor-extra')!,\n } as XMLElement);\n }\n\n // Build anchor attributes including simplePos and distance from text\n const anchorAttrs: Record<string, any> = {\n behindDoc: this.anchor?.behindDoc ? 1 : 0,\n locked: this.anchor?.locked ? 1 : 0,\n layoutInCell: this.anchor?.layoutInCell ? 1 : 0,\n allowOverlap: this.anchor?.allowOverlap ? 1 : 0,\n relativeHeight: this.anchor?.relativeHeight,\n simplePos: this.anchor?.simplePos ? '1' : '0',\n distT: (this.anchor?.distT ?? 0).toString(),\n distB: (this.anchor?.distB ?? 0).toString(),\n distL: (this.anchor?.distL ?? 0).toString(),\n distR: (this.anchor?.distR ?? 0).toString(),\n };\n if (this.hidden) anchorAttrs.hidden = '1';\n\n // Add wp:simplePos child element (required by ECMA-376 even when simplePos=\"0\")\n anchorChildren.unshift(XMLBuilder.wp('simplePos', { x: '0', y: '0' }));\n\n return XMLBuilder.w('drawing', undefined, [\n XMLBuilder.wp('anchor', anchorAttrs, anchorChildren),\n ]);\n } else {\n // Inline image\n const effectExt = this.effectExtent || { left: 0, top: 0, right: 0, bottom: 0 };\n\n return XMLBuilder.w('drawing', undefined, [\n XMLBuilder.wp(\n 'inline',\n {\n distT: this.inlineDistT.toString(),\n distB: this.inlineDistB.toString(),\n distL: this.inlineDistL.toString(),\n distR: this.inlineDistR.toString(),\n },\n [\n extent,\n XMLBuilder.wp('effectExtent', {\n t: effectExt.top.toString(),\n r: effectExt.right.toString(),\n b: effectExt.bottom.toString(),\n l: effectExt.left.toString(),\n }),\n buildDocPr(this.docPrId.toString()),\n buildCNvGraphicFramePr(),\n graphic,\n ]\n ),\n ]);\n }\n }\n}\n"]}
|
package/package.json
CHANGED