Showing
2 changed files
with
24 additions
and
6 deletions
@@ -18,14 +18,25 @@ part of pdf; | @@ -18,14 +18,25 @@ part of pdf; | ||
18 | 18 | ||
19 | enum PdfLineCap { joinMiter, joinRound, joinBevel } | 19 | enum PdfLineCap { joinMiter, joinRound, joinBevel } |
20 | 20 | ||
21 | +@immutable | ||
22 | +class _PdfGraphicsContext { | ||
23 | + const _PdfGraphicsContext({@required this.ctm}) : assert(ctm != null); | ||
24 | + final Matrix4 ctm; | ||
25 | + | ||
26 | + _PdfGraphicsContext copy() => _PdfGraphicsContext(ctm: ctm.clone()); | ||
27 | +} | ||
28 | + | ||
21 | class PdfGraphics { | 29 | class PdfGraphics { |
22 | - PdfGraphics(this.page, this.buf); | 30 | + PdfGraphics(this.page, this.buf) { |
31 | + _context = _PdfGraphicsContext(ctm: Matrix4.identity()); | ||
32 | + } | ||
23 | 33 | ||
24 | /// Ellipse 4-spline magic number | 34 | /// Ellipse 4-spline magic number |
25 | static const double _m4 = 0.551784; | 35 | static const double _m4 = 0.551784; |
26 | 36 | ||
27 | - /// Graphic context number | ||
28 | - int _context = 0; | 37 | + /// Graphic context |
38 | + _PdfGraphicsContext _context; | ||
39 | + final Queue<_PdfGraphicsContext> _contextQueue = Queue<_PdfGraphicsContext>(); | ||
29 | 40 | ||
30 | final PdfPage page; | 41 | final PdfPage page; |
31 | 42 | ||
@@ -61,17 +72,17 @@ class PdfGraphics { | @@ -61,17 +72,17 @@ class PdfGraphics { | ||
61 | /// When using [PdfPage], you can create another fresh Graphics instance, | 72 | /// When using [PdfPage], you can create another fresh Graphics instance, |
62 | /// which will draw over this one. | 73 | /// which will draw over this one. |
63 | void restoreContext() { | 74 | void restoreContext() { |
64 | - if (_context > 0) { | 75 | + if (_contextQueue.isNotEmpty) { |
65 | // restore graphics context | 76 | // restore graphics context |
66 | buf.putString('Q\n'); | 77 | buf.putString('Q\n'); |
67 | - _context--; | 78 | + _context = _contextQueue.removeLast(); |
68 | } | 79 | } |
69 | } | 80 | } |
70 | 81 | ||
71 | void saveContext() { | 82 | void saveContext() { |
72 | // save graphics context | 83 | // save graphics context |
73 | buf.putString('q\n'); | 84 | buf.putString('q\n'); |
74 | - _context++; | 85 | + _contextQueue.addLast(_context.copy()); |
75 | } | 86 | } |
76 | 87 | ||
77 | /// Draws an image onto the page. | 88 | /// Draws an image onto the page. |
@@ -227,6 +238,12 @@ class PdfGraphics { | @@ -227,6 +238,12 @@ class PdfGraphics { | ||
227 | final Float64List s = t.storage; | 238 | final Float64List s = t.storage; |
228 | buf.putNumList(<double>[s[0], s[1], s[4], s[5], s[12], s[13]]); | 239 | buf.putNumList(<double>[s[0], s[1], s[4], s[5], s[12], s[13]]); |
229 | buf.putString(' cm\n'); | 240 | buf.putString(' cm\n'); |
241 | + _context.ctm.multiply(t); | ||
242 | + } | ||
243 | + | ||
244 | + /// Get the transformation Matrix | ||
245 | + Matrix4 getTransform() { | ||
246 | + return _context.ctm.clone(); | ||
230 | } | 247 | } |
231 | 248 | ||
232 | /// This adds a line segment to the current path | 249 | /// This adds a line segment to the current path |
-
Please register or login to post a comment