@@ -1185,22 +1185,31 @@ final class Paint {
1185
1185
@pragma ('vm:entry-point' )
1186
1186
final ByteData _data = ByteData (_kDataByteCount);
1187
1187
1188
+ // Must match //lib/ui/painting/paint.cc.
1188
1189
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 ;
1201
1206
1202
1207
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 ;
1204
1213
static const int _kBlendModeOffset = _kBlendModeIndex << 2 ;
1205
1214
static const int _kStyleOffset = _kStyleIndex << 2 ;
1206
1215
static const int _kStrokeWidthOffset = _kStrokeWidthIndex << 2 ;
@@ -1214,7 +1223,7 @@ final class Paint {
1214
1223
static const int _kInvertColorOffset = _kInvertColorIndex << 2 ;
1215
1224
1216
1225
// 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).
1218
1227
1219
1228
// Binary format must match the deserialization code in paint.cc.
1220
1229
// C++ unit tests access this.
@@ -1260,12 +1269,28 @@ final class Paint {
1260
1269
/// This color is not used when compositing. To colorize a layer, use
1261
1270
/// [colorFilter] .
1262
1271
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);
1265
1285
}
1286
+
1266
1287
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);
1269
1294
}
1270
1295
1271
1296
// Must be kept in sync with the default in paint.cc.
@@ -1642,6 +1667,30 @@ enum ColorSpace {
1642
1667
displayP3,
1643
1668
}
1644
1669
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
+
1645
1694
/// The format in which image bytes should be returned when using
1646
1695
/// [Image.toByteData] .
1647
1696
// We do not expect to add more encoding formats to the ImageByteFormat enum,
0 commit comments