mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-11-14 06:31:41 +00:00
PDF/.ai import: legacy type keeps manual kerning, discretionary hyphens and language
Legacy .ai type (version 7) now reads the operators it used to skip: - `autoKern kernValue Tk` (and `TK` in overflow text) sets the manual kerning of the character before the pair, or at the start of a line the space before the line's first character; autoKern 1 sets the pair back to automatic. Values are kept to -1000..10000. - `T+` and `T-` (discretionary hyphens) become soft hyphens. - `languageID XL` sets the characters' language (ids 0 to 11). - A visible text object read while a line breaking value (`TG`) or Japanese layout rules (`Xu`, `Tu`) are set opens with a warning, once per file for each. Final-form positions (Tc, Tw, Tm, Td, T*, TR) stay ignored. Legacy .ai saves now write manual kerning as `0 value Tk` after each character that has it and before a paragraph's first character with space before it, and soft hyphens as `T+`; manual kerning is no longer listed among the attributes left out. The writer's prolog defines Tk and T+. Docs: docs/file-format-parity.md, docs/target-app-parity.md.
This commit is contained in:
@@ -3,8 +3,11 @@
|
||||
//! type runs along, `TP`), the modal character and paragraph attributes
|
||||
//! (`Tr Tf Ts Tz Tt TA Tl Ta Ti`, and §15.4.7 and §22's letter and word spacing `TC TW`, hanging
|
||||
//! punctuation `Tq`, hyphenation `Th` and tab stops `Xb Xe XB`, and §15.3.4's writing direction `TV`,
|
||||
//! Roman character rotation `Tv`, Kumi blocks `Ty TY` and binding punctuation `Tg`), the paint
|
||||
//! style, and the characters (`Tx`, `Tj`, overflow `TX`; `\r` ends a paragraph). Type set in rendering modes 4 to 7 is a mask (§5.7): the
|
||||
//! Roman character rotation `Tv`, Kumi blocks `Ty TY` and binding punctuation `Tg`, and §22.6's
|
||||
//! hyphenation language `XL`), the paint style, the characters (`Tx`, `Tj`, overflow `TX`; `\r` ends
|
||||
//! a paragraph), manual kerning pairs (`Tk`, overflow `TK`) and discretionary hyphens (`T+`, `T-`,
|
||||
//! read as soft hyphens). The line breaking value `TG` and the Japanese layout rules `Xu` (`Tu`) are
|
||||
//! not kept: a visible text object read while one is set gives a warning. Type set in rendering modes 4 to 7 is a mask (§5.7): the
|
||||
//! text object clips the objects of its clipping group. Final-form operators (the
|
||||
//! computed positions, §15.1) are skipped: the type is laid out again. Strings are decoded by the
|
||||
//! encoding pairs of the current font's `TZ`, then by the file's `TE` encoding unless that `TZ`'s
|
||||
@@ -59,6 +62,14 @@ const MASK_NOT_CLIPPED: &str = "type used as a mask in linked areas, wraparound
|
||||
/// The warning when `TV` changes after a text object's first character: the object keeps the
|
||||
/// direction of that character.
|
||||
const DIRECTION_CHANGE_LEFT_OUT: &str = "type that changes writing direction inside a text object opens in the direction of its first character";
|
||||
/// The warning when a visible text object is read while a line breaking value (`TG`) is set.
|
||||
const LINE_BREAKING_LEFT_OUT: &str = "the Line Breaking setting of legacy type was left out";
|
||||
/// The warning when a visible text object is read while Japanese layout rules (`Xu`, `Tu`) are set.
|
||||
const JAPANESE_LAYOUT_LEFT_OUT: &str = "the Japanese layout rules of legacy type were left out";
|
||||
/// The manual kerning range `text.setRangeStyle` takes, in 1/1000 em.
|
||||
const KERNING_RANGE: (f64, f64) = (-1000.0, 10_000.0);
|
||||
/// The soft hyphen a discretionary hyphen (`T+`, `T-`) is read as.
|
||||
const SOFT_HYPHEN: char = '\u{ad}';
|
||||
|
||||
/// A text path (`Tp` … `TP`).
|
||||
#[derive(Debug, Default)]
|
||||
@@ -124,6 +135,9 @@ pub(super) struct LegacyText {
|
||||
vertical: bool,
|
||||
/// A later character was set in the other direction.
|
||||
direction_changed: bool,
|
||||
/// A manual kerning value (`Tk`, `TK`) read at the start of a line, in 1/1000 em: the space
|
||||
/// before the next character, which starts the line.
|
||||
kern_before: Option<f64>,
|
||||
/// The state when it began (lock, visibility), and whether it began on a `%_` line.
|
||||
gs: GState,
|
||||
hidden: bool,
|
||||
@@ -148,6 +162,40 @@ impl LegacyText {
|
||||
}
|
||||
}
|
||||
|
||||
/// Add `text` in `style` to `runs`: to the last run when it has that style, else as a new run.
|
||||
fn push_run(runs: &mut Vec<TextRun>, text: String, style: CharStyle) {
|
||||
if text.is_empty() {
|
||||
return;
|
||||
}
|
||||
match runs.last_mut() {
|
||||
Some(last) if last.inline.is_none() && last.style == style => last.text.push_str(&text),
|
||||
_ => runs.push(TextRun::new(text, style)),
|
||||
}
|
||||
}
|
||||
|
||||
/// Give the last character of `runs` the manual kerning `kerning` (None: automatic), in a run of
|
||||
/// its own unless its run has one character, which joins the run before it when their styles
|
||||
/// match. False when there is no character or the last one ends a paragraph: the kerning is at
|
||||
/// the start of a line.
|
||||
fn set_last_kerning(runs: &mut Vec<TextRun>, kerning: Option<f64>) -> bool {
|
||||
let Some(last) = runs.last_mut().filter(|r| r.inline.is_none()) else { return false };
|
||||
let Some(c) = last.text.chars().next_back().filter(|&c| c != '\n') else { return false };
|
||||
if last.style.kerning == kerning {
|
||||
return true;
|
||||
}
|
||||
if last.text.len() > c.len_utf8() {
|
||||
last.text.pop();
|
||||
let style = CharStyle { kerning, ..last.style.clone() };
|
||||
runs.push(TextRun::new(c.to_string(), style));
|
||||
return true;
|
||||
}
|
||||
last.style.kerning = kerning;
|
||||
if let Some(one) = runs.pop() {
|
||||
push_run(runs, one.text, one.style);
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
/// Are `a` and `b` the same, leaving their tab stops out?
|
||||
fn same_but_tabs(a: &mut ParaStyle, b: &mut ParaStyle) -> bool {
|
||||
let (a_tabs, b_tabs) = (std::mem::take(&mut a.tabs), std::mem::take(&mut b.tabs));
|
||||
@@ -203,6 +251,10 @@ pub(super) struct TypeState {
|
||||
vertical: bool,
|
||||
/// `TY`: a Kumi block recorded for later use, which horizontal type keeps as its mark.
|
||||
kumi_recorded: bool,
|
||||
/// A line breaking value (`TG`) was read: VectorCraft has no setting for it.
|
||||
line_breaking: bool,
|
||||
/// Japanese layout rules (`Xu`, `Tu`) were read: VectorCraft has no setting for them.
|
||||
japanese_layout: bool,
|
||||
/// The encoding strings are in, by code (`TE`); None where it says nothing.
|
||||
encoding: Vec<Option<char>>,
|
||||
/// Re-encoded fonts' original names (`%AI3_BeginEncoding: _new old`, or `TZ`'s).
|
||||
@@ -232,6 +284,8 @@ impl Default for TypeState {
|
||||
render: 0,
|
||||
vertical: false,
|
||||
kumi_recorded: false,
|
||||
line_breaking: false,
|
||||
japanese_layout: false,
|
||||
encoding: vec![None; 256],
|
||||
fonts: vec![],
|
||||
font_encodings: vec![],
|
||||
@@ -684,6 +738,22 @@ impl Reader<'_> {
|
||||
st.tabs_version = st.tabs_version.wrapping_add(1);
|
||||
}
|
||||
}
|
||||
// `languageID XL` (§22.6), the hyphenation language: 0 U.S. English (the default
|
||||
// language, none), then U.K. English, French, German, Spanish, Dutch, Italian, Swedish,
|
||||
// Norwegian, Finnish, Danish and Hungarian, as the Character panel's language tags.
|
||||
"XL" => {
|
||||
const TAGS: [&str; 11] = ["en-GB", "fr", "de", "es", "nl", "it", "sv", "nb", "fi", "da", "hu"];
|
||||
match n0 {
|
||||
Some(0.0) => st.style.language = None,
|
||||
Some(id) if id.fract() == 0.0 && (1.0..=11.0).contains(&id) => {
|
||||
st.style.language = TAGS.get(id as usize - 1).map(|t| t.to_string());
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
// `linebreak TG` and `prop cjkLayout cjkRoman cjkCjk Xu` (`Tu` the same, §22.6).
|
||||
"TG" => st.line_breaking = true,
|
||||
"Xu" | "Tu" => st.japanese_layout = true,
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
@@ -691,14 +761,59 @@ impl Reader<'_> {
|
||||
/// `(…) Tx` (`Tj`, overflow `TX`): characters in the current style and paint.
|
||||
pub(super) fn text_body(&mut self, w: &str, vals: &[V]) {
|
||||
let Some(bytes) = vals.iter().rev().find_map(|v| if let V::Str(s) = v { Some(s.clone()) } else { None }) else { return };
|
||||
if self.text.is_none() {
|
||||
return;
|
||||
}
|
||||
let decoded = self.type_state.decode(&bytes);
|
||||
self.add_chars(w == "TX", decoded);
|
||||
}
|
||||
|
||||
/// `autoKern kernValue Tk` (`TK` in overflow text): the space between the character before it
|
||||
/// and the character after it. With `autoKern` 0 the pair takes `kernValue` in 1/1000 em as
|
||||
/// manual kerning, kept to the range `text.setRangeStyle` takes; with 1 the pair takes the
|
||||
/// automatic kerning. The value is the kerning after the character before it; at the start of
|
||||
/// a line it is the space before the character after it. Operands that are missing, are not
|
||||
/// numbers, or a flag other than 0 and 1 leave the type as it was, and so does a `Tk` outside a
|
||||
/// text object.
|
||||
pub(super) fn text_kern(&mut self, vals: &[V]) {
|
||||
let Some([auto, value]) = nums::<2>(vals) else { return };
|
||||
let Some(auto) = flag(auto) else { return };
|
||||
let Some(t) = self.text.as_mut() else { return };
|
||||
let kerning = (!auto).then(|| value.clamp(KERNING_RANGE.0, KERNING_RANGE.1));
|
||||
let line_start = t.pending_break.is_some() || !set_last_kerning(&mut t.runs, kerning);
|
||||
if line_start {
|
||||
t.kern_before = kerning;
|
||||
}
|
||||
}
|
||||
|
||||
/// `T+` (a discretionary hyphen that doesn't print) or `T-` (`printed`: the character before it
|
||||
/// is a discretionary hyphen that prints, §15.4.10.1): a soft hyphen, which shows as a hyphen
|
||||
/// only where a line breaks at it. A printed hyphen character (`-` or U+2010) before `T-`
|
||||
/// becomes the soft hyphen; else one is added.
|
||||
pub(super) fn discretionary_hyphen(&mut self, printed: bool) {
|
||||
let Some(t) = self.text.as_mut() else { return };
|
||||
if printed
|
||||
&& t.pending_break.is_none()
|
||||
&& let Some(last) = t.runs.last_mut()
|
||||
&& last.inline.is_none()
|
||||
&& last.text.ends_with(['-', '\u{2010}'])
|
||||
{
|
||||
last.text.pop();
|
||||
last.text.push(SOFT_HYPHEN);
|
||||
return;
|
||||
}
|
||||
self.add_chars(false, SOFT_HYPHEN.to_string());
|
||||
}
|
||||
|
||||
/// Characters in the current style and paint (`overflow`: read by `TX`).
|
||||
fn add_chars(&mut self, overflow: bool, decoded: String) {
|
||||
let st = &mut self.type_state;
|
||||
let Some(t) = self.text.as_mut() else { return };
|
||||
let decoded = st.decode(&bytes);
|
||||
if decoded.is_empty() {
|
||||
return;
|
||||
}
|
||||
// Overflow text ending the story with a paragraph break (`(\r) TX`) adds no paragraph.
|
||||
if w == "TX" && decoded == "\n" {
|
||||
if overflow && decoded == "\n" {
|
||||
if t.pending_break.is_none() {
|
||||
let para = (!t.para_taken).then(|| (st.para.clone(), st.tabs_version));
|
||||
t.pending_break = Some(PendingBreak { vertical: st.vertical, para });
|
||||
@@ -744,6 +859,8 @@ impl Reader<'_> {
|
||||
text.push('\n');
|
||||
t.para_taken = false;
|
||||
}
|
||||
// Where the characters start in `text`, after a break read before them.
|
||||
let at = text.len();
|
||||
for c in decoded.chars() {
|
||||
if c != '\n' && !t.para_taken {
|
||||
t.begin_para(&mut st.para, st.tabs_version);
|
||||
@@ -757,10 +874,19 @@ impl Reader<'_> {
|
||||
t.para_taken = false;
|
||||
}
|
||||
}
|
||||
match t.runs.last_mut() {
|
||||
Some(last) if last.style == style => last.text.push_str(&text),
|
||||
_ => t.runs.push(TextRun::new(text, style)),
|
||||
// Kerning read at the start of the line is the space before its first character; a
|
||||
// paragraph break there leaves no character for it.
|
||||
let first = decoded.chars().next().filter(|&c| c != '\n');
|
||||
if let (Some(k), Some(c)) = (t.kern_before.take(), first) {
|
||||
let end = at + c.len_utf8();
|
||||
let (rest, after) = (text.split_off(end), CharStyle { kerning_before: k, ..style.clone() });
|
||||
let own = text.split_off(at);
|
||||
push_run(&mut t.runs, text, style.clone());
|
||||
push_run(&mut t.runs, own, after);
|
||||
push_run(&mut t.runs, rest, style);
|
||||
return;
|
||||
}
|
||||
push_run(&mut t.runs, text, style);
|
||||
}
|
||||
|
||||
/// `TO`: the text object ends. Area type with several linked areas becomes one frame for each
|
||||
@@ -792,6 +918,15 @@ impl Reader<'_> {
|
||||
if t.direction_changed {
|
||||
self.warn(DIRECTION_CHANGE_LEFT_OUT);
|
||||
}
|
||||
// A copy on `%_` lines is not the type the document shows.
|
||||
if !(t.hidden || hidden) {
|
||||
if self.type_state.line_breaking {
|
||||
self.warn(LINE_BREAKING_LEFT_OUT);
|
||||
}
|
||||
if self.type_state.japanese_layout {
|
||||
self.warn(JAPANESE_LAYOUT_LEFT_OUT);
|
||||
}
|
||||
}
|
||||
let mut paras = std::mem::take(&mut t.paras);
|
||||
if paras.is_empty() {
|
||||
paras.push(ParaRun { style: self.type_state.para.clone(), count: 1, tabs_version: 0 });
|
||||
|
||||
@@ -383,17 +383,20 @@ impl<'a> Reader<'a> {
|
||||
// `(text) justified TS`, special characters (§22.6): the reader adds its characters like `Tx`.
|
||||
"Tx" | "Tj" | "TX" | "TS" => self.text_body(w, &vals),
|
||||
"Tr" | "Tf" | "Ts" | "Tz" | "Tt" | "TA" | "Tl" | "Ta" | "Ti" | "TC" | "TW" | "Tq" | "Th" | "TV" | "Tv" | "Ty" | "TY" | "Tg" | "Xb"
|
||||
| "Xe" | "XB" => {
|
||||
| "Xe" | "XB" | "XL" | "TG" | "Xu" | "Tu" => {
|
||||
self.text_attr(w, &vals);
|
||||
}
|
||||
// Attributes the reader doesn't keep (kerning pairs, line breaking and Japanese layout
|
||||
// rules) and final-form positions (§15.3).
|
||||
"Tk" | "TK" | "Tc" | "Tw" | "Tm" | "Td" | "T*" | "TR" | "T+" | "T-" | "TG" | "Tu" | "Xu" => {}
|
||||
// A kerning pair (`Tk`, `TK` in overflow text, §15.4.6.1) and discretionary hyphens
|
||||
// (`T+`, `T-`, §15.4.10.1).
|
||||
"Tk" | "TK" => self.text_kern(&vals),
|
||||
"T+" => self.discretionary_hyphen(false),
|
||||
"T-" => self.discretionary_hyphen(true),
|
||||
// Final-form positions (§15.4.7: `Tc Tw Tm Td T* TR`, printing only), which the type's
|
||||
// layout computes again.
|
||||
"Tc" | "Tw" | "Tm" | "Td" | "T*" | "TR" => {}
|
||||
// `TM` (pop text matrix) and `Te` (end render), listed in §22.6, keep nothing either; the
|
||||
// reader takes `Te` with any number of operands.
|
||||
"TM" | "Te" => {}
|
||||
// The hyphenation language (`XL`), which the reader doesn't keep either (§22).
|
||||
"XL" => {}
|
||||
"TE" => self.te(&vals),
|
||||
"TZ" => self.tz(&vals),
|
||||
// An image whose samples follow in comment lines (read at `%AI5_EndRaster`).
|
||||
|
||||
@@ -4284,6 +4284,109 @@ fn legacy_end_render_and_text_matrix_pop_read() {
|
||||
}
|
||||
}
|
||||
|
||||
/// The text, manual kerning and space before each run of a legacy-format file's first text object.
|
||||
fn legacy_kerning(art: &str) -> Vec<(String, Option<f64>, f64)> {
|
||||
legacy_texts(art)[0].runs.iter().map(|r| (r.text.clone(), r.style.kerning, r.style.kerning_before)).collect()
|
||||
}
|
||||
|
||||
/// `autoKern kernValue Tk` (§15.4.6.1) spaces the character before it from the one after it: with
|
||||
/// `autoKern` 0 by `kernValue` (1/1000 em, kept to -1000 to 10,000) as the manual kerning after the
|
||||
/// character before it, with 1 by the automatic kerning; `TK` does the same in overflow text. At
|
||||
/// the start of a line it is the space before the line's first character.
|
||||
#[test]
|
||||
fn legacy_manual_pair_kerning_is_kept() {
|
||||
let s = |x: &str| x.to_string();
|
||||
let runs = legacy_kerning(&point_type("0 TA\n(A) Tx\n0 -80 Tk", "V"));
|
||||
assert_eq!(runs, [(s("A"), Some(-80.0), 0.0), (s("V"), Some(0.0), 0.0)]);
|
||||
// Inside a run, the character before it takes the value alone.
|
||||
let runs = legacy_kerning(&point_type("(WAVE) Tx\n0 50 Tk", "S"));
|
||||
assert_eq!(runs, [(s("WAV"), None, 0.0), (s("E"), Some(50.0), 0.0), (s("S"), None, 0.0)]);
|
||||
// `autoKern` 1 gives the pair the automatic kerning, whatever its value.
|
||||
let runs = legacy_kerning(&point_type("0 TA\n(AV) Tx\n1 -50 Tk", "A"));
|
||||
assert_eq!(runs, [(s("A"), Some(0.0), 0.0), (s("V"), None, 0.0), (s("A"), Some(0.0), 0.0)]);
|
||||
// Pairs with the same value in a row stay one run.
|
||||
let runs = legacy_kerning(&point_type("0 TA\n(A) Tx\n0 50 Tk\n(B) Tx\n0 50 Tk", "C"));
|
||||
assert_eq!(runs, [(s("AB"), Some(50.0), 0.0), (s("C"), Some(0.0), 0.0)]);
|
||||
// At the start of the text and of a paragraph, the space before the line's first character.
|
||||
let runs = legacy_kerning(&point_type("0 -30 Tk", "Hi"));
|
||||
assert_eq!(runs, [(s("H"), None, -30.0), (s("i"), None, 0.0)]);
|
||||
let runs = legacy_kerning(&point_type("(a\\r) Tx\n0 40 Tk", "b"));
|
||||
assert_eq!(runs, [(s("a\n"), None, 0.0), (s("b"), None, 40.0)]);
|
||||
let runs = legacy_kerning(&point_type("(a) Tx\n(\\r) TX\n0 40 TK", "b"));
|
||||
assert_eq!(runs, [(s("a\n"), None, 0.0), (s("b"), None, 40.0)]);
|
||||
// In overflow text.
|
||||
let runs = legacy_kerning(&point_type("(ab) Tx\n0 25 TK", "c").replace("(c) Tx", "(c) TX"));
|
||||
assert_eq!(runs, [(s("a"), None, 0.0), (s("b"), Some(25.0), 0.0), (s("c"), None, 0.0)]);
|
||||
// Kept to the range `text.setRangeStyle` takes.
|
||||
let runs = legacy_kerning(&point_type("(a) Tx\n0 -5000 Tk\n(b) Tx\n0 20000 Tk", "c"));
|
||||
assert_eq!(runs, [(s("a"), Some(-1000.0), 0.0), (s("b"), Some(10_000.0), 0.0), (s("c"), None, 0.0)]);
|
||||
// The pair is spaced as the kerning says.
|
||||
let x = |art: &str| legacy_origins(&legacy_texts(art)[0])[1].0;
|
||||
let (plain, kerned) = (x(&point_type("0 TA\n(A) Tx", "V")), x(&point_type("0 TA\n(A) Tx\n0 -80 Tk", "V")));
|
||||
assert!((plain - kerned - 0.96).abs() < 1e-6, "{plain} {kerned}");
|
||||
}
|
||||
|
||||
/// A `Tk` whose operands are missing or are not numbers, or whose flag is not 0 or 1, and a `Tk`
|
||||
/// outside a text object leave the type as it was.
|
||||
#[test]
|
||||
fn legacy_pair_kerning_with_bad_operands_leaves_the_type_as_it_was() {
|
||||
let want = legacy_kerning(&point_type("(H) Tx", "i"));
|
||||
for bad in ["0 Tk", "Tk", "/x 50 Tk", "0 /x Tk", "2 50 Tk", "0.5 50 Tk", "(0) 50 Tk"] {
|
||||
assert_eq!(legacy_kerning(&point_type(&format!("(H) Tx\n{bad}"), "i")), want, "{bad}");
|
||||
}
|
||||
let outside = legacy_kerning(&format!("0 50 Tk\n{}", point_type("(H) Tx", "i")));
|
||||
assert_eq!(outside, want);
|
||||
}
|
||||
|
||||
/// `T+` (a discretionary hyphen, §15.4.10.1) is a soft hyphen where it stands, in overflow text
|
||||
/// too; `T-` makes the printed hyphen before it a soft hyphen, or adds one. Outside a text object
|
||||
/// they add nothing.
|
||||
#[test]
|
||||
fn legacy_discretionary_hyphens_are_soft_hyphens() {
|
||||
for (art, text) in [
|
||||
(point_type("(co) Tx\nT+", "operate"), "co\u{ad}operate"),
|
||||
(point_type("(co-) Tx\nT-", "operate"), "co\u{ad}operate"),
|
||||
(point_type("(co) Tx\nT-", "operate"), "co\u{ad}operate"),
|
||||
(point_type("(co) Tx\nT+", "operate").replace("(operate) Tx", "(operate) TX"), "co\u{ad}operate"),
|
||||
(format!("T+\nT-\n{}", point_type("", "co")), "co"),
|
||||
] {
|
||||
let texts = legacy_texts(&art);
|
||||
assert_eq!(texts[0].plain_text(), text, "{art}");
|
||||
}
|
||||
}
|
||||
|
||||
/// `languageID XL` (§22.6) is the characters' language, 0 (U.S. English) the default; it lasts into
|
||||
/// the next text object, and an ID that is not 0 to 11 leaves the language as it was.
|
||||
#[test]
|
||||
fn legacy_hyphenation_language_is_kept() {
|
||||
let lang = |t: &vectorcraft_doc::TextObject| t.runs.iter().map(|r| r.style.language.clone()).collect::<Vec<_>>();
|
||||
let texts = legacy_texts(&format!("{}{}", point_type("%_ 3 XL\n(a) Tx\n%_ 0 XL\n(b) Tx\n%_ 8 XL", "c"), point_type("", "d")));
|
||||
assert_eq!(lang(&texts[0]), [Some("de".to_string()), None, Some("nb".to_string())]);
|
||||
assert_eq!(lang(&texts[1]), [Some("nb".to_string())]);
|
||||
for bad in ["12 XL", "-1 XL", "1.5 XL", "/x XL", "XL"] {
|
||||
let texts = legacy_texts(&point_type(&format!("2 XL\n{bad}"), "a"));
|
||||
assert_eq!(lang(&texts[0]), [Some("fr".to_string())], "{bad}");
|
||||
}
|
||||
}
|
||||
|
||||
/// The line breaking value (`TG`) and the Japanese layout rules (`Xu`, `Tu`, §22.6) are not kept:
|
||||
/// a visible text object read while one is set gives a warning, once for each in a file. A copy of
|
||||
/// a text object on `%_` lines gives none, and the final-form positions (§15.4.7) give none.
|
||||
#[test]
|
||||
fn legacy_line_breaking_and_japanese_layout_rules_are_warned_once() {
|
||||
const LINE_BREAKING: &str = "the Line Breaking setting of legacy type was left out";
|
||||
const JAPANESE_LAYOUT: &str = "the Japanese layout rules of legacy type were left out";
|
||||
let r = legacy_read(&format!("{}{}", point_type("50 TG\n0 1 120 150 Xu", "a"), point_type("60 TG", "b")));
|
||||
assert_eq!(r.warnings, [LINE_BREAKING, JAPANESE_LAYOUT]);
|
||||
assert_eq!(legacy_read(&point_type("0 1 120 150 Tu", "a")).warnings, [JAPANESE_LAYOUT]);
|
||||
let hidden: String = point_type("50 TG", "a").lines().map(|l| format!("%_{l}\n")).collect();
|
||||
assert_eq!(legacy_read(&hidden).warnings, Vec::<String>::new());
|
||||
let final_form = point_type("1 0 0 1 10 50 Tm\n0 0 Td\nT*\n0 Tc\n0 Tw\n1 0 0 1 0 0 TR\nTe\nTM", "Hi");
|
||||
let r = legacy_read(&final_form);
|
||||
assert!(r.warnings.is_empty(), "{:?}", r.warnings);
|
||||
assert_eq!(art_texts(&r.doc)[0].plain_text(), "Hi");
|
||||
}
|
||||
|
||||
/// Spacing is kept to the ranges the Justification options take, a Minimum, Desired and Maximum
|
||||
/// out of order go back to their defaults, and hyphenation's letter counts and limit to the ranges
|
||||
/// `text.setFormat` takes.
|
||||
|
||||
@@ -208,15 +208,15 @@ fn a_postscript_ai_with_a_multi_layer_mask_opens_with_its_layers() {
|
||||
assert!(r.warnings.iter().any(|w| w.contains("clipping group in each layer")), "{:?}", r.warnings);
|
||||
}
|
||||
|
||||
/// A `.ai` in PostScript form (read through its layers) whose text carries hyphenation and
|
||||
/// tab-ruler attributes: `XL` (hyphenation language), `Xb`/`Xe`/`XB` (a tab definition) and `Th`
|
||||
/// (hyphen control). The reader drops `XL` and keeps the tab definition as the paragraph's tab
|
||||
/// stops rather than failing the file the way it did before (the symptom seen on Illustrator 6/8
|
||||
/// EPS files whose `Adobe_level2_AI5` program can't be run).
|
||||
/// A `.ai` in PostScript form (read through its layers) whose text carries hyphenation, tab-ruler
|
||||
/// and kerning attributes: `XL` (hyphenation language), `Xb`/`Xe`/`XB` (a tab definition), `Th`
|
||||
/// (hyphen control), `Tk` (a manual kerning pair) and `T+` (a discretionary hyphen). The reader
|
||||
/// keeps the language, the tab definition as the paragraph's tab stops, the pair's kerning and the
|
||||
/// soft hyphen.
|
||||
#[test]
|
||||
fn text_with_hyphenation_and_tab_attributes_opens_instead_of_failing() {
|
||||
let text = "0 To\n1 0 0 1 10 50 0 Tp\nTP\n0 Tr\n0 0 0 1 k\n/_Helvetica 9 Tf\n\
|
||||
%_ 0 XL\n36 1 Xb\n0 0 3 72 Xe\nXB\n0 1 2 2 99 Th\n0 Ta\n(hi) Tx\nTO\n";
|
||||
%_ 3 XL\n36 1 Xb\n0 0 3 72 Xe\nXB\n0 1 2 2 99 Th\n0 Ta\n(h) Tx\n0 -40 Tk\n(i) Tx\nT+\n(ho) Tx\nTO\n";
|
||||
// The operators sit on a visible layer (so they'd be reported as unknown, not quietly skipped
|
||||
// on a hidden one), beside the square so the layer is never empty.
|
||||
let src = NAMED_PROLOG.replace("S\nLB\n%AI5_EndLayer--\n%AI5_BeginLayer", &format!("S\n{text}LB\n%AI5_EndLayer--\n%AI5_BeginLayer"));
|
||||
@@ -228,10 +228,14 @@ fn text_with_hyphenation_and_tab_attributes_opens_instead_of_failing() {
|
||||
let mut texts = vec![];
|
||||
r.document.walk(|n| {
|
||||
if let NodeKind::Text(t) = &n.kind {
|
||||
texts.push(t.para_at(0).clone());
|
||||
texts.push((**t).clone());
|
||||
}
|
||||
});
|
||||
let [p] = texts.as_slice() else { panic!("{texts:?}") };
|
||||
let [t] = texts.as_slice() else { panic!("{texts:?}") };
|
||||
assert_eq!(t.plain_text(), "hi\u{ad}ho");
|
||||
let runs: Vec<_> = t.runs.iter().map(|r| (r.text.as_str(), r.style.kerning, r.style.language.as_deref())).collect();
|
||||
assert_eq!(runs, [("h", Some(-40.0), Some("de")), ("i\u{ad}ho", None, Some("de"))]);
|
||||
let p = t.para_at(0);
|
||||
assert!(!p.hyphenate);
|
||||
assert_eq!((p.hyphenation.after_first, p.hyphenation.before_last, p.hyphenation.hyphen_limit), (2, 2, 25));
|
||||
let tabs: Vec<_> = p.tabs.iter().map(|t| (t.position, t.align)).collect();
|
||||
|
||||
@@ -33,7 +33,9 @@
|
||||
//! - Type (§15): point type, area type and type on a path as text objects, `type To`, `a b c d tx
|
||||
//! ty startPt Tp` (the text matrix; the frame or path in art space between it and `TP`), each
|
||||
//! run's paint style, `Tr` (fill, stroke, both or neither), `/_font size ascent descent Tf`,
|
||||
//! `Ts Tz Tt TA Tl Ta Ti` and its characters `(…) Tx` (`\r` ends a paragraph), `TO`. Standard
|
||||
//! `Ts Tz Tt TA Tl Ta Ti` and its characters `(…) Tx` (`\r` ends a paragraph), with manual
|
||||
//! kerning as `0 value Tk` after each character that has it and before a paragraph's first
|
||||
//! character that has space before it (§15.4.6.1) and soft hyphens as `T+` (§15.4.10.1), `TO`. Standard
|
||||
//! Vertical Roman Alignment is written as `1 Tv` and `0 Tv`, and Tate-chu-yoko in horizontal
|
||||
//! type as a Kumi block recorded for later use, `1 TY` … `0 TY` (§15.3.4); neither operator is
|
||||
//! written for type that has neither mark. Only the
|
||||
@@ -99,7 +101,7 @@ const HEX_LINE: usize = 60;
|
||||
pub const SUBLAYERS: &str = "sublayers are written as groups in their top-level layer (legacy .ai files have no sublayers)";
|
||||
pub const TYPE: &str = "type a legacy .ai can't hold as text (characters outside Windows Latin-1, vertical type, ruby, inline graphics, gradient or pattern fills) is written as outlines";
|
||||
pub const ROTATED_TYPE: &str = "type with rotated characters is written as outlines, which keep the rotation, and is no longer editable text (legacy .ai text can't rotate characters)";
|
||||
pub const TYPE_ATTRIBUTES: &str = "type attributes legacy .ai files don't have (underline, strikethrough, manual kerning, optical kerning, small caps, superscript and subscript, OpenType features, Variable Font settings, optical margin alignment, System Layout, fractional widths off, area type options, type on a path's effect, alignment and spacing, an end bracket short of the path's end, subpaths after the first in an area type frame or a type path, space after paragraphs, tabs, bulleted and numbered lists) are left out";
|
||||
pub const TYPE_ATTRIBUTES: &str = "type attributes legacy .ai files don't have (underline, strikethrough, optical kerning, small caps, superscript and subscript, OpenType features, Variable Font settings, optical margin alignment, System Layout, fractional widths off, area type options, type on a path's effect, alignment and spacing, an end bracket short of the path's end, subpaths after the first in an area type frame or a type path, space after paragraphs, tabs, bulleted and numbered lists) are left out";
|
||||
pub const DYNAMIC_TEXT: &str = "Dynamic Text is written as the sizes the type is drawn at (legacy .ai files don't have it)";
|
||||
pub const HIDDEN: &str = "hidden objects are left out (hidden layers are kept, hidden)";
|
||||
pub const HIDDEN_LAYER: &str = "hidden objects are moved to a hidden layer above their own (legacy .ai files can hide only layers)";
|
||||
|
||||
@@ -119,7 +119,6 @@ pub(super) fn lost_attributes(t: &TextObject) -> bool {
|
||||
let run_lost = |s: &CharStyle| {
|
||||
s.underline
|
||||
|| s.strikethrough
|
||||
|| s.kerning.is_some_and(|k| k != 0.0)
|
||||
|| s.optical_kerning
|
||||
|| s.small_caps.is_some()
|
||||
|| s.position != CharPosition::Normal
|
||||
|
||||
@@ -107,6 +107,7 @@ VCLegacy begin
|
||||
/To {pop} bd /Tp {7 {pop} repeat} bd /TP {} bd /TO {} bd
|
||||
/Tr {pop} bd /Tf {pop pop pop pop} bd /Ts {pop} bd /Tz {pop pop} bd /Tt {pop} bd /TA {pop} bd
|
||||
/Tl {pop pop} bd /Ta {pop} bd /Ti {pop pop pop} bd /Tx {pop} bd /Tv {pop} bd /TY {pop} bd
|
||||
/Tk {pop pop} bd /T+ {} bd
|
||||
% The page trailer (3): annotatepage marks nothing.
|
||||
/annotatepage {} bd
|
||||
end
|
||||
|
||||
@@ -1454,12 +1454,12 @@ fn type_on_a_path_alignment_and_end_bracket_are_warned_as_left_out() {
|
||||
assert!(warned(&|t| t.kind = TextKind::OnPath { path: two(false), start: 0.25, end: None }));
|
||||
}
|
||||
|
||||
/// Kerning other than Auto or 0, optical kerning, Optical Margin Alignment, System Layout,
|
||||
/// fractional widths off and an area type frame with a second subpath are not held by a legacy
|
||||
/// `.ai` text object: type with any of them is written as text, with the warning that they are
|
||||
/// left out.
|
||||
/// Optical kerning, Optical Margin Alignment, System Layout, fractional widths off and an area
|
||||
/// type frame with a second subpath are not held by a legacy `.ai` text object: type with any of
|
||||
/// them is written as text, with the warning that they are left out. Manual kerning is held
|
||||
/// (`Tk`), with no warning.
|
||||
#[test]
|
||||
fn kerning_margins_widths_and_extra_frames_are_warned_as_left_out() {
|
||||
fn optical_kerning_margins_widths_and_extra_frames_are_warned_as_left_out() {
|
||||
use vectorcraft_doc::{TextKind, TextObject};
|
||||
let warned = |edit: &dyn Fn(&mut TextObject)| {
|
||||
let mut doc = typed();
|
||||
@@ -1473,7 +1473,8 @@ fn kerning_margins_widths_and_extra_frames_are_warned_as_left_out() {
|
||||
};
|
||||
assert!(!warned(&|_| {}));
|
||||
assert!(!warned(&|t| t.runs[0].style.kerning = Some(0.0)));
|
||||
assert!(warned(&|t| t.runs[0].style.kerning = Some(50.0)));
|
||||
assert!(!warned(&|t| t.runs[0].style.kerning = Some(50.0)));
|
||||
assert!(!warned(&|t| t.runs[0].style.kerning_before = 50.0));
|
||||
assert!(warned(&|t| t.runs[0].style.optical_kerning = true));
|
||||
assert!(warned(&|t| t.optical_margin = true));
|
||||
assert!(warned(&|t| t.system_layout = true));
|
||||
@@ -1486,6 +1487,46 @@ fn kerning_margins_widths_and_extra_frames_are_warned_as_left_out() {
|
||||
assert!(warned(&|t| t.kind = TextKind::Area { frame: PathData::new(vec![square(10.0), square(120.0)]) }));
|
||||
}
|
||||
|
||||
/// Manual kerning is written as `0 value Tk` after each character that has it, the space before a
|
||||
/// paragraph's first character as `Tk` before it, and a soft hyphen as a discretionary hyphen
|
||||
/// (`T+`, §15.4.6.1 and §15.4.10.1); each reads back on the same characters.
|
||||
#[test]
|
||||
fn manual_kerning_and_soft_hyphens_are_written_and_read_back() {
|
||||
use vectorcraft_doc::{CharStyle, TextObject, TextRun};
|
||||
let plain = style(12.0, Paint::solid(Color::BLACK));
|
||||
let kerned = CharStyle { kerning: Some(-80.0), ..plain.clone() };
|
||||
let before = CharStyle { kerning_before: 40.0, ..plain.clone() };
|
||||
let mut t = TextObject::point(vectorcraft_geom::Point::new(20.0, 40.0), "AV", kerned.clone());
|
||||
for (text, st) in [("A co\u{ad}op\n", &plain), ("W", &before), ("ord", &plain), ("d\u{ad}", &kerned)] {
|
||||
t.runs.push(TextRun::new(text, st.clone()));
|
||||
}
|
||||
let mut doc = Document::new(300.0, 200.0);
|
||||
let layer = doc.layers[0].id;
|
||||
let n = Node::new(doc.alloc_id(), NodeKind::Text(Box::new(t)));
|
||||
doc.insert(Some(layer), usize::MAX, n).unwrap();
|
||||
let out = write(&doc);
|
||||
assert!(!out.warnings.iter().any(|w| w == TYPE || w == TYPE_ATTRIBUTES), "{:?}", out.warnings);
|
||||
let text = String::from_utf8(out.bytes.clone()).unwrap();
|
||||
assert!(text.contains("(A) Tx\n0 -80 Tk\n(V) Tx\n0 -80 Tk\n"), "{text}");
|
||||
assert!(text.contains("(A co) Tx\nT+\n(op\\r) Tx\n"), "{text}");
|
||||
assert!(text.contains("0 40 Tk\n(W) Tx\n"), "{text}");
|
||||
// A soft hyphen with manual kerning keeps it too.
|
||||
assert!(text.contains("(d) Tx\n0 -80 Tk\nT+\n0 -80 Tk\n"), "{text}");
|
||||
let read = texts(&crate::import(&out.bytes).unwrap().document);
|
||||
let runs: Vec<(String, Option<f64>, f64)> = read[0].1.runs.iter().map(|r| (r.text.clone(), r.style.kerning, r.style.kerning_before)).collect();
|
||||
let s = |x: &str| x.to_string();
|
||||
assert_eq!(
|
||||
runs,
|
||||
[
|
||||
(s("AV"), Some(-80.0), 0.0),
|
||||
(s("A co\u{ad}op\n"), None, 0.0),
|
||||
(s("W"), None, 40.0),
|
||||
(s("ord"), None, 0.0),
|
||||
(s("d\u{ad}"), Some(-80.0), 0.0)
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/// Type whose font size measures the cap height is written at the em size it is drawn at, with
|
||||
/// no warning: 14 pt measuring a 0.7 em cap height reads back as 20 pt type.
|
||||
#[test]
|
||||
|
||||
@@ -833,6 +833,8 @@ impl<'a> Writer<'a> {
|
||||
self.line("TP");
|
||||
let mut para = 0usize;
|
||||
let mut para_start = true;
|
||||
// No character of the current paragraph has been written.
|
||||
let mut line_start = true;
|
||||
for run in &t.runs {
|
||||
let text = if run.style.all_caps { run.text.to_uppercase() } else { run.text.clone() };
|
||||
let mut pieces = text.split('\n').peekable();
|
||||
@@ -846,14 +848,38 @@ impl<'a> Writer<'a> {
|
||||
para_start = false;
|
||||
}
|
||||
self.char_style(&run.style, t.para_at(para));
|
||||
let mut bytes: Vec<u8> = piece.chars().filter_map(latin::encode).collect();
|
||||
// The space before a line's first character, kerning before it (§15.4.6.1).
|
||||
if line_start && !piece.is_empty() && run.style.kerning_before != 0.0 {
|
||||
self.kern(run.style.kerning_before);
|
||||
}
|
||||
line_start = false;
|
||||
// Manual kerning after each character, a soft hyphen as a discretionary hyphen
|
||||
// (§15.4.10.1).
|
||||
let kerning = run.style.kerning.filter(|k| *k != 0.0);
|
||||
let mut bytes = vec![];
|
||||
for c in piece.chars() {
|
||||
if c == '\u{ad}' {
|
||||
self.text_string(&mut bytes);
|
||||
self.line("T+");
|
||||
if let Some(k) = kerning {
|
||||
self.kern(k);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
let Some(b) = latin::encode(c) else { continue };
|
||||
bytes.push(b);
|
||||
if let Some(k) = kerning {
|
||||
self.text_string(&mut bytes);
|
||||
self.kern(k);
|
||||
}
|
||||
}
|
||||
if ends_paragraph {
|
||||
bytes.push(b'\r');
|
||||
para += 1;
|
||||
para_start = true;
|
||||
line_start = true;
|
||||
}
|
||||
self.body.push_str(&ps::bytes(&bytes));
|
||||
self.line(" Tx");
|
||||
self.text_string(&mut bytes);
|
||||
}
|
||||
}
|
||||
if self.kumi {
|
||||
@@ -863,6 +889,22 @@ impl<'a> Writer<'a> {
|
||||
self.line("TO");
|
||||
}
|
||||
|
||||
/// `bytes` as a string of characters, `(…) Tx`, when there are any; `bytes` is left empty.
|
||||
fn text_string(&mut self, bytes: &mut Vec<u8>) {
|
||||
if !bytes.is_empty() {
|
||||
self.body.push_str(&ps::bytes(bytes));
|
||||
self.line(" Tx");
|
||||
bytes.clear();
|
||||
}
|
||||
}
|
||||
|
||||
/// Manual kerning of `k` 1/1000 em between the characters before and after it: `0 k Tk`.
|
||||
fn kern(&mut self, k: f64) {
|
||||
self.body.push_str("0 ");
|
||||
ps::push_num(&mut self.body, finite(k, 0.0));
|
||||
self.line(" Tk");
|
||||
}
|
||||
|
||||
/// A paragraph's attributes: alignment `Ta` and indents `Ti` (first line's, left, right).
|
||||
fn paragraph(&mut self, p: &ParaStyle) {
|
||||
let align = match p.justify {
|
||||
|
||||
@@ -4818,6 +4818,8 @@ axis Both И двете
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers вградено изображение от {_1} × {_2} пиксела беше намалено до {_3} × {_4} пиксела, за да се запазят слоевете
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel свързаните картини показват записания във файла предварителен преглед с ниска резолюция, докато файловете им бъдат намерени: презакачете ги в панела „Връзки“
|
||||
@msg linked type areas past VectorCraft's limits were left out свързаните текстови области извън ограниченията на VectorCraft бяха пропуснати
|
||||
@msg the Line Breaking setting of legacy type was left out настройката за прекъсване на редовете на текста в стария формат беше пропусната
|
||||
@msg the Japanese layout rules of legacy type were left out японските правила за оформление на текста в стария формат бяха пропуснати
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character текст, който сменя посоката на писане в рамките на текстов обект, се отваря в посоката на първия си знак
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip текст, използван като маска в свързани области, обтичащ текст или съставен път, не изрязва
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel свързаните картини без предварителен преглед във файла показват заместител, докато файловете им бъдат намерени: презакачете ги в панела „Връзки“
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -5216,6 +5216,8 @@ imageTrace Outline Obris
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers ugrađena slika od {_1} × {_2} piksela smanjena je na {_3} × {_4} piksela kako bi se zadržali slojevi
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel povezane slike prikazuju pregled niske rezolucije sačuvan u datoteci dok se njihove datoteke ne pronađu: ponovo ih povežite u panelu Veze
|
||||
@msg linked type areas past VectorCraft's limits were left out povezana područja teksta izvan ograničenja programa VectorCraft su izostavljena
|
||||
@msg the Line Breaking setting of legacy type was left out postavka prijeloma redova teksta u starom formatu je izostavljena
|
||||
@msg the Japanese layout rules of legacy type were left out japanska pravila rasporeda teksta u starom formatu su izostavljena
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character tekst koji mijenja smjer pisanja unutar tekstualnog objekta otvara se u smjeru svog prvog znaka
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip tekst korišten kao maska u povezanim područjima, omotanom tekstu ili složenoj putanji ne odsijeca
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel povezane slike bez pregleda u datoteci prikazuju čuvar mjesta dok se njihove datoteke ne pronađu: ponovo ih povežite u panelu Veze
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -5667,6 +5667,8 @@ digits Malayalam Malaiàlam
|
||||
@msg library panel `{given}` isn't open el panell de biblioteca `{given}` no està obert
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel les imatges enllaçades mostren la previsualització de baixa resolució desada al fitxer fins que es trobin els seus fitxers: torneu-les a enllaçar al panell Enllaços
|
||||
@msg linked type areas past VectorCraft's limits were left out s’han omès les àrees de text enllaçades que superen els límits de VectorCraft
|
||||
@msg the Line Breaking setting of legacy type was left out s’ha omès l’ajust de salt de línia del text en format antic
|
||||
@msg the Japanese layout rules of legacy type were left out s’han omès les regles de composició japonesa del text en format antic
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character el text que canvia de direcció d’escriptura dins d’un objecte de text s’obre en la direcció del seu primer caràcter
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip el text usat com a màscara en àrees enllaçades, en text ajustat o en un traçat compost no retalla
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel les imatges enllaçades sense previsualització al fitxer mostren un marcador de posició fins que es trobin els seus fitxers: torneu-les a enllaçar al panell Enllaços
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -5414,6 +5414,8 @@ imageTrace Outline Obrys
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers vložený obrázek o rozměrech {_1} × {_2} pixelů byl zmenšen na {_3} × {_4} pixelů, aby se zachovaly vrstvy
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel propojené obrázky se zobrazují jako náhled v nízkém rozlišení uložený v souboru, dokud se nenajdou jejich soubory: znovu je propojte v panelu Propojení
|
||||
@msg linked type areas past VectorCraft's limits were left out propojené textové oblasti nad limity aplikace VectorCraft byly vynechány
|
||||
@msg the Line Breaking setting of legacy type was left out nastavení zalamování řádků textu ve starém formátu bylo vynecháno
|
||||
@msg the Japanese layout rules of legacy type were left out japonská pravidla sazby textu ve starém formátu byla vynechána
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character text, který mění směr psaní uvnitř textového objektu, se otevře ve směru svého prvního znaku
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip text použitý jako maska v propojených oblastech, obtékaném textu nebo složené cestě neořezává
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel propojené obrázky bez náhledu v souboru se zobrazují jako zástupný symbol, dokud se nenajdou jejich soubory: znovu je propojte v panelu Propojení
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4903,6 +4903,8 @@ imageTrace Outline Kontur
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers et indlejret billede på {_1} × {_2} pixel blev formindsket til {_3} × {_4} pixel for at bevare lagene
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel linkede billeder viser den gemte forhåndsvisning i lav opløsning, indtil deres filer findes: link dem igen i Links-panelet
|
||||
@msg linked type areas past VectorCraft's limits were left out sammenkædede tekstområder ud over VectorCrafts grænser blev udeladt
|
||||
@msg the Line Breaking setting of legacy type was left out indstillingen for linjeskift i tekst i det gamle format blev udeladt
|
||||
@msg the Japanese layout rules of legacy type were left out de japanske layoutregler for tekst i det gamle format blev udeladt
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character tekst, der skifter skriveretning inde i et tekstobjekt, åbnes i retningen for sit første tegn
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip tekst brugt som maske i sammenkædede områder, ombrudt tekst eller en sammensat kurve beskærer ikke
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel linkede billeder uden forhåndsvisning i filen viser en pladsholder, indtil deres filer findes: link dem igen i Links-panelet
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -5030,6 +5030,8 @@ theme Appearance Erscheinungsbild
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers ein eingebettetes Bild mit {_1} × {_2} Pixeln wurde auf {_3} × {_4} Pixel verkleinert, damit die Ebenen erhalten bleiben
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel verknüpfte Bilder zeigen die in der Datei gespeicherte Vorschau in niedriger Auflösung, bis ihre Dateien gefunden werden: Verknüpfen Sie sie im Bedienfeld „Verknüpfungen“ neu
|
||||
@msg linked type areas past VectorCraft's limits were left out verkettete Textbereiche jenseits der Grenzen von VectorCraft wurden ausgelassen
|
||||
@msg the Line Breaking setting of legacy type was left out die Einstellung für den Zeilenumbruch von Text im alten Format wurde ausgelassen
|
||||
@msg the Japanese layout rules of legacy type were left out die japanischen Satzregeln von Text im alten Format wurden ausgelassen
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character Text, der innerhalb eines Textobjekts die Schreibrichtung wechselt, wird in der Richtung seines ersten Zeichens geöffnet
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip als Maske verwendeter Text in verketteten Bereichen, umfließendem Text oder einem zusammengesetzten Pfad beschneidet nicht
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel verknüpfte Bilder ohne Vorschau in der Datei zeigen einen Platzhalter, bis ihre Dateien gefunden werden: Verknüpfen Sie sie im Bedienfeld „Verknüpfungen“ neu
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -5053,6 +5053,8 @@ digits Malayalam Μαλαγιάλαμ
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers μια ενσωματωμένη εικόνα {_1} × {_2} pixel μειώθηκε σε {_3} × {_4} pixel για να διατηρηθούν τα επίπεδα
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel οι συνδεδεμένες εικόνες εμφανίζουν την προεπισκόπηση χαμηλής ανάλυσης που έχει αποθηκευτεί, μέχρι να βρεθούν τα αρχεία τους: επανασυνδέστε τις στον πίνακα Σύνδεσμοι
|
||||
@msg linked type areas past VectorCraft's limits were left out οι συνδεδεμένες περιοχές κειμένου πέρα από τα όρια του VectorCraft παραλείφθηκαν
|
||||
@msg the Line Breaking setting of legacy type was left out η ρύθμιση αλλαγής γραμμής του κειμένου παλιάς μορφής παραλείφθηκε
|
||||
@msg the Japanese layout rules of legacy type were left out οι ιαπωνικοί κανόνες διάταξης του κειμένου παλιάς μορφής παραλείφθηκαν
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character το κείμενο που αλλάζει κατεύθυνση γραφής μέσα σε ένα αντικείμενο κειμένου ανοίγει με την κατεύθυνση του πρώτου χαρακτήρα του
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip το κείμενο που χρησιμοποιείται ως μάσκα σε συνδεδεμένες περιοχές, σε κείμενο με αναδίπλωση ή σε σύνθετη διαδρομή δεν αποκόπτει
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel οι συνδεδεμένες εικόνες χωρίς προεπισκόπηση στο αρχείο εμφανίζουν ένα σύμβολο κράτησης θέσης, μέχρι να βρεθούν τα αρχεία τους: επανασυνδέστε τις στον πίνακα Σύνδεσμοι
|
||||
|
||||
|
Can't render this file because it is too large.
|
@@ -5106,6 +5106,8 @@ axis Both Ambos
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers una imagen incrustada de {_1} × {_2} píxeles se redujo a {_3} × {_4} píxeles para conservar las capas
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel las imágenes vinculadas muestran la vista previa de baja resolución guardada en el archivo hasta que se encuentren sus archivos: vuelva a vincularlas en el panel Vínculos
|
||||
@msg linked type areas past VectorCraft's limits were left out se omitieron las áreas de texto enlazadas que superan los límites de VectorCraft
|
||||
@msg the Line Breaking setting of legacy type was left out se omitió el ajuste de salto de línea del texto en formato antiguo
|
||||
@msg the Japanese layout rules of legacy type were left out se omitieron las reglas de composición japonesa del texto en formato antiguo
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character el texto que cambia de dirección de escritura dentro de un objeto de texto se abre en la dirección de su primer carácter
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip el texto usado como máscara en áreas enlazadas, texto ceñido o un trazado compuesto no recorta
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel las imágenes vinculadas sin vista previa en el archivo muestran un marcador de posición hasta que se encuentren sus archivos: vuelva a vincularlas en el panel Vínculos
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -5313,6 +5313,8 @@ imageTrace Outline Ääriviiva
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers upotettu {_1} × {_2} kuvapisteen kuva pienennettiin kokoon {_3} × {_4} kuvapistettä, jotta tasot säilyvät
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel linkitetyt kuvat näyttävät tiedostoon tallennetun matalan tarkkuuden esikatselun, kunnes niiden tiedostot löytyvät: linkitä ne uudelleen Linkit-paneelissa
|
||||
@msg linked type areas past VectorCraft's limits were left out VectorCraftin rajat ylittävät linkitetyt tekstialueet jätettiin pois
|
||||
@msg the Line Breaking setting of legacy type was left out vanhan muodon tekstin rivinvaihtoasetus jätettiin pois
|
||||
@msg the Japanese layout rules of legacy type were left out vanhan muodon tekstin japanilaiset asettelusäännöt jätettiin pois
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character tekstiobjektin sisällä kirjoitussuuntaa vaihtava teksti avautuu ensimmäisen merkkinsä suuntaan
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip maskina käytetty teksti linkitetyissä alueissa, rivitetyssä tekstissä tai yhdistelmäpolussa ei rajaa
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel linkitetyt kuvat, joilla ei ole esikatselua tiedostossa, näkyvät paikkamerkkinä, kunnes niiden tiedostot löytyvät: linkitä ne uudelleen Linkit-paneelissa
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -5093,6 +5093,8 @@ axis Both Les deux
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers une image incorporée de {_1} × {_2} pixels a été réduite à {_3} × {_4} pixels pour conserver les calques
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel les images liées affichent l’aperçu basse résolution enregistré dans le fichier tant que leurs fichiers ne sont pas trouvés : liez-les à nouveau dans le panneau Liens
|
||||
@msg linked type areas past VectorCraft's limits were left out les zones de texte liées au-delà des limites de VectorCraft ont été omises
|
||||
@msg the Line Breaking setting of legacy type was left out le réglage de coupure de ligne du texte à l’ancien format a été omis
|
||||
@msg the Japanese layout rules of legacy type were left out les règles de composition japonaise du texte à l’ancien format ont été omises
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character le texte qui change de sens d’écriture dans un objet texte s’ouvre dans le sens de son premier caractère
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip le texte utilisé comme masque dans des zones liées, un habillage de texte ou un tracé transparent ne découpe pas
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel les images liées sans aperçu dans le fichier affichent un espace réservé tant que leurs fichiers ne sont pas trouvés : liez-les à nouveau dans le panneau Liens
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -8309,6 +8309,8 @@ antiAlias Sharp शार्प
|
||||
@msg type dimension must be finite टाइप का आयाम परिमित होना चाहिए
|
||||
@msg type must be static or dynamic, not {v} type: प्रकार स्थिर या गतिशील होना चाहिए, न कि {v}
|
||||
@msg type objects can't be isolated टाइप ऑब्जेक्ट्स को आइसोलेट नहीं किया जा सकता
|
||||
@msg the Line Breaking setting of legacy type was left out पुराने प्रारूप के टेक्स्ट की लाइन ब्रेकिंग सेटिंग छोड़ दी गई
|
||||
@msg the Japanese layout rules of legacy type were left out पुराने प्रारूप के टेक्स्ट के जापानी लेआउट नियम छोड़ दिए गए
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character टेक्स्ट ऑब्जेक्ट के भीतर लेखन दिशा बदलने वाला टेक्स्ट अपने पहले वर्ण की दिशा में खुलता है
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip लिंक्ड एरिया, रैपअराउंड टेक्स्ट या कंपाउंड पाथ में मास्क के रूप में इस्तेमाल किया गया टाइप क्लिप नहीं करता
|
||||
@msg Unembedded to {_1} एम्बेड हटाकर {_1} में रखा गया
|
||||
|
||||
|
Can't render this file because it is too large.
|
@@ -4959,6 +4959,8 @@ imageTrace Outline Körvonal
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers egy {_1} × {_2} képpontos beágyazott kép {_3} × {_4} képpontosra lett kicsinyítve, hogy a rétegek megmaradjanak
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel a csatolt képek a fájlban mentett kis felbontású előnézetet mutatják, amíg a fájljaik elő nem kerülnek: csatold őket újra a Csatolások panelen
|
||||
@msg linked type areas past VectorCraft's limits were left out a VectorCraft korlátain túli csatolt szövegterületek kimaradtak
|
||||
@msg the Line Breaking setting of legacy type was left out a régi formátumú szöveg sortörési beállítása kimaradt
|
||||
@msg the Japanese layout rules of legacy type were left out a régi formátumú szöveg japán tördelési szabályai kimaradtak
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character a szövegobjektumon belül írásirányt váltó szöveg az első karakterének irányában nyílik meg
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip a csatolt területeken, körbefuttatott szövegben vagy összetett útvonalban maszkként használt szöveg nem vág ki
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel a fájlban előnézet nélküli csatolt képek helyőrzőt mutatnak, amíg a fájljaik elő nem kerülnek: csatold őket újra a Csatolások panelen
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4903,6 +4903,8 @@ imageTrace Outline Kontur
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers gambar tersemat berukuran {_1} × {_2} piksel diperkecil menjadi {_3} × {_4} piksel agar lapisannya tetap terjaga
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel gambar tertaut menampilkan pratinjau resolusi rendah yang tersimpan dalam berkas sampai berkasnya ditemukan: tautkan ulang di panel Tautan
|
||||
@msg linked type areas past VectorCraft's limits were left out area teks tertaut di luar batas VectorCraft dihilangkan
|
||||
@msg the Line Breaking setting of legacy type was left out pengaturan pemisah baris teks format lama dihilangkan
|
||||
@msg the Japanese layout rules of legacy type were left out aturan tata letak Jepang teks format lama dihilangkan
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character teks yang mengubah arah penulisan di dalam objek teks dibuka dengan arah karakter pertamanya
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip teks yang digunakan sebagai masker di area tertaut, teks terbungkus, atau jalur majemuk tidak memotong
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel gambar tertaut tanpa pratinjau dalam berkas menampilkan penanda tempat sampai berkasnya ditemukan: tautkan ulang di panel Tautan
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2422 and column 5.
|
@@ -5158,6 +5158,8 @@ axis Both Entrambi
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers un'immagine incorporata di {_1} × {_2} pixel è stata ridotta a {_3} × {_4} pixel per mantenere i livelli
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel le immagini collegate mostrano l'anteprima a bassa risoluzione salvata nel file finché i loro file non vengono trovati: ricollegale nel pannello Collegamenti
|
||||
@msg linked type areas past VectorCraft's limits were left out le aree di testo concatenate oltre i limiti di VectorCraft sono state omesse
|
||||
@msg the Line Breaking setting of legacy type was left out l’impostazione di interruzione di riga del testo in formato precedente è stata omessa
|
||||
@msg the Japanese layout rules of legacy type were left out le regole di composizione giapponese del testo in formato precedente sono state omesse
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character il testo che cambia direzione di scrittura all’interno di un oggetto di testo si apre nella direzione del suo primo carattere
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip il testo usato come maschera in aree concatenate, testo attorno o un tracciato composto non ritaglia
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel le immagini collegate senza anteprima nel file mostrano un segnaposto finché i loro file non vengono trovati: ricollegale nel pannello Collegamenti
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4700,6 +4700,8 @@ swatch Bright Violet ビビッドバイオレット
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers レイヤーを保持するため、{_1} × {_2} ピクセルの埋め込み画像を {_3} × {_4} ピクセルに縮小しました
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel リンク画像は、元のファイルが見つかるまで、ファイルに保存された低解像度のプレビューで表示されます:リンクパネルで再リンクしてください
|
||||
@msg linked type areas past VectorCraft's limits were left out VectorCraft の上限を超えるリンクされたテキストエリアは省略されました
|
||||
@msg the Line Breaking setting of legacy type was left out 旧形式のテキストの行分割の設定は読み込まれませんでした
|
||||
@msg the Japanese layout rules of legacy type were left out 旧形式のテキストの日本語組版ルールは読み込まれませんでした
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character テキストオブジェクト内で書字方向が変わる文字は、最初の文字の方向で開きます
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip リンクされたエリア、テキストの回り込み、複合パス内でマスクとして使われた文字はクリップしません
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel ファイルにプレビューのないリンク画像は、元のファイルが見つかるまでプレースホルダーで表示されます:リンクパネルで再リンクしてください
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -5139,6 +5139,8 @@ font-technology Variable ცვლადი
|
||||
Stacked დასტად
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel დაკავშირებული გამოსახულებები ფაილში შენახულ დაბალი გარჩევადობის მინიატურას აჩვენებს, სანამ მათი ფაილები არ მოიძებნება: დაუკავშირეთ ისინი ხელახლა ბმულების პანელში
|
||||
@msg linked type areas past VectorCraft's limits were left out VectorCraft-ის ლიმიტების მიღმა დაკავშირებული ტექსტის არეები გამოტოვებულია
|
||||
@msg the Line Breaking setting of legacy type was left out ძველი ფორმატის ტექსტის სტრიქონის გადატანის პარამეტრი გამოტოვებულია
|
||||
@msg the Japanese layout rules of legacy type were left out ძველი ფორმატის ტექსტის იაპონური განლაგების წესები გამოტოვებულია
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character ტექსტი, რომელიც ტექსტური ობიექტის შიგნით ცვლის წერის მიმართულებას, იხსნება მისი პირველი სიმბოლოს მიმართულებით
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip დაკავშირებულ არეებში, გარსშემოვლებულ ტექსტში ან შედგენილ ტრაექტორიაში ნიღბად გამოყენებული ტექსტი არ ჭრის
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel დაკავშირებული გამოსახულებები, რომელთა მინიატურაც ფაილში არ არის, ადგილის შემნახველს აჩვენებს, სანამ მათი ფაილები არ მოიძებნება: დაუკავშირეთ ისინი ხელახლა ბმულების პანელში
|
||||
|
||||
|
Can't render this file because it is too large.
|
@@ -4627,6 +4627,8 @@ theme Appearance 외관
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers 레이어를 유지하기 위해 {_1} × {_2} 픽셀의 포함된 이미지를 {_3} × {_4} 픽셀로 줄였습니다
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel 연결된 그림은 해당 파일을 찾을 때까지 파일에 저장된 저해상도 미리 보기로 표시됩니다: 링크 패널에서 다시 연결하세요
|
||||
@msg linked type areas past VectorCraft's limits were left out VectorCraft 한도를 넘는 연결된 문자 영역은 제외되었습니다
|
||||
@msg the Line Breaking setting of legacy type was left out 이전 형식 문자의 줄 바꿈 설정이 생략되었습니다
|
||||
@msg the Japanese layout rules of legacy type were left out 이전 형식 문자의 일본어 조판 규칙이 생략되었습니다
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character 문자 개체 안에서 쓰기 방향이 바뀌는 문자는 첫 글자의 방향으로 열립니다
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip 연결된 영역, 문자 감싸기 또는 컴파운드 패스에서 마스크로 사용된 문자는 클리핑하지 않습니다
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel 파일에 미리 보기가 없는 연결된 그림은 해당 파일을 찾을 때까지 자리 표시자로 표시됩니다: 링크 패널에서 다시 연결하세요
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -5418,6 +5418,8 @@ imageTrace Outline Contour
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers een ingesloten afbeelding van {_1} × {_2} pixels is verkleind tot {_3} × {_4} pixels om de lagen te behouden
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel gekoppelde afbeeldingen tonen het in het bestand opgeslagen voorbeeld met lage resolutie totdat hun bestanden zijn gevonden: koppel ze opnieuw in het paneel Koppelingen
|
||||
@msg linked type areas past VectorCraft's limits were left out gekoppelde tekstvlakken buiten de limieten van VectorCraft zijn weggelaten
|
||||
@msg the Line Breaking setting of legacy type was left out de instelling voor regelafbreking van tekst in de oude indeling is weggelaten
|
||||
@msg the Japanese layout rules of legacy type were left out de Japanse opmaakregels van tekst in de oude indeling zijn weggelaten
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character tekst die binnen een tekstobject van schrijfrichting verandert, wordt geopend in de richting van het eerste teken
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip tekst die als masker wordt gebruikt in gekoppelde vlakken, tekstomloop of een samengesteld pad knipt niet uit
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel gekoppelde afbeeldingen zonder voorbeeld in het bestand tonen een tijdelijke aanduiding totdat hun bestanden zijn gevonden: koppel ze opnieuw in het paneel Koppelingen
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -5241,6 +5241,8 @@ imageTrace Outline Kontur
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers osadzony obraz o wymiarach {_1} × {_2} pikseli zmniejszono do {_3} × {_4} pikseli, aby zachować warstwy
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel połączone obrazy pokazują zapisany w pliku podgląd niskiej rozdzielczości, dopóki ich pliki nie zostaną znalezione: połącz je ponownie w panelu Łącza
|
||||
@msg linked type areas past VectorCraft's limits were left out połączone obszary tekstu poza limitami VectorCraft zostały pominięte
|
||||
@msg the Line Breaking setting of legacy type was left out pominięto ustawienie łamania wierszy tekstu w starym formacie
|
||||
@msg the Japanese layout rules of legacy type were left out pominięto japońskie reguły składu tekstu w starym formacie
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character tekst zmieniający kierunek pisania wewnątrz obiektu tekstowego otwiera się w kierunku swojego pierwszego znaku
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip tekst użyty jako maska w połączonych obszarach, oblewanym tekście lub ścieżce złożonej nie przycina
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel połączone obrazy bez podglądu w pliku pokazują symbol zastępczy, dopóki ich pliki nie zostaną znalezione: połącz je ponownie w panelu Łącza
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -5361,6 +5361,8 @@ axis Both Ambos
|
||||
@msg {path}: not a file {path}: não é um arquivo
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel as imagens vinculadas mostram a visualização de baixa resolução salva no arquivo até que seus arquivos sejam encontrados: revincule-as no painel Links
|
||||
@msg linked type areas past VectorCraft's limits were left out as áreas de texto encadeadas além dos limites do VectorCraft foram omitidas
|
||||
@msg the Line Breaking setting of legacy type was left out a configuração de quebra de linha do texto no formato antigo foi omitida
|
||||
@msg the Japanese layout rules of legacy type were left out as regras de composição japonesa do texto no formato antigo foram omitidas
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character o texto que muda de direção de escrita dentro de um objeto de texto abre na direção do primeiro caractere
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip o texto usado como máscara em áreas encadeadas, texto com quebra ou um caminho composto não recorta
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel as imagens vinculadas sem visualização no arquivo mostram um espaço reservado até que seus arquivos sejam encontrados: revincule-as no painel Links
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -5143,6 +5143,8 @@ axis Both Оба
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers встроенное изображение {_1} × {_2} пикселей уменьшено до {_3} × {_4} пикселей, чтобы сохранить слои
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel связанные изображения показываются как сохранённый в файле просмотр низкого разрешения, пока их файлы не найдены: восстановите связи на панели «Связи»
|
||||
@msg linked type areas past VectorCraft's limits were left out связанные текстовые области за пределами ограничений VectorCraft пропущены
|
||||
@msg the Line Breaking setting of legacy type was left out настройка разрыва строк текста старого формата пропущена
|
||||
@msg the Japanese layout rules of legacy type were left out японские правила вёрстки текста старого формата пропущены
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character текст, меняющий направление письма внутри текстового объекта, открывается в направлении своего первого символа
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip текст, используемый как маска в связанных областях, обтекающем тексте или составном контуре, не обрезает
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel связанные изображения без просмотра в файле показываются как заполнитель, пока их файлы не найдены: восстановите связи на панели «Связи»
|
||||
|
||||
|
Can't render this file because it is too large.
|
@@ -5000,6 +5000,8 @@ axis Both Båda
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers en inbäddad bild på {_1} × {_2} pixlar förminskades till {_3} × {_4} pixlar för att behålla lagren
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel länkade bilder visar förhandsgranskningen med låg upplösning som sparats i filen tills deras filer hittas: länka om dem i panelen Länkar
|
||||
@msg linked type areas past VectorCraft's limits were left out länkade textområden utöver VectorCrafts gränser utelämnades
|
||||
@msg the Line Breaking setting of legacy type was left out inställningen för radbrytning i text i det gamla formatet utelämnades
|
||||
@msg the Japanese layout rules of legacy type were left out de japanska layoutreglerna för text i det gamla formatet utelämnades
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character text som byter skrivriktning inuti ett textobjekt öppnas i riktningen för sitt första tecken
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip text som används som mask i länkade områden, ombruten text eller en sammansatt bana beskär inte
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel länkade bilder utan förhandsgranskning i filen visar en platshållare tills deras filer hittas: länka om dem i panelen Länkar
|
||||
|
||||
|
Can't render this file because it is too large.
|
@@ -4836,6 +4836,8 @@ axis Both Her İkisi
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers katmanları korumak için {_1} × {_2} piksellik gömülü bir resim {_3} × {_4} piksele küçültüldü
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel bağlantılı resimler, dosyaları bulunana kadar dosyaya kaydedilen düşük çözünürlüklü önizlemeyi gösterir: bunları Bağlantılar panelinde yeniden bağlayın
|
||||
@msg linked type areas past VectorCraft's limits were left out VectorCraft sınırlarını aşan bağlantılı metin alanları dışarıda bırakıldı
|
||||
@msg the Line Breaking setting of legacy type was left out eski biçimdeki metnin satır kesme ayarı atlandı
|
||||
@msg the Japanese layout rules of legacy type were left out eski biçimdeki metnin Japonca dizgi kuralları atlandı
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character bir metin nesnesi içinde yazı yönünü değiştiren metin, ilk karakterinin yönünde açılır
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip bağlantılı alanlarda, kaydırılan metinde veya bileşik yolda maske olarak kullanılan metin kırpmaz
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel dosyada önizlemesi olmayan bağlantılı resimler, dosyaları bulunana kadar bir yer tutucu gösterir: bunları Bağlantılar panelinde yeniden bağlayın
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 5 and column 25.
|
@@ -5142,6 +5142,8 @@ axis Both Обидві
|
||||
@msg an embedded image of {_1} × {_2} pixels was reduced to {_3} × {_4} pixels to keep the layers вбудоване зображення {_1} × {_2} пікселів зменшено до {_3} × {_4} пікселів, щоб зберегти шари
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel пов’язані зображення показуються як збережений у файлі перегляд низької роздільності, доки їхні файли не знайдено: відновіть зв’язки на панелі «Зв’язки»
|
||||
@msg linked type areas past VectorCraft's limits were left out пов’язані текстові області понад обмеження VectorCraft пропущено
|
||||
@msg the Line Breaking setting of legacy type was left out налаштування розриву рядків тексту старого формату пропущено
|
||||
@msg the Japanese layout rules of legacy type were left out японські правила верстки тексту старого формату пропущено
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character текст, що змінює напрямок письма всередині текстового об’єкта, відкривається в напрямку свого першого символу
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip текст, використаний як маска у пов’язаних областях, тексті з обтіканням або складеному контурі, не обрізає
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel пов’язані зображення без перегляду у файлі показуються як заповнювач, доки їхні файли не знайдено: відновіть зв’язки на панелі «Зв’язки»
|
||||
|
||||
|
Can't render this file because it is too large.
|
@@ -4930,6 +4930,8 @@ theme Appearance Giao diện
|
||||
@msg line {line}: value for `{var}` is longer than {MAX_GRAPH_CSV} bytes dòng {line}: giá trị của `{var}` dài hơn {MAX_GRAPH_CSV} byte
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel ảnh liên kết hiển thị bản xem trước độ phân giải thấp đã lưu trong tệp cho đến khi tìm thấy tệp gốc: liên kết lại trong bảng Liên kết
|
||||
@msg linked type areas past VectorCraft's limits were left out các vùng chữ liên kết vượt quá giới hạn của VectorCraft đã bị bỏ qua
|
||||
@msg the Line Breaking setting of legacy type was left out thiết lập ngắt dòng của chữ định dạng cũ đã bị bỏ qua
|
||||
@msg the Japanese layout rules of legacy type were left out các quy tắc dàn trang tiếng Nhật của chữ định dạng cũ đã bị bỏ qua
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character chữ đổi hướng viết bên trong một đối tượng văn bản sẽ mở theo hướng của ký tự đầu tiên
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip chữ dùng làm mặt nạ trong các vùng liên kết, chữ bao quanh hoặc đường dẫn phức không cắt xén
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel ảnh liên kết không có bản xem trước trong tệp hiển thị ô giữ chỗ cho đến khi tìm thấy tệp gốc: liên kết lại trong bảng Liên kết
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 204 and column 5.
|
@@ -3701,6 +3701,8 @@ digits Malayalam 马拉雅拉姆数字
|
||||
@plural {n} linked image changed on disk. Show the new version?|{n} linked images changed on disk. Show the new versions? 有 {n} 个链接图像已在磁盘上更改。要显示新版本吗?
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel 链接的图片在找到其文件之前显示文件中存储的低分辨率预览:请在“链接”面板中重新链接
|
||||
@msg linked type areas past VectorCraft's limits were left out 超出 VectorCraft 限制的串接文字区域已省略
|
||||
@msg the Line Breaking setting of legacy type was left out 旧格式文字的换行设置已省略
|
||||
@msg the Japanese layout rules of legacy type were left out 旧格式文字的日文排版规则已省略
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character 在文字对象内更改书写方向的文字按其第一个字符的方向打开
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip 在串接区域、绕排文字或复合路径中用作蒙版的文字不会剪切
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel 文件中没有预览的链接图片在找到其文件之前显示占位符:请在“链接”面板中重新链接
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4946,6 +4946,8 @@ digits Malayalam 馬來亞拉姆數字
|
||||
@plural {n} linked image changed on disk. Show the new version?|{n} linked images changed on disk. Show the new versions? 有 {n} 個連結影像已在磁碟上變更。要顯示新版本嗎?
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel 連結的圖片在找到其檔案之前顯示檔案中儲存的低解析度預覽:請在「連結」面板中重新連結
|
||||
@msg linked type areas past VectorCraft's limits were left out 超出 VectorCraft 限制的串連文字區域已略過
|
||||
@msg the Line Breaking setting of legacy type was left out 已略過舊格式文字的換行設定
|
||||
@msg the Japanese layout rules of legacy type were left out 已略過舊格式文字的日文排版規則
|
||||
@msg type that changes writing direction inside a text object opens in the direction of its first character 在文字物件內變更書寫方向的文字會依其第一個字元的方向開啟
|
||||
@msg type used as a mask in linked areas, wraparound text or a compound path doesn't clip 在串連區域、繞圖文字或複合路徑中用作遮色片的文字不會剪裁
|
||||
@msg linked pictures with no preview in the file show a placeholder until their files are found: relink them in the Links panel 檔案中沒有預覽的連結圖片在找到其檔案之前顯示預留位置:請在「連結」面板中重新連結
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -196,6 +196,11 @@ private editing data. VectorCraft:
|
||||
as that art, with one note that counts them. Type stays live without a comparison when the saved art paints
|
||||
nothing or draws type of its own, in frames of threaded type, when a text variable binds it, and when its text
|
||||
object doesn't come in as one text object.
|
||||
Legacy `.ai` type keeps its manual kerning pairs (`Tk`, `TK`: the kerning after the character before the
|
||||
pair, or at a line's start the space before its first character), its discretionary hyphens (`T+`, `T-`) as
|
||||
soft hyphens and its hyphenation language (`XL`); a line breaking value (`TG`) and Japanese layout rules
|
||||
(`Xu`, `Tu`) are not kept, with a warning. Legacy `.ai` saves write manual kerning as `Tk` and soft hyphens
|
||||
as `T+`.
|
||||
Legacy `.ai` type keeps its paragraphs' letter and word spacing (`TC`, `TW`), hanging punctuation (`Tq`) and
|
||||
hyphenation (`Th`); its tab definitions (`Xb` … `XB`) set its paragraphs' tab stops. Paragraphs in a row with
|
||||
the same attributes share one copy of them while the text object is read, and those copies hold at most
|
||||
|
||||
@@ -513,7 +513,7 @@ about 1–1.5 agent-hours each, so the other rows (estimated on the older scale)
|
||||
| Layers, artboards, document setup | 5 | 82% | Layers panel: a confirmation before deleting layers that hold art, Collect for Export, row context menus, the Layer Options dialog for several rows with mixed values, Paste Remembers Layers for sublayers; artboard preset polish (artboard escape routing and document setup modal handoff done; Move Artwork for artboard X/Y edits, Rearrange All Artboards, Document Setup, New Document and the rest of the Layers panel are done) | 4–7 |
|
||||
| View & navigation | 3 | 70% | New View/Edit Views, multiple windows/arrange, Snap to Pixel/Glyph (print tiling is done) | 9–14 |
|
||||
| Guides, grids, smart guides, snapping, rulers | 3 | 85% | global/video rulers, Spacing Guides' distance readouts and spacing for resized or drawn art, Alt swapping a ruler guide's orientation, ruler guides selected together with art (marquee, Shift-click), ruler guides as Layers rows with their own lock and hide (#451: Lock Guides locks them all; Make Guides paths are Layers rows already) (dragging existing guides is done, #414; new guides snapping to side midpoints and artboards, and artboard guides, #451; the drawing tools snapping, with Construction Guides, #506; Spacing Guides for moves, #394; moves snapping to the grid, #740; ruler guides pulling drawn points with Smart Guides on, and "center" and "anchor" labels while hovering with the Selection tool, #812; distance and angle labels while drawing, #2983) | 2–4; status-bar X/Y uses the active ruler origin and General units |
|
||||
| File formats | 6 | 85% | PDF import: glyphs inside a marked-content span with an empty `ActualText` come in as outlines in their fill and stroke, adding no text (#6971; scores and estimates unchanged); Explicit editing-data oversized single-artboard import fixed (#6865); scores and estimates unchanged. Affinity export, and the rest of Affinity import (adjustments, blur and bevel effects, brushes, live symbol instances, text threading), DWG (no open spec: DXF instead), PSD placement as layers (Photoshop Import Options; the merged image is done), EPS checked against more real files users send (Inkscape files open as vectors; other generators' constructs are tested with programs written from the PostScript Language Reference only; CID-keyed CJK type and `CCITTFaxDecode` images not read), legacy `.ai` files saved without the prolog that defines their operators (their own operator set isn't read yet), the rest of Illustrator's editing data (appearances and live effects, symbols, pattern fills, brushes, placed files: #637), the remaining fidelity polish; EPS, DXF, EMF/WMF, TIFF, BMP, Targa, PSD export, SVGZ, PDF security, PDF/X, PDF layers, presets and Affinity import are done | 6–10 (existing scope; Affinity export unestimated) |
|
||||
| File formats | 6 | 85% | PDF import: glyphs inside a marked-content span with an empty `ActualText` come in as outlines in their fill and stroke, adding no text (#6971; scores and estimates unchanged); Explicit editing-data oversized single-artboard import fixed (#6865); scores and estimates unchanged. Legacy `.ai` files that name but omit their prolog open with their layers, or with their art on one layer when the format has no layers; graph data and settings in these files still come in only as drawn art. Affinity export, and the rest of Affinity import (adjustments, blur and bevel effects, brushes, live symbol instances, text threading), DWG (no open spec: DXF instead), PSD placement as layers (Photoshop Import Options; the merged image is done), EPS checked against more real files users send (Inkscape files open as vectors; other generators' constructs are tested with programs written from the PostScript Language Reference only; CID-keyed CJK type and `CCITTFaxDecode` images not read), the rest of Illustrator's editing data (appearances and live effects, symbols, pattern fills, brushes, placed files: #637), the remaining fidelity polish; EPS, DXF, EMF/WMF, TIFF, BMP, Targa, PSD export, SVGZ, PDF security, PDF/X, PDF layers, presets and Affinity import are done | 6–10 (existing scope; Affinity export unestimated) |
|
||||
| Export for Screens, Asset Export, slices, Save for Web | 3 | 85% | polish only (all four are done) | 2–4 |
|
||||
| Print, colour management, separations, flattener | 3 | 80% | print preview fidelity (flattener presets in PDF and print, overprint in PDF and composite print, Print dialog, presets, PostScript, marks, separations, Print Tiling, print overprint/flattener/bitmap options and printer profile are done, as are the Japanese papers in its Media list: JIS B4/B5/B6, はがき, 往復はがき, 封筒 長形3号/長形4号/角形2号/角形3号 and 四六判, beside the ISO B4/B5 that settings saved before them keep) | 1–2 |
|
||||
| Automation | 3 | 65% | scripting surface, batch (MCP drops malformed app replies without replay; Variables: text/visibility variables bound to objects, an object may carry several, dataset rows applied in one undo step, panel and Window › Variables with dialogs; image/graph kinds and dataset import/export open) | 6–10 |
|
||||
@@ -1585,6 +1585,7 @@ Moved from the ROADMAP's "Shipped so far" on 2026-10-10. Update it when a featur
|
||||
To find those characters, SVG export lays a type object out a second time only when the second layout can differ from the first: point type with Line-end Punctuation Half Width and no Japanese punctuation or letters, the setting new type gets, is laid out once. Exporting 5,000 such objects takes a median of 109.4 ms instead of 171.5 ms on Windows 11, with the same SVG (`crates/svg/src/export/text/tests.rs`).
|
||||
SVG export (live text), legacy `.ai` saves (text objects), DXF export (`TEXT` entities) and the CSS Properties panel write area type that Shrink Text to Fit scales down at the size it draws at, and scale its tracking, kerning, leading and baseline shifts the same way where the format holds them.
|
||||
Legacy `.ai` saves (version 7) write type with rotated characters (Character Rotation, Touch Type turns) as its outlines, with a warning that it is no longer editable text (unless `outlineText` already asks for every type object as outlines): a version 7 text object has no character rotation ([Adobe Illustrator File Format Specification 7.0](https://www.nationalarchives.gov.uk/PRONOM/fmt/423), §15), and the outlines keep each character's rotation, baseline shift and scale (`legacy_ai::tests::type_with_rotated_characters_is_outlines_that_keep_the_rotation`).
|
||||
Legacy `.ai` type keeps its manual kerning pairs (`Tk`, `TK`), its discretionary hyphens (`T+`, `T-`) as soft hyphens and its hyphenation language (`XL`) when it opens, and legacy `.ai` saves write manual kerning as `Tk` and soft hyphens as `T+` ([file format specification, version 7](https://web.archive.org/web/20050126105313/https://partners.adobe.com/public/developer/en/illustrator/sdk/AI7FileFormat.pdf), §15.4.6.1, §15.4.10.1 and §22.6). A file whose type sets a line breaking value (`TG`) or Japanese layout rules (`Xu`, `Tu`), which VectorCraft doesn't keep, opens with a warning for each (`import::ai::tests::legacy_manual_pair_kerning_is_kept`, `legacy_line_breaking_and_japanese_layout_rules_are_warned_once`, `legacy_ai::tests::manual_kerning_and_soft_hyphens_are_written_and_read_back`).
|
||||
A PDF saved with Illustrator's editing data opens through it as a PDF-compatible `.ai` does, with its layers and groups and with art reaching past its page unclipped; such a PDF holds the data in `AIPDFPrivateData` streams (part of #868). A shape a PDF or `.ai` paints with a gradient (a clip path round a shading) opens as one path filled with the gradient, not a clip group round a rectangle, so Shape Builder, Live Paint and Pathfinder work on its outline (#1304).
|
||||
In a `.ai` opened from its editing data, a text object on a layer that shows and doesn't print stays on that layer, made from the file's text document, even where the page doesn't draw it (`crates/eps/src/import/tests_native.rs`). Such a `.ai` opens without the PDF part's warnings that text was kept as outlines when no outlined glyphs come in, and a warning counts the text objects that hold the page's type next to glyphs the page has only as outlines, which don't come in (`crates/engine/src/cmd/fileio/tests_aiimport.rs`). Where the art of a `.ai` or EPS opened from its editing data differs a little from the file's page, the warning gives the share of the page that differs away from type. When that share is 0.2% or less, the warning names the type and gives the share of the page that differs where the type is; when all the type is made from the text document, the type's share has a warning of its own beside the art's (`crates/eps/src/import/tests_native.rs`).
|
||||
In a `.ai` or EPS opened from its editing data, where a layer's or group's drawn look (an effect can be attached to a group or a layer, [Vector and raster effects](https://helpx.adobe.com/illustrator/desktop/special-effects-styles/apply-filter-effects/vector-and-raster-effects.html)) draws a copy of art with type, the import puts the page's type that lies over the copy's other art into the copy's group, instead of giving it to other text objects by painting order. Type beside the copy's art, and every copy's type in a file past the import's text-object limits, still goes by painting order. Without a page, such a copy has no type, and no warning counts it as left out. How the page's type is matched with a copy is VectorCraft's own rule (`crates/eps/src/import/tests_native.rs`).
|
||||
|
||||
Reference in New Issue
Block a user