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