Commit 9fe6e9f8 authored by Daniel Cheng's avatar Daniel Cheng Committed by Commit Bot

Update IPC ParamTraits for SkBitmap to follow best practices.

Using memcpy() to serialize a POD struct is highly discouraged. Just use
the standard IPC param traits macros for doing it.

Bug: 779428
Change-Id: I48f52c1f5c245ba274d595829ed92e8b3cb41334
Reviewed-on: https://chromium-review.googlesource.com/899649Reviewed-by: default avatarTom Sepez <tsepez@chromium.org>
Commit-Queue: Daniel Cheng <dcheng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#534562}
parent 20062064
...@@ -7,57 +7,64 @@ ...@@ -7,57 +7,64 @@
#include <string> #include <string>
#include "base/pickle.h" #include "base/pickle.h"
#include "ipc/ipc_message_utils.h"
#include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkImageInfo.h" #include "third_party/skia/include/core/SkImageInfo.h"
#include "ui/gfx/ipc/skia/gfx_skia_param_traits_macros.h"
#include "ui/gfx/transform.h" #include "ui/gfx/transform.h"
namespace { // Generate param traits write methods.
#include "ipc/param_traits_write_macros.h"
struct SkBitmap_Data { namespace IPC {
// The color type for the bitmap (bits per pixel, etc). #undef UI_GFX_IPC_SKIA_GFX_SKIA_PARAM_TRAITS_MACROS_H_
SkColorType color_type; #include "ui/gfx/ipc/skia/gfx_skia_param_traits_macros.h"
} // namespace IPC
// The alpha type for the bitmap (opaque, premul, unpremul). // Generate param traits read methods.
SkAlphaType alpha_type; #include "ipc/param_traits_read_macros.h"
namespace IPC {
#undef UI_GFX_IPC_SKIA_GFX_SKIA_PARAM_TRAITS_MACROS_H_
#include "ui/gfx/ipc/skia/gfx_skia_param_traits_macros.h"
} // namespace IPC
// The width of the bitmap in pixels. // Generate param traits log methods.
uint32_t width; #include "ipc/param_traits_log_macros.h"
namespace IPC {
#undef UI_GFX_IPC_SKIA_GFX_SKIA_PARAM_TRAITS_MACROS_H_
#include "ui/gfx/ipc/skia/gfx_skia_param_traits_macros.h"
} // namespace IPC
// The height of the bitmap in pixels. namespace IPC {
uint32_t height;
void InitSkBitmapDataForTransfer(const SkBitmap& bitmap) { void ParamTraits<SkImageInfo>::Write(base::Pickle* m, const SkImageInfo& p) {
const SkImageInfo& info = bitmap.info(); WriteParam(m, p.colorType());
color_type = info.colorType(); WriteParam(m, p.alphaType());
alpha_type = info.alphaType(); WriteParam(m, p.width());
width = info.width(); WriteParam(m, p.height());
height = info.height(); }
}
// Returns whether |bitmap| successfully initialized. bool ParamTraits<SkImageInfo>::Read(const base::Pickle* m,
bool InitSkBitmapFromData(SkBitmap* bitmap, base::PickleIterator* iter,
const char* pixels, SkImageInfo* r) {
size_t pixels_size) const { SkColorType color_type;
if (!bitmap->tryAllocPixels( SkAlphaType alpha_type;
SkImageInfo::Make(width, height, color_type, alpha_type))) uint32_t width;
return false; uint32_t height;
if (pixels_size != bitmap->computeByteSize()) if (!ReadParam(m, iter, &color_type) || !ReadParam(m, iter, &alpha_type) ||
return false; !ReadParam(m, iter, &width) || !ReadParam(m, iter, &height)) {
memcpy(bitmap->getPixels(), pixels, pixels_size); return false;
return true;
} }
};
} // namespace *r = SkImageInfo::Make(width, height, color_type, alpha_type);
return true;
}
namespace IPC { void ParamTraits<SkImageInfo>::Log(const SkImageInfo& p, std::string* l) {
l->append("<SkImageInfo>");
}
void ParamTraits<SkBitmap>::Write(base::Pickle* m, const SkBitmap& p) { void ParamTraits<SkBitmap>::Write(base::Pickle* m, const SkBitmap& p) {
size_t fixed_size = sizeof(SkBitmap_Data); WriteParam(m, p.info());
SkBitmap_Data bmp_data;
bmp_data.InitSkBitmapDataForTransfer(p);
m->WriteData(reinterpret_cast<const char*>(&bmp_data),
static_cast<int>(fixed_size));
size_t pixel_size = p.computeByteSize(); size_t pixel_size = p.computeByteSize();
m->WriteData(reinterpret_cast<const char*>(p.getPixels()), m->WriteData(reinterpret_cast<const char*>(p.getPixels()),
static_cast<int>(pixel_size)); static_cast<int>(pixel_size));
...@@ -66,28 +73,28 @@ void ParamTraits<SkBitmap>::Write(base::Pickle* m, const SkBitmap& p) { ...@@ -66,28 +73,28 @@ void ParamTraits<SkBitmap>::Write(base::Pickle* m, const SkBitmap& p) {
bool ParamTraits<SkBitmap>::Read(const base::Pickle* m, bool ParamTraits<SkBitmap>::Read(const base::Pickle* m,
base::PickleIterator* iter, base::PickleIterator* iter,
SkBitmap* r) { SkBitmap* r) {
const char* fixed_data; SkImageInfo image_info;
int fixed_data_size = 0; if (!ReadParam(m, iter, &image_info))
if (!iter->ReadData(&fixed_data, &fixed_data_size) ||
(fixed_data_size <= 0)) {
return false; return false;
}
if (fixed_data_size != sizeof(SkBitmap_Data))
return false; // Message is malformed.
const char* variable_data; const char* bitmap_data;
int variable_data_size = 0; int bitmap_data_size = 0;
if (!iter->ReadData(&variable_data, &variable_data_size) || if (!iter->ReadData(&bitmap_data, &bitmap_data_size))
(variable_data_size < 0)) {
return false; return false;
} // ReadData() only returns true if bitmap_data_size >= 0.
const SkBitmap_Data* bmp_data =
reinterpret_cast<const SkBitmap_Data*>(fixed_data); if (!r->tryAllocPixels(image_info))
return bmp_data->InitSkBitmapFromData(r, variable_data, variable_data_size); return false;
if (static_cast<size_t>(bitmap_data_size) != r->computeByteSize())
return false;
memcpy(r->getPixels(), bitmap_data, bitmap_data_size);
return true;
} }
void ParamTraits<SkBitmap>::Log(const SkBitmap& p, std::string* l) { void ParamTraits<SkBitmap>::Log(const SkBitmap& p, std::string* l) {
l->append("<SkBitmap>"); l->append("<SkBitmap>");
LogParam(p.info(), l);
} }
void ParamTraits<gfx::Transform>::Write(base::Pickle* m, const param_type& p) { void ParamTraits<gfx::Transform>::Write(base::Pickle* m, const param_type& p) {
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "ui/gfx/ipc/skia/gfx_skia_ipc_export.h" #include "ui/gfx/ipc/skia/gfx_skia_ipc_export.h"
class SkBitmap; class SkBitmap;
struct SkImageInfo;
namespace base { namespace base {
class Pickle; class Pickle;
...@@ -24,6 +25,16 @@ class Transform; ...@@ -24,6 +25,16 @@ class Transform;
namespace IPC { namespace IPC {
template <>
struct GFX_SKIA_IPC_EXPORT ParamTraits<SkImageInfo> {
using param_type = SkImageInfo;
static void Write(base::Pickle* m, const param_type& p);
static bool Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r);
static void Log(const param_type& p, std::string* l);
};
template <> template <>
struct GFX_SKIA_IPC_EXPORT ParamTraits<SkBitmap> { struct GFX_SKIA_IPC_EXPORT ParamTraits<SkBitmap> {
using param_type = SkBitmap; using param_type = SkBitmap;
......
// 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 UI_GFX_IPC_SKIA_GFX_SKIA_PARAM_TRAITS_MACROS_H_
#define UI_GFX_IPC_SKIA_GFX_SKIA_PARAM_TRAITS_MACROS_H_
#include <stdint.h>
#include "ipc/ipc_message_macros.h"
#include "third_party/skia/include/core/SkImageInfo.h"
IPC_ENUM_TRAITS_VALIDATE(SkColorType, kLastEnum_SkColorType);
IPC_ENUM_TRAITS_VALIDATE(SkAlphaType, kLastEnum_SkAlphaType);
#endif // UI_GFX_IPC_SKIA_GFX_SKIA_PARAM_TRAITS_MACROS_H_
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