Index: skia/public/interfaces/bitmap_skbitmap_struct_traits.h |
diff --git a/skia/public/interfaces/bitmap_skbitmap_struct_traits.h b/skia/public/interfaces/bitmap_skbitmap_struct_traits.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..11c7766d9ce39214980ec6f627bb6c463185169d |
--- /dev/null |
+++ b/skia/public/interfaces/bitmap_skbitmap_struct_traits.h |
@@ -0,0 +1,196 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef SKIA_PUBLIC_INTERFACES_BITMAP_SKBITMAP_STRUCT_TRAITS_H_ |
+#define SKIA_PUBLIC_INTERFACES_BITMAP_SKBITMAP_STRUCT_TRAITS_H_ |
+ |
+#include "mojo/public/cpp/bindings/array_traits.h" |
+#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.
|
+#include "skia/public/interfaces/bitmap.mojom.h" |
+ |
+namespace mojo { |
+ |
+namespace { |
+ |
+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
|
+ switch (type) { |
+ case skia::mojom::ColorType::UNKNOWN: |
+ return kUnknown_SkColorType; |
+ case skia::mojom::ColorType::ALPHA_8: |
+ return kAlpha_8_SkColorType; |
+ case skia::mojom::ColorType::RGB_565: |
+ return kRGB_565_SkColorType; |
+ case skia::mojom::ColorType::ARGB_4444: |
+ return kARGB_4444_SkColorType; |
+ case skia::mojom::ColorType::RGBA_8888: |
+ return kRGBA_8888_SkColorType; |
+ case skia::mojom::ColorType::BGRA_8888: |
+ return kBGRA_8888_SkColorType; |
+ case skia::mojom::ColorType::INDEX_8: |
+ return kIndex_8_SkColorType; |
+ case skia::mojom::ColorType::GRAY_8: |
+ return kGray_8_SkColorType; |
+ 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
|
+ NOTREACHED(); |
+ } |
+ return kUnknown_SkColorType; |
+} |
+ |
+SkAlphaType MojoAlphaTypeToSk(skia::mojom::AlphaType type) { |
+ switch (type) { |
+ case skia::mojom::AlphaType::UNKNOWN: |
+ return kUnknown_SkAlphaType; |
+ case skia::mojom::AlphaType::ALPHA_TYPE_OPAQUE: |
+ return kOpaque_SkAlphaType; |
+ case skia::mojom::AlphaType::PREMUL: |
+ return kPremul_SkAlphaType; |
+ case skia::mojom::AlphaType::UNPREMUL: |
+ return kUnpremul_SkAlphaType; |
+ default: |
+ NOTREACHED(); |
+ } |
+ return kUnknown_SkAlphaType; |
+} |
+ |
+SkColorProfileType MojoProfileTypeToSk(skia::mojom::ColorProfileType type) { |
+ switch (type) { |
+ case skia::mojom::ColorProfileType::LINEAR: |
+ return kLinear_SkColorProfileType; |
+ case skia::mojom::ColorProfileType::SRGB: |
+ return kSRGB_SkColorProfileType; |
+ default: |
+ NOTREACHED(); |
+ } |
+ return kLinear_SkColorProfileType; |
+} |
+ |
+skia::mojom::ColorType SkColorTypeToMojo(SkColorType type) { |
+ switch (type) { |
+ case kUnknown_SkColorType: |
+ return skia::mojom::ColorType::UNKNOWN; |
+ case kAlpha_8_SkColorType: |
+ return skia::mojom::ColorType::ALPHA_8; |
+ case kRGB_565_SkColorType: |
+ return skia::mojom::ColorType::RGB_565; |
+ case kARGB_4444_SkColorType: |
+ return skia::mojom::ColorType::ARGB_4444; |
+ case kRGBA_8888_SkColorType: |
+ return skia::mojom::ColorType::RGBA_8888; |
+ case kBGRA_8888_SkColorType: |
+ return skia::mojom::ColorType::BGRA_8888; |
+ case kIndex_8_SkColorType: |
+ return skia::mojom::ColorType::INDEX_8; |
+ case kGray_8_SkColorType: |
+ return skia::mojom::ColorType::GRAY_8; |
+ default: |
+ NOTREACHED(); |
+ } |
+ return skia::mojom::ColorType::UNKNOWN; |
+} |
+ |
+skia::mojom::AlphaType SkAlphaTypeToMojo(SkAlphaType type) { |
+ switch (type) { |
+ case kUnknown_SkAlphaType: |
+ return skia::mojom::AlphaType::UNKNOWN; |
+ case kOpaque_SkAlphaType: |
+ return skia::mojom::AlphaType::ALPHA_TYPE_OPAQUE; |
+ case kPremul_SkAlphaType: |
+ return skia::mojom::AlphaType::PREMUL; |
+ case kUnpremul_SkAlphaType: |
+ return skia::mojom::AlphaType::UNPREMUL; |
+ default: |
+ NOTREACHED(); |
+ } |
+ return skia::mojom::AlphaType::UNKNOWN; |
+} |
+ |
+skia::mojom::ColorProfileType SkProfileTypeToMojo(SkColorProfileType type) { |
+ switch (type) { |
+ case kLinear_SkColorProfileType: |
+ return skia::mojom::ColorProfileType::LINEAR; |
+ case kSRGB_SkColorProfileType: |
+ return skia::mojom::ColorProfileType::SRGB; |
+ default: |
+ NOTREACHED(); |
+ } |
+ return skia::mojom::ColorProfileType::LINEAR; |
+} |
+ |
+} // namespace |
+ |
+// A buffer used to read pixel data directly from BitmapDataView to SkBitmap. |
+struct BitmapBuffer { |
+ uint8_t* data = nullptr; |
+ size_t size = 0; |
+}; |
+ |
+// ArrayTraits needed for ReadPixelData use with BitmapBuffer. |
+template <> |
+struct ArrayTraits<BitmapBuffer> { |
+ using Element = uint8_t; |
+ static size_t GetSize(const BitmapBuffer& b) { return b.size; } |
+ static uint8_t* GetData(BitmapBuffer& b) { return b.data; } |
+ static const uint8_t* GetData(const BitmapBuffer& b) { return b.data; } |
+ static uint8_t* GetAt(BitmapBuffer& b, size_t i) { return b.data + i; } |
+ static const uint8_t* GetAt(const BitmapBuffer& b, size_t i) { |
+ return b.data + i; |
+ } |
+ static void Resize(BitmapBuffer& b, size_t size) { CHECK_EQ(size, b.size); } |
+}; |
+ |
+template <> |
+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.
|
+ static skia::mojom::ColorType color_type(const SkBitmap& r) { |
+ return SkColorTypeToMojo(r.colorType()); |
+ } |
+ static skia::mojom::AlphaType alpha_type(const SkBitmap& r) { |
+ return SkAlphaTypeToMojo(r.alphaType()); |
+ } |
+ static skia::mojom::ColorProfileType profile_type(const SkBitmap& r) { |
+ return SkProfileTypeToMojo(r.profileType()); |
+ } |
+ static uint32_t width(const SkBitmap& r) { |
+ 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
|
+ } |
+ static uint32_t height(const SkBitmap& r) { |
+ return r.height() < 0 ? 0 : static_cast<uint32_t>(r.height()); |
+ } |
+ |
+ 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.
|
+ // NOTE: This code doesn't correctly serialize Index8 bitmaps. |
+ const SkImageInfo& info = r.info(); |
+ size_t size = r.getSize(); |
+ size_t row_bytes = r.rowBytes(); |
+ mojo::Array<uint8_t> pixel_data = mojo::Array<uint8_t>::New(size); |
+ if (!r.readPixels(info, &pixel_data[0], row_bytes, 0, 0)) |
+ return nullptr; |
+ return pixel_data; |
+ } |
+ |
+ static bool Read(skia::mojom::BitmapDataView data, SkBitmap* out) { |
+ // 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
|
+ *out = SkBitmap(); |
+ if (!out->tryAllocPixels(SkImageInfo::Make( |
+ data.width(), data.height(), MojoColorTypeToSk(data.color_type()), |
+ MojoAlphaTypeToSk(data.alpha_type()), |
+ MojoProfileTypeToSk(data.profile_type())))) { |
+ return false; |
+ } |
+ |
+ if (static_cast<uint32_t>(out->width()) != data.width() || |
+ static_cast<uint32_t>(out->height()) != data.height() || |
+ !out->getPixels()) { |
+ return false; |
+ } |
+ |
+ BitmapBuffer bitmap_buffer; |
+ bitmap_buffer.data = static_cast<uint8_t*>(out->getPixels()); |
+ bitmap_buffer.size = out->getSize(); |
+ return data.ReadPixelData(&bitmap_buffer); |
+ } |
+}; |
+ |
+} // namespace mojo |
+ |
+#endif // SKIA_PUBLIC_INTERFACES_BITMAP_SKBITMAP_STRUCT_TRAITS_H_ |