Showing
7 changed files
with
87 additions
and
14 deletions
| @@ -19,27 +19,56 @@ | @@ -19,27 +19,56 @@ | ||
| 19 | part of pdf; | 19 | part of pdf; |
| 20 | 20 | ||
| 21 | class PdfColor { | 21 | class PdfColor { |
| 22 | + /// Create a color with red, green, blue and alpha components | ||
| 23 | + /// values between 0 and 1 | ||
| 22 | const PdfColor(this.red, this.green, this.blue, [this.alpha = 1.0]) | 24 | const PdfColor(this.red, this.green, this.blue, [this.alpha = 1.0]) |
| 23 | : assert(red >= 0 && red <= 1), | 25 | : assert(red >= 0 && red <= 1), |
| 24 | assert(green >= 0 && green <= 1), | 26 | assert(green >= 0 && green <= 1), |
| 25 | assert(blue >= 0 && blue <= 1), | 27 | assert(blue >= 0 && blue <= 1), |
| 26 | assert(alpha >= 0 && alpha <= 1); | 28 | assert(alpha >= 0 && alpha <= 1); |
| 27 | 29 | ||
| 30 | + /// Return a color with: 0xAARRGGBB | ||
| 28 | const PdfColor.fromInt(int color) | 31 | const PdfColor.fromInt(int color) |
| 29 | : red = (color >> 16 & 0xff) / 255.0, | 32 | : red = (color >> 16 & 0xff) / 255.0, |
| 30 | green = (color >> 8 & 0xff) / 255.0, | 33 | green = (color >> 8 & 0xff) / 255.0, |
| 31 | blue = (color & 0xff) / 255.0, | 34 | blue = (color & 0xff) / 255.0, |
| 32 | alpha = (color >> 24 & 0xff) / 255.0; | 35 | alpha = (color >> 24 & 0xff) / 255.0; |
| 33 | 36 | ||
| 37 | + /// Can parse colors in the form: | ||
| 38 | + /// * #RRGGBBAA | ||
| 39 | + /// * #RRGGBB | ||
| 40 | + /// * #RGB | ||
| 41 | + /// * RRGGBBAA | ||
| 42 | + /// * RRGGBB | ||
| 43 | + /// * RGB | ||
| 34 | factory PdfColor.fromHex(String color) { | 44 | factory PdfColor.fromHex(String color) { |
| 35 | if (color.startsWith('#')) { | 45 | if (color.startsWith('#')) { |
| 36 | color = color.substring(1); | 46 | color = color.substring(1); |
| 37 | } | 47 | } |
| 38 | - return PdfColor( | ||
| 39 | - (int.parse(color.substring(0, 1), radix: 16) >> 16 & 0xff) / 255.0, | ||
| 40 | - (int.parse(color.substring(2, 3), radix: 16) >> 8 & 0xff) / 255.0, | ||
| 41 | - (int.parse(color.substring(4, 5), radix: 16) & 0xff) / 255.0, | ||
| 42 | - (int.parse(color.substring(6, 7), radix: 16) >> 24 & 0xff) / 255.0); | 48 | + |
| 49 | + double red; | ||
| 50 | + double green; | ||
| 51 | + double blue; | ||
| 52 | + double alpha = 1; | ||
| 53 | + | ||
| 54 | + if (color.length == 3) { | ||
| 55 | + red = int.parse(color.substring(0, 1) * 2, radix: 16) / 255; | ||
| 56 | + green = int.parse(color.substring(1, 2) * 2, radix: 16) / 255; | ||
| 57 | + blue = int.parse(color.substring(2, 3) * 2, radix: 16) / 255; | ||
| 58 | + return PdfColor(red, green, blue, alpha); | ||
| 59 | + } | ||
| 60 | + | ||
| 61 | + assert(color.length == 3 || color.length == 6 || color.length == 8); | ||
| 62 | + | ||
| 63 | + red = int.parse(color.substring(0, 2), radix: 16) / 255; | ||
| 64 | + green = int.parse(color.substring(2, 4), radix: 16) / 255; | ||
| 65 | + blue = int.parse(color.substring(4, 6), radix: 16) / 255; | ||
| 66 | + | ||
| 67 | + if (color.length == 8) { | ||
| 68 | + alpha = int.parse(color.substring(6, 8), radix: 16) / 255; | ||
| 69 | + } | ||
| 70 | + | ||
| 71 | + return PdfColor(red, green, blue, alpha); | ||
| 43 | } | 72 | } |
| 44 | 73 | ||
| 45 | factory PdfColor.fromRYB(double red, double yellow, double blue, | 74 | factory PdfColor.fromRYB(double red, double yellow, double blue, |
| @@ -113,7 +142,12 @@ class PdfColor { | @@ -113,7 +142,12 @@ class PdfColor { | ||
| 113 | (((blue * 255.0).round() & 0xff) << 0)) & | 142 | (((blue * 255.0).round() & 0xff) << 0)) & |
| 114 | 0xFFFFFFFF; | 143 | 0xFFFFFFFF; |
| 115 | 144 | ||
| 116 | - String toHex() => '#' + toInt().toRadixString(16); | 145 | + String toHex() { |
| 146 | + final int i = toInt(); | ||
| 147 | + final String rgb = (i & 0xffffff).toRadixString(16); | ||
| 148 | + final String a = ((i & 0xff000000) >> 24).toRadixString(16); | ||
| 149 | + return '#$rgb$a'; | ||
| 150 | + } | ||
| 117 | 151 | ||
| 118 | PdfColorCmyk toCmyk() { | 152 | PdfColorCmyk toCmyk() { |
| 119 | return PdfColorCmyk.fromRgb(red, green, blue, alpha); | 153 | return PdfColorCmyk.fromRgb(red, green, blue, alpha); |
| @@ -45,7 +45,7 @@ class Color extends StatelessWidget { | @@ -45,7 +45,7 @@ class Color extends StatelessWidget { | ||
| 45 | children: <Widget>[ | 45 | children: <Widget>[ |
| 46 | Text(name, style: style), | 46 | Text(name, style: style), |
| 47 | Text(varient ?? '', style: style), | 47 | Text(varient ?? '', style: style), |
| 48 | - Padding(padding: const EdgeInsets.all(2 * PdfPageFormat.mm)), | 48 | + SizedBox(height: 4 * PdfPageFormat.mm), |
| 49 | Text(color.toHex(), style: hexStyle), | 49 | Text(color.toHex(), style: hexStyle), |
| 50 | Row( | 50 | Row( |
| 51 | mainAxisSize: MainAxisSize.max, | 51 | mainAxisSize: MainAxisSize.max, |
| @@ -709,6 +709,44 @@ void main() { | @@ -709,6 +709,44 @@ void main() { | ||
| 709 | ])); | 709 | ])); |
| 710 | }); | 710 | }); |
| 711 | 711 | ||
| 712 | + group('Pdf Colors Conversions', () { | ||
| 713 | + test('fromHex #RRGGBBAA', () { | ||
| 714 | + final PdfColor c = PdfColor.fromHex('#12345678'); | ||
| 715 | + expect(c.red, 0x12 / 255); | ||
| 716 | + expect(c.green, 0x34 / 255); | ||
| 717 | + expect(c.blue, 0x56 / 255); | ||
| 718 | + expect(c.alpha, 0x78 / 255); | ||
| 719 | + }); | ||
| 720 | + | ||
| 721 | + test('fromHex RRGGBBAA', () { | ||
| 722 | + final PdfColor c = PdfColor.fromHex('12345678'); | ||
| 723 | + expect(c.red, 0x12 / 255); | ||
| 724 | + expect(c.green, 0x34 / 255); | ||
| 725 | + expect(c.blue, 0x56 / 255); | ||
| 726 | + expect(c.alpha, 0x78 / 255); | ||
| 727 | + }); | ||
| 728 | + | ||
| 729 | + test('fromHex RRGGBB', () { | ||
| 730 | + final PdfColor c = PdfColor.fromHex('123456'); | ||
| 731 | + expect(c.red, 0x12 / 255); | ||
| 732 | + expect(c.green, 0x34 / 255); | ||
| 733 | + expect(c.blue, 0x56 / 255); | ||
| 734 | + expect(c.alpha, 1); | ||
| 735 | + }); | ||
| 736 | + | ||
| 737 | + test('fromHex RGB', () { | ||
| 738 | + final PdfColor c = PdfColor.fromHex('18f'); | ||
| 739 | + expect(c.red, 0x11 / 255); | ||
| 740 | + expect(c.green, 0x88 / 255); | ||
| 741 | + expect(c.blue, 0xff / 255); | ||
| 742 | + expect(c.alpha, 1); | ||
| 743 | + }); | ||
| 744 | + | ||
| 745 | + test('toHex RGB', () { | ||
| 746 | + expect(PdfColor.fromHex('#12345678').toHex(), '#12345678'); | ||
| 747 | + }); | ||
| 748 | + }); | ||
| 749 | + | ||
| 712 | tearDownAll(() { | 750 | tearDownAll(() { |
| 713 | final File file = File('colors.pdf'); | 751 | final File file = File('colors.pdf'); |
| 714 | file.writeAsBytesSync(pdf.save()); | 752 | file.writeAsBytesSync(pdf.save()); |
| @@ -31,7 +31,7 @@ List<TableRow> buildTable( | @@ -31,7 +31,7 @@ List<TableRow> buildTable( | ||
| 31 | final List<TableRow> rows = <TableRow>[]; | 31 | final List<TableRow> rows = <TableRow>[]; |
| 32 | { | 32 | { |
| 33 | final List<Widget> tableRow = <Widget>[]; | 33 | final List<Widget> tableRow = <Widget>[]; |
| 34 | - for (String cell in <String>['Hue', 'Color', 'ARGB']) { | 34 | + for (String cell in <String>['Hue', 'Color', 'RGBA']) { |
| 35 | tableRow.add(Container( | 35 | tableRow.add(Container( |
| 36 | alignment: Alignment.center, | 36 | alignment: Alignment.center, |
| 37 | margin: const EdgeInsets.all(5), | 37 | margin: const EdgeInsets.all(5), |
No preview for this file type
No preview for this file type
No preview for this file type
-
Please register or login to post a comment