David PHAM-VAN

Add support for GreyScale Jpeg

@@ -16,6 +16,7 @@ @@ -16,6 +16,7 @@
16 - Simplify PdfImage constructor 16 - Simplify PdfImage constructor
17 - Implement Image orientation 17 - Implement Image orientation
18 - Add Exif reader 18 - Add Exif reader
  19 +- Add support for GreyScale Jpeg
19 20
20 ## 1.3.23 21 ## 1.3.23
21 22
@@ -205,6 +205,7 @@ class PDFImage extends PdfImage { @@ -205,6 +205,7 @@ class PDFImage extends PdfImage {
205 height: height, 205 height: height,
206 alpha: alpha, 206 alpha: alpha,
207 alphaChannel: false, 207 alphaChannel: false,
  208 + isRGB: true,
208 jpeg: false, 209 jpeg: false,
209 orientation: PdfImageOrientation.topLeft); 210 orientation: PdfImageOrientation.topLeft);
210 } 211 }
@@ -24,6 +24,7 @@ class PdfJpegInfo { @@ -24,6 +24,7 @@ class PdfJpegInfo {
24 24
25 int width; 25 int width;
26 int height; 26 int height;
  27 + int color;
27 int offset = 0; 28 int offset = 0;
28 while (offset < buffer.lengthInBytes) { 29 while (offset < buffer.lengthInBytes) {
29 while (buffer.getUint8(offset) == 0xff) { 30 while (buffer.getUint8(offset) == 0xff) {
@@ -55,6 +56,7 @@ class PdfJpegInfo { @@ -55,6 +56,7 @@ class PdfJpegInfo {
55 if (mrkr == 0xc0) { 56 if (mrkr == 0xc0) {
56 height = buffer.getUint16(offset + 1); 57 height = buffer.getUint16(offset + 1);
57 width = buffer.getUint16(offset + 3); 58 width = buffer.getUint16(offset + 3);
  59 + color = buffer.getUint8(offset + 5);
58 break; 60 break;
59 } 61 }
60 offset += len - 2; 62 offset += len - 2;
@@ -62,15 +64,19 @@ class PdfJpegInfo { @@ -62,15 +64,19 @@ class PdfJpegInfo {
62 64
63 final Map<PdfExifTag, dynamic> tags = _findExifInJpeg(buffer); 65 final Map<PdfExifTag, dynamic> tags = _findExifInJpeg(buffer);
64 66
65 - return PdfJpegInfo._(width, height, tags); 67 + return PdfJpegInfo._(width, height, color, tags);
66 } 68 }
67 69
68 - PdfJpegInfo._(this.width, this.height, this.tags); 70 + PdfJpegInfo._(this.width, this.height, this._color, this.tags);
69 71
70 final int width; 72 final int width;
71 73
72 final int height; 74 final int height;
73 75
  76 + final int _color;
  77 +
  78 + bool get isRGB => _color == 3;
  79 +
74 final Map<PdfExifTag, dynamic> tags; 80 final Map<PdfExifTag, dynamic> tags;
75 81
76 /// EXIF version 82 /// EXIF version
@@ -51,6 +51,7 @@ class PdfImage extends PdfXObject { @@ -51,6 +51,7 @@ class PdfImage extends PdfXObject {
51 height: height, 51 height: height,
52 alpha: alpha, 52 alpha: alpha,
53 alphaChannel: false, 53 alphaChannel: false,
  54 + isRGB: true,
54 jpeg: false, 55 jpeg: false,
55 orientation: orientation, 56 orientation: orientation,
56 ); 57 );
@@ -62,12 +63,14 @@ class PdfImage extends PdfXObject { @@ -62,12 +63,14 @@ class PdfImage extends PdfXObject {
62 @required int height, 63 @required int height,
63 @required this.alpha, 64 @required this.alpha,
64 @required this.alphaChannel, 65 @required this.alphaChannel,
  66 + @required this.isRGB,
65 @required this.jpeg, 67 @required this.jpeg,
66 @required this.orientation, 68 @required this.orientation,
67 }) : assert(alphaChannel == false || alpha == true), 69 }) : assert(alphaChannel == false || alpha == true),
68 assert(width != null), 70 assert(width != null),
69 assert(height != null), 71 assert(height != null),
70 assert(jpeg != null), 72 assert(jpeg != null),
  73 + assert(isRGB != null),
71 assert(orientation != null), 74 assert(orientation != null),
72 _width = width, 75 _width = width,
73 _height = height, 76 _height = height,
@@ -86,16 +89,17 @@ class PdfImage extends PdfXObject { @@ -86,16 +89,17 @@ class PdfImage extends PdfXObject {
86 height: height, 89 height: height,
87 alpha: alpha, 90 alpha: alpha,
88 alphaChannel: true, 91 alphaChannel: true,
  92 + isRGB: false,
89 jpeg: jpeg, 93 jpeg: jpeg,
90 orientation: orientation, 94 orientation: orientation,
91 ); 95 );
92 params['/SMask'] = PdfStream.string('${_sMask.objser} 0 R'); 96 params['/SMask'] = PdfStream.string('${_sMask.objser} 0 R');
93 } 97 }
94 98
95 - if (alphaChannel) {  
96 - params['/ColorSpace'] = PdfStream.string('/DeviceGray');  
97 - } else { 99 + if (isRGB) {
98 params['/ColorSpace'] = PdfStream.string('/DeviceRGB'); 100 params['/ColorSpace'] = PdfStream.string('/DeviceRGB');
  101 + } else {
  102 + params['/ColorSpace'] = PdfStream.string('/DeviceGray');
99 } 103 }
100 104
101 if (jpeg) { 105 if (jpeg) {
@@ -118,6 +122,7 @@ class PdfImage extends PdfXObject { @@ -118,6 +122,7 @@ class PdfImage extends PdfXObject {
118 height: info.height, 122 height: info.height,
119 jpeg: true, 123 jpeg: true,
120 alpha: false, 124 alpha: false,
  125 + isRGB: info.isRGB,
121 alphaChannel: false, 126 alphaChannel: false,
122 orientation: orientation ?? info.orientation, 127 orientation: orientation ?? info.orientation,
123 ); 128 );
@@ -145,6 +150,9 @@ class PdfImage extends PdfXObject { @@ -145,6 +150,9 @@ class PdfImage extends PdfXObject {
145 /// The image data is a jpeg image 150 /// The image data is a jpeg image
146 final bool jpeg; 151 final bool jpeg;
147 152
  153 + /// The image data is a color RGB image
  154 + final bool isRGB;
  155 +
148 /// The internal orientation of the image 156 /// The internal orientation of the image
149 final PdfImageOrientation orientation; 157 final PdfImageOrientation orientation;
150 158