mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-11-09 06:06:38 +00:00
With an unclipped raster/vector balance between 0 and 100, a group that splits into more than 10^(balance/20) regions is rasterized whole and none of its regions are used. The region build now stops at the first region past that limit (pathops `regions_within`) instead of building every region and then discarding them. Groups at or under the limit, and every group with Clip Complex Regions on, still build every region. Flatten Transparency, the flattened document and EPS export come out the same as with every region built, for groups under the limit, at it, just over it and far over it.
59 lines
3.1 KiB
Rust
59 lines
3.1 KiB
Rust
//! Object → Flatten Transparency: transparent art becomes opaque art that looks the same.
|
|
//!
|
|
//! The targets (`ids` or the selection) split into groups of overlapping objects. Groups without
|
|
//! transparency stay as they are (their type and strokes are outlined on request). The others are
|
|
//! cut into atomic regions: the faces of the planar arrangement of every fill, outlined stroke and
|
|
//! clipping path in them ([`po::regions`]). The same paints cover each whole region, so its colour
|
|
//! is exact: those paints composited as the renderer composites them ([`Composer`], blend modes by
|
|
//! [`composite`]), over white (or over nothing with Preserve Alpha); in CMYK documents their inks
|
|
//! composite, plane by plane ([`cmyk_planes`]), and the colour is CMYK. Each region becomes a path
|
|
//! filled with that flat colour. Where gradients, patterns, images, opacity masks or raster
|
|
//! effects reach there is no single colour: those regions are rendered into one image per group,
|
|
//! clipped to them with Clip Complex Regions (else the image is a rectangle that takes in the
|
|
//! regions it overlaps). The raster/vector balance rasterizes whole groups that split into more
|
|
//! regions than it allows (all of them at 0). For files without transparency (PDF/X-1a, PDF/X-3)
|
|
//! a CMYK document's images are opaque CMYK: its colours keep their inks there too.
|
|
//!
|
|
//! Edit → Transparency Flattener Presets: the built-in presets plus the user's, saved with the
|
|
//! preferences ([`crate::Prefs::flattener_presets`]); a `preset` named anywhere options are taken
|
|
//! finds both.
|
|
//!
|
|
//! Window → Flattener Preview: the same plan, worked out without rendering, reports what flattening
|
|
//! the document would touch ([`FlattenReport`], `flattener.preview`).
|
|
|
|
use std::collections::BTreeSet;
|
|
use std::sync::Arc;
|
|
|
|
use serde::{Deserialize, Serialize};
|
|
use serde_json::{Value, json};
|
|
use vectorcraft_color::blend::{cmyk_planes, composite, planes_cmyk};
|
|
use vectorcraft_color::{BlendMode, Color, Paint};
|
|
use vectorcraft_doc::appearance::{AppearanceItem, FillLayer};
|
|
use vectorcraft_doc::cmyk::Inks;
|
|
use vectorcraft_doc::{Appearance, ColorMode, Document, Effect, ImageBlob, ImageObject, Knockout, Node, NodeId, NodeKind};
|
|
use vectorcraft_geom::{Affine, FillRule, PathData, Rect, shapes};
|
|
use vectorcraft_pathops as po;
|
|
use vectorcraft_render::effects;
|
|
|
|
use super::edit::roots_of;
|
|
use super::menucmds::{MAX_PIXELS, isolated_doc, unique_key};
|
|
use super::pathops::{node_path, outline_strokes, outline_strokes_under, separate, shape_node};
|
|
use super::{CommandSpec, EngineError, Result, Session, always, bad, bool_or, cmd, has_doc, str_param, targets, unique_name};
|
|
|
|
mod analysis;
|
|
mod apply;
|
|
mod commands;
|
|
mod compose;
|
|
mod options;
|
|
mod presets;
|
|
mod report;
|
|
|
|
pub(crate) use analysis::{outlined_text, see_through_images};
|
|
#[cfg(test)]
|
|
pub(crate) use apply::with_every_region;
|
|
pub(crate) use apply::{expand_transparent_tile_images, flatten_document, flatten_expanded, has_transparent_tile_images};
|
|
pub use commands::specs;
|
|
pub use options::FlattenOptions;
|
|
pub use presets::{FlattenerPreset, PRESET_EXTS, PRESET_FORMAT};
|
|
pub use report::{FlattenReport, Highlight, Overprints, report};
|