| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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/trees/layer_tree_host.h" | 5 #include "cc/trees/layer_tree_host.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <stack> | 8 #include <stack> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 allow_partial_texture_updates(false), | 54 allow_partial_texture_updates(false), |
| 55 using_offscreen_context3d(false), | 55 using_offscreen_context3d(false), |
| 56 max_texture_size(0), | 56 max_texture_size(0), |
| 57 avoid_pow2_textures(false), | 57 avoid_pow2_textures(false), |
| 58 using_map_image(false), | 58 using_map_image(false), |
| 59 using_shared_memory_resources(false), | 59 using_shared_memory_resources(false), |
| 60 using_discard_framebuffer(false) {} | 60 using_discard_framebuffer(false) {} |
| 61 | 61 |
| 62 RendererCapabilities::~RendererCapabilities() {} | 62 RendererCapabilities::~RendererCapabilities() {} |
| 63 | 63 |
| 64 UIResourceRequest::UIResourceRequest() | 64 UIResourceRequest::UIResourceRequest(UIResourceRequestType type, |
| 65 : type(UIResourceInvalidRequest), id(0), bitmap(NULL) {} | 65 UIResourceId id) |
| 66 : type_(type), id_(id) {} |
| 67 |
| 68 UIResourceRequest::UIResourceRequest(UIResourceRequestType type, |
| 69 UIResourceId id, |
| 70 const UIResourceBitmap& bitmap) |
| 71 : type_(type), id_(id), bitmap_(new UIResourceBitmap(bitmap)) {} |
| 72 |
| 73 UIResourceRequest::UIResourceRequest(const UIResourceRequest& request) { |
| 74 (*this) = request; |
| 75 } |
| 76 |
| 77 UIResourceRequest& UIResourceRequest::operator=( |
| 78 const UIResourceRequest& request) { |
| 79 type_ = request.type_; |
| 80 id_ = request.id_; |
| 81 if (request.bitmap_) { |
| 82 bitmap_ = make_scoped_ptr(new UIResourceBitmap(*request.bitmap_.get())); |
| 83 } else { |
| 84 bitmap_.reset(); |
| 85 } |
| 86 |
| 87 return *this; |
| 88 } |
| 66 | 89 |
| 67 UIResourceRequest::~UIResourceRequest() {} | 90 UIResourceRequest::~UIResourceRequest() {} |
| 68 | 91 |
| 69 bool LayerTreeHost::AnyLayerTreeHostInstanceExists() { | 92 bool LayerTreeHost::AnyLayerTreeHostInstanceExists() { |
| 70 return s_num_layer_tree_instances > 0; | 93 return s_num_layer_tree_instances > 0; |
| 71 } | 94 } |
| 72 | 95 |
| 73 scoped_ptr<LayerTreeHost> LayerTreeHost::Create( | 96 scoped_ptr<LayerTreeHost> LayerTreeHost::Create( |
| 74 LayerTreeHostClient* client, | 97 LayerTreeHostClient* client, |
| 75 const LayerTreeSettings& settings, | 98 const LayerTreeSettings& settings, |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 369 sync_tree->set_ui_resource_request_queue(ui_resource_request_queue_); | 392 sync_tree->set_ui_resource_request_queue(ui_resource_request_queue_); |
| 370 ui_resource_request_queue_.clear(); | 393 ui_resource_request_queue_.clear(); |
| 371 // Process any ui resource requests in the queue. For impl-side-painting, | 394 // Process any ui resource requests in the queue. For impl-side-painting, |
| 372 // the queue is processed in LayerTreeHostImpl::ActivatePendingTree. | 395 // the queue is processed in LayerTreeHostImpl::ActivatePendingTree. |
| 373 if (!settings_.impl_side_painting) | 396 if (!settings_.impl_side_painting) |
| 374 sync_tree->ProcessUIResourceRequestQueue(); | 397 sync_tree->ProcessUIResourceRequestQueue(); |
| 375 } | 398 } |
| 376 if (overhang_ui_resource_) { | 399 if (overhang_ui_resource_) { |
| 377 host_impl->SetOverhangUIResource( | 400 host_impl->SetOverhangUIResource( |
| 378 overhang_ui_resource_->id(), | 401 overhang_ui_resource_->id(), |
| 379 overhang_ui_resource_->GetSize()); | 402 GetUIResourceSize(overhang_ui_resource_->id())); |
| 380 } | 403 } |
| 381 | 404 |
| 382 DCHECK(!sync_tree->ViewportSizeInvalid()); | 405 DCHECK(!sync_tree->ViewportSizeInvalid()); |
| 383 | 406 |
| 384 if (new_impl_tree_has_no_evicted_resources) { | 407 if (new_impl_tree_has_no_evicted_resources) { |
| 385 if (sync_tree->ContentsTexturesPurged()) | 408 if (sync_tree->ContentsTexturesPurged()) |
| 386 sync_tree->ResetContentsTexturesPurged(); | 409 sync_tree->ResetContentsTexturesPurged(); |
| 387 } | 410 } |
| 388 | 411 |
| 389 if (!settings_.impl_side_painting) { | 412 if (!settings_.impl_side_painting) { |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 627 page_scale_factor_ = page_scale_factor; | 650 page_scale_factor_ = page_scale_factor; |
| 628 min_page_scale_factor_ = min_page_scale_factor; | 651 min_page_scale_factor_ = min_page_scale_factor; |
| 629 max_page_scale_factor_ = max_page_scale_factor; | 652 max_page_scale_factor_ = max_page_scale_factor; |
| 630 SetNeedsCommit(); | 653 SetNeedsCommit(); |
| 631 } | 654 } |
| 632 | 655 |
| 633 void LayerTreeHost::SetOverhangBitmap(const SkBitmap& bitmap) { | 656 void LayerTreeHost::SetOverhangBitmap(const SkBitmap& bitmap) { |
| 634 DCHECK(bitmap.width() && bitmap.height()); | 657 DCHECK(bitmap.width() && bitmap.height()); |
| 635 DCHECK_EQ(bitmap.bytesPerPixel(), 4); | 658 DCHECK_EQ(bitmap.bytesPerPixel(), 4); |
| 636 | 659 |
| 637 scoped_refptr<UIResourceBitmap> overhang_ui_bitmap(UIResourceBitmap::Create( | 660 SkBitmap bitmap_copy; |
| 638 new uint8_t[bitmap.width() * bitmap.height() * bitmap.bytesPerPixel()], | 661 if (bitmap.isImmutable()) { |
| 639 UIResourceBitmap::RGBA8, | 662 bitmap_copy = bitmap; |
| 640 UIResourceBitmap::REPEAT, | 663 } else { |
| 641 gfx::Size(bitmap.width(), bitmap.height()))); | 664 bitmap.copyTo(&bitmap_copy, bitmap.config()); |
| 642 bitmap.copyPixelsTo( | 665 bitmap_copy.setImmutable(); |
| 643 overhang_ui_bitmap->GetPixels(), | 666 } |
| 644 bitmap.width() * bitmap.height() * bitmap.bytesPerPixel(), | 667 |
| 645 bitmap.width() * bitmap.bytesPerPixel()); | 668 overhang_ui_resource_ = ScopedUIResource::Create( |
| 646 overhang_ui_resource_ = ScopedUIResource::Create(this, overhang_ui_bitmap); | 669 this, UIResourceBitmap(bitmap_copy, UIResourceBitmap::REPEAT)); |
| 647 } | 670 } |
| 648 | 671 |
| 649 void LayerTreeHost::SetVisible(bool visible) { | 672 void LayerTreeHost::SetVisible(bool visible) { |
| 650 if (visible_ == visible) | 673 if (visible_ == visible) |
| 651 return; | 674 return; |
| 652 visible_ = visible; | 675 visible_ = visible; |
| 653 if (!visible) | 676 if (!visible) |
| 654 ReduceMemoryUsage(); | 677 ReduceMemoryUsage(); |
| 655 proxy_->SetVisible(visible); | 678 proxy_->SetVisible(visible); |
| 656 } | 679 } |
| (...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1139 ++iter) { | 1162 ++iter) { |
| 1140 (*iter).second->Animate(monotonic_time); | 1163 (*iter).second->Animate(monotonic_time); |
| 1141 bool start_ready_animations = true; | 1164 bool start_ready_animations = true; |
| 1142 (*iter).second->UpdateState(start_ready_animations, NULL); | 1165 (*iter).second->UpdateState(start_ready_animations, NULL); |
| 1143 } | 1166 } |
| 1144 } | 1167 } |
| 1145 | 1168 |
| 1146 UIResourceId LayerTreeHost::CreateUIResource(UIResourceClient* client) { | 1169 UIResourceId LayerTreeHost::CreateUIResource(UIResourceClient* client) { |
| 1147 DCHECK(client); | 1170 DCHECK(client); |
| 1148 | 1171 |
| 1149 UIResourceRequest request; | 1172 UIResourceId next_id = next_ui_resource_id_++; |
| 1150 bool resource_lost = false; | 1173 DCHECK(ui_resource_client_map_.find(next_id) == |
| 1151 request.type = UIResourceRequest::UIResourceCreate; | |
| 1152 request.id = next_ui_resource_id_++; | |
| 1153 | |
| 1154 DCHECK(ui_resource_client_map_.find(request.id) == | |
| 1155 ui_resource_client_map_.end()); | 1174 ui_resource_client_map_.end()); |
| 1156 | 1175 |
| 1157 request.bitmap = client->GetBitmap(request.id, resource_lost); | 1176 bool resource_lost = false; |
| 1177 UIResourceRequest request(UIResourceRequest::UIResourceCreate, |
| 1178 next_id, |
| 1179 client->GetBitmap(next_id, resource_lost)); |
| 1158 ui_resource_request_queue_.push_back(request); | 1180 ui_resource_request_queue_.push_back(request); |
| 1159 ui_resource_client_map_[request.id] = client; | 1181 |
| 1160 return request.id; | 1182 UIResourceClientData data; |
| 1183 data.client = client; |
| 1184 data.size = request.GetBitmap().GetSize(); |
| 1185 |
| 1186 ui_resource_client_map_[request.GetId()] = data; |
| 1187 return request.GetId(); |
| 1161 } | 1188 } |
| 1162 | 1189 |
| 1163 // Deletes a UI resource. May safely be called more than once. | 1190 // Deletes a UI resource. May safely be called more than once. |
| 1164 void LayerTreeHost::DeleteUIResource(UIResourceId uid) { | 1191 void LayerTreeHost::DeleteUIResource(UIResourceId uid) { |
| 1165 UIResourceClientMap::iterator iter = ui_resource_client_map_.find(uid); | 1192 UIResourceClientMap::iterator iter = ui_resource_client_map_.find(uid); |
| 1166 if (iter == ui_resource_client_map_.end()) | 1193 if (iter == ui_resource_client_map_.end()) |
| 1167 return; | 1194 return; |
| 1168 | 1195 |
| 1169 UIResourceRequest request; | 1196 UIResourceRequest request(UIResourceRequest::UIResourceDelete, uid); |
| 1170 request.type = UIResourceRequest::UIResourceDelete; | |
| 1171 request.id = uid; | |
| 1172 ui_resource_request_queue_.push_back(request); | 1197 ui_resource_request_queue_.push_back(request); |
| 1173 ui_resource_client_map_.erase(uid); | 1198 ui_resource_client_map_.erase(iter); |
| 1174 } | 1199 } |
| 1175 | 1200 |
| 1176 void LayerTreeHost::RecreateUIResources() { | 1201 void LayerTreeHost::RecreateUIResources() { |
| 1177 for (UIResourceClientMap::iterator iter = ui_resource_client_map_.begin(); | 1202 for (UIResourceClientMap::iterator iter = ui_resource_client_map_.begin(); |
| 1178 iter != ui_resource_client_map_.end(); | 1203 iter != ui_resource_client_map_.end(); |
| 1179 ++iter) { | 1204 ++iter) { |
| 1180 UIResourceId uid = iter->first; | 1205 UIResourceId uid = iter->first; |
| 1181 UIResourceRequest request; | 1206 const UIResourceClientData& data = iter->second; |
| 1182 request.type = UIResourceRequest::UIResourceCreate; | |
| 1183 request.id = uid; | |
| 1184 bool resource_lost = true; | 1207 bool resource_lost = true; |
| 1185 request.bitmap = iter->second->GetBitmap(uid, resource_lost); | 1208 UIResourceRequest request(UIResourceRequest::UIResourceCreate, |
| 1186 DCHECK(request.bitmap.get()); | 1209 uid, |
| 1210 data.client->GetBitmap(uid, resource_lost)); |
| 1187 ui_resource_request_queue_.push_back(request); | 1211 ui_resource_request_queue_.push_back(request); |
| 1188 } | 1212 } |
| 1189 } | 1213 } |
| 1190 | 1214 |
| 1215 // Returns the size of a resource given its id. |
| 1216 gfx::Size LayerTreeHost::GetUIResourceSize(UIResourceId uid) const { |
| 1217 UIResourceClientMap::const_iterator iter = ui_resource_client_map_.find(uid); |
| 1218 if (iter == ui_resource_client_map_.end()) |
| 1219 return gfx::Size(); |
| 1220 |
| 1221 const UIResourceClientData& data = iter->second; |
| 1222 return data.size; |
| 1223 } |
| 1224 |
| 1191 } // namespace cc | 1225 } // namespace cc |
| OLD | NEW |