David PHAM-VAN

Improve GraphicState

@@ -4,6 +4,7 @@ @@ -4,6 +4,7 @@
4 4
5 - Fix documentation 5 - Fix documentation
6 - Add Positioned.fill() 6 - Add Positioned.fill()
  7 +- Improve GraphicState
7 8
8 ## 3.1.0 9 ## 3.1.0
9 10
@@ -20,6 +20,7 @@ import 'package:meta/meta.dart'; @@ -20,6 +20,7 @@ import 'package:meta/meta.dart';
20 20
21 import 'data_types.dart'; 21 import 'data_types.dart';
22 import 'document.dart'; 22 import 'document.dart';
  23 +import 'function.dart';
23 import 'object.dart'; 24 import 'object.dart';
24 import 'smask.dart'; 25 import 'smask.dart';
25 26
@@ -83,22 +84,40 @@ enum PdfBlendMode { @@ -83,22 +84,40 @@ enum PdfBlendMode {
83 @immutable 84 @immutable
84 class PdfGraphicState { 85 class PdfGraphicState {
85 /// Create a new graphic state 86 /// Create a new graphic state
86 - const PdfGraphicState({this.opacity, this.blendMode, this.softMask});  
87 -  
88 - /// The opacity to apply to this graphic state  
89 - final double? opacity; 87 + const PdfGraphicState({
  88 + double? opacity,
  89 + double? strokeOpacity,
  90 + double? fillOpacity,
  91 + this.blendMode,
  92 + this.softMask,
  93 + this.transferFunction,
  94 + }) : fillOpacity = fillOpacity ?? opacity,
  95 + strokeOpacity = strokeOpacity ?? opacity;
  96 +
  97 + /// Fill opacity to apply to this graphic state
  98 + final double? fillOpacity;
  99 +
  100 + /// Stroke opacity to apply to this graphic state
  101 + final double? strokeOpacity;
90 102
91 /// The current blend mode to be used 103 /// The current blend mode to be used
92 final PdfBlendMode? blendMode; 104 final PdfBlendMode? blendMode;
93 105
  106 + /// Opacity mask
94 final PdfSoftMask? softMask; 107 final PdfSoftMask? softMask;
95 108
  109 + /// Color transfer function
  110 + final PdfFunction? transferFunction;
  111 +
96 PdfDict output() { 112 PdfDict output() {
97 final params = PdfDict(); 113 final params = PdfDict();
98 114
99 - if (opacity != null) {  
100 - params['/CA'] = PdfNum(opacity!);  
101 - params['/ca'] = PdfNum(opacity!); 115 + if (strokeOpacity != null) {
  116 + params['/CA'] = PdfNum(strokeOpacity!);
  117 + }
  118 +
  119 + if (fillOpacity != null) {
  120 + params['/ca'] = PdfNum(fillOpacity!);
102 } 121 }
103 122
104 if (blendMode != null) { 123 if (blendMode != null) {
@@ -111,6 +130,10 @@ class PdfGraphicState { @@ -111,6 +130,10 @@ class PdfGraphicState {
111 params['/SMask'] = softMask!.output(); 130 params['/SMask'] = softMask!.output();
112 } 131 }
113 132
  133 + if (transferFunction != null) {
  134 + params['/TR'] = transferFunction!.ref();
  135 + }
  136 +
114 return params; 137 return params;
115 } 138 }
116 139
@@ -119,13 +142,20 @@ class PdfGraphicState { @@ -119,13 +142,20 @@ class PdfGraphicState {
119 if (!(other is PdfGraphicState)) { 142 if (!(other is PdfGraphicState)) {
120 return false; 143 return false;
121 } 144 }
122 - return other.opacity == opacity && 145 + return other.fillOpacity == fillOpacity &&
  146 + other.strokeOpacity == strokeOpacity &&
123 other.blendMode == blendMode && 147 other.blendMode == blendMode &&
124 - other.softMask == softMask; 148 + other.softMask == softMask &&
  149 + other.transferFunction == transferFunction;
125 } 150 }
126 151
127 @override 152 @override
128 - int get hashCode => opacity.hashCode; 153 + int get hashCode =>
  154 + fillOpacity.hashCode *
  155 + strokeOpacity.hashCode *
  156 + blendMode.hashCode *
  157 + softMask.hashCode *
  158 + transferFunction.hashCode;
129 } 159 }
130 160
131 /// Stores all the graphic states used in the document 161 /// Stores all the graphic states used in the document