Chromium Code Reviews| 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 |