| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/resources/picture.h" | 5 #include "cc/resources/picture.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <set> | 9 #include <set> |
| 10 | 10 |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 std::string decoded; | 115 std::string decoded; |
| 116 base::Base64Decode(encoded, &decoded); | 116 base::Base64Decode(encoded, &decoded); |
| 117 SkMemoryStream stream(decoded.data(), decoded.size()); | 117 SkMemoryStream stream(decoded.data(), decoded.size()); |
| 118 | 118 |
| 119 // Read the picture. This creates an empty picture on failure. | 119 // Read the picture. This creates an empty picture on failure. |
| 120 SkPicture* skpicture = SkPicture::CreateFromStream(&stream, &DecodeBitmap); | 120 SkPicture* skpicture = SkPicture::CreateFromStream(&stream, &DecodeBitmap); |
| 121 if (skpicture == NULL) | 121 if (skpicture == NULL) |
| 122 return NULL; | 122 return NULL; |
| 123 | 123 |
| 124 gfx::Rect layer_rect(skpicture->width(), skpicture->height()); | 124 gfx::Rect layer_rect(skpicture->width(), skpicture->height()); |
| 125 gfx::Rect opaque_rect(skpicture->width(), skpicture->height()); | 125 return make_scoped_refptr(new Picture(skpicture, layer_rect)); |
| 126 | |
| 127 return make_scoped_refptr(new Picture(skpicture, layer_rect, opaque_rect)); | |
| 128 } | 126 } |
| 129 | 127 |
| 130 scoped_refptr<Picture> Picture::CreateFromValue(const base::Value* raw_value) { | 128 scoped_refptr<Picture> Picture::CreateFromValue(const base::Value* raw_value) { |
| 131 const base::DictionaryValue* value = NULL; | 129 const base::DictionaryValue* value = NULL; |
| 132 if (!raw_value->GetAsDictionary(&value)) | 130 if (!raw_value->GetAsDictionary(&value)) |
| 133 return NULL; | 131 return NULL; |
| 134 | 132 |
| 135 // Decode the picture from base64. | 133 // Decode the picture from base64. |
| 136 std::string encoded; | 134 std::string encoded; |
| 137 if (!value->GetString("skp64", &encoded)) | 135 if (!value->GetString("skp64", &encoded)) |
| 138 return NULL; | 136 return NULL; |
| 139 | 137 |
| 140 std::string decoded; | 138 std::string decoded; |
| 141 base::Base64Decode(encoded, &decoded); | 139 base::Base64Decode(encoded, &decoded); |
| 142 SkMemoryStream stream(decoded.data(), decoded.size()); | 140 SkMemoryStream stream(decoded.data(), decoded.size()); |
| 143 | 141 |
| 144 const base::Value* layer_rect_value = NULL; | 142 const base::Value* layer_rect_value = NULL; |
| 145 if (!value->Get("params.layer_rect", &layer_rect_value)) | 143 if (!value->Get("params.layer_rect", &layer_rect_value)) |
| 146 return NULL; | 144 return NULL; |
| 147 | 145 |
| 148 gfx::Rect layer_rect; | 146 gfx::Rect layer_rect; |
| 149 if (!MathUtil::FromValue(layer_rect_value, &layer_rect)) | 147 if (!MathUtil::FromValue(layer_rect_value, &layer_rect)) |
| 150 return NULL; | 148 return NULL; |
| 151 | 149 |
| 152 const base::Value* opaque_rect_value = NULL; | |
| 153 if (!value->Get("params.opaque_rect", &opaque_rect_value)) | |
| 154 return NULL; | |
| 155 | |
| 156 gfx::Rect opaque_rect; | |
| 157 if (!MathUtil::FromValue(opaque_rect_value, &opaque_rect)) | |
| 158 return NULL; | |
| 159 | |
| 160 // Read the picture. This creates an empty picture on failure. | 150 // Read the picture. This creates an empty picture on failure. |
| 161 SkPicture* skpicture = SkPicture::CreateFromStream(&stream, &DecodeBitmap); | 151 SkPicture* skpicture = SkPicture::CreateFromStream(&stream, &DecodeBitmap); |
| 162 if (skpicture == NULL) | 152 if (skpicture == NULL) |
| 163 return NULL; | 153 return NULL; |
| 164 | 154 |
| 165 return make_scoped_refptr(new Picture(skpicture, layer_rect, opaque_rect)); | 155 return make_scoped_refptr(new Picture(skpicture, layer_rect)); |
| 166 } | 156 } |
| 167 | 157 |
| 168 Picture::Picture(SkPicture* picture, | 158 Picture::Picture(SkPicture* picture, const gfx::Rect& layer_rect) |
| 169 const gfx::Rect& layer_rect, | 159 : layer_rect_(layer_rect), |
| 170 const gfx::Rect& opaque_rect) : | 160 picture_(skia::AdoptRef(picture)), |
| 171 layer_rect_(layer_rect), | 161 cell_size_(layer_rect.size()) { |
| 172 opaque_rect_(opaque_rect), | |
| 173 picture_(skia::AdoptRef(picture)), | |
| 174 cell_size_(layer_rect.size()) { | |
| 175 } | 162 } |
| 176 | 163 |
| 177 Picture::Picture(const skia::RefPtr<SkPicture>& picture, | 164 Picture::Picture(const skia::RefPtr<SkPicture>& picture, |
| 178 const gfx::Rect& layer_rect, | 165 const gfx::Rect& layer_rect, |
| 179 const gfx::Rect& opaque_rect, | |
| 180 const PixelRefMap& pixel_refs) : | 166 const PixelRefMap& pixel_refs) : |
| 181 layer_rect_(layer_rect), | 167 layer_rect_(layer_rect), |
| 182 opaque_rect_(opaque_rect), | |
| 183 picture_(picture), | 168 picture_(picture), |
| 184 pixel_refs_(pixel_refs), | 169 pixel_refs_(pixel_refs), |
| 185 cell_size_(layer_rect.size()) { | 170 cell_size_(layer_rect.size()) { |
| 186 } | 171 } |
| 187 | 172 |
| 188 Picture::~Picture() { | 173 Picture::~Picture() { |
| 189 TRACE_EVENT_OBJECT_DELETED_WITH_ID( | 174 TRACE_EVENT_OBJECT_DELETED_WITH_ID( |
| 190 TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::Picture", this); | 175 TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::Picture", this); |
| 191 } | 176 } |
| 192 | 177 |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 picture_ = skia::AdoptRef(recorder.endRecording()); | 265 picture_ = skia::AdoptRef(recorder.endRecording()); |
| 281 DCHECK(picture_); | 266 DCHECK(picture_); |
| 282 | 267 |
| 283 if (recording) { | 268 if (recording) { |
| 284 // SkRecording requires it's the only one holding onto canvas before we | 269 // SkRecording requires it's the only one holding onto canvas before we |
| 285 // may call releasePlayback(). (This helps enforce thread-safety.) | 270 // may call releasePlayback(). (This helps enforce thread-safety.) |
| 286 canvas.clear(); | 271 canvas.clear(); |
| 287 playback_.reset(recording->releasePlayback()); | 272 playback_.reset(recording->releasePlayback()); |
| 288 } | 273 } |
| 289 | 274 |
| 290 opaque_rect_ = gfx::ToEnclosedRect(opaque_layer_rect); | |
| 291 | |
| 292 EmitTraceSnapshot(); | 275 EmitTraceSnapshot(); |
| 293 } | 276 } |
| 294 | 277 |
| 295 void Picture::GatherPixelRefs( | 278 void Picture::GatherPixelRefs( |
| 296 const SkTileGridFactory::TileGridInfo& tile_grid_info) { | 279 const SkTileGridFactory::TileGridInfo& tile_grid_info) { |
| 297 TRACE_EVENT2("cc", "Picture::GatherPixelRefs", | 280 TRACE_EVENT2("cc", "Picture::GatherPixelRefs", |
| 298 "width", layer_rect_.width(), | 281 "width", layer_rect_.width(), |
| 299 "height", layer_rect_.height()); | 282 "height", layer_rect_.height()); |
| 300 | 283 |
| 301 DCHECK(picture_); | 284 DCHECK(picture_); |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 410 skia::RefPtr<SkPicture> picture(skia::AdoptRef(recorder.endRecording())); | 393 skia::RefPtr<SkPicture> picture(skia::AdoptRef(recorder.endRecording())); |
| 411 picture->serialize(&stream, &EncodeBitmap); | 394 picture->serialize(&stream, &EncodeBitmap); |
| 412 } else { | 395 } else { |
| 413 // Serialize the picture. | 396 // Serialize the picture. |
| 414 picture_->serialize(&stream, &EncodeBitmap); | 397 picture_->serialize(&stream, &EncodeBitmap); |
| 415 } | 398 } |
| 416 | 399 |
| 417 // Encode the picture as base64. | 400 // Encode the picture as base64. |
| 418 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); | 401 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); |
| 419 res->Set("params.layer_rect", MathUtil::AsValue(layer_rect_).release()); | 402 res->Set("params.layer_rect", MathUtil::AsValue(layer_rect_).release()); |
| 420 res->Set("params.opaque_rect", MathUtil::AsValue(opaque_rect_).release()); | |
| 421 | 403 |
| 422 size_t serialized_size = stream.bytesWritten(); | 404 size_t serialized_size = stream.bytesWritten(); |
| 423 scoped_ptr<char[]> serialized_picture(new char[serialized_size]); | 405 scoped_ptr<char[]> serialized_picture(new char[serialized_size]); |
| 424 stream.copyTo(serialized_picture.get()); | 406 stream.copyTo(serialized_picture.get()); |
| 425 std::string b64_picture; | 407 std::string b64_picture; |
| 426 base::Base64Encode(std::string(serialized_picture.get(), serialized_size), | 408 base::Base64Encode(std::string(serialized_picture.get(), serialized_size), |
| 427 &b64_picture); | 409 &b64_picture); |
| 428 res->SetString("skp64", b64_picture); | 410 res->SetString("skp64", b64_picture); |
| 429 return res.PassAs<base::Value>(); | 411 return res.PassAs<base::Value>(); |
| 430 } | 412 } |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 561 scoped_refptr<base::debug::TracedValue> record_data = | 543 scoped_refptr<base::debug::TracedValue> record_data = |
| 562 new base::debug::TracedValue(); | 544 new base::debug::TracedValue(); |
| 563 TracedValue::SetIDRef(this, record_data.get(), "picture_id"); | 545 TracedValue::SetIDRef(this, record_data.get(), "picture_id"); |
| 564 record_data->BeginArray("layer_rect"); | 546 record_data->BeginArray("layer_rect"); |
| 565 MathUtil::AddToTracedValue(layer_rect_, record_data.get()); | 547 MathUtil::AddToTracedValue(layer_rect_, record_data.get()); |
| 566 record_data->EndArray(); | 548 record_data->EndArray(); |
| 567 return record_data; | 549 return record_data; |
| 568 } | 550 } |
| 569 | 551 |
| 570 } // namespace cc | 552 } // namespace cc |
| OLD | NEW |