OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef SKIA_PUBLIC_INTERFACES_BITMAP_SKBITMAP_STRUCT_TRAITS_H_ | |
6 #define SKIA_PUBLIC_INTERFACES_BITMAP_SKBITMAP_STRUCT_TRAITS_H_ | |
7 | |
8 #include "mojo/public/cpp/bindings/array_traits.h" | |
9 #include "third_party/skia/include/core/SkBitmap.h" | |
yzshen1
2016/05/26 22:44:13
Please order them alphabetically.
msw
2016/05/27 19:34:11
Done.
| |
10 #include "skia/public/interfaces/bitmap.mojom.h" | |
11 | |
12 namespace mojo { | |
13 | |
14 namespace { | |
15 | |
16 SkColorType MojoColorTypeToSk(skia::mojom::ColorType type) { | |
yzshen1
2016/05/26 22:44:13
Can you move the impl code of this file into a .cc
Tom Sepez
2016/05/26 22:57:34
So this is a header file and we risk instantiating
msw
2016/05/27 19:34:11
Moved impls to a cc file.
msw
2016/05/27 19:34:11
I couldn't get forward decls working, but I split
| |
17 switch (type) { | |
18 case skia::mojom::ColorType::UNKNOWN: | |
19 return kUnknown_SkColorType; | |
20 case skia::mojom::ColorType::ALPHA_8: | |
21 return kAlpha_8_SkColorType; | |
22 case skia::mojom::ColorType::RGB_565: | |
23 return kRGB_565_SkColorType; | |
24 case skia::mojom::ColorType::ARGB_4444: | |
25 return kARGB_4444_SkColorType; | |
26 case skia::mojom::ColorType::RGBA_8888: | |
27 return kRGBA_8888_SkColorType; | |
28 case skia::mojom::ColorType::BGRA_8888: | |
29 return kBGRA_8888_SkColorType; | |
30 case skia::mojom::ColorType::INDEX_8: | |
31 return kIndex_8_SkColorType; | |
32 case skia::mojom::ColorType::GRAY_8: | |
33 return kGray_8_SkColorType; | |
34 default: | |
yzshen1
2016/05/26 22:44:13
Please consider removing "default" and also line 3
msw
2016/05/27 19:34:11
Done.
msw
2016/05/31 23:02:47
I had to restore the post-switch return statements
| |
35 NOTREACHED(); | |
36 } | |
37 return kUnknown_SkColorType; | |
38 } | |
39 | |
40 SkAlphaType MojoAlphaTypeToSk(skia::mojom::AlphaType type) { | |
41 switch (type) { | |
42 case skia::mojom::AlphaType::UNKNOWN: | |
43 return kUnknown_SkAlphaType; | |
44 case skia::mojom::AlphaType::ALPHA_TYPE_OPAQUE: | |
45 return kOpaque_SkAlphaType; | |
46 case skia::mojom::AlphaType::PREMUL: | |
47 return kPremul_SkAlphaType; | |
48 case skia::mojom::AlphaType::UNPREMUL: | |
49 return kUnpremul_SkAlphaType; | |
50 default: | |
51 NOTREACHED(); | |
52 } | |
53 return kUnknown_SkAlphaType; | |
54 } | |
55 | |
56 SkColorProfileType MojoProfileTypeToSk(skia::mojom::ColorProfileType type) { | |
57 switch (type) { | |
58 case skia::mojom::ColorProfileType::LINEAR: | |
59 return kLinear_SkColorProfileType; | |
60 case skia::mojom::ColorProfileType::SRGB: | |
61 return kSRGB_SkColorProfileType; | |
62 default: | |
63 NOTREACHED(); | |
64 } | |
65 return kLinear_SkColorProfileType; | |
66 } | |
67 | |
68 skia::mojom::ColorType SkColorTypeToMojo(SkColorType type) { | |
69 switch (type) { | |
70 case kUnknown_SkColorType: | |
71 return skia::mojom::ColorType::UNKNOWN; | |
72 case kAlpha_8_SkColorType: | |
73 return skia::mojom::ColorType::ALPHA_8; | |
74 case kRGB_565_SkColorType: | |
75 return skia::mojom::ColorType::RGB_565; | |
76 case kARGB_4444_SkColorType: | |
77 return skia::mojom::ColorType::ARGB_4444; | |
78 case kRGBA_8888_SkColorType: | |
79 return skia::mojom::ColorType::RGBA_8888; | |
80 case kBGRA_8888_SkColorType: | |
81 return skia::mojom::ColorType::BGRA_8888; | |
82 case kIndex_8_SkColorType: | |
83 return skia::mojom::ColorType::INDEX_8; | |
84 case kGray_8_SkColorType: | |
85 return skia::mojom::ColorType::GRAY_8; | |
86 default: | |
87 NOTREACHED(); | |
88 } | |
89 return skia::mojom::ColorType::UNKNOWN; | |
90 } | |
91 | |
92 skia::mojom::AlphaType SkAlphaTypeToMojo(SkAlphaType type) { | |
93 switch (type) { | |
94 case kUnknown_SkAlphaType: | |
95 return skia::mojom::AlphaType::UNKNOWN; | |
96 case kOpaque_SkAlphaType: | |
97 return skia::mojom::AlphaType::ALPHA_TYPE_OPAQUE; | |
98 case kPremul_SkAlphaType: | |
99 return skia::mojom::AlphaType::PREMUL; | |
100 case kUnpremul_SkAlphaType: | |
101 return skia::mojom::AlphaType::UNPREMUL; | |
102 default: | |
103 NOTREACHED(); | |
104 } | |
105 return skia::mojom::AlphaType::UNKNOWN; | |
106 } | |
107 | |
108 skia::mojom::ColorProfileType SkProfileTypeToMojo(SkColorProfileType type) { | |
109 switch (type) { | |
110 case kLinear_SkColorProfileType: | |
111 return skia::mojom::ColorProfileType::LINEAR; | |
112 case kSRGB_SkColorProfileType: | |
113 return skia::mojom::ColorProfileType::SRGB; | |
114 default: | |
115 NOTREACHED(); | |
116 } | |
117 return skia::mojom::ColorProfileType::LINEAR; | |
118 } | |
119 | |
120 } // namespace | |
121 | |
122 // A buffer used to read pixel data directly from BitmapDataView to SkBitmap. | |
123 struct BitmapBuffer { | |
124 uint8_t* data = nullptr; | |
125 size_t size = 0; | |
126 }; | |
127 | |
128 // ArrayTraits needed for ReadPixelData use with BitmapBuffer. | |
129 template <> | |
130 struct ArrayTraits<BitmapBuffer> { | |
131 using Element = uint8_t; | |
132 static size_t GetSize(const BitmapBuffer& b) { return b.size; } | |
133 static uint8_t* GetData(BitmapBuffer& b) { return b.data; } | |
134 static const uint8_t* GetData(const BitmapBuffer& b) { return b.data; } | |
135 static uint8_t* GetAt(BitmapBuffer& b, size_t i) { return b.data + i; } | |
136 static const uint8_t* GetAt(const BitmapBuffer& b, size_t i) { | |
137 return b.data + i; | |
138 } | |
139 static void Resize(BitmapBuffer& b, size_t size) { CHECK_EQ(size, b.size); } | |
140 }; | |
141 | |
142 template <> | |
143 struct StructTraits<skia::mojom::Bitmap, SkBitmap> { | |
yzshen1
2016/05/26 22:44:13
SkBitmap supports null state; besides, we do have
msw
2016/05/27 19:34:11
Done.
| |
144 static skia::mojom::ColorType color_type(const SkBitmap& r) { | |
145 return SkColorTypeToMojo(r.colorType()); | |
146 } | |
147 static skia::mojom::AlphaType alpha_type(const SkBitmap& r) { | |
148 return SkAlphaTypeToMojo(r.alphaType()); | |
149 } | |
150 static skia::mojom::ColorProfileType profile_type(const SkBitmap& r) { | |
151 return SkProfileTypeToMojo(r.profileType()); | |
152 } | |
153 static uint32_t width(const SkBitmap& r) { | |
154 return r.width() < 0 ? 0 : static_cast<uint32_t>(r.width()); | |
yzshen1
2016/05/26 22:44:13
Out of curiosity: when will this be < 0?
msw
2016/05/27 19:34:11
I don't know of any legitimate cases, this is just
| |
155 } | |
156 static uint32_t height(const SkBitmap& r) { | |
157 return r.height() < 0 ? 0 : static_cast<uint32_t>(r.height()); | |
158 } | |
159 | |
160 static mojo::Array<uint8_t> pixel_data(const SkBitmap& r) { | |
yzshen1
2016/05/26 22:44:13
Now that you have ArrayTraits<BitmapBuffer> define
msw
2016/05/27 19:34:11
Done.
| |
161 // NOTE: This code doesn't correctly serialize Index8 bitmaps. | |
162 const SkImageInfo& info = r.info(); | |
163 size_t size = r.getSize(); | |
164 size_t row_bytes = r.rowBytes(); | |
165 mojo::Array<uint8_t> pixel_data = mojo::Array<uint8_t>::New(size); | |
166 if (!r.readPixels(info, &pixel_data[0], row_bytes, 0, 0)) | |
167 return nullptr; | |
168 return pixel_data; | |
169 } | |
170 | |
171 static bool Read(skia::mojom::BitmapDataView data, SkBitmap* out) { | |
172 // TODO: Ensure width and height are reasonable, eg. <= kMaxBitmapSize? | |
yzshen1
2016/05/26 22:44:13
Should this be addressed in this CL?
msw
2016/05/27 19:34:11
No, the converter didn't check, so it's fine to le
| |
173 *out = SkBitmap(); | |
174 if (!out->tryAllocPixels(SkImageInfo::Make( | |
175 data.width(), data.height(), MojoColorTypeToSk(data.color_type()), | |
176 MojoAlphaTypeToSk(data.alpha_type()), | |
177 MojoProfileTypeToSk(data.profile_type())))) { | |
178 return false; | |
179 } | |
180 | |
181 if (static_cast<uint32_t>(out->width()) != data.width() || | |
182 static_cast<uint32_t>(out->height()) != data.height() || | |
183 !out->getPixels()) { | |
184 return false; | |
185 } | |
186 | |
187 BitmapBuffer bitmap_buffer; | |
188 bitmap_buffer.data = static_cast<uint8_t*>(out->getPixels()); | |
189 bitmap_buffer.size = out->getSize(); | |
190 return data.ReadPixelData(&bitmap_buffer); | |
191 } | |
192 }; | |
193 | |
194 } // namespace mojo | |
195 | |
196 #endif // SKIA_PUBLIC_INTERFACES_BITMAP_SKBITMAP_STRUCT_TRAITS_H_ | |
OLD | NEW |