Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(458)

Side by Side Diff: skia/public/interfaces/bitmap_skbitmap_struct_traits.h

Issue 2014013002: Add SkBitmap StructTraits for skia::mojo::Bitmap. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add mojo/public/cpp/bindings typemap deps. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698