[go: nahoru, domu]

blob: fe5a01a069c54de8178ba6a6895ab7e1d787edd4 [file] [log] [blame]
Avi Drissman09875652022-09-15 20:03:191// Copyright 2018 The Chromium Authors
Saman Samie4d5f8a2018-04-13 19:58:192// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Miyoung Shin40adbd62019-07-30 07:33:405#include "skia/public/mojom/image_info_mojom_traits.h"
Saman Samie4d5f8a2018-04-13 19:58:196
danakjf6993672023-05-04 18:15:307#include "base/notreached.h"
danakjd9c27832022-04-26 22:05:088#include "base/numerics/checked_math.h"
James Cook862440f32020-08-31 19:55:449#include "base/numerics/safe_conversions.h"
James Cook862440f32020-08-31 19:55:4410#include "mojo/public/cpp/bindings/array_data_view.h"
Anton Bikineev3ac3d302021-05-15 17:54:0111#include "third_party/abseil-cpp/absl/types/optional.h"
Kevin Lubick040667a2022-04-07 13:49:0312#include "third_party/skia/include/core/SkColorSpace.h"
Kevin Lubickefd439a2022-07-11 13:50:4513#include "third_party/skia/modules/skcms/skcms.h"
James Cook862440f32020-08-31 19:55:4414
Saman Samie4d5f8a2018-04-13 19:58:1915namespace mojo {
16
danakj630f1ca2020-11-19 19:49:4717namespace {
18
danakjf6993672023-05-04 18:15:3019absl::optional<SkImageInfo> MakeSkImageInfo(
20 SkColorType color_type,
21 SkAlphaType alpha_type,
22 int width,
23 int height,
24 mojo::ArrayDataView<float> color_transfer_function,
25 mojo::ArrayDataView<float> color_to_xyz_matrix) {
26 if (width < 0 || height < 0) {
27 return absl::nullopt;
28 }
danakj630f1ca2020-11-19 19:49:4729 sk_sp<SkColorSpace> color_space;
30 if (!color_transfer_function.is_null() && !color_to_xyz_matrix.is_null()) {
31 const float* data = color_transfer_function.data();
32 skcms_TransferFunction transfer_function;
danakj12e36502023-05-04 22:02:2833 // TODO(crbug.com/1394542): Mojo should validate this array size. We can CHECK it instead
34 // when it does.
danakjf6993672023-05-04 18:15:3035 if (color_transfer_function.size() != 7u) {
36 return absl::nullopt;
37 }
danakj630f1ca2020-11-19 19:49:4738 transfer_function.g = data[0];
39 transfer_function.a = data[1];
40 transfer_function.b = data[2];
41 transfer_function.c = data[3];
42 transfer_function.d = data[4];
43 transfer_function.e = data[5];
44 transfer_function.f = data[6];
45
46 skcms_Matrix3x3 to_xyz_matrix;
danakj12e36502023-05-04 22:02:2847 // TODO(crbug.com/1394542): Mojo should validate this array size. We can CHECK it instead
48 // when it does.
danakjf6993672023-05-04 18:15:3049 if (color_to_xyz_matrix.size() != 9u) {
50 return absl::nullopt;
51 }
danakj630f1ca2020-11-19 19:49:4752 memcpy(to_xyz_matrix.vals, color_to_xyz_matrix.data(), 9 * sizeof(float));
53 color_space = SkColorSpace::MakeRGB(transfer_function, to_xyz_matrix);
54 }
55
56 return SkImageInfo::Make(width, height, color_type, alpha_type,
57 std::move(color_space));
58}
59
60} // namespace
61
Daniel Cheng212e5202020-11-07 01:16:4862// static
63skia::mojom::AlphaType EnumTraits<skia::mojom::AlphaType, SkAlphaType>::ToMojom(
64 SkAlphaType type) {
Saman Samie4d5f8a2018-04-13 19:58:1965 switch (type) {
Daniel Cheng212e5202020-11-07 01:16:4866 case kOpaque_SkAlphaType:
67 return skia::mojom::AlphaType::ALPHA_TYPE_OPAQUE;
68 case kPremul_SkAlphaType:
69 return skia::mojom::AlphaType::PREMUL;
70 case kUnpremul_SkAlphaType:
71 return skia::mojom::AlphaType::UNPREMUL;
Alex Gough405dd512022-05-02 19:23:3872 case kUnknown_SkAlphaType:
73 // Unknown types should not be sent over mojo.
74 break;
Saman Samie4d5f8a2018-04-13 19:58:1975 }
danakjf6993672023-05-04 18:15:3076 NOTREACHED_NORETURN();
Saman Samie4d5f8a2018-04-13 19:58:1977}
78
Daniel Cheng212e5202020-11-07 01:16:4879// static
80bool EnumTraits<skia::mojom::AlphaType, SkAlphaType>::FromMojom(
81 skia::mojom::AlphaType in,
82 SkAlphaType* out) {
83 switch (in) {
Saman Samie4d5f8a2018-04-13 19:58:1984 case skia::mojom::AlphaType::ALPHA_TYPE_OPAQUE:
Daniel Cheng212e5202020-11-07 01:16:4885 *out = kOpaque_SkAlphaType;
86 return true;
Saman Samie4d5f8a2018-04-13 19:58:1987 case skia::mojom::AlphaType::PREMUL:
Daniel Cheng212e5202020-11-07 01:16:4888 *out = kPremul_SkAlphaType;
89 return true;
Saman Samie4d5f8a2018-04-13 19:58:1990 case skia::mojom::AlphaType::UNPREMUL:
Daniel Cheng212e5202020-11-07 01:16:4891 *out = kUnpremul_SkAlphaType;
92 return true;
Alex Gough405dd512022-05-02 19:23:3893 case skia::mojom::AlphaType::UNKNOWN:
94 // Unknown types should not be sent over mojo.
95 return false;
Saman Samie4d5f8a2018-04-13 19:58:1996 }
Daniel Cheng212e5202020-11-07 01:16:4897 return false;
Saman Samie4d5f8a2018-04-13 19:58:1998}
99
Daniel Cheng212e5202020-11-07 01:16:48100// static
101skia::mojom::ColorType EnumTraits<skia::mojom::ColorType, SkColorType>::ToMojom(
102 SkColorType type) {
Saman Samie4d5f8a2018-04-13 19:58:19103 switch (type) {
Saman Samie4d5f8a2018-04-13 19:58:19104 case kAlpha_8_SkColorType:
105 return skia::mojom::ColorType::ALPHA_8;
106 case kRGB_565_SkColorType:
107 return skia::mojom::ColorType::RGB_565;
108 case kARGB_4444_SkColorType:
109 return skia::mojom::ColorType::ARGB_4444;
110 case kRGBA_8888_SkColorType:
111 return skia::mojom::ColorType::RGBA_8888;
112 case kBGRA_8888_SkColorType:
113 return skia::mojom::ColorType::BGRA_8888;
114 case kGray_8_SkColorType:
115 return skia::mojom::ColorType::GRAY_8;
Alex Gough405dd512022-05-02 19:23:38116 case kUnknown_SkColorType:
117 // Fall through as unknown values should not be sent over the wire.
Saman Samie4d5f8a2018-04-13 19:58:19118 default:
119 // Skia has color types not used by Chrome.
120 break;
121 }
danakjf6993672023-05-04 18:15:30122 NOTREACHED_NORETURN();
Saman Samie4d5f8a2018-04-13 19:58:19123}
124
Daniel Cheng212e5202020-11-07 01:16:48125// static
126bool EnumTraits<skia::mojom::ColorType, SkColorType>::FromMojom(
127 skia::mojom::ColorType in,
128 SkColorType* out) {
129 switch (in) {
Daniel Cheng212e5202020-11-07 01:16:48130 case skia::mojom::ColorType::ALPHA_8:
131 *out = kAlpha_8_SkColorType;
132 return true;
133 case skia::mojom::ColorType::RGB_565:
134 *out = kRGB_565_SkColorType;
135 return true;
136 case skia::mojom::ColorType::ARGB_4444:
137 *out = kARGB_4444_SkColorType;
138 return true;
139 case skia::mojom::ColorType::RGBA_8888:
140 *out = kRGBA_8888_SkColorType;
141 return true;
142 case skia::mojom::ColorType::BGRA_8888:
143 *out = kBGRA_8888_SkColorType;
144 return true;
145 case skia::mojom::ColorType::GRAY_8:
146 *out = kGray_8_SkColorType;
147 return true;
148 case skia::mojom::ColorType::DEPRECATED_INDEX_8:
Alex Gough405dd512022-05-02 19:23:38149 case skia::mojom::ColorType::UNKNOWN:
150 // UNKNOWN or unsupported values should not be sent over mojo.
Daniel Cheng212e5202020-11-07 01:16:48151 break;
Saman Samie4d5f8a2018-04-13 19:58:19152 }
Daniel Cheng212e5202020-11-07 01:16:48153 return false;
Saman Samie4d5f8a2018-04-13 19:58:19154}
155
156// static
Saman Samie4d5f8a2018-04-13 19:58:19157uint32_t StructTraits<skia::mojom::ImageInfoDataView, SkImageInfo>::width(
158 const SkImageInfo& info) {
James Cook862440f32020-08-31 19:55:44159 // Negative width images are invalid.
160 return base::checked_cast<uint32_t>(info.width());
Saman Samie4d5f8a2018-04-13 19:58:19161}
162
163// static
164uint32_t StructTraits<skia::mojom::ImageInfoDataView, SkImageInfo>::height(
165 const SkImageInfo& info) {
James Cook862440f32020-08-31 19:55:44166 // Negative height images are invalid.
167 return base::checked_cast<uint32_t>(info.height());
168}
169
170// static
Anton Bikineev3ac3d302021-05-15 17:54:01171absl::optional<std::vector<float>>
James Cook862440f32020-08-31 19:55:44172StructTraits<skia::mojom::ImageInfoDataView,
173 SkImageInfo>::color_transfer_function(const SkImageInfo& info) {
174 SkColorSpace* color_space = info.colorSpace();
danakjf6993672023-05-04 18:15:30175 if (!color_space) {
Anton Bikineev3ac3d302021-05-15 17:54:01176 return absl::nullopt;
danakjf6993672023-05-04 18:15:30177 }
James Cook862440f32020-08-31 19:55:44178 skcms_TransferFunction fn;
179 color_space->transferFn(&fn);
180 return std::vector<float>({fn.g, fn.a, fn.b, fn.c, fn.d, fn.e, fn.f});
181}
182
183// static
Anton Bikineev3ac3d302021-05-15 17:54:01184absl::optional<std::vector<float>>
James Cook862440f32020-08-31 19:55:44185StructTraits<skia::mojom::ImageInfoDataView, SkImageInfo>::color_to_xyz_matrix(
186 const SkImageInfo& info) {
187 SkColorSpace* color_space = info.colorSpace();
danakjf6993672023-05-04 18:15:30188 if (!color_space) {
Anton Bikineev3ac3d302021-05-15 17:54:01189 return absl::nullopt;
danakjf6993672023-05-04 18:15:30190 }
James Cook862440f32020-08-31 19:55:44191 skcms_Matrix3x3 to_xyz_matrix;
192 CHECK(color_space->toXYZD50(&to_xyz_matrix));
193
194 // C-style arrays-of-arrays are tightly packed, so directly copy into vector.
195 static_assert(sizeof(to_xyz_matrix.vals) == sizeof(float) * 9,
196 "matrix must be 3x3 floats");
197 float* values = &to_xyz_matrix.vals[0][0];
198 return std::vector<float>(values, values + 9);
Saman Samie4d5f8a2018-04-13 19:58:19199}
200
201// static
202bool StructTraits<skia::mojom::ImageInfoDataView, SkImageInfo>::Read(
203 skia::mojom::ImageInfoDataView data,
204 SkImageInfo* info) {
Daniel Cheng212e5202020-11-07 01:16:48205 SkColorType color_type;
206 SkAlphaType alpha_type;
207
danakjf6993672023-05-04 18:15:30208 if (!data.ReadColorType(&color_type) || !data.ReadAlphaType(&alpha_type)) {
Daniel Cheng212e5202020-11-07 01:16:48209 return false;
danakjf6993672023-05-04 18:15:30210 }
Daniel Cheng212e5202020-11-07 01:16:48211
James Cook862440f32020-08-31 19:55:44212 mojo::ArrayDataView<float> color_transfer_function;
213 data.GetColorTransferFunctionDataView(&color_transfer_function);
214 mojo::ArrayDataView<float> color_to_xyz_matrix;
215 data.GetColorToXyzMatrixDataView(&color_to_xyz_matrix);
216
danakjd9c27832022-04-26 22:05:08217 // The ImageInfo wire types are uint32_t, but the Skia type uses int, and the
218 // values can't be negative.
219 auto width = base::MakeCheckedNum(data.width()).Cast<int>();
220 auto height = base::MakeCheckedNum(data.height()).Cast<int>();
danakjf6993672023-05-04 18:15:30221 if (!width.IsValid() || !height.IsValid()) {
danakjd9c27832022-04-26 22:05:08222 return false;
danakjf6993672023-05-04 18:15:30223 }
danakjd9c27832022-04-26 22:05:08224
danakjf6993672023-05-04 18:15:30225 absl::optional<SkImageInfo> maybe_info = MakeSkImageInfo(
danakjd9c27832022-04-26 22:05:08226 color_type, alpha_type, width.ValueOrDie(), height.ValueOrDie(),
227 std::move(color_transfer_function), std::move(color_to_xyz_matrix));
danakjf6993672023-05-04 18:15:30228 if (!maybe_info.has_value()) {
229 return false;
230 }
231 *info = *maybe_info;
danakj630f1ca2020-11-19 19:49:47232 return true;
233}
234
235// static
236bool StructTraits<skia::mojom::BitmapN32ImageInfoDataView, SkImageInfo>::Read(
237 skia::mojom::BitmapN32ImageInfoDataView data,
238 SkImageInfo* info) {
239 SkAlphaType alpha_type;
danakjf6993672023-05-04 18:15:30240 if (!data.ReadAlphaType(&alpha_type)) {
Daniel Cheng212e5202020-11-07 01:16:48241 return false;
danakjf6993672023-05-04 18:15:30242 }
James Cook862440f32020-08-31 19:55:44243
danakj630f1ca2020-11-19 19:49:47244 mojo::ArrayDataView<float> color_transfer_function;
245 data.GetColorTransferFunctionDataView(&color_transfer_function);
246 mojo::ArrayDataView<float> color_to_xyz_matrix;
247 data.GetColorToXyzMatrixDataView(&color_to_xyz_matrix);
James Cook862440f32020-08-31 19:55:44248
danakjd9c27832022-04-26 22:05:08249 // The ImageInfo wire types are uint32_t, but the Skia type uses int, and the
250 // values can't be negative.
251 auto width = base::MakeCheckedNum(data.width()).Cast<int>();
252 auto height = base::MakeCheckedNum(data.height()).Cast<int>();
danakjf6993672023-05-04 18:15:30253 if (!width.IsValid() || !height.IsValid()) {
danakjd9c27832022-04-26 22:05:08254 return false;
danakjf6993672023-05-04 18:15:30255 }
danakjd9c27832022-04-26 22:05:08256
danakjf6993672023-05-04 18:15:30257 absl::optional<SkImageInfo> maybe_info = MakeSkImageInfo(
danakjd9c27832022-04-26 22:05:08258 kN32_SkColorType, alpha_type, width.ValueOrDie(), height.ValueOrDie(),
259 std::move(color_transfer_function), std::move(color_to_xyz_matrix));
danakjf6993672023-05-04 18:15:30260 if (!maybe_info.has_value()) {
261 return false;
262 }
263 *info = *maybe_info;
Saman Samie4d5f8a2018-04-13 19:58:19264 return true;
265}
266
267} // namespace mojo