Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(892)

Unified Diff: cc/trees/layer_tree_host.cc

Issue 22870016: Update the nine patch layer to use UI resources (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: updated dchecks in ui_resource_bitmap Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: cc/trees/layer_tree_host.cc
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index 773a689ac03749590685580a88dafb9cb92fcf0b..a56f5200529e1e2beff702ef32eb8ed636d1787a 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -61,8 +61,31 @@ RendererCapabilities::RendererCapabilities()
RendererCapabilities::~RendererCapabilities() {}
-UIResourceRequest::UIResourceRequest()
- : type(UIResourceInvalidRequest), id(0), bitmap(NULL) {}
+UIResourceRequest::UIResourceRequest(UIResourceRequestType type,
+ UIResourceId id)
+ : type_(type), id_(id) {}
+
+UIResourceRequest::UIResourceRequest(UIResourceRequestType type,
+ UIResourceId id,
+ const UIResourceBitmap& bitmap)
+ : type_(type), id_(id), bitmap_(new UIResourceBitmap(bitmap)) {}
+
+UIResourceRequest::UIResourceRequest(const UIResourceRequest& request) {
+ (*this) = request;
+}
+
+UIResourceRequest& UIResourceRequest::operator=(
+ const UIResourceRequest& request) {
+ type_ = request.type_;
+ id_ = request.id_;
+ if (request.bitmap_) {
+ bitmap_ = make_scoped_ptr(new UIResourceBitmap(*request.bitmap_.get()));
+ } else {
+ bitmap_.reset();
+ }
+
+ return *this;
+}
UIResourceRequest::~UIResourceRequest() {}
@@ -376,7 +399,7 @@ void LayerTreeHost::FinishCommitOnImplThread(LayerTreeHostImpl* host_impl) {
if (overhang_ui_resource_) {
host_impl->SetOverhangUIResource(
overhang_ui_resource_->id(),
- overhang_ui_resource_->GetSize());
+ GetUIResourceSize(overhang_ui_resource_->id()));
}
DCHECK(!sync_tree->ViewportSizeInvalid());
@@ -637,16 +660,16 @@ void LayerTreeHost::SetOverhangBitmap(const SkBitmap& bitmap) {
DCHECK(bitmap.width() && bitmap.height());
DCHECK_EQ(bitmap.bytesPerPixel(), 4);
- scoped_refptr<UIResourceBitmap> overhang_ui_bitmap(UIResourceBitmap::Create(
- new uint8_t[bitmap.width() * bitmap.height() * bitmap.bytesPerPixel()],
- UIResourceBitmap::RGBA8,
- UIResourceBitmap::REPEAT,
- gfx::Size(bitmap.width(), bitmap.height())));
- bitmap.copyPixelsTo(
- overhang_ui_bitmap->GetPixels(),
- bitmap.width() * bitmap.height() * bitmap.bytesPerPixel(),
- bitmap.width() * bitmap.bytesPerPixel());
- overhang_ui_resource_ = ScopedUIResource::Create(this, overhang_ui_bitmap);
+ SkBitmap bitmap_copy;
+ if (bitmap.isImmutable()) {
+ bitmap_copy = bitmap;
+ } else {
+ bitmap.copyTo(&bitmap_copy, bitmap.config());
+ bitmap_copy.setImmutable();
+ }
+
+ overhang_ui_resource_ = ScopedUIResource::Create(
+ this, UIResourceBitmap(bitmap_copy, UIResourceBitmap::REPEAT));
}
void LayerTreeHost::SetVisible(bool visible) {
@@ -1149,18 +1172,22 @@ void LayerTreeHost::AnimateLayers(base::TimeTicks time) {
UIResourceId LayerTreeHost::CreateUIResource(UIResourceClient* client) {
DCHECK(client);
- UIResourceRequest request;
- bool resource_lost = false;
- request.type = UIResourceRequest::UIResourceCreate;
- request.id = next_ui_resource_id_++;
-
- DCHECK(ui_resource_client_map_.find(request.id) ==
+ UIResourceId next_id = next_ui_resource_id_++;
+ DCHECK(ui_resource_client_map_.find(next_id) ==
ui_resource_client_map_.end());
- request.bitmap = client->GetBitmap(request.id, resource_lost);
+ bool resource_lost = false;
+ UIResourceRequest request(UIResourceRequest::UIResourceCreate,
+ next_id,
+ client->GetBitmap(next_id, resource_lost));
ui_resource_request_queue_.push_back(request);
- ui_resource_client_map_[request.id] = client;
- return request.id;
+
+ UIResourceClientData data;
+ data.client = client;
+ data.size = request.GetBitmap().GetSize();
+
+ ui_resource_client_map_[request.GetId()] = data;
+ return request.GetId();
}
// Deletes a UI resource. May safely be called more than once.
@@ -1169,11 +1196,19 @@ void LayerTreeHost::DeleteUIResource(UIResourceId uid) {
if (iter == ui_resource_client_map_.end())
return;
- UIResourceRequest request;
- request.type = UIResourceRequest::UIResourceDelete;
- request.id = uid;
+ UIResourceRequest request(UIResourceRequest::UIResourceDelete, uid);
ui_resource_request_queue_.push_back(request);
- ui_resource_client_map_.erase(uid);
+ ui_resource_client_map_.erase(iter);
+}
+
+// Returns the size of a resource given its id.
+gfx::Size LayerTreeHost::GetUIResourceSize(UIResourceId uid) const {
+ UIResourceClientMap::const_iterator iter = ui_resource_client_map_.find(uid);
+ if (iter == ui_resource_client_map_.end())
+ return gfx::Size();
+
+ const UIResourceClientData& data = iter->second;
+ return data.size;
}
void LayerTreeHost::RecreateUIResources(bool resource_lost) {
@@ -1181,11 +1216,10 @@ void LayerTreeHost::RecreateUIResources(bool resource_lost) {
iter != ui_resource_client_map_.end();
++iter) {
UIResourceId uid = iter->first;
- UIResourceRequest request;
- request.type = UIResourceRequest::UIResourceCreate;
- request.id = uid;
- request.bitmap = iter->second->GetBitmap(uid, resource_lost);
- DCHECK(request.bitmap.get());
+ const UIResourceClientData& data = iter->second;
+ UIResourceRequest request(UIResourceRequest::UIResourceCreate,
+ uid,
+ data.client->GetBitmap(uid, resource_lost));
ui_resource_request_queue_.push_back(request);
}
}

Powered by Google App Engine
This is Rietveld 408576698