Commit e4d5f8a7 authored by Saman Sami's avatar Saman Sami Committed by Commit Bot

Extract mojom for SkImageInfo out of SkBitmap's mojom

I would like to be able to send a shared memory handle + SkImageInfo
and construct an SkBitmap on the receiver's side.

TBR=reed@google.com

Bug: 831744
Cq-Include-Trybots: luci.chromium.try:mac_optional_gpu_tests_rel;master.tryserver.chromium.win:win10_chromium_x64_rel_ng
Change-Id: If8be0cd2d876100f2430aed6195263cfcc415213
Reviewed-on: https://chromium-review.googlesource.com/1007767
Commit-Queue: Saman Sami <samans@chromium.org>
Reviewed-by: default avatarMike Reed <reed@chromium.org>
Reviewed-by: default avatarMiguel Casas <mcasas@chromium.org>
Reviewed-by: default avatarTom Sepez <tsepez@chromium.org>
Cr-Commit-Position: refs/heads/master@{#550732}
parent 464ebff9
...@@ -17,8 +17,9 @@ import java.nio.ByteBuffer; ...@@ -17,8 +17,9 @@ import java.nio.ByteBuffer;
*/ */
public class BitmapUtils { public class BitmapUtils {
public static Bitmap convertToBitmap(org.chromium.skia.mojom.Bitmap bitmapData) { public static Bitmap convertToBitmap(org.chromium.skia.mojom.Bitmap bitmapData) {
int width = bitmapData.width; if (bitmapData.imageInfo == null) return null;
int height = bitmapData.height; int width = bitmapData.imageInfo.width;
int height = bitmapData.imageInfo.height;
final long numPixels = (long) width * height; final long numPixels = (long) width * height;
// TODO(mcasas): https://crbug.com/670028 homogeneize overflow checking. // TODO(mcasas): https://crbug.com/670028 homogeneize overflow checking.
if (bitmapData.pixelData == null || width <= 0 || height <= 0 if (bitmapData.pixelData == null || width <= 0 || height <= 0
...@@ -26,8 +27,8 @@ public class BitmapUtils { ...@@ -26,8 +27,8 @@ public class BitmapUtils {
return null; return null;
} }
if (bitmapData.colorType != ColorType.RGBA_8888 if (bitmapData.imageInfo.colorType != ColorType.RGBA_8888
&& bitmapData.colorType != ColorType.BGRA_8888) { && bitmapData.imageInfo.colorType != ColorType.BGRA_8888) {
return null; return null;
} }
......
...@@ -45,9 +45,9 @@ public class FaceDetectionImpl implements FaceDetection { ...@@ -45,9 +45,9 @@ public class FaceDetectionImpl implements FaceDetection {
// FaceDetector requires an even width, so pad the image if the width is odd. // FaceDetector requires an even width, so pad the image if the width is odd.
// https://developer.android.com/reference/android/media/FaceDetector.html#FaceDetector(int, int, int) // https://developer.android.com/reference/android/media/FaceDetector.html#FaceDetector(int, int, int)
final int width = bitmapData.width + (bitmapData.width % 2); final int width = bitmapData.imageInfo.width + (bitmapData.imageInfo.width % 2);
final int height = bitmapData.height; final int height = bitmapData.imageInfo.height;
if (width != bitmapData.width) { if (width != bitmapData.imageInfo.width) {
Bitmap paddedBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Bitmap paddedBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(paddedBitmap); Canvas canvas = new Canvas(paddedBitmap);
canvas.drawBitmap(bitmap, 0, 0, null); canvas.drawBitmap(bitmap, 0, 0, null);
......
...@@ -103,12 +103,12 @@ public class FaceDetectionImplTest { ...@@ -103,12 +103,12 @@ public class FaceDetectionImplTest {
@Feature({"ShapeDetection"}) @Feature({"ShapeDetection"})
public void testDetectHandlesOddWidthWithAndroidAPI() throws Exception { public void testDetectHandlesOddWidthWithAndroidAPI() throws Exception {
// Pad the image so that the width is odd. // Pad the image so that the width is odd.
Bitmap paddedBitmap = Bitmap.createBitmap(MONA_LISA_BITMAP.width + 1, Bitmap paddedBitmap = Bitmap.createBitmap(MONA_LISA_BITMAP.imageInfo.width + 1,
MONA_LISA_BITMAP.height, Bitmap.Config.ARGB_8888); MONA_LISA_BITMAP.imageInfo.height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(paddedBitmap); Canvas canvas = new Canvas(paddedBitmap);
canvas.drawBitmap(BitmapUtils.convertToBitmap(MONA_LISA_BITMAP), 0, 0, null); canvas.drawBitmap(BitmapUtils.convertToBitmap(MONA_LISA_BITMAP), 0, 0, null);
org.chromium.skia.mojom.Bitmap mojoBitmap = TestUtils.mojoBitmapFromBitmap(paddedBitmap); org.chromium.skia.mojom.Bitmap mojoBitmap = TestUtils.mojoBitmapFromBitmap(paddedBitmap);
Assert.assertEquals(1, mojoBitmap.width % 2); Assert.assertEquals(1, mojoBitmap.imageInfo.width % 2);
FaceDetectionResult[] results = detect(mojoBitmap, true, DetectionProviderType.ANDROID); FaceDetectionResult[] results = detect(mojoBitmap, true, DetectionProviderType.ANDROID);
Assert.assertEquals(1, results.length); Assert.assertEquals(1, results.length);
......
...@@ -38,10 +38,10 @@ public class TestUtils { ...@@ -38,10 +38,10 @@ public class TestUtils {
bitmap.copyPixelsToBuffer(buffer); bitmap.copyPixelsToBuffer(buffer);
org.chromium.skia.mojom.Bitmap mojoBitmap = new org.chromium.skia.mojom.Bitmap(); org.chromium.skia.mojom.Bitmap mojoBitmap = new org.chromium.skia.mojom.Bitmap();
mojoBitmap.width = bitmap.getWidth(); mojoBitmap.imageInfo.width = bitmap.getWidth();
mojoBitmap.height = bitmap.getHeight(); mojoBitmap.imageInfo.height = bitmap.getHeight();
mojoBitmap.pixelData = buffer.array(); mojoBitmap.pixelData = buffer.array();
mojoBitmap.colorType = ColorType.RGBA_8888; mojoBitmap.imageInfo.colorType = ColorType.RGBA_8888;
return mojoBitmap; return mojoBitmap;
} }
......
...@@ -17,6 +17,7 @@ import org.chromium.base.test.BaseRobolectricTestRunner; ...@@ -17,6 +17,7 @@ import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Feature;
import org.chromium.skia.mojom.Bitmap; import org.chromium.skia.mojom.Bitmap;
import org.chromium.skia.mojom.ColorType; import org.chromium.skia.mojom.ColorType;
import org.chromium.skia.mojom.ImageInfo;
/** /**
* Test suite for conversion-to-Frame utils. * Test suite for conversion-to-Frame utils.
...@@ -46,6 +47,7 @@ public class BitmapUtilsTest { ...@@ -46,6 +47,7 @@ public class BitmapUtilsTest {
public void testConversionFailsWithInvalidBitmap() { public void testConversionFailsWithInvalidBitmap() {
Bitmap bitmap = new Bitmap(); Bitmap bitmap = new Bitmap();
bitmap.pixelData = null; bitmap.pixelData = null;
bitmap.imageInfo = new ImageInfo();
assertNull(BitmapUtils.convertToFrame(bitmap)); assertNull(BitmapUtils.convertToFrame(bitmap));
} }
...@@ -57,9 +59,10 @@ public class BitmapUtilsTest { ...@@ -57,9 +59,10 @@ public class BitmapUtilsTest {
@Feature({"ShapeDetection"}) @Feature({"ShapeDetection"})
public void testConversionFailsWithInvalidDimensions() { public void testConversionFailsWithInvalidDimensions() {
Bitmap bitmap = new Bitmap(); Bitmap bitmap = new Bitmap();
bitmap.imageInfo = new ImageInfo();
bitmap.pixelData = EMPTY_DATA; bitmap.pixelData = EMPTY_DATA;
bitmap.width = INVALID_WIDTH; bitmap.imageInfo.width = INVALID_WIDTH;
bitmap.height = VALID_HEIGHT; bitmap.imageInfo.height = VALID_HEIGHT;
assertNull(BitmapUtils.convertToFrame(bitmap)); assertNull(BitmapUtils.convertToFrame(bitmap));
} }
...@@ -71,10 +74,11 @@ public class BitmapUtilsTest { ...@@ -71,10 +74,11 @@ public class BitmapUtilsTest {
@Feature({"ShapeDetection"}) @Feature({"ShapeDetection"})
public void testConversionFailsWithWronglyWrappedData() { public void testConversionFailsWithWronglyWrappedData() {
Bitmap bitmap = new Bitmap(); Bitmap bitmap = new Bitmap();
bitmap.imageInfo = new ImageInfo();
bitmap.pixelData = EMPTY_DATA; bitmap.pixelData = EMPTY_DATA;
bitmap.width = VALID_WIDTH; bitmap.imageInfo.width = VALID_WIDTH;
bitmap.height = VALID_HEIGHT; bitmap.imageInfo.height = VALID_HEIGHT;
bitmap.colorType = ColorType.RGBA_8888; bitmap.imageInfo.colorType = ColorType.RGBA_8888;
assertNull(BitmapUtils.convertToFrame(bitmap)); assertNull(BitmapUtils.convertToFrame(bitmap));
} }
......
...@@ -8,6 +8,7 @@ mojom("interfaces") { ...@@ -8,6 +8,7 @@ mojom("interfaces") {
sources = [ sources = [
"bitmap.mojom", "bitmap.mojom",
"blur_image_filter_tile_mode.mojom", "blur_image_filter_tile_mode.mojom",
"image_info.mojom",
] ]
} }
......
...@@ -5,41 +5,10 @@ ...@@ -5,41 +5,10 @@
// This file contains structures used to represent SkBitmaps in Mojo. // This file contains structures used to represent SkBitmaps in Mojo.
module skia.mojom; module skia.mojom;
// Mirror of SkColorType. import "skia/public/interfaces/image_info.mojom";
enum ColorType {
UNKNOWN,
ALPHA_8,
RGB_565,
ARGB_4444,
RGBA_8888,
BGRA_8888,
INDEX_8,
GRAY_8,
};
// Mirror of SkAlphaType.
enum AlphaType {
UNKNOWN,
ALPHA_TYPE_OPAQUE,
PREMUL,
UNPREMUL,
};
// Capture of the (simple) gamma of SkColorSpace. Need to eventually
// serialize the actual colorspace object.
enum ColorProfileType {
LINEAR,
SRGB,
};
struct Bitmap { struct Bitmap {
ColorType color_type; ImageInfo image_info;
AlphaType alpha_type;
ColorProfileType profile_type;
uint32 width;
uint32 height;
uint64 row_bytes; uint64 row_bytes;
array<uint8> pixel_data; array<uint8> pixel_data;
}; };
...@@ -6,105 +6,6 @@ ...@@ -6,105 +6,6 @@
namespace mojo { namespace mojo {
namespace {
SkColorType MojoColorTypeToSk(skia::mojom::ColorType type) {
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::GRAY_8:
return kGray_8_SkColorType;
case skia::mojom::ColorType::INDEX_8:
// no longer supported
break;
}
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;
}
NOTREACHED();
return kUnknown_SkAlphaType;
}
sk_sp<SkColorSpace> MojoProfileTypeToSk(skia::mojom::ColorProfileType type) {
switch (type) {
case skia::mojom::ColorProfileType::LINEAR:
return nullptr;
case skia::mojom::ColorProfileType::SRGB:
return SkColorSpace::MakeSRGB();
}
NOTREACHED();
return nullptr;
}
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 kGray_8_SkColorType:
return skia::mojom::ColorType::GRAY_8;
default:
// Skia has color types not used by Chrome.
break;
}
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;
}
NOTREACHED();
return skia::mojom::AlphaType::UNKNOWN;
}
skia::mojom::ColorProfileType SkColorSpaceToMojo(SkColorSpace* cs) {
if (cs && cs->gammaCloseToSRGB())
return skia::mojom::ColorProfileType::SRGB;
return skia::mojom::ColorProfileType::LINEAR;
}
} // namespace
// static // static
bool StructTraits<skia::mojom::BitmapDataView, SkBitmap>::IsNull( bool StructTraits<skia::mojom::BitmapDataView, SkBitmap>::IsNull(
const SkBitmap& b) { const SkBitmap& b) {
...@@ -118,34 +19,9 @@ void StructTraits<skia::mojom::BitmapDataView, SkBitmap>::SetToNull( ...@@ -118,34 +19,9 @@ void StructTraits<skia::mojom::BitmapDataView, SkBitmap>::SetToNull(
} }
// static // static
skia::mojom::ColorType StructTraits<skia::mojom::BitmapDataView, const SkImageInfo& StructTraits<skia::mojom::BitmapDataView,
SkBitmap>::color_type(const SkBitmap& b) { SkBitmap>::image_info(const SkBitmap& b) {
return SkColorTypeToMojo(b.colorType()); return b.info();
}
// static
skia::mojom::AlphaType StructTraits<skia::mojom::BitmapDataView,
SkBitmap>::alpha_type(const SkBitmap& b) {
return SkAlphaTypeToMojo(b.alphaType());
}
// static
skia::mojom::ColorProfileType
StructTraits<skia::mojom::BitmapDataView, SkBitmap>::profile_type(
const SkBitmap& b) {
return SkColorSpaceToMojo(b.colorSpace());
}
// static
uint32_t StructTraits<skia::mojom::BitmapDataView, SkBitmap>::width(
const SkBitmap& b) {
return b.width() < 0 ? 0 : static_cast<uint32_t>(b.width());
}
// static
uint32_t StructTraits<skia::mojom::BitmapDataView, SkBitmap>::height(
const SkBitmap& b) {
return b.height() < 0 ? 0 : static_cast<uint32_t>(b.height());
} }
// static // static
...@@ -166,24 +42,23 @@ bool StructTraits<skia::mojom::BitmapDataView, SkBitmap>::Read( ...@@ -166,24 +42,23 @@ bool StructTraits<skia::mojom::BitmapDataView, SkBitmap>::Read(
skia::mojom::BitmapDataView data, skia::mojom::BitmapDataView data,
SkBitmap* b) { SkBitmap* b) {
// TODO: Ensure width and height are reasonable, eg. <= kMaxBitmapSize? // TODO: Ensure width and height are reasonable, eg. <= kMaxBitmapSize?
SkImageInfo image_info;
if (!data.ReadImageInfo(&image_info))
return false;
*b = SkBitmap(); *b = SkBitmap();
if (!b->tryAllocPixels( if (!b->tryAllocPixels(image_info, data.row_bytes())) {
SkImageInfo::Make(data.width(), data.height(),
MojoColorTypeToSk(data.color_type()),
MojoAlphaTypeToSk(data.alpha_type()),
MojoProfileTypeToSk(data.profile_type())),
data.row_bytes())) {
return false; return false;
} }
// If the image is empty, return success after setting the image info. // If the image is empty, return success after setting the image info.
if (data.width() == 0 || data.height() == 0) if (image_info.width() == 0 || image_info.height() == 0)
return true; return true;
mojo::ArrayDataView<uint8_t> data_view; mojo::ArrayDataView<uint8_t> data_view;
data.GetPixelDataDataView(&data_view); data.GetPixelDataDataView(&data_view);
if (static_cast<uint32_t>(b->width()) != data.width() || if (static_cast<int>(b->width()) != image_info.width() ||
static_cast<uint32_t>(b->height()) != data.height() || static_cast<int>(b->height()) != image_info.height() ||
static_cast<uint64_t>(b->rowBytes()) != data.row_bytes() || static_cast<uint64_t>(b->rowBytes()) != data.row_bytes() ||
b->computeByteSize() != data_view.size() || !b->readyToDraw()) { b->computeByteSize() != data_view.size() || !b->readyToDraw()) {
return false; return false;
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "base/containers/span.h" #include "base/containers/span.h"
#include "mojo/public/cpp/bindings/array_traits.h" #include "mojo/public/cpp/bindings/array_traits.h"
#include "skia/public/interfaces/bitmap.mojom.h" #include "skia/public/interfaces/bitmap.mojom.h"
#include "skia/public/interfaces/image_info_struct_traits.h"
#include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkBitmap.h"
namespace mojo { namespace mojo {
...@@ -20,11 +21,7 @@ template <> ...@@ -20,11 +21,7 @@ template <>
struct StructTraits<skia::mojom::BitmapDataView, SkBitmap> { struct StructTraits<skia::mojom::BitmapDataView, SkBitmap> {
static bool IsNull(const SkBitmap& b); static bool IsNull(const SkBitmap& b);
static void SetToNull(SkBitmap* b); static void SetToNull(SkBitmap* b);
static skia::mojom::ColorType color_type(const SkBitmap& b); static const SkImageInfo& image_info(const SkBitmap& b);
static skia::mojom::AlphaType alpha_type(const SkBitmap& b);
static skia::mojom::ColorProfileType profile_type(const SkBitmap& b);
static uint32_t width(const SkBitmap& b);
static uint32_t height(const SkBitmap& b);
static uint64_t row_bytes(const SkBitmap& b); static uint64_t row_bytes(const SkBitmap& b);
static BitmapBuffer pixel_data(const SkBitmap& b); static BitmapBuffer pixel_data(const SkBitmap& b);
static bool Read(skia::mojom::BitmapDataView data, SkBitmap* b); static bool Read(skia::mojom::BitmapDataView data, SkBitmap* b);
......
// Copyright 2015 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.
module skia.mojom;
// Mirror of SkColorType.
enum ColorType {
UNKNOWN,
ALPHA_8,
RGB_565,
ARGB_4444,
RGBA_8888,
BGRA_8888,
INDEX_8,
GRAY_8,
};
// Mirror of SkAlphaType.
enum AlphaType {
UNKNOWN,
ALPHA_TYPE_OPAQUE,
PREMUL,
UNPREMUL,
};
// Capture of the (simple) gamma of SkColorSpace. Need to eventually
// serialize the actual colorspace object.
enum ColorProfileType {
LINEAR,
SRGB,
};
struct ImageInfo {
ColorType color_type;
AlphaType alpha_type;
ColorProfileType profile_type;
uint32 width;
uint32 height;
};
// Copyright 2018 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.
#include "skia/public/interfaces/image_info_struct_traits.h"
namespace mojo {
namespace {
SkColorType MojoColorTypeToSk(skia::mojom::ColorType type) {
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::GRAY_8:
return kGray_8_SkColorType;
case skia::mojom::ColorType::INDEX_8:
// no longer supported
break;
}
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;
}
NOTREACHED();
return kUnknown_SkAlphaType;
}
sk_sp<SkColorSpace> MojoProfileTypeToSk(skia::mojom::ColorProfileType type) {
switch (type) {
case skia::mojom::ColorProfileType::LINEAR:
return nullptr;
case skia::mojom::ColorProfileType::SRGB:
return SkColorSpace::MakeSRGB();
}
NOTREACHED();
return nullptr;
}
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 kGray_8_SkColorType:
return skia::mojom::ColorType::GRAY_8;
default:
// Skia has color types not used by Chrome.
break;
}
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;
}
NOTREACHED();
return skia::mojom::AlphaType::UNKNOWN;
}
skia::mojom::ColorProfileType SkColorSpaceToMojo(SkColorSpace* cs) {
if (cs && cs->gammaCloseToSRGB())
return skia::mojom::ColorProfileType::SRGB;
return skia::mojom::ColorProfileType::LINEAR;
}
} // namespace
// static
skia::mojom::ColorType
StructTraits<skia::mojom::ImageInfoDataView, SkImageInfo>::color_type(
const SkImageInfo& info) {
return SkColorTypeToMojo(info.colorType());
}
// static
skia::mojom::AlphaType
StructTraits<skia::mojom::ImageInfoDataView, SkImageInfo>::alpha_type(
const SkImageInfo& info) {
return SkAlphaTypeToMojo(info.alphaType());
}
// static
skia::mojom::ColorProfileType
StructTraits<skia::mojom::ImageInfoDataView, SkImageInfo>::profile_type(
const SkImageInfo& info) {
return SkColorSpaceToMojo(info.colorSpace());
}
// static
uint32_t StructTraits<skia::mojom::ImageInfoDataView, SkImageInfo>::width(
const SkImageInfo& info) {
return info.width() < 0 ? 0 : static_cast<uint32_t>(info.width());
}
// static
uint32_t StructTraits<skia::mojom::ImageInfoDataView, SkImageInfo>::height(
const SkImageInfo& info) {
return info.height() < 0 ? 0 : static_cast<uint32_t>(info.height());
}
// static
bool StructTraits<skia::mojom::ImageInfoDataView, SkImageInfo>::Read(
skia::mojom::ImageInfoDataView data,
SkImageInfo* info) {
*info = SkImageInfo::Make(data.width(), data.height(),
MojoColorTypeToSk(data.color_type()),
MojoAlphaTypeToSk(data.alpha_type()),
MojoProfileTypeToSk(data.profile_type()));
return true;
}
} // namespace mojo
// Copyright 2018 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_IMAGE_INFO_STRUCT_TRAITS_H_
#define SKIA_PUBLIC_INTERFACES_IMAGE_INFO_STRUCT_TRAITS_H_
#include "skia/public/interfaces/image_info.mojom.h"
#include "third_party/skia/include/core/SkImageInfo.h"
namespace mojo {
template <>
struct StructTraits<skia::mojom::ImageInfoDataView, SkImageInfo> {
static skia::mojom::ColorType color_type(const SkImageInfo& info);
static skia::mojom::AlphaType alpha_type(const SkImageInfo& info);
static skia::mojom::ColorProfileType profile_type(const SkImageInfo& info);
static uint32_t width(const SkImageInfo& info);
static uint32_t height(const SkImageInfo& info);
static bool Read(skia::mojom::ImageInfoDataView data, SkImageInfo* info);
};
} // namespace mojo
#endif // SKIA_PUBLIC_INTERFACES_IMAGE_INFO_STRUCT_TRAITS_H_
# 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.
mojom = "//skia/public/interfaces/image_info.mojom"
public_headers = [ "//third_party/skia/include/core/SkImageInfo.h" ]
traits_headers = [ "//skia/public/interfaces/image_info_struct_traits.h" ]
sources = [
"//skia/public/interfaces/image_info_struct_traits.cc",
]
deps = [
"//mojo/public/cpp/bindings",
]
public_deps = [
"//skia",
]
type_mappings = [ "skia.mojom.ImageInfo=SkImageInfo" ]
...@@ -31,6 +31,11 @@ class StructTraitsTest : public testing::Test, public mojom::TraitsTestService { ...@@ -31,6 +31,11 @@ class StructTraitsTest : public testing::Test, public mojom::TraitsTestService {
private: private:
// TraitsTestService: // TraitsTestService:
void EchoImageInfo(const SkImageInfo& i,
EchoImageInfoCallback callback) override {
std::move(callback).Run(i);
}
void EchoBitmap(const SkBitmap& b, EchoBitmapCallback callback) override { void EchoBitmap(const SkBitmap& b, EchoBitmapCallback callback) override {
std::move(callback).Run(b); std::move(callback).Run(b);
} }
...@@ -53,6 +58,16 @@ static bool colorspace_srgb_gamma(SkColorSpace* cs) { ...@@ -53,6 +58,16 @@ static bool colorspace_srgb_gamma(SkColorSpace* cs) {
} // namespace } // namespace
TEST_F(StructTraitsTest, ImageInfo) {
SkImageInfo input = SkImageInfo::Make(
34, 56, SkColorType::kGray_8_SkColorType,
SkAlphaType::kUnpremul_SkAlphaType, SkColorSpace::MakeSRGB());
mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
SkImageInfo output;
proxy->EchoImageInfo(input, &output);
EXPECT_EQ(input, output);
}
TEST_F(StructTraitsTest, Bitmap) { TEST_F(StructTraitsTest, Bitmap) {
SkBitmap input; SkBitmap input;
input.allocN32Pixels(10, 5); input.allocN32Pixels(10, 5);
......
...@@ -4,12 +4,16 @@ ...@@ -4,12 +4,16 @@
module skia.mojom; module skia.mojom;
import "skia/public/interfaces/image_info.mojom";
import "skia/public/interfaces/bitmap.mojom"; import "skia/public/interfaces/bitmap.mojom";
import "skia/public/interfaces/blur_image_filter_tile_mode.mojom"; import "skia/public/interfaces/blur_image_filter_tile_mode.mojom";
// All functions on this interface echo their arguments to test StructTraits // All functions on this interface echo their arguments to test StructTraits
// serialization and deserialization. // serialization and deserialization.
interface TraitsTestService { interface TraitsTestService {
[Sync]
EchoImageInfo(ImageInfo i) => (ImageInfo pass);
[Sync] [Sync]
EchoBitmap(Bitmap b) => (Bitmap pass); EchoBitmap(Bitmap b) => (Bitmap pass);
......
...@@ -5,4 +5,5 @@ ...@@ -5,4 +5,5 @@
typemaps = [ typemaps = [
"//skia/public/interfaces/blur_image_filter_tile_mode.typemap", "//skia/public/interfaces/blur_image_filter_tile_mode.typemap",
"//skia/public/interfaces/skbitmap.typemap", "//skia/public/interfaces/skbitmap.typemap",
"//skia/public/interfaces/skimageinfo.typemap",
] ]
importScripts("../../resources/testharness.js"); importScripts("../../resources/testharness.js");
importScripts("file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"); importScripts("file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js");
importScripts("file:///gen/skia/public/interfaces/image_info.mojom.js");
importScripts("file:///gen/skia/public/interfaces/bitmap.mojom.js"); importScripts("file:///gen/skia/public/interfaces/bitmap.mojom.js");
importScripts("file:///gen/ui/gfx/geometry/mojo/geometry.mojom.js"); importScripts("file:///gen/ui/gfx/geometry/mojo/geometry.mojom.js");
importScripts("file:///gen/services/shape_detection/public/mojom/barcodedetection.mojom.js"); importScripts("file:///gen/services/shape_detection/public/mojom/barcodedetection.mojom.js");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment