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

Side by Side Diff: components/exo/surface.cc

Issue 1962473002: exo: Add support for alpha_compositing interface to wayland bindings. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@wayland-protocols-alpha-compositing
Patch Set: address review feedback Created 4 years, 7 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 | « components/exo/surface.h ('k') | components/exo/surface_unittest.cc » ('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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "components/exo/surface.h" 5 #include "components/exo/surface.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/callback_helpers.h" 9 #include "base/callback_helpers.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 129
130 //////////////////////////////////////////////////////////////////////////////// 130 ////////////////////////////////////////////////////////////////////////////////
131 // Surface, public: 131 // Surface, public:
132 132
133 Surface::Surface() 133 Surface::Surface()
134 : aura::Window(new CustomWindowDelegate(this)), 134 : aura::Window(new CustomWindowDelegate(this)),
135 has_pending_contents_(false), 135 has_pending_contents_(false),
136 pending_input_region_(SkIRect::MakeLargest()), 136 pending_input_region_(SkIRect::MakeLargest()),
137 pending_buffer_scale_(1.0f), 137 pending_buffer_scale_(1.0f),
138 pending_only_visible_on_secure_output_(false), 138 pending_only_visible_on_secure_output_(false),
139 pending_blend_mode_(SkXfermode::kSrcOver_Mode),
140 pending_alpha_(1.0f),
139 input_region_(SkIRect::MakeLargest()), 141 input_region_(SkIRect::MakeLargest()),
140 needs_commit_surface_hierarchy_(false), 142 needs_commit_surface_hierarchy_(false),
141 update_contents_after_successful_compositing_(false), 143 update_contents_after_successful_compositing_(false),
142 compositor_(nullptr), 144 compositor_(nullptr),
143 delegate_(nullptr) { 145 delegate_(nullptr) {
144 SetType(ui::wm::WINDOW_TYPE_CONTROL); 146 SetType(ui::wm::WINDOW_TYPE_CONTROL);
145 SetName("ExoSurface"); 147 SetName("ExoSurface");
146 SetProperty(kSurfaceKey, this); 148 SetProperty(kSurfaceKey, this);
147 Init(ui::LAYER_SOLID_COLOR); 149 Init(ui::LAYER_SOLID_COLOR);
148 SetEventTargeter(base::WrapUnique(new CustomWindowTargeter)); 150 SetEventTargeter(base::WrapUnique(new CustomWindowTargeter));
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 pending_viewport_ = viewport; 309 pending_viewport_ = viewport;
308 } 310 }
309 311
310 void Surface::SetOnlyVisibleOnSecureOutput(bool only_visible_on_secure_output) { 312 void Surface::SetOnlyVisibleOnSecureOutput(bool only_visible_on_secure_output) {
311 TRACE_EVENT1("exo", "Surface::SetOnlyVisibleOnSecureOutput", 313 TRACE_EVENT1("exo", "Surface::SetOnlyVisibleOnSecureOutput",
312 "only_visible_on_secure_output", only_visible_on_secure_output); 314 "only_visible_on_secure_output", only_visible_on_secure_output);
313 315
314 pending_only_visible_on_secure_output_ = only_visible_on_secure_output; 316 pending_only_visible_on_secure_output_ = only_visible_on_secure_output;
315 } 317 }
316 318
319 void Surface::SetBlendMode(SkXfermode::Mode blend_mode) {
320 TRACE_EVENT1("exo", "Surface::SetBlendMode", "blend_mode", blend_mode);
321
322 pending_blend_mode_ = blend_mode;
323 }
324
325 void Surface::SetAlpha(float alpha) {
326 TRACE_EVENT1("exo", "Surface::SetAlpha", "alpha", alpha);
327
328 pending_alpha_ = alpha;
329 }
330
317 void Surface::Commit() { 331 void Surface::Commit() {
318 TRACE_EVENT0("exo", "Surface::Commit"); 332 TRACE_EVENT0("exo", "Surface::Commit");
319 333
320 needs_commit_surface_hierarchy_ = true; 334 needs_commit_surface_hierarchy_ = true;
321 335
322 if (delegate_) 336 if (delegate_)
323 delegate_->OnSurfaceCommit(); 337 delegate_->OnSurfaceCommit();
324 else 338 else
325 CommitSurfaceHierarchy(); 339 CommitSurfaceHierarchy();
326 } 340 }
(...skipping 29 matching lines...) Expand all
356 gfx::Size contents_size = 370 gfx::Size contents_size =
357 pending_viewport_.IsEmpty() 371 pending_viewport_.IsEmpty()
358 ? gfx::ScaleToFlooredSize(texture_mailbox.size_in_pixels(), 372 ? gfx::ScaleToFlooredSize(texture_mailbox.size_in_pixels(),
359 1.0f / pending_buffer_scale_) 373 1.0f / pending_buffer_scale_)
360 : pending_viewport_; 374 : pending_viewport_;
361 layer()->SetTextureMailbox(texture_mailbox, 375 layer()->SetTextureMailbox(texture_mailbox,
362 std::move(texture_mailbox_release_callback), 376 std::move(texture_mailbox_release_callback),
363 contents_size); 377 contents_size);
364 layer()->SetTextureFlipped(false); 378 layer()->SetTextureFlipped(false);
365 layer()->SetBounds(gfx::Rect(layer()->bounds().origin(), contents_size)); 379 layer()->SetBounds(gfx::Rect(layer()->bounds().origin(), contents_size));
366 layer()->SetFillsBoundsOpaquely(pending_opaque_region_.contains(
367 gfx::RectToSkIRect(gfx::Rect(contents_size))));
368 } else { 380 } else {
369 // Show solid color content if no buffer is attached or we failed 381 // Show solid color content if no buffer is attached or we failed
370 // to produce a texture mailbox for the currently attached buffer. 382 // to produce a texture mailbox for the currently attached buffer.
371 layer()->SetShowSolidColorContent(); 383 layer()->SetShowSolidColorContent();
372 layer()->SetColor(SK_ColorBLACK); 384 layer()->SetColor(SK_ColorBLACK);
373 } 385 }
374 386
375 // Schedule redraw of the damage region. 387 // Schedule redraw of the damage region.
376 for (SkRegion::Iterator it(pending_damage_); !it.done(); it.next()) 388 for (SkRegion::Iterator it(pending_damage_); !it.done(); it.next())
377 layer()->SchedulePaint(gfx::SkIRectToRect(it.rect())); 389 layer()->SchedulePaint(gfx::SkIRectToRect(it.rect()));
378 390
379 // Reset damage. 391 // Reset damage.
380 pending_damage_.setEmpty(); 392 pending_damage_.setEmpty();
381 } 393 }
382 394
383 // Update current input region. 395 // Update current input region.
384 input_region_ = pending_input_region_; 396 input_region_ = pending_input_region_;
385 397
386 // Move pending frame callbacks to the end of |frame_callbacks_|. 398 // Move pending frame callbacks to the end of |frame_callbacks_|.
387 frame_callbacks_.splice(frame_callbacks_.end(), pending_frame_callbacks_); 399 frame_callbacks_.splice(frame_callbacks_.end(), pending_frame_callbacks_);
388 400
401 // Update alpha compositing properties.
402 // TODO(reveman): Use a more reliable way to force blending off than setting
403 // fills-bounds-opaquely.
404 layer()->SetFillsBoundsOpaquely(
405 pending_blend_mode_ == SkXfermode::kSrc_Mode ||
406 pending_opaque_region_.contains(
407 gfx::RectToSkIRect(gfx::Rect(layer()->size()))));
408 if (layer()->has_external_content())
409 layer()->SetTextureAlpha(pending_alpha_);
410
389 // Synchronize window hierarchy. This will position and update the stacking 411 // Synchronize window hierarchy. This will position and update the stacking
390 // order of all sub-surfaces after committing all pending state of sub-surface 412 // order of all sub-surfaces after committing all pending state of sub-surface
391 // descendants. 413 // descendants.
392 aura::Window* stacking_target = nullptr; 414 aura::Window* stacking_target = nullptr;
393 for (auto& sub_surface_entry : pending_sub_surfaces_) { 415 for (auto& sub_surface_entry : pending_sub_surfaces_) {
394 Surface* sub_surface = sub_surface_entry.first; 416 Surface* sub_surface = sub_surface_entry.first;
395 417
396 // Synchronsouly commit all pending state of the sub-surface and its 418 // Synchronsouly commit all pending state of the sub-surface and its
397 // decendents. 419 // decendents.
398 if (sub_surface->needs_commit_surface_hierarchy()) 420 if (sub_surface->needs_commit_surface_hierarchy())
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 // of the surface next time the compositor successfully ends compositing. 565 // of the surface next time the compositor successfully ends compositing.
544 update_contents_after_successful_compositing_ = true; 566 update_contents_after_successful_compositing_ = true;
545 } 567 }
546 568
547 void Surface::OnCompositingShuttingDown(ui::Compositor* compositor) { 569 void Surface::OnCompositingShuttingDown(ui::Compositor* compositor) {
548 compositor->RemoveObserver(this); 570 compositor->RemoveObserver(this);
549 compositor_ = nullptr; 571 compositor_ = nullptr;
550 } 572 }
551 573
552 } // namespace exo 574 } // namespace exo
OLDNEW
« no previous file with comments | « components/exo/surface.h ('k') | components/exo/surface_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698