@@ -1185,22 +1185,31 @@ final class Paint {
11851185 @pragma ('vm:entry-point' )
11861186 final ByteData _data = ByteData (_kDataByteCount);
11871187
1188+ // Must match //lib/ui/painting/paint.cc.
11881189 static const int _kIsAntiAliasIndex = 0 ;
1189- static const int _kColorIndex = 1 ;
1190- static const int _kBlendModeIndex = 2 ;
1191- static const int _kStyleIndex = 3 ;
1192- static const int _kStrokeWidthIndex = 4 ;
1193- static const int _kStrokeCapIndex = 5 ;
1194- static const int _kStrokeJoinIndex = 6 ;
1195- static const int _kStrokeMiterLimitIndex = 7 ;
1196- static const int _kFilterQualityIndex = 8 ;
1197- static const int _kMaskFilterIndex = 9 ;
1198- static const int _kMaskFilterBlurStyleIndex = 10 ;
1199- static const int _kMaskFilterSigmaIndex = 11 ;
1200- static const int _kInvertColorIndex = 12 ;
1190+ static const int _kColorRedIndex = 1 ;
1191+ static const int _kColorGreenIndex = 2 ;
1192+ static const int _kColorBlueIndex = 3 ;
1193+ static const int _kColorAlphaIndex = 4 ;
1194+ static const int _kColorSpaceIndex = 5 ;
1195+ static const int _kBlendModeIndex = 6 ;
1196+ static const int _kStyleIndex = 7 ;
1197+ static const int _kStrokeWidthIndex = 8 ;
1198+ static const int _kStrokeCapIndex = 9 ;
1199+ static const int _kStrokeJoinIndex = 10 ;
1200+ static const int _kStrokeMiterLimitIndex = 11 ;
1201+ static const int _kFilterQualityIndex = 12 ;
1202+ static const int _kMaskFilterIndex = 13 ;
1203+ static const int _kMaskFilterBlurStyleIndex = 14 ;
1204+ static const int _kMaskFilterSigmaIndex = 15 ;
1205+ static const int _kInvertColorIndex = 16 ;
12011206
12021207 static const int _kIsAntiAliasOffset = _kIsAntiAliasIndex << 2 ;
1203- static const int _kColorOffset = _kColorIndex << 2 ;
1208+ static const int _kColorRedOffset = _kColorRedIndex << 2 ;
1209+ static const int _kColorGreenOffset = _kColorGreenIndex << 2 ;
1210+ static const int _kColorBlueOffset = _kColorBlueIndex << 2 ;
1211+ static const int _kColorAlphaOffset = _kColorAlphaIndex << 2 ;
1212+ static const int _kColorSpaceOffset = _kColorSpaceIndex << 2 ;
12041213 static const int _kBlendModeOffset = _kBlendModeIndex << 2 ;
12051214 static const int _kStyleOffset = _kStyleIndex << 2 ;
12061215 static const int _kStrokeWidthOffset = _kStrokeWidthIndex << 2 ;
@@ -1214,7 +1223,7 @@ final class Paint {
12141223 static const int _kInvertColorOffset = _kInvertColorIndex << 2 ;
12151224
12161225 // If you add more fields, remember to update _kDataByteCount.
1217- static const int _kDataByteCount = 52 ; // 4 * (last index + 1).
1226+ static const int _kDataByteCount = 68 ; // 4 * (last index + 1).
12181227
12191228 // Binary format must match the deserialization code in paint.cc.
12201229 // C++ unit tests access this.
@@ -1260,12 +1269,28 @@ final class Paint {
12601269 /// This color is not used when compositing. To colorize a layer, use
12611270 /// [colorFilter] .
12621271 Color get color {
1263- final int encoded = _data.getInt32 (_kColorOffset, _kFakeHostEndian);
1264- return Color (encoded ^ _kColorDefault);
1272+ final double red = _data.getFloat32 (_kColorRedOffset, _kFakeHostEndian);
1273+ final double green = _data.getFloat32 (_kColorGreenOffset, _kFakeHostEndian);
1274+ final double blue = _data.getFloat32 (_kColorBlueOffset, _kFakeHostEndian);
1275+ final double alpha =
1276+ 1.0 - _data.getFloat32 (_kColorAlphaOffset, _kFakeHostEndian);
1277+ final ColorSpace colorSpace = _indexToColorSpace (
1278+ _data.getInt32 (_kColorSpaceOffset, _kFakeHostEndian));
1279+ return Color .from (
1280+ alpha: alpha,
1281+ red: red,
1282+ green: green,
1283+ blue: blue,
1284+ colorSpace: colorSpace);
12651285 }
1286+
12661287 set color (Color value) {
1267- final int encoded = value.value ^ _kColorDefault;
1268- _data.setInt32 (_kColorOffset, encoded, _kFakeHostEndian);
1288+ _data.setFloat32 (_kColorRedOffset, value.r, _kFakeHostEndian);
1289+ _data.setFloat32 (_kColorGreenOffset, value.g, _kFakeHostEndian);
1290+ _data.setFloat32 (_kColorBlueOffset, value.b, _kFakeHostEndian);
1291+ _data.setFloat32 (_kColorAlphaOffset, 1.0 - value.a, _kFakeHostEndian);
1292+ _data.setInt32 (_kColorSpaceOffset, _colorSpaceToIndex (value.colorSpace),
1293+ _kFakeHostEndian);
12691294 }
12701295
12711296 // Must be kept in sync with the default in paint.cc.
@@ -1642,6 +1667,30 @@ enum ColorSpace {
16421667 displayP3,
16431668}
16441669
1670+ int _colorSpaceToIndex (ColorSpace colorSpace) {
1671+ switch (colorSpace) {
1672+ case ColorSpace .sRGB:
1673+ return 0 ;
1674+ case ColorSpace .extendedSRGB:
1675+ return 1 ;
1676+ case ColorSpace .displayP3:
1677+ return 2 ;
1678+ }
1679+ }
1680+
1681+ ColorSpace _indexToColorSpace (int index) {
1682+ switch (index) {
1683+ case 0 :
1684+ return ColorSpace .sRGB;
1685+ case 1 :
1686+ return ColorSpace .extendedSRGB;
1687+ case 2 :
1688+ return ColorSpace .displayP3;
1689+ default :
1690+ throw ArgumentError ('Unknown color space: $index ' );
1691+ }
1692+ }
1693+
16451694/// The format in which image bytes should be returned when using
16461695/// [Image.toByteData] .
16471696// We do not expect to add more encoding formats to the ImageByteFormat enum,
0 commit comments