blitz-pdf 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +292 -12
- package/THIRD_PARTY_NOTICES.md +4 -2
- package/dist/browser.d.ts +1 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/document-options.d.ts +36 -0
- package/dist/document-options.d.ts.map +1 -0
- package/dist/document-options.js +236 -0
- package/dist/document-options.js.map +1 -0
- package/dist/node.d.ts +1 -1
- package/dist/node.d.ts.map +1 -1
- package/dist/options.d.ts +35 -1
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js +21 -14
- package/dist/options.js.map +1 -1
- package/dist/types.d.ts +71 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/validation.d.ts +2 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +7 -0
- package/dist/validation.js.map +1 -0
- package/docs/pagination-regressions.md +88 -0
- package/examples/zugferd.mjs +41 -0
- package/licenses/RUST_DEPENDENCIES.txt +27 -0
- package/package.json +4 -2
- package/src/browser.ts +1 -1
- package/src/document-options.ts +218 -0
- package/src/node.ts +1 -1
- package/src/options.ts +18 -13
- package/src/types.ts +76 -1
- package/src/validation.ts +6 -0
- package/vendor/README.md +27 -2
- package/vendor/krilla/.cargo-ok +1 -0
- package/vendor/krilla/.cargo_vcs_info.json +6 -0
- package/vendor/krilla/Cargo.lock +1357 -0
- package/vendor/krilla/Cargo.toml +165 -0
- package/vendor/krilla/LICENSE_APACHE +202 -0
- package/vendor/krilla/LICENSE_MIT +21 -0
- package/vendor/krilla/README.md +156 -0
- package/vendor/krilla/examples/basic.rs +117 -0
- package/vendor/krilla/examples/empty_document.rs +25 -0
- package/vendor/krilla/examples/parley.rs +174 -0
- package/vendor/krilla/examples/simple_text.rs +118 -0
- package/vendor/krilla/examples/stream_builder.rs +93 -0
- package/vendor/krilla/icc/LICENSE +116 -0
- package/vendor/krilla/icc/README.md +1 -0
- package/vendor/krilla/icc/sGrey-v2-magic.icc +0 -0
- package/vendor/krilla/icc/sGrey-v4.icc +0 -0
- package/vendor/krilla/icc/sRGB-v2-magic.icc +0 -0
- package/vendor/krilla/icc/sRGB-v4.icc +0 -0
- package/vendor/krilla/src/chunk_container.rs +503 -0
- package/vendor/krilla/src/configure/PDF_A1.md +227 -0
- package/vendor/krilla/src/configure/PDF_A2.md +269 -0
- package/vendor/krilla/src/configure/PDF_A3.md +31 -0
- package/vendor/krilla/src/configure/PDF_A4.md +211 -0
- package/vendor/krilla/src/configure/PDF_UA1.md +202 -0
- package/vendor/krilla/src/configure/README.md +23 -0
- package/vendor/krilla/src/configure/mod.rs +197 -0
- package/vendor/krilla/src/configure/validate.rs +1244 -0
- package/vendor/krilla/src/configure/version.rs +134 -0
- package/vendor/krilla/src/content.rs +1352 -0
- package/vendor/krilla/src/data.rs +49 -0
- package/vendor/krilla/src/document.rs +156 -0
- package/vendor/krilla/src/error.rs +170 -0
- package/vendor/krilla/src/geom.rs +341 -0
- package/vendor/krilla/src/graphics/blend.rs +46 -0
- package/vendor/krilla/src/graphics/color.rs +552 -0
- package/vendor/krilla/src/graphics/graphic.rs +30 -0
- package/vendor/krilla/src/graphics/graphics_state.rs +251 -0
- package/vendor/krilla/src/graphics/icc.rs +218 -0
- package/vendor/krilla/src/graphics/image.rs +835 -0
- package/vendor/krilla/src/graphics/mask.rs +128 -0
- package/vendor/krilla/src/graphics/mod.rs +14 -0
- package/vendor/krilla/src/graphics/paint.rs +434 -0
- package/vendor/krilla/src/graphics/separation.rs +86 -0
- package/vendor/krilla/src/graphics/shading_function.rs +865 -0
- package/vendor/krilla/src/graphics/shading_pattern.rs +60 -0
- package/vendor/krilla/src/graphics/tiling_pattern.rs +119 -0
- package/vendor/krilla/src/graphics/xobject.rs +150 -0
- package/vendor/krilla/src/interactive/action.rs +68 -0
- package/vendor/krilla/src/interactive/annotation.rs +283 -0
- package/vendor/krilla/src/interactive/destination.rs +289 -0
- package/vendor/krilla/src/interactive/mod.rs +3 -0
- package/vendor/krilla/src/interchange/embed.rs +240 -0
- package/vendor/krilla/src/interchange/metadata.rs +564 -0
- package/vendor/krilla/src/interchange/mod.rs +4 -0
- package/vendor/krilla/src/interchange/outline.rs +263 -0
- package/vendor/krilla/src/interchange/tagging/fmt.rs +733 -0
- package/vendor/krilla/src/interchange/tagging/generate.toml +474 -0
- package/vendor/krilla/src/interchange/tagging/generated.rs +4754 -0
- package/vendor/krilla/src/interchange/tagging/mod.rs +1324 -0
- package/vendor/krilla/src/interchange/tagging/tag.rs +686 -0
- package/vendor/krilla/src/lib.rs +179 -0
- package/vendor/krilla/src/num.rs +26 -0
- package/vendor/krilla/src/page.rs +612 -0
- package/vendor/krilla/src/pdf.rs +313 -0
- package/vendor/krilla/src/resource.rs +436 -0
- package/vendor/krilla/src/serialize.rs +1101 -0
- package/vendor/krilla/src/stream.rs +368 -0
- package/vendor/krilla/src/surface.rs +664 -0
- package/vendor/krilla/src/text/cid.rs +488 -0
- package/vendor/krilla/src/text/font.rs +351 -0
- package/vendor/krilla/src/text/glyph/bitmap.rs +81 -0
- package/vendor/krilla/src/text/glyph/colr.rs +581 -0
- package/vendor/krilla/src/text/glyph/mod.rs +205 -0
- package/vendor/krilla/src/text/glyph/outline.rs +72 -0
- package/vendor/krilla/src/text/glyph/svg.rs +34 -0
- package/vendor/krilla/src/text/group.rs +463 -0
- package/vendor/krilla/src/text/mod.rs +232 -0
- package/vendor/krilla/src/text/shape.rs +102 -0
- package/vendor/krilla/src/text/type3.rs +514 -0
- package/vendor/krilla/src/util.rs +286 -0
- package/vendor/stylo/properties/longhands.toml +0 -1
- package/vendor/stylo/stylesheets/rule_parser.rs +1 -1
- package/wasm/blitz_pdf.js +10 -5
- package/wasm/blitz_pdf_bg.wasm +0 -0
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
use std::collections::HashMap;
|
|
2
|
+
use std::fmt::Debug;
|
|
3
|
+
use std::hash::Hash;
|
|
4
|
+
use std::marker::PhantomData;
|
|
5
|
+
|
|
6
|
+
use pdf_writer::types::ProcSet;
|
|
7
|
+
use pdf_writer::writers;
|
|
8
|
+
use pdf_writer::{Chunk, Dict, Finish, Name, Ref};
|
|
9
|
+
|
|
10
|
+
use crate::serialize::{Cacheable, SerializeContext};
|
|
11
|
+
use crate::util::NameExt;
|
|
12
|
+
|
|
13
|
+
pub(crate) trait Resource {
|
|
14
|
+
fn new(ref_: Ref) -> Self;
|
|
15
|
+
fn get_ref(&self) -> Ref;
|
|
16
|
+
fn get_dict<'a>(resources: &'a mut writers::Resources) -> Dict<'a>;
|
|
17
|
+
fn get_prefix() -> &'static str;
|
|
18
|
+
fn get_mapper(b: &mut ResourceDictionaryBuilder) -> &mut ResourceMapper<Self>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
pub(crate) trait Resourceable: Cacheable {
|
|
22
|
+
type Resource: Resource;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
#[derive(Debug, Eq, PartialEq, Hash, Clone)]
|
|
26
|
+
pub(crate) struct ExtGState(Ref);
|
|
27
|
+
|
|
28
|
+
impl Resource for ExtGState {
|
|
29
|
+
fn new(ref_: Ref) -> Self {
|
|
30
|
+
Self(ref_)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
fn get_ref(&self) -> Ref {
|
|
34
|
+
self.0
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
fn get_dict<'a>(resources: &'a mut writers::Resources) -> Dict<'a> {
|
|
38
|
+
resources.ext_g_states()
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
fn get_prefix() -> &'static str {
|
|
42
|
+
"g"
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
fn get_mapper(b: &mut ResourceDictionaryBuilder) -> &mut ResourceMapper<ExtGState> {
|
|
46
|
+
&mut b.ext_g_states
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
#[derive(Debug, Eq, PartialEq, Hash, Clone)]
|
|
51
|
+
pub(crate) struct ColorSpace(Ref);
|
|
52
|
+
|
|
53
|
+
impl Resource for ColorSpace {
|
|
54
|
+
fn new(ref_: Ref) -> Self {
|
|
55
|
+
Self(ref_)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
fn get_ref(&self) -> Ref {
|
|
59
|
+
self.0
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
fn get_dict<'a>(resources: &'a mut writers::Resources) -> Dict<'a> {
|
|
63
|
+
resources.color_spaces()
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
fn get_prefix() -> &'static str {
|
|
67
|
+
"c"
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
fn get_mapper(b: &mut ResourceDictionaryBuilder) -> &mut ResourceMapper<ColorSpace> {
|
|
71
|
+
&mut b.color_spaces
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
#[derive(Debug, Eq, PartialEq, Hash, Clone)]
|
|
76
|
+
pub(crate) struct Shading(Ref);
|
|
77
|
+
|
|
78
|
+
impl Resource for Shading {
|
|
79
|
+
fn new(ref_: Ref) -> Self {
|
|
80
|
+
Self(ref_)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
fn get_ref(&self) -> Ref {
|
|
84
|
+
self.0
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
fn get_dict<'a>(resources: &'a mut writers::Resources) -> Dict<'a> {
|
|
88
|
+
resources.shadings()
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
fn get_prefix() -> &'static str {
|
|
92
|
+
"s"
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
fn get_mapper(b: &mut ResourceDictionaryBuilder) -> &mut ResourceMapper<Shading> {
|
|
96
|
+
&mut b.shadings
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
#[derive(Debug, Eq, PartialEq, Hash, Clone)]
|
|
101
|
+
pub(crate) struct XObject(Ref);
|
|
102
|
+
|
|
103
|
+
impl Resource for XObject {
|
|
104
|
+
fn new(ref_: Ref) -> Self {
|
|
105
|
+
Self(ref_)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
fn get_ref(&self) -> Ref {
|
|
109
|
+
self.0
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
fn get_dict<'a>(resources: &'a mut writers::Resources) -> Dict<'a> {
|
|
113
|
+
resources.x_objects()
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
fn get_prefix() -> &'static str {
|
|
117
|
+
"x"
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
fn get_mapper(b: &mut ResourceDictionaryBuilder) -> &mut ResourceMapper<XObject> {
|
|
121
|
+
&mut b.x_objects
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
#[derive(Debug, Eq, PartialEq, Hash, Clone)]
|
|
126
|
+
pub(crate) struct Pattern(Ref);
|
|
127
|
+
|
|
128
|
+
impl Resource for Pattern {
|
|
129
|
+
fn new(ref_: Ref) -> Self {
|
|
130
|
+
Self(ref_)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
fn get_ref(&self) -> Ref {
|
|
134
|
+
self.0
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
fn get_dict<'a>(resources: &'a mut writers::Resources) -> Dict<'a> {
|
|
138
|
+
resources.patterns()
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
fn get_prefix() -> &'static str {
|
|
142
|
+
"p"
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
fn get_mapper(b: &mut ResourceDictionaryBuilder) -> &mut ResourceMapper<Pattern> {
|
|
146
|
+
&mut b.patterns
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
#[derive(Debug, Eq, PartialEq, Hash, Clone)]
|
|
151
|
+
pub(crate) struct Font(Ref);
|
|
152
|
+
|
|
153
|
+
impl Resource for Font {
|
|
154
|
+
fn new(ref_: Ref) -> Self {
|
|
155
|
+
Self(ref_)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
fn get_ref(&self) -> Ref {
|
|
159
|
+
self.0
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
fn get_dict<'a>(resources: &'a mut writers::Resources) -> Dict<'a> {
|
|
163
|
+
resources.fonts()
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
fn get_prefix() -> &'static str {
|
|
167
|
+
"f"
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
fn get_mapper(b: &mut ResourceDictionaryBuilder) -> &mut ResourceMapper<Font> {
|
|
171
|
+
&mut b.fonts
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
#[derive(Debug)]
|
|
176
|
+
pub(crate) struct ResourceDictionaryBuilder {
|
|
177
|
+
pub(crate) color_spaces: ResourceMapper<ColorSpace>,
|
|
178
|
+
pub(crate) ext_g_states: ResourceMapper<ExtGState>,
|
|
179
|
+
pub(crate) patterns: ResourceMapper<Pattern>,
|
|
180
|
+
pub(crate) x_objects: ResourceMapper<XObject>,
|
|
181
|
+
pub(crate) shadings: ResourceMapper<Shading>,
|
|
182
|
+
pub(crate) fonts: ResourceMapper<Font>,
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
impl ResourceDictionaryBuilder {
|
|
186
|
+
pub(crate) fn new() -> Self {
|
|
187
|
+
Self {
|
|
188
|
+
color_spaces: ResourceMapper::new(),
|
|
189
|
+
ext_g_states: ResourceMapper::new(),
|
|
190
|
+
patterns: ResourceMapper::new(),
|
|
191
|
+
x_objects: ResourceMapper::new(),
|
|
192
|
+
shadings: ResourceMapper::new(),
|
|
193
|
+
fonts: ResourceMapper::new(),
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
pub(crate) fn register_resource<T>(&mut self, obj: T) -> String
|
|
198
|
+
where
|
|
199
|
+
T: Resource,
|
|
200
|
+
{
|
|
201
|
+
T::get_mapper(self).remap_with_name(obj.get_ref())
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
pub(crate) fn finish(self) -> ResourceDictionary {
|
|
205
|
+
ResourceDictionary {
|
|
206
|
+
color_spaces: self.color_spaces.into_resource_list(),
|
|
207
|
+
ext_g_states: self.ext_g_states.into_resource_list(),
|
|
208
|
+
patterns: self.patterns.into_resource_list(),
|
|
209
|
+
x_objects: self.x_objects.into_resource_list(),
|
|
210
|
+
shadings: self.shadings.into_resource_list(),
|
|
211
|
+
fonts: self.fonts.into_resource_list(),
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
#[derive(Debug, Eq, PartialEq, Hash, Clone)]
|
|
217
|
+
pub(crate) struct ResourceDictionary {
|
|
218
|
+
pub(crate) color_spaces: ResourceList<ColorSpace>,
|
|
219
|
+
pub(crate) ext_g_states: ResourceList<ExtGState>,
|
|
220
|
+
pub(crate) patterns: ResourceList<Pattern>,
|
|
221
|
+
pub(crate) x_objects: ResourceList<XObject>,
|
|
222
|
+
pub(crate) shadings: ResourceList<Shading>,
|
|
223
|
+
pub(crate) fonts: ResourceList<Font>,
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
impl Default for ResourceDictionary {
|
|
227
|
+
fn default() -> Self {
|
|
228
|
+
Self {
|
|
229
|
+
color_spaces: ResourceList::empty(),
|
|
230
|
+
ext_g_states: ResourceList::empty(),
|
|
231
|
+
patterns: ResourceList::empty(),
|
|
232
|
+
x_objects: ResourceList::empty(),
|
|
233
|
+
shadings: ResourceList::empty(),
|
|
234
|
+
fonts: ResourceList::empty(),
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
pub(crate) type ResourceNumber = u32;
|
|
240
|
+
|
|
241
|
+
impl ResourceDictionary {
|
|
242
|
+
pub fn to_pdf_resources<T>(
|
|
243
|
+
&self,
|
|
244
|
+
parent: &mut T,
|
|
245
|
+
sc: &mut SerializeContext,
|
|
246
|
+
resources_chunk: &mut Chunk,
|
|
247
|
+
) where
|
|
248
|
+
T: ResourcesExt,
|
|
249
|
+
{
|
|
250
|
+
let write_proc_sets = !sc.serialize_settings().pdf_version().deprecates_proc_sets();
|
|
251
|
+
let has_resource_entries = self.color_spaces.len() > 0
|
|
252
|
+
|| self.ext_g_states.len() > 0
|
|
253
|
+
|| self.patterns.len() > 0
|
|
254
|
+
|| self.x_objects.len() > 0
|
|
255
|
+
|| self.shadings.len() > 0
|
|
256
|
+
|| self.fonts.len() > 0;
|
|
257
|
+
|
|
258
|
+
if !write_proc_sets && !has_resource_entries {
|
|
259
|
+
// `Resources` dictionary is mandatory (or rather, it's mandatory if
|
|
260
|
+
// there isn't a parent resource dictionary to inherit from, but we just
|
|
261
|
+
// assume it is always mandatory), so just write an empty one as a direct
|
|
262
|
+
// object instead of an indirect object, for aesthetic reasons.
|
|
263
|
+
parent.resources().finish();
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
let resources_ref = sc.new_ref();
|
|
268
|
+
let mut resources = resources_chunk
|
|
269
|
+
.indirect(resources_ref)
|
|
270
|
+
.start::<writers::Resources>();
|
|
271
|
+
if write_proc_sets {
|
|
272
|
+
resources.proc_sets([
|
|
273
|
+
ProcSet::Pdf,
|
|
274
|
+
ProcSet::Text,
|
|
275
|
+
ProcSet::ImageColor,
|
|
276
|
+
ProcSet::ImageGrayscale,
|
|
277
|
+
]);
|
|
278
|
+
}
|
|
279
|
+
write_resource_type::<ColorSpace>(&mut resources, &self.color_spaces);
|
|
280
|
+
write_resource_type::<ExtGState>(&mut resources, &self.ext_g_states);
|
|
281
|
+
write_resource_type::<Pattern>(&mut resources, &self.patterns);
|
|
282
|
+
write_resource_type::<XObject>(&mut resources, &self.x_objects);
|
|
283
|
+
write_resource_type::<Shading>(&mut resources, &self.shadings);
|
|
284
|
+
write_resource_type::<Font>(&mut resources, &self.fonts);
|
|
285
|
+
parent.set_resources(resources_ref);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
fn write_resource_type<T>(resources: &mut writers::Resources, resource_list: &ResourceList<T>)
|
|
290
|
+
where
|
|
291
|
+
T: Resource,
|
|
292
|
+
{
|
|
293
|
+
if resource_list.len() > 0 {
|
|
294
|
+
let mut dict = T::get_dict(resources);
|
|
295
|
+
|
|
296
|
+
for (name, entry) in resource_list.get_entries() {
|
|
297
|
+
dict.pair(name.to_pdf_name(), entry);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
dict.finish();
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
#[derive(Debug, Eq, PartialEq, Hash, Clone, Default)]
|
|
305
|
+
pub(crate) struct ResourceList<V> {
|
|
306
|
+
entries: Vec<Ref>,
|
|
307
|
+
phantom: PhantomData<V>,
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
impl<T> ResourceList<T>
|
|
311
|
+
where
|
|
312
|
+
T: Resource,
|
|
313
|
+
{
|
|
314
|
+
pub(crate) fn empty() -> ResourceList<T> {
|
|
315
|
+
Self {
|
|
316
|
+
entries: vec![],
|
|
317
|
+
phantom: Default::default(),
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
pub(crate) fn len(&self) -> u32 {
|
|
322
|
+
self.entries.len() as u32
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
fn name_from_number(num: ResourceNumber) -> String {
|
|
326
|
+
format!("{}{}", T::get_prefix(), num)
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
pub(crate) fn get_entries(&self) -> impl Iterator<Item = (String, Ref)> + '_ {
|
|
330
|
+
self.entries
|
|
331
|
+
.iter()
|
|
332
|
+
.enumerate()
|
|
333
|
+
.map(|(i, r)| (Self::name_from_number(i as ResourceNumber), *r))
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
#[derive(Debug, Eq, PartialEq)]
|
|
338
|
+
pub(crate) struct ResourceMapper<T: ?Sized> {
|
|
339
|
+
forward: Vec<Ref>,
|
|
340
|
+
backward: HashMap<Ref, ResourceNumber>,
|
|
341
|
+
phantom: PhantomData<T>,
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
impl<T> ResourceMapper<T>
|
|
345
|
+
where
|
|
346
|
+
T: Resource,
|
|
347
|
+
{
|
|
348
|
+
pub(crate) fn new() -> Self {
|
|
349
|
+
Self {
|
|
350
|
+
forward: Vec::new(),
|
|
351
|
+
backward: HashMap::new(),
|
|
352
|
+
phantom: PhantomData,
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
pub(crate) fn remap(&mut self, ref_: Ref) -> ResourceNumber {
|
|
357
|
+
let forward = &mut self.forward;
|
|
358
|
+
let backward = &mut self.backward;
|
|
359
|
+
|
|
360
|
+
*backward.entry(ref_).or_insert_with(|| {
|
|
361
|
+
let old = forward.len();
|
|
362
|
+
forward.push(ref_);
|
|
363
|
+
old as ResourceNumber
|
|
364
|
+
})
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
pub(crate) fn remap_with_name(&mut self, ref_: Ref) -> String {
|
|
368
|
+
Self::name_from_number(self.remap(ref_))
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
fn name_from_number(num: ResourceNumber) -> String {
|
|
372
|
+
format!("{}{}", T::get_prefix(), num)
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
pub(crate) fn into_resource_list(self) -> ResourceList<T> {
|
|
376
|
+
ResourceList {
|
|
377
|
+
entries: self.forward,
|
|
378
|
+
phantom: Default::default(),
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
pub(crate) trait ResourcesExt {
|
|
384
|
+
fn resources(&mut self) -> writers::Resources<'_>;
|
|
385
|
+
fn set_resources(&mut self, resources_ref: Ref);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
impl ResourcesExt for writers::FormXObject<'_> {
|
|
389
|
+
fn resources(&mut self) -> writers::Resources<'_> {
|
|
390
|
+
self.resources()
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
fn set_resources(&mut self, resources_ref: Ref) {
|
|
394
|
+
self.pair(Name(b"Resources"), resources_ref);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
impl ResourcesExt for writers::TilingPattern<'_> {
|
|
399
|
+
fn resources(&mut self) -> writers::Resources<'_> {
|
|
400
|
+
self.resources()
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
fn set_resources(&mut self, resources_ref: Ref) {
|
|
404
|
+
self.pair(Name(b"Resources"), resources_ref);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
impl ResourcesExt for writers::Type3Font<'_> {
|
|
409
|
+
fn resources(&mut self) -> writers::Resources<'_> {
|
|
410
|
+
self.resources()
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
fn set_resources(&mut self, resources_ref: Ref) {
|
|
414
|
+
self.pair(Name(b"Resources"), resources_ref);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
impl ResourcesExt for writers::Pages<'_> {
|
|
419
|
+
fn resources(&mut self) -> writers::Resources<'_> {
|
|
420
|
+
self.resources()
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
fn set_resources(&mut self, resources_ref: Ref) {
|
|
424
|
+
self.pair(Name(b"Resources"), resources_ref);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
impl ResourcesExt for writers::Page<'_> {
|
|
429
|
+
fn resources(&mut self) -> writers::Resources<'_> {
|
|
430
|
+
self.resources()
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
fn set_resources(&mut self, resources_ref: Ref) {
|
|
434
|
+
self.pair(Name(b"Resources"), resources_ref);
|
|
435
|
+
}
|
|
436
|
+
}
|