forked from 1b-agent/opencadstudio-upstream
build(web): restore the wasm build — gate native-only deps off wasm
The web build had bit-rotted: native-only features added since it last compiled pulled crates that don't build for wasm32-unknown-unknown. - printpdf (PDF export / printing) → native-only target; the web build gets stub export_pdf / print_wires. It pulls a wasm-incompatible memchr 1.0.2 via lopdf → nom_locate, and the web has no filesystem. - getrandom 0.3 (via ahash via acadrust) → enable its wasm_js feature and add the matching --cfg getrandom_backend rustflag in .cargo/config.toml. - ocs_plugin_api "host" feature (out-of-process plugin runtime: interprocess, libloading, memmap2, rkyv) → native-only target; the web gets the dependency-free manifest/ribbon contract. The host code was already wasm-gated; only the Cargo wiring pulled it in unconditionally. `trunk build --release` succeeds again. Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
1 parent
8b1e37e0da
commit
44fa9df278
5 files changed
+75
-3
No files matched your search
+34
-1
@@ -9,15 +9,43 @@
|
||||
// drawing origin at the paper origin.
|
||||
|
||||
use crate::io::plot_style::PlotStyleTable;
|
||||
use crate::scene::model::hatch_model::{HatchModel, HatchPattern};
|
||||
use crate::scene::model::hatch_model::HatchModel;
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
use crate::scene::model::hatch_model::HatchPattern;
|
||||
use crate::scene::WireModel;
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
use printpdf::{
|
||||
Color, Line, LineCapStyle, LineJoinStyle, LinePoint, Mm, Op, PaintMode, PdfDocument, PdfPage,
|
||||
PdfSaveOptions, Point, Polygon, PolygonRing, Pt, Rgb, WindingOrder,
|
||||
};
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
use std::io::Write;
|
||||
use std::path::Path;
|
||||
|
||||
// The web build has no `printpdf` (it pulls a wasm-incompatible `memchr` via
|
||||
// lopdf → nom_locate) and no filesystem, so PDF export is native-only; the web
|
||||
// build gets these stubs so the call sites still compile.
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
pub fn export_pdf(
|
||||
_wires: &[WireModel],
|
||||
_hatches: &[HatchModel],
|
||||
_wipeouts: &[HatchModel],
|
||||
_paper_w: f64,
|
||||
_paper_h: f64,
|
||||
_offset_x: f32,
|
||||
_offset_y: f32,
|
||||
_rotation_deg: i32,
|
||||
_path: &Path,
|
||||
_plot_style: Option<&PlotStyleTable>,
|
||||
) -> Result<(), String> {
|
||||
Err("PDF export is not available in the web version.".into())
|
||||
}
|
||||
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
pub async fn pick_pdf_path_owned(_stem: String) -> Option<std::path::PathBuf> {
|
||||
None
|
||||
}
|
||||
|
||||
// ── Public entry point ────────────────────────────────────────────────────
|
||||
|
||||
/// Export `wires` to a PDF file.
|
||||
@@ -26,6 +54,7 @@ use std::path::Path;
|
||||
/// - `offset_x` / `offset_y`: added to every wire coordinate so the drawing
|
||||
/// origin maps to the bottom-left corner of the page.
|
||||
/// - `rotation_deg`: 0 | 90 | 180 | 270 — rotates the entire drawing on the page.
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
pub fn export_pdf(
|
||||
wires: &[WireModel],
|
||||
hatches: &[HatchModel],
|
||||
@@ -54,6 +83,7 @@ pub fn export_pdf(
|
||||
}
|
||||
|
||||
/// Show a PDF save-file dialog and return the chosen path (or None if cancelled).
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
pub async fn pick_pdf_path_owned(stem: String) -> Option<std::path::PathBuf> {
|
||||
rfd::AsyncFileDialog::new()
|
||||
.set_title("Export as PDF")
|
||||
@@ -67,6 +97,7 @@ pub async fn pick_pdf_path_owned(stem: String) -> Option<std::path::PathBuf> {
|
||||
|
||||
// ── PDF builder ───────────────────────────────────────────────────────────
|
||||
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
fn build_pdf(
|
||||
wires: &[WireModel],
|
||||
hatches: &[HatchModel],
|
||||
@@ -235,6 +266,7 @@ fn build_pdf(
|
||||
doc.save(&PdfSaveOptions::default(), &mut warnings)
|
||||
}
|
||||
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
fn flush_line(ops: &mut Vec<Op>, pts: &[LinePoint]) {
|
||||
if pts.len() < 2 {
|
||||
return;
|
||||
@@ -252,6 +284,7 @@ fn flush_line(ops: &mut Vec<Op>, pts: &[LinePoint]) {
|
||||
/// rings so islands and holes render correctly under the even-odd rule.
|
||||
/// Mirrors `scene::paper_canvas::draw_hatch`: solid → fill, pattern → outline,
|
||||
/// gradient → solid fill of the averaged colour.
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
fn emit_hatch(ops: &mut Vec<Op>, hatch: &HatchModel, ox: f32, oy: f32) {
|
||||
if hatch.boundary.is_empty() {
|
||||
return;
|
||||
|
||||
@@ -7,15 +7,34 @@
|
||||
//
|
||||
// The function is async so the UI remains responsive while the job is queued.
|
||||
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
use crate::io::pdf_export;
|
||||
use crate::io::plot_style::PlotStyleTable;
|
||||
use crate::scene::model::hatch_model::HatchModel;
|
||||
use crate::scene::WireModel;
|
||||
|
||||
// Printing routes through the native PDF pipeline + the OS print command, so it
|
||||
// is native-only; the web build gets a stub so the call site still compiles.
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
pub async fn print_wires(
|
||||
_wires: Vec<WireModel>,
|
||||
_hatches: Vec<HatchModel>,
|
||||
_wipeouts: Vec<HatchModel>,
|
||||
_paper_w: f64,
|
||||
_paper_h: f64,
|
||||
_offset_x: f32,
|
||||
_offset_y: f32,
|
||||
_rotation_deg: i32,
|
||||
_plot_style: Option<PlotStyleTable>,
|
||||
) -> Result<String, String> {
|
||||
Err("Printing is not available in the web version.".into())
|
||||
}
|
||||
|
||||
/// Render `wires` (plus hatch / wipeout fills) to a temp PDF and dispatch it
|
||||
/// to the default system printer.
|
||||
///
|
||||
/// Returns `Ok(printer_name)` on success or `Err(message)` on failure.
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
pub async fn print_wires(
|
||||
wires: Vec<WireModel>,
|
||||
hatches: Vec<HatchModel>,
|
||||
@@ -47,6 +66,7 @@ pub async fn print_wires(
|
||||
}
|
||||
|
||||
/// Platform-specific dispatch of a PDF path to the system printer.
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
fn dispatch_to_printer(path: &std::path::Path) -> Result<String, String> {
|
||||
#[cfg(target_os = "windows")]
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user