| Index: cc/trees/layer_tree_host.cc
|
| diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
|
| index 8afb592766da19a75bec6b5b918a563773c04c7b..7c06b96cfb72cc16996d792ddf75c57127e8ef63 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() {}
|
|
|
| @@ -389,7 +412,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());
|
| @@ -647,16 +670,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) {
|
| @@ -1162,18 +1185,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.
|
| @@ -1182,11 +1209,9 @@ 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);
|
| }
|
|
|
| void LayerTreeHost::RecreateUIResources() {
|
| @@ -1194,16 +1219,25 @@ void LayerTreeHost::RecreateUIResources() {
|
| iter != ui_resource_client_map_.end();
|
| ++iter) {
|
| UIResourceId uid = iter->first;
|
| - UIResourceRequest request;
|
| - request.type = UIResourceRequest::UIResourceCreate;
|
| - request.id = uid;
|
| + const UIResourceClientData& data = iter->second;
|
| bool resource_lost = true;
|
| - request.bitmap = iter->second->GetBitmap(uid, resource_lost);
|
| - DCHECK(request.bitmap.get());
|
| + UIResourceRequest request(UIResourceRequest::UIResourceCreate,
|
| + uid,
|
| + data.client->GetBitmap(uid, resource_lost));
|
| ui_resource_request_queue_.push_back(request);
|
| }
|
| }
|
|
|
| +// 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::RegisterViewportLayers(
|
| scoped_refptr<Layer> page_scale_layer,
|
| scoped_refptr<Layer> inner_viewport_scroll_layer,
|
|
|