| 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 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 630 page_scale_factor_ = page_scale_factor; | 653 page_scale_factor_ = page_scale_factor; |
| 631 min_page_scale_factor_ = min_page_scale_factor; | 654 min_page_scale_factor_ = min_page_scale_factor; |
| 632 max_page_scale_factor_ = max_page_scale_factor; | 655 max_page_scale_factor_ = max_page_scale_factor; |
| 633 SetNeedsCommit(); | 656 SetNeedsCommit(); |
| 634 } | 657 } |
| 635 | 658 |
| 636 void LayerTreeHost::SetOverhangBitmap(const SkBitmap& bitmap) { | 659 void LayerTreeHost::SetOverhangBitmap(const SkBitmap& bitmap) { |
| 637 DCHECK(bitmap.width() && bitmap.height()); | 660 DCHECK(bitmap.width() && bitmap.height()); |
| 638 DCHECK_EQ(bitmap.bytesPerPixel(), 4); | 661 DCHECK_EQ(bitmap.bytesPerPixel(), 4); |
| 639 | 662 |
| 640 scoped_refptr<UIResourceBitmap> overhang_ui_bitmap(UIResourceBitmap::Create( | 663 SkBitmap bitmap_copy; |
| 641 new uint8_t[bitmap.width() * bitmap.height() * bitmap.bytesPerPixel()], | 664 if (bitmap.isImmutable()) { |
| 642 UIResourceBitmap::RGBA8, | 665 bitmap_copy = bitmap; |
| 643 UIResourceBitmap::REPEAT, | 666 } else { |
| 644 gfx::Size(bitmap.width(), bitmap.height()))); | 667 bitmap.copyTo(&bitmap_copy, bitmap.config()); |
| 645 bitmap.copyPixelsTo( | 668 bitmap_copy.setImmutable(); |
| 646 overhang_ui_bitmap->GetPixels(), | 669 } |
| 647 bitmap.width() * bitmap.height() * bitmap.bytesPerPixel(), | 670 |
| 648 bitmap.width() * bitmap.bytesPerPixel()); | 671 overhang_ui_resource_ = ScopedUIResource::Create( |
| 649 overhang_ui_resource_ = ScopedUIResource::Create(this, overhang_ui_bitmap); | 672 this, UIResourceBitmap(bitmap_copy, UIResourceBitmap::REPEAT)); |
| 650 } | 673 } |
| 651 | 674 |
| 652 void LayerTreeHost::SetVisible(bool visible) { | 675 void LayerTreeHost::SetVisible(bool visible) { |
| 653 if (visible_ == visible) | 676 if (visible_ == visible) |
| 654 return; | 677 return; |
| 655 visible_ = visible; | 678 visible_ = visible; |
| 656 if (!visible) | 679 if (!visible) |
| 657 ReduceMemoryUsage(); | 680 ReduceMemoryUsage(); |
| 658 proxy_->SetVisible(visible); | 681 proxy_->SetVisible(visible); |
| 659 } | 682 } |
| (...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1142 ++iter) { | 1165 ++iter) { |
| 1143 (*iter).second->Animate(monotonic_time); | 1166 (*iter).second->Animate(monotonic_time); |
| 1144 bool start_ready_animations = true; | 1167 bool start_ready_animations = true; |
| 1145 (*iter).second->UpdateState(start_ready_animations, NULL); | 1168 (*iter).second->UpdateState(start_ready_animations, NULL); |
| 1146 } | 1169 } |
| 1147 } | 1170 } |
| 1148 | 1171 |
| 1149 UIResourceId LayerTreeHost::CreateUIResource(UIResourceClient* client) { | 1172 UIResourceId LayerTreeHost::CreateUIResource(UIResourceClient* client) { |
| 1150 DCHECK(client); | 1173 DCHECK(client); |
| 1151 | 1174 |
| 1152 UIResourceRequest request; | 1175 UIResourceId next_id = next_ui_resource_id_++; |
| 1153 bool resource_lost = false; | 1176 DCHECK(ui_resource_client_map_.find(next_id) == |
| 1154 request.type = UIResourceRequest::UIResourceCreate; | |
| 1155 request.id = next_ui_resource_id_++; | |
| 1156 | |
| 1157 DCHECK(ui_resource_client_map_.find(request.id) == | |
| 1158 ui_resource_client_map_.end()); | 1177 ui_resource_client_map_.end()); |
| 1159 | 1178 |
| 1160 request.bitmap = client->GetBitmap(request.id, resource_lost); | 1179 bool resource_lost = false; |
| 1180 UIResourceRequest request(UIResourceRequest::UIResourceCreate, |
| 1181 next_id, |
| 1182 client->GetBitmap(next_id, resource_lost)); |
| 1161 ui_resource_request_queue_.push_back(request); | 1183 ui_resource_request_queue_.push_back(request); |
| 1162 ui_resource_client_map_[request.id] = client; | 1184 |
| 1163 return request.id; | 1185 UIResourceClientData data; |
| 1186 data.client = client; |
| 1187 data.size = request.GetBitmap().GetSize(); |
| 1188 |
| 1189 ui_resource_client_map_[request.GetId()] = data; |
| 1190 return request.GetId(); |
| 1164 } | 1191 } |
| 1165 | 1192 |
| 1166 // Deletes a UI resource. May safely be called more than once. | 1193 // Deletes a UI resource. May safely be called more than once. |
| 1167 void LayerTreeHost::DeleteUIResource(UIResourceId uid) { | 1194 void LayerTreeHost::DeleteUIResource(UIResourceId uid) { |
| 1168 UIResourceClientMap::iterator iter = ui_resource_client_map_.find(uid); | 1195 UIResourceClientMap::iterator iter = ui_resource_client_map_.find(uid); |
| 1169 if (iter == ui_resource_client_map_.end()) | 1196 if (iter == ui_resource_client_map_.end()) |
| 1170 return; | 1197 return; |
| 1171 | 1198 |
| 1172 UIResourceRequest request; | 1199 UIResourceRequest request(UIResourceRequest::UIResourceDelete, uid); |
| 1173 request.type = UIResourceRequest::UIResourceDelete; | |
| 1174 request.id = uid; | |
| 1175 ui_resource_request_queue_.push_back(request); | 1200 ui_resource_request_queue_.push_back(request); |
| 1176 ui_resource_client_map_.erase(uid); | 1201 ui_resource_client_map_.erase(iter); |
| 1202 } |
| 1203 |
| 1204 // Returns the size of a resource given its id. |
| 1205 gfx::Size LayerTreeHost::GetUIResourceSize(UIResourceId uid) const { |
| 1206 UIResourceClientMap::const_iterator iter = ui_resource_client_map_.find(uid); |
| 1207 if (iter == ui_resource_client_map_.end()) |
| 1208 return gfx::Size(); |
| 1209 |
| 1210 const UIResourceClientData& data = iter->second; |
| 1211 return data.size; |
| 1177 } | 1212 } |
| 1178 | 1213 |
| 1179 void LayerTreeHost::RecreateUIResources(bool resource_lost) { | 1214 void LayerTreeHost::RecreateUIResources(bool resource_lost) { |
| 1180 for (UIResourceClientMap::iterator iter = ui_resource_client_map_.begin(); | 1215 for (UIResourceClientMap::iterator iter = ui_resource_client_map_.begin(); |
| 1181 iter != ui_resource_client_map_.end(); | 1216 iter != ui_resource_client_map_.end(); |
| 1182 ++iter) { | 1217 ++iter) { |
| 1183 UIResourceId uid = iter->first; | 1218 UIResourceId uid = iter->first; |
| 1184 UIResourceRequest request; | 1219 const UIResourceClientData& data = iter->second; |
| 1185 request.type = UIResourceRequest::UIResourceCreate; | 1220 UIResourceRequest request(UIResourceRequest::UIResourceCreate, |
| 1186 request.id = uid; | 1221 uid, |
| 1187 request.bitmap = iter->second->GetBitmap(uid, resource_lost); | 1222 data.client->GetBitmap(uid, resource_lost)); |
| 1188 DCHECK(request.bitmap.get()); | |
| 1189 ui_resource_request_queue_.push_back(request); | 1223 ui_resource_request_queue_.push_back(request); |
| 1190 } | 1224 } |
| 1191 } | 1225 } |
| 1192 | 1226 |
| 1193 } // namespace cc | 1227 } // namespace cc |
| OLD | NEW |