From 20b8d2c121c713cb32f6048df6435735a0c0262f Mon Sep 17 00:00:00 2001 From: Laurenz Stampfl <47084093+LaurenzV@users.noreply.github.com> Date: Tue, 11 Jun 2024 13:12:03 +0200 Subject: [PATCH] Don't change DPI in resvg (#4354) --- crates/typst/src/visualize/image/mod.rs | 5 ++++- crates/typst/src/visualize/image/svg.rs | 8 ++++---- tests/ref/figure-table.png | Bin 2973 -> 2851 bytes tests/ref/image-svg-text-font.png | Bin 1363 -> 1225 bytes 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/crates/typst/src/visualize/image/mod.rs b/crates/typst/src/visualize/image/mod.rs index e5916f1d4..fbbedfb3e 100644 --- a/crates/typst/src/visualize/image/mod.rs +++ b/crates/typst/src/visualize/image/mod.rs @@ -329,6 +329,9 @@ impl Image { /// if the image doesn't contain DPI metadata. pub const DEFAULT_DPI: f64 = 72.0; + /// Should always be the same as the default DPI used by usvg. + pub const USVG_DEFAULT_DPI: f64 = 96.0; + /// Create an image from a buffer and a format. #[comemo::memoize] #[typst_macros::time(name = "load image")] @@ -407,7 +410,7 @@ impl Image { pub fn dpi(&self) -> Option { match &self.0.kind { ImageKind::Raster(raster) => raster.dpi(), - ImageKind::Svg(_) => None, + ImageKind::Svg(_) => Some(Image::USVG_DEFAULT_DPI), } } diff --git a/crates/typst/src/visualize/image/svg.rs b/crates/typst/src/visualize/image/svg.rs index 399d8d5ad..09319ccde 100644 --- a/crates/typst/src/visualize/image/svg.rs +++ b/crates/typst/src/visualize/image/svg.rs @@ -12,7 +12,6 @@ use crate::layout::Axes; use crate::text::{ Font, FontBook, FontFlags, FontStretch, FontStyle, FontVariant, FontWeight, }; -use crate::visualize::Image; use crate::World; /// A decoded SVG. @@ -102,9 +101,10 @@ fn base_options() -> usvg::Options<'static> { // Disable usvg's default to "Times New Roman". font_family: String::new(), - // We override the DPI here so that we get the correct the size when - // scaling the image to its natural size. - dpi: Image::DEFAULT_DPI as f32, + // We don't override the DPI here, because we already + // force the image into the corresponding DPI by setting + // the width and height. Changing the DPI only trips up + // the logic in `resvg`. // Override usvg's resource loading defaults. resources_dir: None, diff --git a/tests/ref/figure-table.png b/tests/ref/figure-table.png index 9a09f659008cb8ade26c8090bd977cca5345a2f6..5e013f42293ff73148382da0ab16cf607ef2975b 100644 GIT binary patch literal 2851 zcmV+;3*7XHP)q)6o!5D(dd&t7+dVI#ugjK-i;;plGrPvA{MMv8v+*_N|7Q8Dj+I$#NI(cL=>^% zwV|R{tl<6bS!S{?9#K(F&e53=GJE!%nZ5s6vu4)6*6dQBbh1b)r6JHjYoK+~Kx?2i z&^l?LHPAZ!QlP!Py+@52wb;hfC{waPFThnyp!u<#o!ufEPj;qcfnG+A99c}D87P{t z#d&J^w~$^m&>CnBv{eC}nVEU;;6V+vnG_HZuyyO!1q&9$#>W2qYh1Z+{Mf2hD-E=n)TBuhUtiz6yga##kB^Uth*-94SwTU;%a<=b zJw5&W{PykJ$E}SUHwFa-aqGi}4@Zt189R3D_U+rpjT?91zya>wym`~z-JO|XF`!?+ ze*L#8k+A`wpFe*-Z{ED>)vJS7R#sN;-n|nN5;}M8eERh1DO0ALIdg_Fh>D8ZzkmP2 zg$t=47#Qf`;X$TSrAp79JxfndA2etXm)*K`V{DirB@HxB;_BvU@8CFTvcq%-C;rGd z%y4pX@!%D#6zKQw-%IA|)vL{$H%CH8j~<p%L-wFE}iY!nw{K-adZT2sC;* zGBQ$j3lk?!1n%0kYv-8~(u#6ewQ3c25nIH3*sx*bckkYfG9go|RxSSDzJ0q(mo6gU z_wV1ocI_JFZ{NNx380gbl4dzN2ZqFgtl2+qO|^GqLAE-e(HryU&tJE0-R8}k1)b>V zXh%m!_95h7ym;Z{Er6*w``TamroFXWVm#3^Kx}xxo&*`lS~^dKMOPpTJ#lS z%PJBb6UQH!q@?7uw2aKG?7*Nf4fHPp+WfXMKPM+w1FeD9Kx?4?2%s}EGH%_v_04LJ z9z9~qrGYMfVo$wd#R@VmE-vhjzgBI}o;}!*8tCFDcE_t%uO^d|lT$=BjGFGBSNHhwW2g-5LoP9|jS>xEg#FC`RIFGL zjeO$73A763J$v?~@ZrOU0(94|U9liw@7&znAW6!VD+lyXo;=Y&e~OEXn>=~4Q3*6_ z*6hZO8;OaDMxb#RU%!4`QAp$|0dbfkr8-`{dR4V*Rm^UL9V{rPDXls_C*&0V2-Xck zgZWO$`0?Y14<9afLqkJhqD7(+RfM-eg9cotq@+OIA+r@KRDcDBglgHcCFNYAOhl)1 zw|@QlB?0u^yLVA*MFSlY8bLMd($Q#DXnQb~OB6ALk+@yv&YcTGgpiIIGX}Q+Uap}- zhXN}VDB(?Z?b)>od9_$ zDQV#mQ3(l&*6y6$vSkbGsP%in(Qk(i9fCSXL?TUz3@bUTKO~~Hd%@?-nZx7SR=5Ek zwSP>BjE?Kj&RGq#23iBHf!084pnof%B@lhFjVC)(vOq7uRs5qBP!Nl3Jn{a#g#~(n z#?gm`^rz0$gM>!(kj7P~vx zYRK#Ftl6tqFBKP>o0~gezyMf(TLl_d;e`tqaE_EMTNW1|9#taGjTH!yHePn<&_PDR zY{DB0U6_Z=DW=&NHeNMQvjx+#OjQEZMWRJo3Fucq+uPeyAtWS(%-4YCJWHWlcpX6*?AoC-XWW%OP6L%7k-NHC0-az36KC^mN?c-G&1N^sZxc28{#(_H*SoQLA@4o z@0KZ3=G?h+vUXj(cu|E+(vFlf_gUqTZWU~X(qK4owj%E{XU;@giGxT>OCxxSqjq6o zVQh++Mg;kBXam)ZHlrrJ+n(wmAO`KpzD;edq>%pv$8gE|BU**UN&rH{z6_t>F6{tH zp>h!67E?ivZP7B95-*^7Re+gpG>|PL(&+Peq0{wsJ7&?~T?+i5Zs2Cac&U`vT^0Jj? zw@bXYFq8G_)nmt6U`mQ+!s3uTv9oND+4<6%01b~SyJ^~?Py)i0&B6%D5p&hGbOd81 z6)?eRoF1hDJ7uE*Nni8`*9gBTkEfoTu3=xXMXd;EqDJ}32?6I=x133V#NiS<4JZkG z78(INE!~v(P5~b^;N>~Gf?X$GdMF{zWKan2ftiklR;NxKY#Hohi9e?riFWwp3Pd3A z2@eOwVFV5$$;-=&F{@m;GOQjP2s{x+Amua#Y6NJjlN^}oROZOPv$HdX5|>16!+T(V zf->De}6KN z*YXJpIA{P>^$AtRbS48R60^*A5aiek)}YZ|2Q1-FkZvAHC=P6KFqMutUMGV`gA6%y z4w(>ci_hUOJeceVKK%kZBWf)`^D&Kv4I8RUK4pTLO9mj25r7teI9tfcD#iLET!;*7 z7t9=jZv>j3kYOI6G>kw)@XLTPT^LcKHJCjd5}?p5(C7iipiP@LT<+MhgL#HVf)b%? zK7}O;oz~zzM9)yDcxr5P#tH5eKF^9&2fRCk5if~;#IM2JN9)1HAr~B{VA?`r3>-KR zs!T=#4S>=>7?Ef+2}g+_lAzQ0IfBd=lo%>rn`+F7^5x4jX=oE}MtMo6_DC5UmfjC4(@VO5dD~1z#7R^R?2rs{?R;?Op0ewXm(2C@R+J*|J4x~9M zn}OlMXb`Q62jx)g zMo`TtbcC7}LYv^)1lLIet%24+>!g9!K0fo1Sos7X)c61Z002ovPDHLkV1nc` BL@WRR literal 2973 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