David PHAM-VAN

Add DecorationImage to BoxDecoration

1 # 1.3.9 1 # 1.3.9
2 * Fix Transform Widget alignment 2 * Fix Transform Widget alignment
3 * Fix CustomPaint Widget size 3 * Fix CustomPaint Widget size
  4 +* Add DecorationImage to BoxDecoration
4 5
5 # 1.3.8 6 # 1.3.8
6 * Add jpeg image loading function 7 * Add jpeg image loading function
@@ -86,6 +86,44 @@ class BoxBorder { @@ -86,6 +86,44 @@ class BoxBorder {
86 } 86 }
87 } 87 }
88 88
  89 +@immutable
  90 +class DecorationImage {
  91 + const DecorationImage(
  92 + {@required this.image,
  93 + this.fit = BoxFit.cover,
  94 + this.alignment = Alignment.center})
  95 + : assert(image != null),
  96 + assert(fit != null),
  97 + assert(alignment != null);
  98 +
  99 + final PdfImage image;
  100 + final BoxFit fit;
  101 + final Alignment alignment;
  102 +
  103 + void paintImage(Context context, PdfRect box) {
  104 + final PdfPoint imageSize =
  105 + PdfPoint(image.width.toDouble(), image.height.toDouble());
  106 + final FittedSizes sizes = applyBoxFit(fit, imageSize, box.size);
  107 + final double scaleX = sizes.destination.x / sizes.source.x;
  108 + final double scaleY = sizes.destination.y / sizes.source.y;
  109 + final PdfRect sourceRect = alignment.inscribe(
  110 + sizes.source, PdfRect.fromPoints(PdfPoint.zero, imageSize));
  111 + final PdfRect destinationRect = alignment.inscribe(sizes.destination, box);
  112 + final Matrix4 mat =
  113 + Matrix4.translationValues(destinationRect.x, destinationRect.y, 0)
  114 + ..scale(scaleX, scaleY, 1)
  115 + ..translate(-sourceRect.x, -sourceRect.y);
  116 +
  117 + context.canvas
  118 + ..saveContext()
  119 + ..drawRect(box.x, box.y, box.width, box.height)
  120 + ..clipPath()
  121 + ..setTransform(mat)
  122 + ..drawImage(image, 0, 0, imageSize.x, imageSize.y)
  123 + ..restoreContext();
  124 + }
  125 +}
  126 +
89 enum BoxShape { circle, rectangle } 127 enum BoxShape { circle, rectangle }
90 128
91 @immutable 129 @immutable
@@ -94,6 +132,7 @@ class BoxDecoration { @@ -94,6 +132,7 @@ class BoxDecoration {
94 {this.color, 132 {this.color,
95 this.border, 133 this.border,
96 this.borderRadius, 134 this.borderRadius,
  135 + this.image,
97 this.shape = BoxShape.rectangle}); 136 this.shape = BoxShape.rectangle});
98 137
99 /// The color to fill in the background of the box. 138 /// The color to fill in the background of the box.
@@ -101,6 +140,7 @@ class BoxDecoration { @@ -101,6 +140,7 @@ class BoxDecoration {
101 final BoxBorder border; 140 final BoxBorder border;
102 final double borderRadius; 141 final double borderRadius;
103 final BoxShape shape; 142 final BoxShape shape;
  143 + final DecorationImage image;
104 144
105 void paintBackground(Context context, PdfRect box) { 145 void paintBackground(Context context, PdfRect box) {
106 assert(box.x != null); 146 assert(box.x != null);
@@ -150,11 +190,13 @@ class DecoratedBox extends SingleChildWidget { @@ -150,11 +190,13 @@ class DecoratedBox extends SingleChildWidget {
150 super.paint(context); 190 super.paint(context);
151 if (position == DecorationPosition.background) { 191 if (position == DecorationPosition.background) {
152 decoration.paintBackground(context, box); 192 decoration.paintBackground(context, box);
  193 + decoration.image?.paintImage(context, box);
153 decoration.border?.paintBorders(context, box); 194 decoration.border?.paintBorders(context, box);
154 } 195 }
155 paintChild(context); 196 paintChild(context);
156 if (position == DecorationPosition.foreground) { 197 if (position == DecorationPosition.foreground) {
157 decoration.paintBackground(context, box); 198 decoration.paintBackground(context, box);
  199 + decoration.image?.paintImage(context, box);
158 decoration.border?.paintBorders(context, box); 200 decoration.border?.paintBorders(context, box);
159 } 201 }
160 } 202 }