From 18c07b08d05ca2f2666b33eb845add077a12a23c Mon Sep 17 00:00:00 2001 From: Muhammad Saddam Nur Date: Thu, 3 Nov 2022 11:07:49 +0700 Subject: [PATCH 1/3] Update | Add rounded QrEyeStyle --- example/lib/main_screen.dart | 9 +-- lib/src/qr_painter.dart | 126 ++++++++++++++++++++++------------- lib/src/types.dart | 8 ++- 3 files changed, 92 insertions(+), 51 deletions(-) diff --git a/example/lib/main_screen.dart b/example/lib/main_screen.dart index dd05fad..6ed90c9 100644 --- a/example/lib/main_screen.dart +++ b/example/lib/main_screen.dart @@ -37,12 +37,13 @@ class _MainScreenState extends State { data: message, version: QrVersions.auto, eyeStyle: const QrEyeStyle( - eyeShape: QrEyeShape.square, - color: Color(0xff128760), + eyeShape: QrEyeShape.squareRounded, + radius: 10, + color: Colors.green, ), dataModuleStyle: const QrDataModuleStyle( - dataModuleShape: QrDataModuleShape.circle, - color: Color(0xff1a5441), + dataModuleShape: QrDataModuleShape.square, + color: Colors.black, ), // size: 320.0, embeddedImage: snapshot.data, diff --git a/lib/src/qr_painter.dart b/lib/src/qr_painter.dart index f2f3ba2..121cf8b 100644 --- a/lib/src/qr_painter.dart +++ b/lib/src/qr_painter.dart @@ -221,20 +221,19 @@ class QrPainter extends CustomPainter { ); // DEBUG: draw the inner content boundary -// final paint = Paint()..style = ui.PaintingStyle.stroke; -// paint.strokeWidth = 1; -// paint.color = const Color(0x55222222); -// canvas.drawRect( -// Rect.fromLTWH(paintMetrics.inset, paintMetrics.inset, -// paintMetrics.innerContentSize, paintMetrics.innerContentSize), -// paint); + // final paint = Paint()..style = ui.PaintingStyle.stroke; + // paint.strokeWidth = 1; + // paint.color = const Color(0x55222222); + // canvas.drawRect( + // Rect.fromLTWH(paintMetrics.inset, paintMetrics.inset, + // paintMetrics.innerContentSize, paintMetrics.innerContentSize), + // paint); double left; double top; final gap = !gapless ? _gapSize : 0; // get the painters for the pixel information - final pixelPaint = - _paintCache.firstPaint(QrCodeElement.codePixel); + final pixelPaint = _paintCache.firstPaint(QrCodeElement.codePixel); if (color != null) { pixelPaint!.color = color!; } else { @@ -251,8 +250,7 @@ class QrPainter extends CustomPainter { if (_isFinderPatternPosition(x, y)) { continue; } - final paint = - _qrImage.isDark(y, x) ? pixelPaint : emptyPixelPaint; + final paint = _qrImage.isDark(y, x) ? pixelPaint : emptyPixelPaint; if (paint == null) { continue; } @@ -273,14 +271,33 @@ class QrPainter extends CustomPainter { paintMetrics.pixelSize + pixelHTweak, paintMetrics.pixelSize + pixelVTweak, ); - if (dataModuleStyle.dataModuleShape == QrDataModuleShape.square) { - canvas.drawRect(squareRect, paint); - } else { - final roundedRect = RRect.fromRectAndRadius( - squareRect, - Radius.circular(paintMetrics.pixelSize + pixelHTweak), - ); - canvas.drawRRect(roundedRect, paint); + + switch (dataModuleStyle.dataModuleShape) { + case QrDataModuleShape.square: + canvas.drawRect(squareRect, paint); + break; + // case QrDataModuleShape.squareRounded: + // final roundedOuterStrokeRect = RRect.fromRectAndCorners( + // squareRect, + // bottomLeft: + // Radius.circular(_isFinderPatternPosition(x, y) ? 3 : 0), + // topLeft: Radius.circular(0), + // bottomRight: Radius.circular(0), + // topRight: Radius.circular(0), + // ); + // // RRect.fromRectAndRadius(squareRect, Radius.circular(0)); + // canvas.drawRRect(roundedOuterStrokeRect, paint); + // // canvas.drawRect(squareRect, paint); + // break; + case QrDataModuleShape.circle: + final roundedRect = RRect.fromRectAndRadius(squareRect, + Radius.circular(paintMetrics.pixelSize + pixelHTweak)); + canvas.drawRRect(roundedRect, paint); + break; + default: + final roundedRect = RRect.fromRectAndRadius(squareRect, + Radius.circular(paintMetrics.pixelSize + pixelHTweak)); + canvas.drawRRect(roundedRect, paint); } } } @@ -292,8 +309,7 @@ class QrPainter extends CustomPainter { ); final requestedSize = embeddedImageStyle != null ? embeddedImageStyle!.size : null; - final imageSize = - _scaledAspectSize(size, originalSize, requestedSize); + final imageSize = _scaledAspectSize(size, originalSize, requestedSize); final position = Offset( (size.width - imageSize.width) / 2.0, (size.height - imageSize.height) / 2.0, @@ -332,9 +348,8 @@ class QrPainter extends CustomPainter { _PaintMetrics metrics, ) { final totalGap = (_finderPatternLimit - 1) * metrics.gapSize; - final radius = - ((_finderPatternLimit * metrics.pixelSize) + totalGap) - - metrics.pixelSize; + final radius = ((_finderPatternLimit * metrics.pixelSize) + totalGap) - + metrics.pixelSize; final strokeAdjust = metrics.pixelSize / 2.0; final edgePos = (metrics.inset + metrics.innerContentSize) - (radius + strokeAdjust); @@ -357,8 +372,8 @@ class QrPainter extends CustomPainter { outerPaint.strokeWidth = metrics.pixelSize; outerPaint.color = color != null ? color! : eyeStyle.color!; - final innerPaint = _paintCache - .firstPaint(QrCodeElement.finderPatternInner, position: position)!; + final innerPaint = _paintCache.firstPaint(QrCodeElement.finderPatternInner, + position: position)!; innerPaint.strokeWidth = metrics.pixelSize; innerPaint.color = emptyColor ?? const Color(0x00ffffff); @@ -372,8 +387,7 @@ class QrPainter extends CustomPainter { dotPaint!.color = eyeStyle.color!; } - final outerRect = - Rect.fromLTWH(offset.dx, offset.dy, radius, radius); + final outerRect = Rect.fromLTWH(offset.dx, offset.dy, radius, radius); final innerRadius = radius - (2 * metrics.pixelSize); final innerRect = Rect.fromLTWH( @@ -392,22 +406,43 @@ class QrPainter extends CustomPainter { dotSize, ); - if (eyeStyle.eyeShape == QrEyeShape.square) { - canvas.drawRect(outerRect, outerPaint); - canvas.drawRect(innerRect, innerPaint); - canvas.drawRect(dotRect, dotPaint); - } else { - final roundedOuterStrokeRect = - RRect.fromRectAndRadius(outerRect, Radius.circular(radius)); - canvas.drawRRect(roundedOuterStrokeRect, outerPaint); - - final roundedInnerStrokeRect = - RRect.fromRectAndRadius(outerRect, Radius.circular(innerRadius)); - canvas.drawRRect(roundedInnerStrokeRect, innerPaint); - - final roundedDotStrokeRect = - RRect.fromRectAndRadius(dotRect, Radius.circular(dotSize)); - canvas.drawRRect(roundedDotStrokeRect, dotPaint); + switch (eyeStyle.eyeShape) { + case QrEyeShape.square: + canvas.drawRect(outerRect, outerPaint); + canvas.drawRect(innerRect, innerPaint); + canvas.drawRect(dotRect, dotPaint); + break; + case QrEyeShape.squareRounded: + final roundedOuterStrokeRect = RRect.fromRectAndRadius( + outerRect, Radius.circular(eyeStyle.radius)); + canvas.drawRRect(roundedOuterStrokeRect, outerPaint); + canvas.drawRect(innerRect, innerPaint); + final roundedDotStrokeRect = RRect.fromRectAndRadius( + dotRect, Radius.circular(eyeStyle.radius / 2)); + canvas.drawRRect(roundedDotStrokeRect, dotPaint); + break; + case QrEyeShape.circle: + final roundedOuterStrokeRect = + RRect.fromRectAndRadius(outerRect, Radius.circular(radius)); + canvas.drawRRect(roundedOuterStrokeRect, outerPaint); + final roundedInnerStrokeRect = + RRect.fromRectAndRadius(outerRect, Radius.circular(innerRadius)); + canvas.drawRRect(roundedInnerStrokeRect, innerPaint); + final roundedDotStrokeRect = + RRect.fromRectAndRadius(dotRect, Radius.circular(dotSize)); + canvas.drawRRect(roundedDotStrokeRect, dotPaint); + break; + + default: + final roundedOuterStrokeRect = + RRect.fromRectAndRadius(outerRect, Radius.circular(radius)); + canvas.drawRRect(roundedOuterStrokeRect, outerPaint); + final roundedInnerStrokeRect = + RRect.fromRectAndRadius(outerRect, Radius.circular(innerRadius)); + canvas.drawRRect(roundedInnerStrokeRect, innerPaint); + final roundedDotStrokeRect = + RRect.fromRectAndRadius(dotRect, Radius.circular(dotSize)); + canvas.drawRRect(roundedDotStrokeRect, dotPaint); } } @@ -447,8 +482,7 @@ class QrPainter extends CustomPainter { } final srcSize = Size(embeddedImage!.width.toDouble(), embeddedImage!.height.toDouble()); - final src = - Alignment.center.inscribe(srcSize, Offset.zero & srcSize); + final src = Alignment.center.inscribe(srcSize, Offset.zero & srcSize); final dst = Alignment.center.inscribe(size, position & size); canvas.drawImageRect(embeddedImage!, src, dst, paint); } diff --git a/lib/src/types.dart b/lib/src/types.dart index b67b185..d052a85 100644 --- a/lib/src/types.dart +++ b/lib/src/types.dart @@ -43,6 +43,9 @@ enum QrEyeShape { /// Use square eye frame. square, + /// Use square rounded eye frame. + squareRounded, + /// Use circular eye frame. circle, } @@ -60,7 +63,7 @@ enum QrDataModuleShape { @immutable class QrEyeStyle { /// Create a new set of styling options for QR Eye. - const QrEyeStyle({this.eyeShape, this.color}); + const QrEyeStyle({this.eyeShape, this.color, this.radius = 0}); /// Eye shape. final QrEyeShape? eyeShape; @@ -68,6 +71,9 @@ class QrEyeStyle { /// Color to tint the eye. final Color? color; + /// radius + final double radius; + @override int get hashCode => eyeShape.hashCode ^ color.hashCode; From 6774eb7a53c5ef399a7bf6b3bb03727d958efc2f Mon Sep 17 00:00:00 2001 From: Muhammad Saddam Nur Date: Thu, 3 Nov 2022 16:04:14 +0700 Subject: [PATCH 2/3] Update | QrDataModuleShape rounded & background --- example/lib/main_screen.dart | 6 ++- lib/src/qr_painter.dart | 78 +++++++++++++++++++++++++++++------- lib/src/types.dart | 7 ++++ 3 files changed, 75 insertions(+), 16 deletions(-) diff --git a/example/lib/main_screen.dart b/example/lib/main_screen.dart index 6ed90c9..92384dd 100644 --- a/example/lib/main_screen.dart +++ b/example/lib/main_screen.dart @@ -35,15 +35,17 @@ class _MainScreenState extends State { size: const Size.square(size), painter: QrPainter( data: message, + gapless: true, version: QrVersions.auto, eyeStyle: const QrEyeStyle( eyeShape: QrEyeShape.squareRounded, - radius: 10, + radius: 15, color: Colors.green, ), dataModuleStyle: const QrDataModuleStyle( - dataModuleShape: QrDataModuleShape.square, + dataModuleShape: QrDataModuleShape.squareRounded, color: Colors.black, + radius: 3, ), // size: 320.0, embeddedImage: snapshot.data, diff --git a/lib/src/qr_painter.dart b/lib/src/qr_painter.dart index 121cf8b..0d6a6ea 100644 --- a/lib/src/qr_painter.dart +++ b/lib/src/qr_painter.dart @@ -7,6 +7,7 @@ import 'dart:async'; import 'dart:ui' as ui; +import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:qr/qr.dart'; @@ -276,19 +277,40 @@ class QrPainter extends CustomPainter { case QrDataModuleShape.square: canvas.drawRect(squareRect, paint); break; - // case QrDataModuleShape.squareRounded: - // final roundedOuterStrokeRect = RRect.fromRectAndCorners( - // squareRect, - // bottomLeft: - // Radius.circular(_isFinderPatternPosition(x, y) ? 3 : 0), - // topLeft: Radius.circular(0), - // bottomRight: Radius.circular(0), - // topRight: Radius.circular(0), - // ); - // // RRect.fromRectAndRadius(squareRect, Radius.circular(0)); - // canvas.drawRRect(roundedOuterStrokeRect, paint); - // // canvas.drawRect(squareRect, paint); - // break; + case QrDataModuleShape.squareRounded: + double bottomLeft = 0; + double bottomRight = 0; + double topLeft = 0; + double topRight = 0; + if (_qrImage.isDark(y, x)) { + bottomLeft = dataModuleStyle.radius; + bottomRight = dataModuleStyle.radius; + topLeft = dataModuleStyle.radius; + topRight = dataModuleStyle.radius; + if (true) { + if (y - 1 >= 0 && _qrImage.isDark(y - 1, x)) { + topLeft = topRight = 0; + } + if (y + 1 < _qrImage.moduleCount && _qrImage.isDark(y + 1, x)) { + bottomRight = bottomLeft = 0; + } + if (x + 1 < _qrImage.moduleCount && _qrImage.isDark(y, x + 1)) { + bottomRight = topRight = 0; + } + if (x - 1 >= 0 && _qrImage.isDark(y, x - 1)) { + topLeft = bottomLeft = 0; + } + } + } + final roundedRect = RRect.fromRectAndCorners( + squareRect, + bottomLeft: Radius.circular(bottomLeft), + bottomRight: Radius.circular(bottomRight), + topLeft: Radius.circular(topLeft), + topRight: Radius.circular(topRight), + ); + canvas.drawRRect(roundedRect, paint); + break; case QrDataModuleShape.circle: final roundedRect = RRect.fromRectAndRadius(squareRect, Radius.circular(paintMetrics.pixelSize + pixelHTweak)); @@ -303,6 +325,34 @@ class QrPainter extends CustomPainter { } if (embeddedImage != null) { + /// background + final originalSizeBackground = Size( + embeddedImage!.width.toDouble() + 10, + embeddedImage!.height.toDouble() + 10, + ); + final requestedSizeBackground = embeddedImageStyle != null + ? Size( + embeddedImageStyle!.size!.width + 10, + embeddedImageStyle!.size!.height + 10, + ) + : null; + final imageSizeBackground = _scaledAspectSize( + size, originalSizeBackground, requestedSizeBackground); + final positionBackground = Offset( + (size.width - imageSizeBackground.width) / 2.0, + (size.height - imageSizeBackground.height) / 2.0, + ); + // draw the image overlay. + _drawImageOverlay( + canvas, + positionBackground, + imageSizeBackground, + QrEmbeddedImageStyle( + color: embeddedImageStyle!.color ?? Colors.white, + ), + ); + + /// image final originalSize = Size( embeddedImage!.width.toDouble(), embeddedImage!.height.toDouble(), @@ -315,7 +365,7 @@ class QrPainter extends CustomPainter { (size.height - imageSize.height) / 2.0, ); // draw the image overlay. - _drawImageOverlay(canvas, position, imageSize, embeddedImageStyle); + _drawImageOverlay(canvas, position, imageSize, null); } } diff --git a/lib/src/types.dart b/lib/src/types.dart index d052a85..dc2a8a6 100644 --- a/lib/src/types.dart +++ b/lib/src/types.dart @@ -55,6 +55,9 @@ enum QrDataModuleShape { /// Use square dots. square, + /// Use square rounded eye frame. + squareRounded, + /// Use circular dots. circle, } @@ -93,6 +96,7 @@ class QrDataModuleStyle { const QrDataModuleStyle({ this.dataModuleShape, this.color, + this.radius = 0, }); /// Eye shape. @@ -101,6 +105,9 @@ class QrDataModuleStyle { /// Color to tint the data modules. final Color? color; + /// radius + final double radius; + @override int get hashCode => dataModuleShape.hashCode ^ color.hashCode; From 60ce080e05171002b6cfcb4a12799977b1ab70b0 Mon Sep 17 00:00:00 2001 From: Muhammad Saddam Nur Date: Thu, 6 Jul 2023 09:50:45 +0700 Subject: [PATCH 3/3] chore: add golden test and update example --- example/lib/main_screen.dart | 52 ++++++-- lib/src/qr_image_view.dart | 3 +- lib/src/qr_painter.dart | 2 +- test/.golden/qr_image_logo_golden.png | Bin 12850 -> 13074 bytes test/.golden/qr_image_rounded_golden.png | Bin 0 -> 9830 bytes ...image_rounded_logo_border_color_golden.png | Bin 0 -> 9187 bytes test/.golden/qr_image_rounded_logo_golden.png | Bin 0 -> 8988 bytes .../qr_image_logo_golden_isolatedDiff.png | Bin 0 -> 5658 bytes .../qr_image_logo_golden_maskedDiff.png | Bin 0 -> 9413 bytes .../qr_image_logo_golden_masterImage.png | Bin 0 -> 12850 bytes .../qr_image_logo_golden_testImage.png | Bin 0 -> 4963 bytes test/image_test.dart | 123 ++++++++++++++++++ 12 files changed, 165 insertions(+), 15 deletions(-) create mode 100644 test/.golden/qr_image_rounded_golden.png create mode 100644 test/.golden/qr_image_rounded_logo_border_color_golden.png create mode 100644 test/.golden/qr_image_rounded_logo_golden.png create mode 100644 test/failures/qr_image_logo_golden_isolatedDiff.png create mode 100644 test/failures/qr_image_logo_golden_maskedDiff.png create mode 100644 test/failures/qr_image_logo_golden_masterImage.png create mode 100644 test/failures/qr_image_logo_golden_testImage.png diff --git a/example/lib/main_screen.dart b/example/lib/main_screen.dart index 92384dd..7bba24a 100644 --- a/example/lib/main_screen.dart +++ b/example/lib/main_screen.dart @@ -18,21 +18,22 @@ class MainScreen extends StatefulWidget { } class _MainScreenState extends State { + double qrSize = 200; + double logoSize = 40; @override Widget build(BuildContext context) { - const String message = + const message = // ignore: lines_longer_than_80_chars 'Hey this is a QR code. Change this value in the main_screen.dart file.'; - final FutureBuilder qrFutureBuilder = FutureBuilder( + final qrFutureBuilder = FutureBuilder( future: _loadOverlayImage(), - builder: (BuildContext ctx, AsyncSnapshot snapshot) { - const double size = 280.0; + builder: (ctx, snapshot) { if (!snapshot.hasData) { - return const SizedBox(width: size, height: size); + return SizedBox(width: qrSize, height: qrSize); } return CustomPaint( - size: const Size.square(size), + size: Size.square(qrSize), painter: QrPainter( data: message, gapless: true, @@ -49,8 +50,8 @@ class _MainScreenState extends State { ), // size: 320.0, embeddedImage: snapshot.data, - embeddedImageStyle: const QrEmbeddedImageStyle( - size: Size.square(60), + embeddedImageStyle: QrEmbeddedImageStyle( + size: Size.square(logoSize), ), ), ); @@ -65,11 +66,39 @@ class _MainScreenState extends State { Expanded( child: Center( child: SizedBox( - width: 280, + width: qrSize, child: qrFutureBuilder, ), ), ), + Expanded( + child: Center( + child: SizedBox( + width: qrSize, + child: QrImageView( + data: message, + gapless: true, + version: QrVersions.auto, + eyeStyle: const QrEyeStyle( + eyeShape: QrEyeShape.squareRounded, + radius: 15, + color: Colors.green, + ), + dataModuleStyle: const QrDataModuleStyle( + dataModuleShape: QrDataModuleShape.squareRounded, + color: Colors.black, + radius: 3, + ), + // size: 320.0, + embeddedImage: + ExactAssetImage('assets/images/4.0x/logo_yakka.png'), + embeddedImageStyle: QrEmbeddedImageStyle( + size: Size.square(logoSize), + ), + ), + ), + ), + ), Padding( padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 40) .copyWith(bottom: 40), @@ -82,9 +111,8 @@ class _MainScreenState extends State { } Future _loadOverlayImage() async { - final Completer completer = Completer(); - final ByteData byteData = - await rootBundle.load('assets/images/4.0x/logo_yakka.png'); + final completer = Completer(); + final byteData = await rootBundle.load('assets/images/4.0x/logo_yakka.png'); ui.decodeImageFromList(byteData.buffer.asUint8List(), completer.complete); return completer.future; } diff --git a/lib/src/qr_image_view.dart b/lib/src/qr_image_view.dart index e803f5c..24bc9e2 100644 --- a/lib/src/qr_image_view.dart +++ b/lib/src/qr_image_view.dart @@ -184,8 +184,7 @@ class _QrImageViewState extends State { return _errorWidget(context, constraints, _validationResult.error); } // no error, build the regular widget - final widgetSize = - widget.size ?? constraints.biggest.shortestSide; + final widgetSize = widget.size ?? constraints.biggest.shortestSide; if (widget.embeddedImage != null) { // if requesting to embed an image then we need to load via a // FutureBuilder because the image provider will be async. diff --git a/lib/src/qr_painter.dart b/lib/src/qr_painter.dart index 0d6a6ea..bb0d666 100644 --- a/lib/src/qr_painter.dart +++ b/lib/src/qr_painter.dart @@ -348,7 +348,7 @@ class QrPainter extends CustomPainter { positionBackground, imageSizeBackground, QrEmbeddedImageStyle( - color: embeddedImageStyle!.color ?? Colors.white, + color: embeddedImageStyle?.color ?? Colors.white, ), ); diff --git a/test/.golden/qr_image_logo_golden.png b/test/.golden/qr_image_logo_golden.png index 8856a1b36837549bb6cf8f1207b3b5302f5e66de..77d3783458a1777ffc2f1b795ae1151d0006ef14 100644 GIT binary patch literal 13074 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 diff --git a/test/.golden/qr_image_rounded_golden.png b/test/.golden/qr_image_rounded_golden.png new file mode 100644 index 0000000000000000000000000000000000000000..b606b4fc22e7225f19e6a1f6aa2b8abd8426d4cf GIT binary patch literal 9830 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 literal 0 HcmV?d00001 diff --git a/test/.golden/qr_image_rounded_logo_border_color_golden.png b/test/.golden/qr_image_rounded_logo_border_color_golden.png new file mode 100644 index 0000000000000000000000000000000000000000..40d9c6c6f1ff147278a4462353af065c1559a3c4 GIT binary patch literal 9187 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 RXeV3%kcax3wfF6!{|i7A%_aZ< literal 0 HcmV?d00001 diff --git a/test/failures/qr_image_logo_golden_isolatedDiff.png b/test/failures/qr_image_logo_golden_isolatedDiff.png new file mode 100644 index 0000000000000000000000000000000000000000..a78aaf4526733ea389fcdb1d7e86f389e0f3b9bb GIT binary patch literal 5658 zcmeHL`9GBF`yZU4Lue3{?HoQ~>^`#0*lQ*=%2;CTGjTGqX9h8LCriYsriig5gHmLR z$(Ca~g&8W8EM*(p%*0@lWxkK^ub+S6Jg?_@J+IgOT+emCujRh3_kCwN*xQPWo)QIt zK;joKAe=xTLAS%_h%hkH;h#SVynZ2^y?EsaaK#<@BLf6FK5`LZbLA$5HAVWX=vutU z_ZdQz$?y5U+&gwJ7-S>$o6Tbs_&>v;lxeVC^+Ey45x#P1|4CERt0y5%7#6OQ>RhMd zigIjha;^GMr}L{zs9$^1f2^gCNi|%R7NptK=Mjnz>Mjnlf{k18JPQu2gfZy9P2sM= zW{Qd^`)sZyhkG6X_3!ns2maRs4!%#9K-Q!ISjh>9m};4s3O(b_4cEBsM7e$*hJoE* zie@OBII$M{lymEmNW#$b7@QPB1_8_dO0BG!?N-aA$u#8cnPgSK6%LOd(aI74qPr>Krc%m?b&=UW7ggY&$%_gj`< z_m`<37^<)@L$`7{V9_oF4)I~(I z9;X;M{Z>89eWORc=5|K9Gm3PZE=2akj|e1foC>N7JRe_Z!eAA)`(6vd>2I`;GI~5U zl`lhI=)vV2?EPOR`HfZij$Sf!OMjO->XxwJshn+A6OTtNKP}^e7Rqn}PsWx`R{QI^ z?E(fqEN*QxrVsbI;y!ZlxUb!Fw0*Y+Mh(S*8*xxZaz?c5+NmeGb8fxQb1 z4}TdnN;zJ#)VjtPTclLV7KvySr+`E3>jEi8)fm0ls@)>92)bPsT~NlZE5*3N%g85@ z|AxGa_E^73-{~uB0QEY)EWHfHNUJk1XrbHK+i|>{L=Cu@!%?u<#9t9c>rS?(UE6u> zCiC(g--iJC`)ELqufguTXC%X7;D8g^`K6G+2L8~GfoDm8E=lx0GnF?v2)9X?5=qD> zSgKMRE0@gQ^cbdsL#%0;J-iQpcQu0Ef4m5sf7AbEX)hErvz--_SVY?pgT`+Hd*>4m(U>BS|2i@ zqi#vT+E2r6STKT~=uQ;wVTZut-!_ym0uysoVvzgIK54YAn2Uc zX!sIq<@{*kI0OQ$KMm8Ppj{0&2PYWwK4z%nz@q{4LW@ap-VjRrZ$!p1RN!2%atwkd z7+^0dOLm~gbWJn`q4nS*(hLu64Rx>>sw(VrN!*jAqo9uf&bRXvhEGH6&?6)hw~^nQ zvH>JS@bvo57w2^TYtYc3`=1UfFy;qWdfWEBkE4!68MQ}-qL01yP9D9s!D+H`r~ws} zoYdCHq;PNWE_eR)-Zhq`?jP#WPX#aBxN+@v1lU0s0AfvtS=7z%V~-N#K-5y44UD)I z!Y=eA9=VMl5Y`X@i@oc5KoLM8x>BTW5=VAJb>TvwCjh=**CuI%*pZW<6Bb~x0x$Xw zCM_*3`03vXV^?js+zRm_c12M3r{u$Ve_nu=8M|ezuq_}k-+=Mr3>ky(vo)W# zry?Pc8+%U)s*zEM7m4~RD#Fnn?@KwNr8Gc)PXyf=Qyk8k{P?+LV9tE^b8SDYGjS-F zeIY$w3IgFKvhR%Sj;5bas3-f5tuoC2a9#V_ZxZ+I;2YY^Yy%)WmJup8SBgFS$&Zc@{Cq^7(bEXewTpw7%}gm z6G3;3k3nCFmQ*-X^It0A=A|ZCnlWsq#Cz&74eB;Lsf$(=_tAXhv^l+dfrw2Q$>{di zwJ?h1#G976@>{wc)fpLc=#uCkMbO>>M(}M+ zkpaK7b+_Z7s9SW5Vxp5tvtTOzpaS*Zjn~XmI1{=p&$u09#ZB99F8T3658Q7 z2l!XdR@!Rn`!&t2Gkup9EL0^?P}zeG>Xvd%d463BsptQFapA$Y=0~?W8-p*o%U|!F z;@Q67FQr?URifo}F)$AQpC$$Q&JBm7tcm#HPr$_D3@_GxRm%yJW1_NWn!m8&oTb#h z-{YQ*RMvN&8m1tLY4%8}4py&*c6CPcw=pErlYJb`AhaK_Aq4-C!jh2Thz5m z9%@( zmoV7A)+DVcS-Py@_Qr9+LuYY+b5+$v^Tzvn!fHCe4;6jjt zlc=nIXsvlO>}PYZ)l$cf70G7Gt}mFzulwiR=-Uioha&)sD53c67x5H{{#U8hhB;Ot zYzScf>8KZqmgJVLWTX315L`Xf?M+KCY3=*eS3D&iHPy>%C1EpGw7SP_;+DSzsh^Rz zc9hY^4LY4h&Lr+}uJRa(cKdd7ZJVsfU3_a!Y}fUqd-a!v^!?-cTkYNc&tCg0SmH+?{@hD0WbikzmQ(A)mq1`u+~QQkBP4il-SE?qJ7CJsEbNu0Yb#%ehT=^rJ7OS zl}YIpOP}SHY+zl5Nl6RHbeH5>cMo=ar(95+b_KOb3yR+jYRcc5%etK-Ff1dZUHW@Y zp@~)n{gFHIXi^2hSHy430@Y+&%xwJgvSR6)c7#Zuj*F(j?%xfnm>}D@xc-8zy5(ux zw6OWMX3Ro{f&o8z8h#xnpq7;a&i>MPi?H&r`U2FL&*QCFNerhbsQl6w(zPHrny8OA zdnFVC@Vq|i`%#E@gO3YuT~0aSy@ysQ%M@|svL=-rp%icEZiGiZ5$b^{x2;rlFY5B^ zQfqHEM8}VQ&B2uMZ?V>An~MX3Yy5_HE3r8r9Wy_EHrRO6zEfShmO0h#`6Q9M{pmxq z&d=u1To1m(e4x>W18|4@aKPVQ`W(yrb3ti{vC(p}U$SkPhDH~?JocvLu*IJ8soB10 z&~|LUxz=>Hdy8!~Ty`@$_1qnLMduF`0s&O>vR6Uq&9EsYQt^zekmoB~{zDc}#B(xC zaS$;$gSS`B3Bv38=&dCQsNLfMZ}zzXj4^+EMcSs^`^g3H}NV|2n=7UZr9 zHRD^N$Kd603t2ufegv8X2jWnZoEIglcy-W;dMht~QDH=y4@9KY5-e7w$Ml;qC;!?U zJ&;Apq6-}MRB5xZTkJby@e8L7=GL5V$HuH2vSmBe(@uai#Os)+OJtANM7FQ*jd!>Z zk4n`2@%c1bwn*Rv0O@0s-xi^6e;uEd)Acx%w5x-(1)ZN5{17m$!I4>${b+?A1$4w#UglL9{dP5&y1#GNYP zUqW3+kHC^f9AAP8yp*1wZ=-IE037GAH)rPe2BHUQ<5p9l)Ga{qd32XxfG^D>t7UE? z8sJ=}#z5oGc7MKIzd1=oSCWeX*x|tdHZ@~TvZS{wfb-22>J>BwWUTt4yrhzO1xv)wAI`6u1`?R zFpv`gzpL{Zoc5@dk5D1t*MMkI*~Y)fPW-~yFe^QbPQRvn17_F*kTZZ%D<6int}3Ej zV>B?svA~cGl$z*u@SxSwg(#6@PfHmq2iPTQ-~%bPre!v{jNnib0e*2vO&?lD4^gMY zO=<6a0K?RBfh~nbJiEY-WV!Q}@j06~3w0eX2CQ&iUU}5{D(;In2L+87 zarbx-0cIWUGafp<-dD%Ad;piJCjmp3fuTGn4{pWu7rd?oZ!!{zzkdAP@vquve{(|Z zL+VVKdxesNo$G$7sj1#byryce=%@Zdf$+a5Tx{r%om?z`Q#DujNc`iP;uq0ML{FNa z#JsqGX&Hr(li_BB@BOob{uoJhRMTqq1uJA4xxIm~v?MGzwC(kO?9WWbY*%bkKE^o7QTj)G+G|rQ&BlAk_umT>wh7Hnq`GCG;JPe;(nr z*Ykenr!RJ9k%nZR%5rb;4>3!e(#f;!iFQJ@0^2BZAyD}}fkljX{tm|Qlo~k>(Ngl> z>?n+8Pr~8@0;-@hcsLyXOq~+`cMf;#U`QF+^8!juzL4li)GkGyS&&zDu!m9=AVQEE zyVJS-xv;v0$zIKRm zPc;)UkhSUprE-xn^ANM>$=%{_emz%vuytT=bAX=~KbP8hb2WN{$Hg)!wRD&=c9SRB zm@DgcPn7(*Lvc=iNUijLk4pX>`PT!79>^Zy3;AulWhF0|9i9S%E+Xv_HD_@t{|95y B26F%a literal 0 HcmV?d00001 diff --git a/test/failures/qr_image_logo_golden_maskedDiff.png b/test/failures/qr_image_logo_golden_maskedDiff.png new file mode 100644 index 0000000000000000000000000000000000000000..a62931588db3ac20460af077c439be6642dca20f GIT binary patch literal 9413 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 literal 0 HcmV?d00001 diff --git a/test/failures/qr_image_logo_golden_masterImage.png b/test/failures/qr_image_logo_golden_masterImage.png new file mode 100644 index 0000000000000000000000000000000000000000..8856a1b36837549bb6cf8f1207b3b5302f5e66de GIT binary patch literal 12850 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 literal 0 HcmV?d00001 diff --git a/test/failures/qr_image_logo_golden_testImage.png b/test/failures/qr_image_logo_golden_testImage.png new file mode 100644 index 0000000000000000000000000000000000000000..fb1950a5ff8dc488737459e71d53820f916e1798 GIT binary patch literal 4963 zcmcgwdr(tX8jp&_7t$`PwnbsvNt10|b;?7Cfl$TP;$YG(g4W`Lq6s!)+++ko2&iaT zYF9LAs|g{IPPdE+7$gd&OZ`o7eiH3U33T}&7Z|~ZHxoKEG z1pb7ucBJiH2CkB2NB@q&M1-a7+`hL+G;A5Z^4YHD3;%9dzUuPwqBG0C3Q2lp^rNwm zh|%jv)!?PiI(DY7yA^&plm5EhxNY}C@5Gx}@U|yiZM*$N0}M~gQaMx8U`i(u`Lrgd zM%m)L^SJ*96Ny{Kh?=Z$@k^3M3%hUM-^HG`2z+-N?lMLiiZ^i!i$Wz|YG>o`ti+r_ zb{|=U`FQzXFlS=UF2%fsYs6r>Le^ql6SOVH{5b+__1NN-nCt1kanV+}tu4hzgr-c@ z*YC@*-hGVwi@dsFuh1Ts=uJ%IybsGr2p@&ELdWtvIe91DEO?{4e`=e}**bpm>}i8_ z*Ez@Zw~_rnN*awuH6`)bh@V8&bLH>5N$;5U{*gRBxAp;k$Nbd)^GWonikDDsYd84| zG@JZe*-^dN&RR=Ft+Ge4PaTR!RePAv3At}JMGDm$gsm}f4M#>Amw5UYKYC!QE=q;( zzcG6rs+heNkF*~gBy~YTbf7D`@&=u-=E6p>2PBJIK9z)|!^lwj42eDWl>bBH>W@YvUiiJB`-B?v52?@Mw`q%)FuoO7`(X2V)}Wz; z3HM^_+ARPQGBNrKEc?2M9$O26kF4Df4}RrtVCk=*^Zb;u>sSt+E2!T5IW{#dH)p9u>(D zL+esAiBa%c32~i5UpnT>;5``d-Dndg@zXTKg*fA=$!ZpN-6(;N4%l6E-h*z}*WFgE zWwqhZ!~wFna=dip#N>vN?M1nr*p#)|8GpUo1ks07KdhYp_Roy9!2tqog*seydJ=37 zK_N9jYPSnZ2-B-^Q>;9Xw3q2l$I;}|x;`}7t4UBIb&0sC9B$=l-Fmc=KJ`hj)R7N+ z@?pyT`PZ$a(S*L~%|)L;bas>|pirWep}4q0x2jGubtBe-Q?AmBlMu)P1g+h&(FV&5 z;*!nb(e1$|z-Al+cwyp6+)RVJvBHE^a3&@2cj3S3_Gl(}DzE?&XSJZF^K@QH1y#bJp94)`eS$o_DthZ6Bm$~!O#AHO0mIIxLOr@wJ_bCo3}wSiQHP@0GI>yI&KD5I+&TV zL-#V#nf%H5m-KL-zFBk8p|gQK0GkZTb5~sS3Q&o|FiZB8Z9311E!rFNO%LUKSt~PX5r&66l6GKm$~tf*c0< zT5`IiMuVMm%7i?e<9|l^pn%UC^h~u#9O#MUa}JmH8Gz(FU{O4i=Rn zw9ZjIXmzUt-QwHh;!x16IF4H-7ZCZG@_%~0HoKs{#KzC!Zmv6VSiNX}|Eo|{ZTyl zA8QuCRrWCkqWv{?pL5S!WBYhBvV^fSkQWJ@yjK)2sTuxEfeKo+ATLWD$!rG2AWq^3 zqRD9-O5)-`5OwIdXNqoC)kp5n*m5QDjQcM7 zX6N`Cn8AaF$M0n_Jvpa5Q_WeiN=GIQ>_F%5cvnpcS?hb>*-j~aqib)-hQM4Xwid>q zJAm%;6@`H5NBi5F7^R(kD#`*V5I}#W0en=51WB%$T0Ikqlhg#AFE}NDS?pM_7aZVl zY`L?+h6kXre&pMdu_aZZHM=rld?z-#d>p@o&V*$L#-c=zvyg@G15@N=g_c*MDvsFe zI;=h$njcDw*7;)ssWA1Y(c1+%VgeYdL-;Ryb?UG2#-r1M*^diX)Vbe z|I$bpF^#wsT?S5aFF2X48GcY!;OnVFwl9dW5qb+3Nq}vU4K|$eTE1s?U;_ul>(WeH kIcmi}>4Oz`KH4!8UHd1q0-kwhOJG^r>*Sp`cN{tQU;M9>)c^nh literal 0 HcmV?d00001 diff --git a/test/image_test.dart b/test/image_test.dart index 578c1c8..1cfcc57 100644 --- a/test/image_test.dart +++ b/test/image_test.dart @@ -183,6 +183,129 @@ void main() { ); }, ); + + testWidgets( + 'QrImageView rounded generates correct image', + (tester) async { + final qrImage = MaterialApp( + home: Center( + child: RepaintBoundary( + child: QrImageView( + data: 'This is a a qr code with a logo', + gapless: true, + version: QrVersions.auto, + eyeStyle: const QrEyeStyle( + eyeShape: QrEyeShape.squareRounded, + radius: 15, + color: Colors.green, + ), + dataModuleStyle: const QrDataModuleStyle( + dataModuleShape: QrDataModuleShape.squareRounded, + color: Colors.black, + radius: 3, + ), + ), + ), + ), + ); + await tester.pumpWidget(qrImage); + await expectLater( + find.byType(QrImageView), + matchesGoldenFile( + './.golden/qr_image_rounded_golden.png', + ), + ); + }, + ); + + testWidgets( + 'QrImageView rounded generates correct image with logo', + (tester) async { + await pumpWidgetWithImages( + tester, + MaterialApp( + home: Center( + child: RepaintBoundary( + child: QrImageView( + data: 'This is a a qr code with a logo', + gapless: true, + version: QrVersions.auto, + eyeStyle: const QrEyeStyle( + eyeShape: QrEyeShape.squareRounded, + radius: 15, + color: Colors.green, + ), + dataModuleStyle: const QrDataModuleStyle( + dataModuleShape: QrDataModuleShape.squareRounded, + color: Colors.black, + radius: 3, + ), + size: 320.0, + embeddedImage: FileImage(File('test/.images/logo_yakka.png')), + embeddedImageStyle: const QrEmbeddedImageStyle( + size: Size.square(60), + ), + ), + ), + ), + ), + ['test/.images/logo_yakka.png'], + ); + + await tester.pumpAndSettle(); + + await expectLater( + find.byType(QrImageView), + matchesGoldenFile('./.golden/qr_image_rounded_logo_golden.png'), + ); + }, + ); + + testWidgets( + 'QrImageView rounded generates correct image with logo & border color', + (tester) async { + await pumpWidgetWithImages( + tester, + MaterialApp( + home: Center( + child: RepaintBoundary( + child: QrImageView( + data: 'This is a a qr code with a logo', + gapless: true, + version: QrVersions.auto, + eyeStyle: const QrEyeStyle( + eyeShape: QrEyeShape.squareRounded, + radius: 15, + color: Colors.green, + ), + dataModuleStyle: const QrDataModuleStyle( + dataModuleShape: QrDataModuleShape.squareRounded, + color: Colors.black, + radius: 3, + ), + size: 320.0, + embeddedImage: FileImage(File('test/.images/logo_yakka.png')), + embeddedImageStyle: const QrEmbeddedImageStyle( + size: Size.square(60), + color: Colors.red, + ), + ), + ), + ), + ), + ['test/.images/logo_yakka.png'], + ); + + await tester.pumpAndSettle(); + + await expectLater( + find.byType(QrImageView), + matchesGoldenFile( + './.golden/qr_image_rounded_logo_border_color_golden.png', + ), + ); + }, + ); } /// Pre-cache images to make sure they show up in golden tests.