// lib/editor/pdf/slide_export.dart // // Pure geometry for exporting pen-first slide annotations to PDF. Because the // pen canvas captures strokes NORMALIZED to the page rect ([0,1]), the export // just maps each normalized point into the slide image's draw rectangle on the // PDF page — no live-widget-size guessing, which is what made the old PPT // exporter misalign ink (see the removed ppt_annotator_screen comment). import 'dart:ui' show Offset, Rect, Size; /// The rectangle a slide [image] occupies when drawn "contain"-fit and centered /// on a PDF page of size [page]. Mirrors the live canvas's fit-to-view so the /// exported ink lands exactly where it was drawn. Rect slideDrawRect(Size page, Size image) { final iw = image.width <= 0 ? 1.0 : image.width; final ih = image.height <= 0 ? 1.0 : image.height; final scale = (page.width / iw) < (page.height / ih) ? page.width / iw : page.height / ih; final drawW = iw * scale; final drawH = ih * scale; final offX = (page.width - drawW) / 2; final offY = (page.height - drawH) / 2; return Rect.fromLTWH(offX, offY, drawW, drawH); } /// Map a normalized stroke point ([0,1] of the page rect) to an absolute point /// inside the slide's [drawRect] on the PDF page. Offset normToSlide(double nx, double ny, Rect drawRect) => Offset(drawRect.left + nx * drawRect.width, drawRect.top + ny * drawRect.height); /// Absolute pen width (PDF units) for a stroke whose width is a fraction of the /// page width, scaled into [drawRect]. double slideStrokeWidth(double normalizedWidth, Rect drawRect) => normalizedWidth * drawRect.width;