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

Side by Side Diff: cc/layers/nine_patch_layer.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: rebased 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 unified diff | Download patch
« no previous file with comments | « cc/layers/nine_patch_layer.h ('k') | cc/layers/nine_patch_layer_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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/layers/nine_patch_layer.h" 5 #include "cc/layers/nine_patch_layer.h"
6 6
7 #include "cc/layers/nine_patch_layer_impl.h" 7 #include "cc/layers/nine_patch_layer_impl.h"
8 #include "cc/resources/prioritized_resource.h" 8 #include "cc/resources/prioritized_resource.h"
9 #include "cc/resources/resource_update.h" 9 #include "cc/resources/resource_update.h"
10 #include "cc/resources/resource_update_queue.h" 10 #include "cc/resources/resource_update_queue.h"
11 #include "cc/resources/scoped_ui_resource.h"
12 #include "cc/resources/ui_resource_bitmap.h"
11 #include "cc/trees/layer_tree_host.h" 13 #include "cc/trees/layer_tree_host.h"
12 14
13 namespace cc { 15 namespace cc {
14 16
17
18 namespace {
19
20 class ScopedUIResourceHolder : public NinePatchLayer::UIResourceHolder {
21 public:
22 static scoped_ptr<ScopedUIResourceHolder> Create(LayerTreeHost* host,
23 const SkBitmap& skbitmap) {
24 return make_scoped_ptr(new ScopedUIResourceHolder(host, skbitmap));
25 }
26 virtual UIResourceId id() OVERRIDE { return resource_->id(); }
27
28 private:
29 ScopedUIResourceHolder(LayerTreeHost* host, const SkBitmap& skbitmap) {
30 resource_ = ScopedUIResource::Create(host, UIResourceBitmap(skbitmap));
31 }
32
33 scoped_ptr<ScopedUIResource> resource_;
34 };
35
36 class SharedUIResourceHolder : public NinePatchLayer::UIResourceHolder {
37 public:
38 static scoped_ptr<SharedUIResourceHolder> Create(UIResourceId id) {
39 return make_scoped_ptr(new SharedUIResourceHolder(id));
40 }
41
42 virtual UIResourceId id() OVERRIDE { return id_; }
43
44 private:
45 explicit SharedUIResourceHolder(UIResourceId id) : id_(id) {}
46
47 UIResourceId id_;
48 };
49
50 } // anonymous namespace
51
52
53 NinePatchLayer::UIResourceHolder::~UIResourceHolder() {}
54
15 scoped_refptr<NinePatchLayer> NinePatchLayer::Create() { 55 scoped_refptr<NinePatchLayer> NinePatchLayer::Create() {
16 return make_scoped_refptr(new NinePatchLayer()); 56 return make_scoped_refptr(new NinePatchLayer());
17 } 57 }
18 58
19 NinePatchLayer::NinePatchLayer() 59 NinePatchLayer::NinePatchLayer() : fill_center_(false) {}
20 : bitmap_dirty_(false) {}
21 60
22 NinePatchLayer::~NinePatchLayer() {} 61 NinePatchLayer::~NinePatchLayer() {}
23 62
24 scoped_ptr<LayerImpl> NinePatchLayer::CreateLayerImpl( 63 scoped_ptr<LayerImpl> NinePatchLayer::CreateLayerImpl(
25 LayerTreeImpl* tree_impl) { 64 LayerTreeImpl* tree_impl) {
26 return NinePatchLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>(); 65 return NinePatchLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>();
27 } 66 }
28 67
29 void NinePatchLayer::SetTexturePriorities( 68 void NinePatchLayer::SetLayerTreeHost(LayerTreeHost* host) {
30 const PriorityCalculator& priority_calc) { 69 if (host == layer_tree_host())
31 if (resource_ && !resource_->texture()->resource_manager()) { 70 return;
32 // Release the resource here, as it is no longer tied to a resource manager. 71
33 resource_.reset(); 72 Layer::SetLayerTreeHost(host);
34 if (!bitmap_.isNull()) 73
35 CreateResource(); 74 // Recreate the resource hold against the new LTH.
36 } else if (bitmap_dirty_ && DrawsContent()) { 75 RecreateUIResourceHolder();
37 CreateResource(); 76 }
77
78 void NinePatchLayer::RecreateUIResourceHolder() {
79 ui_resource_holder_.reset();
80 if (!layer_tree_host() || bitmap_.empty())
81 return;
82
83 ui_resource_holder_ =
84 ScopedUIResourceHolder::Create(layer_tree_host(), bitmap_);
85 }
86
87 void NinePatchLayer::SetBorder(gfx::Rect border) {
88 if (border == border_)
89 return;
90 border_ = border;
91 SetNeedsCommit();
92 }
93
94 void NinePatchLayer::SetBitmap(const SkBitmap& skbitmap, gfx::Rect aperture) {
95 image_aperture_ = aperture;
96 bitmap_ = skbitmap;
97
98 // TODO(ccameron): Remove this. This provides the default border that was
99 // provided before borders were required to be explicitly provided. Once Blink
100 // fixes its callers to call SetBorder, this can be removed.
101 SetBorder(gfx::Rect(aperture.x(),
102 aperture.y(),
103 skbitmap.width() - aperture.width(),
104 skbitmap.height() - aperture.height()));
105 RecreateUIResourceHolder();
106 SetNeedsCommit();
107 }
108
109 void NinePatchLayer::SetUIResourceId(UIResourceId resource_id,
110 gfx::Rect aperture) {
111 if (ui_resource_holder_ && ui_resource_holder_->id() == resource_id &&
112 image_aperture_ == aperture)
113 return;
114
115 image_aperture_ = aperture;
116 if (resource_id) {
117 ui_resource_holder_ = SharedUIResourceHolder::Create(resource_id);
118 } else {
119 ui_resource_holder_.reset();
38 } 120 }
39 121
40 if (resource_) { 122 SetNeedsCommit();
41 resource_->texture()->set_request_priority(
42 PriorityCalculator::UIPriority(true));
43 resource_->texture()->SetDimensions(
44 gfx::Size(bitmap_.width(), bitmap_.height()),
45 layer_tree_host()->GetRendererCapabilities().best_texture_format);
46 }
47 } 123 }
48 124
49 void NinePatchLayer::SetBitmap(const SkBitmap& bitmap, gfx::Rect aperture) { 125 void NinePatchLayer::SetFillCenter(bool fill_center) {
50 bitmap_ = bitmap; 126 if (fill_center_ == fill_center)
51 image_aperture_ = aperture;
52 bitmap_dirty_ = true;
53 SetNeedsDisplay();
54 }
55
56 bool NinePatchLayer::Update(ResourceUpdateQueue* queue,
57 const OcclusionTracker* occlusion) {
58 bool updated = Layer::Update(queue, occlusion);
59
60 CreateUpdaterIfNeeded();
61
62 if (resource_ &&
63 (bitmap_dirty_ || resource_->texture()->resource_id() == 0)) {
64 gfx::Rect content_rect(0, 0, bitmap_.width(), bitmap_.height());
65 ResourceUpdate upload = ResourceUpdate::Create(resource_->texture(),
66 &bitmap_,
67 content_rect,
68 content_rect,
69 gfx::Vector2d());
70 queue->AppendFullUpload(upload);
71 bitmap_dirty_ = false;
72 updated = true;
73 }
74
75 return updated;
76 }
77
78 void NinePatchLayer::CreateUpdaterIfNeeded() {
79 if (updater_.get())
80 return; 127 return;
81 128
82 updater_ = ImageLayerUpdater::Create(); 129 fill_center_ = fill_center;
83 } 130 SetNeedsCommit();
84
85 void NinePatchLayer::CreateResource() {
86 DCHECK(!bitmap_.isNull());
87 CreateUpdaterIfNeeded();
88 updater_->SetBitmap(bitmap_);
89
90 if (!resource_) {
91 resource_ = updater_->CreateResource(
92 layer_tree_host()->contents_texture_manager());
93 }
94 } 131 }
95 132
96 bool NinePatchLayer::DrawsContent() const { 133 bool NinePatchLayer::DrawsContent() const {
97 bool draws = !bitmap_.isNull() && 134 return ui_resource_holder_ && ui_resource_holder_->id() &&
98 Layer::DrawsContent() && 135 Layer::DrawsContent();
99 bitmap_.width() &&
100 bitmap_.height();
101 return draws;
102 } 136 }
103 137
104 void NinePatchLayer::PushPropertiesTo(LayerImpl* layer) { 138 void NinePatchLayer::PushPropertiesTo(LayerImpl* layer) {
105 Layer::PushPropertiesTo(layer); 139 Layer::PushPropertiesTo(layer);
106 NinePatchLayerImpl* layer_impl = static_cast<NinePatchLayerImpl*>(layer); 140 NinePatchLayerImpl* layer_impl = static_cast<NinePatchLayerImpl*>(layer);
107 141
108 if (resource_) { 142 if (!ui_resource_holder_) {
109 DCHECK(!bitmap_.isNull()); 143 layer_impl->SetUIResourceId(0);
110 layer_impl->SetResourceId(resource_->texture()->resource_id()); 144 } else {
111 layer_impl->SetLayout( 145 DCHECK(layer_tree_host());
112 gfx::Size(bitmap_.width(), bitmap_.height()), image_aperture_); 146
147 gfx::Size image_size =
148 layer_tree_host()->GetUIResourceSize(ui_resource_holder_->id());
149 layer_impl->SetUIResourceId(ui_resource_holder_->id());
150 layer_impl->SetLayout(image_size, image_aperture_, border_, fill_center_);
113 } 151 }
114
115 // NinePatchLayer must push properties every commit to make sure
116 // NinePatchLayerImpl::resource_id_ is valid.
117 // http://crbug.com/276482
118 needs_push_properties_ = true;
119 } 152 }
120 153
121 } // namespace cc 154 } // namespace cc
OLDNEW
« no previous file with comments | « cc/layers/nine_patch_layer.h ('k') | cc/layers/nine_patch_layer_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698