Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 3576956

Browse files
committed
started sending down the wider colors in paint
1 parent c52c1d8 commit 3576956

File tree

2 files changed

+108
-38
lines changed

2 files changed

+108
-38
lines changed

lib/ui/painting.dart

Lines changed: 67 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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,

lib/ui/painting/paint.cc

Lines changed: 41 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,25 @@
2121
namespace flutter {
2222

2323
// Indices for 32bit values.
24+
// Must match //lib/ui/painting.dart.
2425
constexpr int kIsAntiAliasIndex = 0;
25-
constexpr int kColorIndex = 1;
26-
constexpr int kBlendModeIndex = 2;
27-
constexpr int kStyleIndex = 3;
28-
constexpr int kStrokeWidthIndex = 4;
29-
constexpr int kStrokeCapIndex = 5;
30-
constexpr int kStrokeJoinIndex = 6;
31-
constexpr int kStrokeMiterLimitIndex = 7;
32-
constexpr int kFilterQualityIndex = 8;
33-
constexpr int kMaskFilterIndex = 9;
34-
constexpr int kMaskFilterBlurStyleIndex = 10;
35-
constexpr int kMaskFilterSigmaIndex = 11;
36-
constexpr int kInvertColorIndex = 12;
37-
constexpr size_t kDataByteCount = 52; // 4 * (last index + 1)
26+
constexpr int kColorRedIndex = 1;
27+
constexpr int kColorGreenIndex = 2;
28+
constexpr int kColorBlueIndex = 3;
29+
constexpr int kColorAlphaIndex = 4;
30+
constexpr int kColorSpaceIndex = 5;
31+
constexpr int kBlendModeIndex = 6;
32+
constexpr int kStyleIndex = 7;
33+
constexpr int kStrokeWidthIndex = 8;
34+
constexpr int kStrokeCapIndex = 9;
35+
constexpr int kStrokeJoinIndex = 10;
36+
constexpr int kStrokeMiterLimitIndex = 11;
37+
constexpr int kFilterQualityIndex = 12;
38+
constexpr int kMaskFilterIndex = 13;
39+
constexpr int kMaskFilterBlurStyleIndex = 14;
40+
constexpr int kMaskFilterSigmaIndex = 15;
41+
constexpr int kInvertColorIndex = 16;
42+
constexpr size_t kDataByteCount = 68; // 4 * (last index + 1)
3843
static_assert(kDataByteCount == sizeof(uint32_t) * (kInvertColorIndex + 1),
3944
"kDataByteCount must match the size of the data array.");
4045

@@ -44,9 +49,6 @@ constexpr int kColorFilterIndex = 1;
4449
constexpr int kImageFilterIndex = 2;
4550
constexpr int kObjectCount = 3; // One larger than largest object index.
4651

47-
// Must be kept in sync with the default in painting.dart.
48-
constexpr uint32_t kColorDefault = 0xFF000000;
49-
5052
// Must be kept in sync with the default in painting.dart.
5153
constexpr uint32_t kBlendModeDefault =
5254
static_cast<uint32_t>(SkBlendMode::kSrcOver);
@@ -58,6 +60,27 @@ constexpr float kStrokeMiterLimitDefault = 4.0f;
5860
// Must be kept in sync with the MaskFilter private constants in painting.dart.
5961
enum MaskFilterType { kNull, kBlur };
6062

63+
namespace {
64+
DlColor ReadColor(const tonic::DartByteData& byte_data) {
65+
const uint32_t* uint_data = static_cast<const uint32_t*>(byte_data.data());
66+
const float* float_data = static_cast<const float*>(byte_data.data());
67+
68+
float red = float_data[kColorRedIndex];
69+
float green = float_data[kColorGreenIndex];
70+
float blue = float_data[kColorBlueIndex];
71+
// Invert alpha so 0 initialized buffer has default value;
72+
float alpha = 1.f - float_data[kColorAlphaIndex];
73+
uint32_t colorspace = uint_data[kColorSpaceIndex];
74+
(void)colorspace;
75+
uint32_t encoded_color = static_cast<uint8_t>(alpha * 255.f) << 24 | //
76+
static_cast<uint8_t>(red * 255.f) << 16 | //
77+
static_cast<uint8_t>(green * 255.f) << 8 | //
78+
static_cast<uint8_t>(blue * 255.f) << 0;
79+
// TODO(gaaclarke): Pass down color info to DlColor.
80+
return DlColor(encoded_color);
81+
}
82+
} // namespace
83+
6184
Paint::Paint(Dart_Handle paint_objects, Dart_Handle paint_data)
6285
: paint_objects_(paint_objects), paint_data_(paint_data) {}
6386

@@ -137,8 +160,7 @@ const DlPaint* Paint::paint(DlPaint& paint,
137160
}
138161

139162
if (flags.applies_alpha_or_color()) {
140-
uint32_t encoded_color = uint_data[kColorIndex];
141-
paint.setColor(DlColor(encoded_color ^ kColorDefault));
163+
paint.setColor(ReadColor(byte_data));
142164
}
143165

144166
if (flags.applies_blend()) {
@@ -238,8 +260,7 @@ void Paint::toDlPaint(DlPaint& paint) const {
238260

239261
paint.setAntiAlias(uint_data[kIsAntiAliasIndex] == 0);
240262

241-
uint32_t encoded_color = uint_data[kColorIndex];
242-
paint.setColor(DlColor(encoded_color ^ kColorDefault));
263+
paint.setColor(ReadColor(byte_data));
243264

244265
uint32_t encoded_blend_mode = uint_data[kBlendModeIndex];
245266
uint32_t blend_mode = encoded_blend_mode ^ kBlendModeDefault;

0 commit comments

Comments
 (0)