94 lines
2.1 KiB
C++
94 lines
2.1 KiB
C++
#pragma once
|
|
#include <string>
|
|
#include <vector>
|
|
#include <memory>
|
|
#include <expected>
|
|
#include <cstdint>
|
|
#include "pdfengine/pdf_document.hpp"
|
|
|
|
namespace pdfengine {
|
|
|
|
struct Rect {
|
|
double x = 0.0;
|
|
double y = 0.0;
|
|
double width = 0.0;
|
|
double height = 0.0;
|
|
};
|
|
|
|
using RectList = std::vector<Rect>;
|
|
|
|
struct ParagraphBounds {
|
|
Rect rect;
|
|
};
|
|
|
|
struct GlyphInfo {
|
|
uint32_t glyphId = 0;
|
|
uint32_t cluster = 0;
|
|
double x = 0.0;
|
|
double y = 0.0;
|
|
double advance = 0.0;
|
|
double width = 0.0;
|
|
double ascent = 0.0;
|
|
double descent = 0.0;
|
|
std::string text;
|
|
};
|
|
|
|
struct LineInfo {
|
|
int id = 0;
|
|
Rect rect;
|
|
double baselineY = 0.0;
|
|
};
|
|
|
|
struct CaretState {
|
|
int offset = 0;
|
|
Rect rect;
|
|
};
|
|
|
|
// Internal comprehensive layout state
|
|
struct LayoutResult {
|
|
ParagraphBounds bounds;
|
|
std::vector<LineInfo> lines;
|
|
std::vector<GlyphInfo> glyphs;
|
|
std::vector<Rect> selectionRects;
|
|
CaretState caret;
|
|
RectList dirtyRects;
|
|
};
|
|
|
|
// Stable, lightweight view for WASM export
|
|
struct LayoutView {
|
|
std::vector<LineInfo> lines;
|
|
std::vector<GlyphInfo> glyphs;
|
|
CaretState caret;
|
|
RectList dirtyRects;
|
|
};
|
|
|
|
class EditSession {
|
|
public:
|
|
virtual ~EditSession() = default;
|
|
|
|
static std::shared_ptr<EditSession> StartEditSession(
|
|
std::shared_ptr<PdfDocument> doc,
|
|
int pageIndex,
|
|
const std::string& paraId
|
|
);
|
|
|
|
// Returns a stable, lightweight view of the layout
|
|
virtual LayoutView GetLayoutView() const = 0;
|
|
|
|
// Geometry queries against the cached layout
|
|
// offset represents the caret insertion point (between glyphs)
|
|
virtual int HitTest(double x, double y) const = 0;
|
|
virtual Rect GetCaretRect(int offset) const = 0;
|
|
virtual std::vector<Rect> GetSelectionRects(int startOffset, int endOffset) const = 0;
|
|
|
|
// Mutates paragraph, marks cache dirty, recalculates
|
|
virtual void ApplyEdit(const std::string& editOpJson) = 0;
|
|
|
|
// Rendering & Lifecycle
|
|
virtual std::vector<uint8_t> RenderDirtyRegion(int dpi, const Rect& region) const = 0;
|
|
virtual bool CommitEdit() = 0;
|
|
virtual void CancelEdit() = 0;
|
|
};
|
|
|
|
} // namespace pdfengine
|