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