15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/cc_messages.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/compositor_frame.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cc/output/filter_operations.h"
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "cc/quads/largest_draw_quad.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/common_param_traits.h"
11c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "third_party/skia/include/core/SkData.h"
12c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "third_party/skia/include/core/SkFlattenableSerialization.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/transform.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ParamTraits<cc::FilterOperation>::Write(
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Message* m, const param_type& p) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, p.type());
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (p.type()) {
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::GRAYSCALE:
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::SEPIA:
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::SATURATE:
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::HUE_ROTATE:
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::INVERT:
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::BRIGHTNESS:
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::SATURATING_BRIGHTNESS:
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::CONTRAST:
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::OPACITY:
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::BLUR:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WriteParam(m, p.amount());
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::DROP_SHADOW:
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      WriteParam(m, p.drop_shadow_offset());
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WriteParam(m, p.amount());
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      WriteParam(m, p.drop_shadow_color());
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::COLOR_MATRIX:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (int i = 0; i < 20; ++i)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WriteParam(m, p.matrix()[i]);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::ZOOM:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WriteParam(m, p.amount());
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      WriteParam(m, p.zoom_inset());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case cc::FilterOperation::REFERENCE:
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      WriteParam(m, p.image_filter());
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      break;
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case cc::FilterOperation::ALPHA_THRESHOLD:
500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      NOTREACHED();
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      break;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool ParamTraits<cc::FilterOperation>::Read(
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Message* m, PickleIterator* iter, param_type* r) {
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  cc::FilterOperation::FilterType type;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float amount;
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Point drop_shadow_offset;
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SkColor drop_shadow_color;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkScalar matrix[20];
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int zoom_inset;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ReadParam(m, iter, &type))
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  r->set_type(type);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = false;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::GRAYSCALE:
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::SEPIA:
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::SATURATE:
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::HUE_ROTATE:
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::INVERT:
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::BRIGHTNESS:
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::SATURATING_BRIGHTNESS:
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::CONTRAST:
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::OPACITY:
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::BLUR:
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ReadParam(m, iter, &amount)) {
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        r->set_amount(amount);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        success = true;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::DROP_SHADOW:
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (ReadParam(m, iter, &drop_shadow_offset) &&
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ReadParam(m, iter, &amount) &&
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          ReadParam(m, iter, &drop_shadow_color)) {
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        r->set_drop_shadow_offset(drop_shadow_offset);
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        r->set_amount(amount);
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        r->set_drop_shadow_color(drop_shadow_color);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        success = true;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::COLOR_MATRIX: {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int i;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (i = 0; i < 20; ++i) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ReadParam(m, iter, &matrix[i]))
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (i == 20) {
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        r->set_matrix(matrix);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        success = true;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::ZOOM:
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (ReadParam(m, iter, &amount) &&
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ReadParam(m, iter, &zoom_inset) &&
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          amount >= 0.f &&
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          zoom_inset >= 0) {
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        r->set_amount(amount);
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        r->set_zoom_inset(zoom_inset);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        success = true;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case cc::FilterOperation::REFERENCE: {
11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      skia::RefPtr<SkImageFilter> filter;
11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      if (!ReadParam(m, iter, &filter)) {
12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        success = false;
12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        break;
12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      }
12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      r->set_image_filter(filter);
12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      success = true;
12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      break;
12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
1270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case cc::FilterOperation::ALPHA_THRESHOLD:
1280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      break;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return success;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ParamTraits<cc::FilterOperation>::Log(
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const param_type& p, std::string* l) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append("(");
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LogParam(static_cast<unsigned>(p.type()), l);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(", ");
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (p.type()) {
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::GRAYSCALE:
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::SEPIA:
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::SATURATE:
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::HUE_ROTATE:
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::INVERT:
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::BRIGHTNESS:
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::SATURATING_BRIGHTNESS:
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::CONTRAST:
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::OPACITY:
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::BLUR:
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LogParam(p.amount(), l);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::DROP_SHADOW:
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      LogParam(p.drop_shadow_offset(), l);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l->append(", ");
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LogParam(p.amount(), l);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l->append(", ");
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      LogParam(p.drop_shadow_color(), l);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::COLOR_MATRIX:
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (int i = 0; i < 20; ++i) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (i)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          l->append(", ");
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LogParam(p.matrix()[i], l);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case cc::FilterOperation::ZOOM:
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LogParam(p.amount(), l);
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l->append(", ");
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      LogParam(p.zoom_inset(), l);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case cc::FilterOperation::REFERENCE:
17268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      LogParam(p.image_filter(), l);
17368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      break;
1740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case cc::FilterOperation::ALPHA_THRESHOLD:
1750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      NOTREACHED();
1760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      break;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(")");
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ParamTraits<cc::FilterOperations>::Write(
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Message* m, const param_type& p) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, p.size());
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::size_t i = 0; i < p.size(); ++i) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WriteParam(m, p.at(i));
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool ParamTraits<cc::FilterOperations>::Read(
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Message* m, PickleIterator* iter, param_type* r) {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t count;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ReadParam(m, iter, &count))
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::size_t i = 0; i < count; ++i) {
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    cc::FilterOperation op = cc::FilterOperation::CreateEmptyFilter();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ReadParam(m, iter, &op))
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    r->Append(op);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ParamTraits<cc::FilterOperations>::Log(
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const param_type& p, std::string* l) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append("(");
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::size_t i = 0; i < p.size(); ++i) {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (i)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l->append(", ");
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LogParam(p.at(i), l);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(")");
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochvoid ParamTraits<skia::RefPtr<SkImageFilter> >::Write(
216c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    Message* m, const param_type& p) {
217c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  SkImageFilter* filter = p.get();
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (filter) {
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    skia::RefPtr<SkData> data =
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        skia::AdoptRef(SkValidatingSerializeFlattenable(filter));
221c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    m->WriteData(static_cast<const char*>(data->data()), data->size());
222c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  } else {
223c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    m->WriteData(0, 0);
224c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  }
225c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch}
226c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
227c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochbool ParamTraits<skia::RefPtr<SkImageFilter> >::Read(
228c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    const Message* m, PickleIterator* iter, param_type* r) {
229c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  const char* data = 0;
230c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  int length = 0;
231c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  if (!m->ReadData(iter, &data, &length))
232c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    return false;
233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (length > 0) {
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SkFlattenable* flattenable = SkValidatingDeserializeFlattenable(
235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        data, length, SkImageFilter::GetFlattenableType());
236c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    *r = skia::AdoptRef(static_cast<SkImageFilter*>(flattenable));
237c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  } else {
238c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    r->clear();
239c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  }
240c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  return true;
241c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch}
242c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
243c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochvoid ParamTraits<skia::RefPtr<SkImageFilter> >::Log(
244c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    const param_type& p, std::string* l) {
245c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  l->append("(");
246c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  LogParam(p.get() ? p->countInputs() : 0, l);
247c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  l->append(")");
248c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch}
249c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<gfx::Transform>::Write(
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Message* m, const param_type& p) {
2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#ifdef SK_MSCALAR_IS_FLOAT
2531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  float column_major_data[16];
2541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  p.matrix().asColMajorf(column_major_data);
2551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
2561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  double column_major_data[16];
2571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  p.matrix().asColMajord(column_major_data);
2581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
2591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  m->WriteBytes(&column_major_data, sizeof(SkMScalar) * 16);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ParamTraits<gfx::Transform>::Read(
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Message* m, PickleIterator* iter, param_type* r) {
2641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const char* column_major_data;
2651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!m->ReadBytes(iter, &column_major_data, sizeof(SkMScalar) * 16))
2661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return false;
2671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  r->matrix().setColMajor(
2681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      reinterpret_cast<const SkMScalar*>(column_major_data));
2691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return true;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<gfx::Transform>::Log(
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const param_type& p, std::string* l) {
2741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#ifdef SK_MSCALAR_IS_FLOAT
2751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  float row_major_data[16];
2761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  p.matrix().asRowMajorf(row_major_data);
2771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
2781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  double row_major_data[16];
2791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  p.matrix().asRowMajord(row_major_data);
2801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append("(");
2821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (int i = 0; i < 16; ++i) {
2831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (i > 0)
2841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      l->append(", ");
2851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    LogParam(row_major_data[i], l);
2861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(") ");
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<cc::RenderPass>::Write(
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Message* m, const param_type& p) {
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WriteParam(m, p.id);
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WriteParam(m, p.output_rect);
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WriteParam(m, p.damage_rect);
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WriteParam(m, p.transform_to_root_target);
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WriteParam(m, p.has_transparent_background);
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WriteParam(m, p.shared_quad_state_list.size());
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WriteParam(m, p.quad_list.size());
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t shared_quad_state_index = 0;
301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  size_t last_shared_quad_state_index = kuint32max;
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (cc::QuadList::ConstIterator iter = p.quad_list.begin();
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       iter != p.quad_list.end();
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       ++iter) {
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const cc::DrawQuad* quad = &*iter;
3064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    DCHECK(quad->rect.Contains(quad->visible_rect))
3074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        << quad->material << " rect: " << quad->rect.ToString()
3084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        << " visible_rect: " << quad->visible_rect.ToString();
3094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    DCHECK(quad->opaque_rect.IsEmpty() ||
3104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)           quad->rect.Contains(quad->opaque_rect))
3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        << quad->material << " rect: " << quad->rect.ToString()
3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        << " opaque_rect: " << quad->opaque_rect.ToString();
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (quad->material) {
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::CHECKERBOARD:
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        WriteParam(m, *cc::CheckerboardDrawQuad::MaterialCast(quad));
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::DEBUG_BORDER:
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        WriteParam(m, *cc::DebugBorderDrawQuad::MaterialCast(quad));
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::IO_SURFACE_CONTENT:
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        WriteParam(m, *cc::IOSurfaceDrawQuad::MaterialCast(quad));
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case cc::DrawQuad::PICTURE_CONTENT:
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::TEXTURE_CONTENT:
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        WriteParam(m, *cc::TextureDrawQuad::MaterialCast(quad));
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::RENDER_PASS:
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        WriteParam(m, *cc::RenderPassDrawQuad::MaterialCast(quad));
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::SOLID_COLOR:
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        WriteParam(m, *cc::SolidColorDrawQuad::MaterialCast(quad));
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case cc::DrawQuad::SURFACE_CONTENT:
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        WriteParam(m, *cc::SurfaceDrawQuad::MaterialCast(quad));
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::TILED_CONTENT:
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        WriteParam(m, *cc::TileDrawQuad::MaterialCast(quad));
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::STREAM_VIDEO_CONTENT:
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        WriteParam(m, *cc::StreamVideoDrawQuad::MaterialCast(quad));
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::YUV_VIDEO_CONTENT:
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        WriteParam(m, *cc::YUVVideoDrawQuad::MaterialCast(quad));
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::INVALID:
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const cc::ScopedPtrVector<cc::SharedQuadState>& sqs_list =
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        p.shared_quad_state_list;
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This is an invalid index.
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t bad_index = sqs_list.size();
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Null shared quad states should not occur.
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(quad->shared_quad_state);
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!quad->shared_quad_state) {
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WriteParam(m, bad_index);
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // SharedQuadStates should appear in the order they are used by DrawQuads.
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Find the SharedQuadState for this DrawQuad.
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    while (shared_quad_state_index < sqs_list.size() &&
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           quad->shared_quad_state != sqs_list[shared_quad_state_index])
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ++shared_quad_state_index;
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_LT(shared_quad_state_index, sqs_list.size());
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (shared_quad_state_index >= sqs_list.size()) {
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WriteParam(m, bad_index);
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WriteParam(m, shared_quad_state_index);
378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (shared_quad_state_index != last_shared_quad_state_index) {
379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      WriteParam(m, *sqs_list[shared_quad_state_index]);
380f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      last_shared_quad_state_index = shared_quad_state_index;
381f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)static size_t ReserveSizeForRenderPassWrite(const cc::RenderPass& p) {
3861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  size_t to_reserve = sizeof(cc::RenderPass);
3871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  to_reserve += p.shared_quad_state_list.size() * sizeof(cc::SharedQuadState);
3891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // The shared_quad_state_index for each quad.
3911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  to_reserve += p.quad_list.size() * sizeof(size_t);
3921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // The largest quad type, verified by a unit test.
3946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  to_reserve += p.quad_list.size() * sizeof(cc::kLargestDrawQuad);
3951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return to_reserve;
3961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
3971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitemplate <typename QuadType>
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic cc::DrawQuad* ReadDrawQuad(const Message* m,
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  PickleIterator* iter,
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  cc::RenderPass* render_pass) {
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  QuadType* quad = render_pass->CreateAndAppendDrawQuad<QuadType>();
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!ReadParam(m, iter, quad))
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return quad;
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ParamTraits<cc::RenderPass>::Read(
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Message* m, PickleIterator* iter, param_type* p) {
41003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  cc::RenderPassId id(-1, -1);
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect output_rect;
412c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  gfx::Rect damage_rect;
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform transform_to_root_target;
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool has_transparent_background;
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t shared_quad_state_list_size;
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t quad_list_size;
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ReadParam(m, iter, &id) ||
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !ReadParam(m, iter, &output_rect) ||
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !ReadParam(m, iter, &damage_rect) ||
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !ReadParam(m, iter, &transform_to_root_target) ||
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !ReadParam(m, iter, &has_transparent_background) ||
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !ReadParam(m, iter, &shared_quad_state_list_size) ||
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !ReadParam(m, iter, &quad_list_size))
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  p->SetAll(id,
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            output_rect,
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            damage_rect,
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            transform_to_root_target,
431effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            has_transparent_background);
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  size_t last_shared_quad_state_index = kuint32max;
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < quad_list_size; ++i) {
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cc::DrawQuad::Material material;
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PickleIterator temp_iter = *iter;
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!ReadParam(m, &temp_iter, &material))
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cc::DrawQuad* draw_quad = NULL;
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (material) {
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::CHECKERBOARD:
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        draw_quad = ReadDrawQuad<cc::CheckerboardDrawQuad>(m, iter, p);
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::DEBUG_BORDER:
4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        draw_quad = ReadDrawQuad<cc::DebugBorderDrawQuad>(m, iter, p);
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::IO_SURFACE_CONTENT:
4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        draw_quad = ReadDrawQuad<cc::IOSurfaceDrawQuad>(m, iter, p);
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case cc::DrawQuad::PICTURE_CONTENT:
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return false;
4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case cc::DrawQuad::SURFACE_CONTENT:
4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        draw_quad = ReadDrawQuad<cc::SurfaceDrawQuad>(m, iter, p);
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::TEXTURE_CONTENT:
4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        draw_quad = ReadDrawQuad<cc::TextureDrawQuad>(m, iter, p);
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::RENDER_PASS:
4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        draw_quad = ReadDrawQuad<cc::RenderPassDrawQuad>(m, iter, p);
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::SOLID_COLOR:
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        draw_quad = ReadDrawQuad<cc::SolidColorDrawQuad>(m, iter, p);
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::TILED_CONTENT:
4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        draw_quad = ReadDrawQuad<cc::TileDrawQuad>(m, iter, p);
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::STREAM_VIDEO_CONTENT:
4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        draw_quad = ReadDrawQuad<cc::StreamVideoDrawQuad>(m, iter, p);
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::YUV_VIDEO_CONTENT:
4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        draw_quad = ReadDrawQuad<cc::YUVVideoDrawQuad>(m, iter, p);
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::INVALID:
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!draw_quad)
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
4804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!draw_quad->rect.Contains(draw_quad->visible_rect)) {
4814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      LOG(ERROR) << "Quad with invalid visible rect " << draw_quad->material
4824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 << " rect: " << draw_quad->rect.ToString()
4834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 << " visible_rect: " << draw_quad->visible_rect.ToString();
4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return false;
4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
4864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!draw_quad->opaque_rect.IsEmpty() &&
4874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        !draw_quad->rect.Contains(draw_quad->opaque_rect)) {
4884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      LOG(ERROR) << "Quad with invalid opaque rect " << draw_quad->material
4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 << " rect: " << draw_quad->rect.ToString()
4904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 << " opaque_rect: " << draw_quad->opaque_rect.ToString();
4914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return false;
4924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t shared_quad_state_index;
495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (!ReadParam(m, iter, &shared_quad_state_index))
496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return false;
497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (shared_quad_state_index >= shared_quad_state_list_size)
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // SharedQuadState indexes should be in ascending order.
500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (last_shared_quad_state_index != kuint32max &&
501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        shared_quad_state_index < last_shared_quad_state_index)
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // If the quad has a new shared quad state, read it in.
505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (last_shared_quad_state_index != shared_quad_state_index) {
506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cc::SharedQuadState* state = p->CreateAndAppendSharedQuadState();
507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (!ReadParam(m, iter, state))
508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        return false;
509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      last_shared_quad_state_index = shared_quad_state_index;
510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    draw_quad->shared_quad_state = p->shared_quad_state_list.back();
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<cc::RenderPass>::Log(
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const param_type& p, std::string* l) {
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append("RenderPass((");
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LogParam(p.id, l);
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append("), ");
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LogParam(p.output_rect, l);
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append(", ");
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LogParam(p.damage_rect, l);
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append(", ");
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LogParam(p.transform_to_root_target, l);
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append(", ");
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LogParam(p.has_transparent_background, l);
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append(", ");
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append("[");
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < p.shared_quad_state_list.size(); ++i) {
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (i)
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l->append(", ");
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LogParam(*p.shared_quad_state_list[i], l);
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append("], [");
5391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (cc::QuadList::ConstIterator iter = p.quad_list.begin();
5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       iter != p.quad_list.end();
5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       ++iter) {
5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (iter != p.quad_list.begin())
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l->append(", ");
5441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const cc::DrawQuad* quad = &*iter;
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (quad->material) {
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::CHECKERBOARD:
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LogParam(*cc::CheckerboardDrawQuad::MaterialCast(quad), l);
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::DEBUG_BORDER:
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LogParam(*cc::DebugBorderDrawQuad::MaterialCast(quad), l);
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::IO_SURFACE_CONTENT:
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LogParam(*cc::IOSurfaceDrawQuad::MaterialCast(quad), l);
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case cc::DrawQuad::PICTURE_CONTENT:
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::TEXTURE_CONTENT:
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LogParam(*cc::TextureDrawQuad::MaterialCast(quad), l);
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::RENDER_PASS:
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LogParam(*cc::RenderPassDrawQuad::MaterialCast(quad), l);
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::SOLID_COLOR:
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LogParam(*cc::SolidColorDrawQuad::MaterialCast(quad), l);
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case cc::DrawQuad::SURFACE_CONTENT:
5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        LogParam(*cc::SurfaceDrawQuad::MaterialCast(quad), l);
5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::TILED_CONTENT:
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LogParam(*cc::TileDrawQuad::MaterialCast(quad), l);
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::STREAM_VIDEO_CONTENT:
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LogParam(*cc::StreamVideoDrawQuad::MaterialCast(quad), l);
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::YUV_VIDEO_CONTENT:
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LogParam(*cc::YUVVideoDrawQuad::MaterialCast(quad), l);
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case cc::DrawQuad::INVALID:
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append("])");
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum CompositorFrameType {
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NO_FRAME,
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DELEGATED_FRAME,
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GL_FRAME,
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SOFTWARE_FRAME,
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<cc::CompositorFrame>::Write(Message* m,
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             const param_type& p) {
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WriteParam(m, p.metadata);
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (p.delegated_frame_data) {
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(!p.gl_frame_data);
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(!p.software_frame_data);
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WriteParam(m, static_cast<int>(DELEGATED_FRAME));
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WriteParam(m, *p.delegated_frame_data);
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (p.gl_frame_data) {
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(!p.software_frame_data);
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WriteParam(m, static_cast<int>(GL_FRAME));
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WriteParam(m, *p.gl_frame_data);
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (p.software_frame_data) {
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WriteParam(m, static_cast<int>(SOFTWARE_FRAME));
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WriteParam(m, *p.software_frame_data);
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WriteParam(m, static_cast<int>(NO_FRAME));
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ParamTraits<cc::CompositorFrame>::Read(const Message* m,
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            PickleIterator* iter,
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            param_type* p) {
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ReadParam(m, iter, &p->metadata))
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int compositor_frame_type;
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ReadParam(m, iter, &compositor_frame_type))
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (compositor_frame_type) {
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case DELEGATED_FRAME:
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      p->delegated_frame_data.reset(new cc::DelegatedFrameData());
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!ReadParam(m, iter, p->delegated_frame_data.get()))
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case GL_FRAME:
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      p->gl_frame_data.reset(new cc::GLFrameData());
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!ReadParam(m, iter, p->gl_frame_data.get()))
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SOFTWARE_FRAME:
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      p->software_frame_data.reset(new cc::SoftwareFrameData());
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!ReadParam(m, iter, p->software_frame_data.get()))
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NO_FRAME:
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<cc::CompositorFrame>::Log(const param_type& p,
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           std::string* l) {
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append("CompositorFrame(");
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LogParam(p.metadata, l);
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append(", ");
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (p.delegated_frame_data)
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LogParam(*p.delegated_frame_data, l);
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (p.gl_frame_data)
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LogParam(*p.gl_frame_data, l);
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (p.software_frame_data)
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LogParam(*p.software_frame_data, l);
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append(")");
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<cc::CompositorFrameAck>::Write(Message* m,
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                const param_type& p) {
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WriteParam(m, p.resources);
666868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WriteParam(m, p.last_software_frame_id);
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (p.gl_frame_data) {
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WriteParam(m, static_cast<int>(GL_FRAME));
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WriteParam(m, *p.gl_frame_data);
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WriteParam(m, static_cast<int>(NO_FRAME));
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ParamTraits<cc::CompositorFrameAck>::Read(const Message* m,
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               PickleIterator* iter,
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               param_type* p) {
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ReadParam(m, iter, &p->resources))
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
681868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!ReadParam(m, iter, &p->last_software_frame_id))
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int compositor_frame_type;
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ReadParam(m, iter, &compositor_frame_type))
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (compositor_frame_type) {
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NO_FRAME:
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case GL_FRAME:
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      p->gl_frame_data.reset(new cc::GLFrameData());
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!ReadParam(m, iter, p->gl_frame_data.get()))
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<cc::CompositorFrameAck>::Log(const param_type& p,
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              std::string* l) {
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append("CompositorFrameAck(");
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LogParam(p.resources, l);
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append(", ");
707868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LogParam(p.last_software_frame_id, l);
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append(", ");
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (p.gl_frame_data)
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LogParam(*p.gl_frame_data, l);
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append(")");
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<cc::DelegatedFrameData>::Write(Message* m,
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                const param_type& p) {
7164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK_NE(0u, p.render_pass_list.size());
7171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
71846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  size_t to_reserve = sizeof(p.device_scale_factor);
71946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  to_reserve += p.resource_list.size() * sizeof(cc::TransferableResource);
7201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (size_t i = 0; i < p.render_pass_list.size(); ++i) {
7211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const cc::RenderPass* pass = p.render_pass_list[i];
7221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    to_reserve += ReserveSizeForRenderPassWrite(*pass);
7231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
7241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  m->Reserve(to_reserve);
7251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
72646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  WriteParam(m, p.device_scale_factor);
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WriteParam(m, p.resource_list);
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WriteParam(m, p.render_pass_list.size());
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < p.render_pass_list.size(); ++i)
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WriteParam(m, *p.render_pass_list[i]);
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ParamTraits<cc::DelegatedFrameData>::Read(const Message* m,
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               PickleIterator* iter,
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               param_type* p) {
73646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!ReadParam(m, iter, &p->device_scale_factor))
73746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
73846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const static size_t kMaxRenderPasses = 10000;
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t num_render_passes;
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ReadParam(m, iter, &p->resource_list) ||
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !ReadParam(m, iter, &num_render_passes) ||
7444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      num_render_passes > kMaxRenderPasses || num_render_passes == 0)
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < num_render_passes; ++i) {
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!ReadParam(m, iter, render_pass.get()))
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    p->render_pass_list.push_back(render_pass.Pass());
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParamTraits<cc::DelegatedFrameData>::Log(const param_type& p,
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              std::string* l) {
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append("DelegatedFrameData(");
75846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  LogParam(p.device_scale_factor, l);
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LogParam(p.resource_list, l);
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append(", [");
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < p.render_pass_list.size(); ++i) {
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (i)
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l->append(", ");
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LogParam(*p.render_pass_list[i], l);
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  l->append("])");
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
76923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void ParamTraits<cc::SoftwareFrameData>::Write(Message* m,
77023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                               const param_type& p) {
771c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK(cc::SharedBitmap::VerifySizeInBytes(p.size));
77223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
77323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  m->Reserve(sizeof(cc::SoftwareFrameData));
77423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  WriteParam(m, p.id);
77523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  WriteParam(m, p.size);
77623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  WriteParam(m, p.damage_rect);
777c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  WriteParam(m, p.bitmap_id);
77823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
77923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
78023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)bool ParamTraits<cc::SoftwareFrameData>::Read(const Message* m,
78123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                              PickleIterator* iter,
78223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                              param_type* p) {
78323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!ReadParam(m, iter, &p->id))
78423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return false;
785c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!ReadParam(m, iter, &p->size) ||
786c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      !cc::SharedBitmap::VerifySizeInBytes(p->size))
78723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return false;
78823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!ReadParam(m, iter, &p->damage_rect))
78923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return false;
790c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!ReadParam(m, iter, &p->bitmap_id))
79123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return false;
79223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return true;
79323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
79423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
79523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void ParamTraits<cc::SoftwareFrameData>::Log(const param_type& p,
79623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                             std::string* l) {
79723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  l->append("SoftwareFrameData(");
79823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  LogParam(p.id, l);
79923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  l->append(", ");
80023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  LogParam(p.size, l);
80123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  l->append(", ");
80223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  LogParam(p.damage_rect, l);
80323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  l->append(", ");
804c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  LogParam(p.bitmap_id, l);
80523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  l->append(")");
80623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
80723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace IPC
809