1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/ipc/gfx_param_traits.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <string>
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/skia/include/core/SkBitmap.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/rect.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/rect_f.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstruct SkBitmap_Data {
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The color type for the bitmap (bits per pixel, etc).
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SkColorType fColorType;
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The alpha type for the bitmap (opaque, premul, unpremul).
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SkAlphaType fAlphaType;
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The width of the bitmap in pixels.
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  uint32 fWidth;
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The height of the bitmap in pixels.
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  uint32 fHeight;
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void InitSkBitmapDataForTransfer(const SkBitmap& bitmap) {
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const SkImageInfo& info = bitmap.info();
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    fColorType = info.fColorType;
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    fAlphaType = info.fAlphaType;
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    fWidth = info.fWidth;
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    fHeight = info.fHeight;
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Returns whether |bitmap| successfully initialized.
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool InitSkBitmapFromData(SkBitmap* bitmap,
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            const char* pixels,
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            size_t pixels_size) const {
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!bitmap->tryAllocPixels(
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            SkImageInfo::Make(fWidth, fHeight, fColorType, fAlphaType)))
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return false;
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (pixels_size != bitmap->getSize())
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return false;
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    memcpy(bitmap->getPixels(), pixels, pixels_size);
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return true;
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace IPC {
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ParamTraits<gfx::Point>::Write(Message* m, const gfx::Point& p) {
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  m->WriteInt(p.x());
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  m->WriteInt(p.y());
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ParamTraits<gfx::Point>::Read(const Message* m, PickleIterator* iter,
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   gfx::Point* r) {
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int x, y;
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!m->ReadInt(iter, &x) ||
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      !m->ReadInt(iter, &y))
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  r->set_x(x);
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  r->set_y(y);
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ParamTraits<gfx::Point>::Log(const gfx::Point& p, std::string* l) {
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  l->append(base::StringPrintf("(%d, %d)", p.x(), p.y()));
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ParamTraits<gfx::PointF>::Write(Message* m, const gfx::PointF& v) {
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ParamTraits<float>::Write(m, v.x());
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ParamTraits<float>::Write(m, v.y());
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ParamTraits<gfx::PointF>::Read(const Message* m,
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      PickleIterator* iter,
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      gfx::PointF* r) {
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  float x, y;
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!ParamTraits<float>::Read(m, iter, &x) ||
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      !ParamTraits<float>::Read(m, iter, &y))
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  r->set_x(x);
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  r->set_y(y);
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ParamTraits<gfx::PointF>::Log(const gfx::PointF& v, std::string* l) {
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  l->append(base::StringPrintf("(%f, %f)", v.x(), v.y()));
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ParamTraits<gfx::Size>::Write(Message* m, const gfx::Size& p) {
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK_GE(p.width(), 0);
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK_GE(p.height(), 0);
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int values[2] = { p.width(), p.height() };
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  m->WriteBytes(&values, sizeof(int) * 2);
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ParamTraits<gfx::Size>::Read(const Message* m,
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  PickleIterator* iter,
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  gfx::Size* r) {
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const char* char_values;
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!m->ReadBytes(iter, &char_values, sizeof(int) * 2))
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const int* values = reinterpret_cast<const int*>(char_values);
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (values[0] < 0 || values[1] < 0)
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  r->set_width(values[0]);
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  r->set_height(values[1]);
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ParamTraits<gfx::Size>::Log(const gfx::Size& p, std::string* l) {
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  l->append(base::StringPrintf("(%d, %d)", p.width(), p.height()));
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ParamTraits<gfx::SizeF>::Write(Message* m, const gfx::SizeF& p) {
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  float values[2] = { p.width(), p.height() };
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  m->WriteBytes(&values, sizeof(float) * 2);
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ParamTraits<gfx::SizeF>::Read(const Message* m,
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   PickleIterator* iter,
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   gfx::SizeF* r) {
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const char* char_values;
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!m->ReadBytes(iter, &char_values, sizeof(float) * 2))
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const float* values = reinterpret_cast<const float*>(char_values);
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  r->set_width(values[0]);
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  r->set_height(values[1]);
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ParamTraits<gfx::SizeF>::Log(const gfx::SizeF& p, std::string* l) {
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  l->append(base::StringPrintf("(%f, %f)", p.width(), p.height()));
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ParamTraits<gfx::Vector2d>::Write(Message* m, const gfx::Vector2d& p) {
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int values[2] = { p.x(), p.y() };
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  m->WriteBytes(&values, sizeof(int) * 2);
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ParamTraits<gfx::Vector2d>::Read(const Message* m,
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      PickleIterator* iter,
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      gfx::Vector2d* r) {
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const char* char_values;
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!m->ReadBytes(iter, &char_values, sizeof(int) * 2))
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const int* values = reinterpret_cast<const int*>(char_values);
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  r->set_x(values[0]);
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  r->set_y(values[1]);
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ParamTraits<gfx::Vector2d>::Log(const gfx::Vector2d& v, std::string* l) {
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  l->append(base::StringPrintf("(%d, %d)", v.x(), v.y()));
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ParamTraits<gfx::Vector2dF>::Write(Message* m, const gfx::Vector2dF& p) {
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  float values[2] = { p.x(), p.y() };
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  m->WriteBytes(&values, sizeof(float) * 2);
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ParamTraits<gfx::Vector2dF>::Read(const Message* m,
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      PickleIterator* iter,
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      gfx::Vector2dF* r) {
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const char* char_values;
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!m->ReadBytes(iter, &char_values, sizeof(float) * 2))
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const float* values = reinterpret_cast<const float*>(char_values);
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  r->set_x(values[0]);
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  r->set_y(values[1]);
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ParamTraits<gfx::Vector2dF>::Log(const gfx::Vector2dF& v, std::string* l) {
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  l->append(base::StringPrintf("(%f, %f)", v.x(), v.y()));
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ParamTraits<gfx::Rect>::Write(Message* m, const gfx::Rect& p) {
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int values[4] = { p.x(), p.y(), p.width(), p.height() };
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  m->WriteBytes(&values, sizeof(int) * 4);
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ParamTraits<gfx::Rect>::Read(const Message* m,
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  PickleIterator* iter,
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  gfx::Rect* r) {
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const char* char_values;
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!m->ReadBytes(iter, &char_values, sizeof(int) * 4))
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const int* values = reinterpret_cast<const int*>(char_values);
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (values[2] < 0 || values[3] < 0)
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  r->SetRect(values[0], values[1], values[2], values[3]);
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ParamTraits<gfx::Rect>::Log(const gfx::Rect& p, std::string* l) {
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  l->append(base::StringPrintf("(%d, %d, %d, %d)", p.x(), p.y(),
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               p.width(), p.height()));
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ParamTraits<gfx::RectF>::Write(Message* m, const gfx::RectF& p) {
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  float values[4] = { p.x(), p.y(), p.width(), p.height() };
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  m->WriteBytes(&values, sizeof(float) * 4);
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ParamTraits<gfx::RectF>::Read(const Message* m,
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   PickleIterator* iter,
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   gfx::RectF* r) {
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const char* char_values;
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!m->ReadBytes(iter, &char_values, sizeof(float) * 4))
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const float* values = reinterpret_cast<const float*>(char_values);
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  r->SetRect(values[0], values[1], values[2], values[3]);
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ParamTraits<gfx::RectF>::Log(const gfx::RectF& p, std::string* l) {
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  l->append(base::StringPrintf("(%f, %f, %f, %f)", p.x(), p.y(),
224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               p.width(), p.height()));
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ParamTraits<SkBitmap>::Write(Message* m, const SkBitmap& p) {
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  size_t fixed_size = sizeof(SkBitmap_Data);
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SkBitmap_Data bmp_data;
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bmp_data.InitSkBitmapDataForTransfer(p);
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  m->WriteData(reinterpret_cast<const char*>(&bmp_data),
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               static_cast<int>(fixed_size));
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  size_t pixel_size = p.getSize();
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SkAutoLockPixels p_lock(p);
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  m->WriteData(reinterpret_cast<const char*>(p.getPixels()),
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               static_cast<int>(pixel_size));
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ParamTraits<SkBitmap>::Read(const Message* m,
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 PickleIterator* iter,
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 SkBitmap* r) {
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const char* fixed_data;
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int fixed_data_size = 0;
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!m->ReadData(iter, &fixed_data, &fixed_data_size) ||
245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     (fixed_data_size <= 0)) {
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    NOTREACHED();
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (fixed_data_size != sizeof(SkBitmap_Data))
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;  // Message is malformed.
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const char* variable_data;
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int variable_data_size = 0;
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!m->ReadData(iter, &variable_data, &variable_data_size) ||
255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     (variable_data_size < 0)) {
256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    NOTREACHED();
257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const SkBitmap_Data* bmp_data =
260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      reinterpret_cast<const SkBitmap_Data*>(fixed_data);
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return bmp_data->InitSkBitmapFromData(r, variable_data, variable_data_size);
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ParamTraits<SkBitmap>::Log(const SkBitmap& p, std::string* l) {
265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  l->append("<SkBitmap>");
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace IPC
269