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

Unified Diff: cc/output/gl_renderer.cc

Issue 2659023003: [cc] Add SkBlendMode::kDstIn support to cc::Layer (Closed)
Patch Set: Created 3 years, 11 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/output/gl_renderer.cc
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
index 134653c29ee5cb49d7d61b8c1789b11987c26adc..59bb170c17de233ad7fd41c17ec0818435a0048d 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -110,6 +110,8 @@ BlendMode BlendModeFromSkXfermode(SkBlendMode mode) {
switch (mode) {
case SkBlendMode::kSrcOver:
return BLEND_MODE_NORMAL;
+ case SkBlendMode::kDstIn:
+ return BLEND_MODE_DESTINATION_IN;
case SkBlendMode::kScreen:
return BLEND_MODE_SCREEN;
case SkBlendMode::kOverlay:
@@ -714,17 +716,22 @@ static sk_sp<SkImage> ApplyImageFilter(
}
bool GLRenderer::CanApplyBlendModeUsingBlendFunc(SkBlendMode blend_mode) {
- return use_blend_equation_advanced_ || blend_mode == SkBlendMode::kScreen ||
- blend_mode == SkBlendMode::kSrcOver;
+ return use_blend_equation_advanced_ || blend_mode == SkBlendMode::kSrcOver ||
+ blend_mode == SkBlendMode::kDstIn ||
+ blend_mode == SkBlendMode::kScreen;
}
void GLRenderer::ApplyBlendModeUsingBlendFunc(SkBlendMode blend_mode) {
- DCHECK(CanApplyBlendModeUsingBlendFunc(blend_mode));
-
// Any modes set here must be reset in RestoreBlendFuncToDefault
- if (use_blend_equation_advanced_) {
+ if (blend_mode == SkBlendMode::kSrcOver) {
+ // Left no-op intentionally.
+ } else if (blend_mode == SkBlendMode::kDstIn) {
+ gl_->BlendFunc(GL_ZERO, GL_SRC_ALPHA);
+ } else if (blend_mode == SkBlendMode::kScreen) {
+ gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE);
+ } else {
+ DCHECK(use_blend_equation_advanced_);
GLenum equation = GL_FUNC_ADD;
-
switch (blend_mode) {
case SkBlendMode::kScreen:
equation = GL_SCREEN_KHR;
@@ -772,25 +779,25 @@ void GLRenderer::ApplyBlendModeUsingBlendFunc(SkBlendMode blend_mode) {
equation = GL_HSL_LUMINOSITY_KHR;
break;
default:
+ NOTREACHED() << "Unexpected blend mode: SkBlendMode::k"
+ << SkBlendMode_Name(blend_mode);
return;
}
-
gl_->BlendEquation(equation);
- } else {
- if (blend_mode == SkBlendMode::kScreen) {
- gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE);
- }
}
}
void GLRenderer::RestoreBlendFuncToDefault(SkBlendMode blend_mode) {
- if (blend_mode == SkBlendMode::kSrcOver)
- return;
-
- if (use_blend_equation_advanced_) {
- gl_->BlendEquation(GL_FUNC_ADD);
- } else {
- gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ switch (blend_mode) {
+ case SkBlendMode::kSrcOver:
+ break;
+ case SkBlendMode::kDstIn:
+ case SkBlendMode::kScreen:
+ gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ break;
+ default:
+ DCHECK(use_blend_equation_advanced_);
+ gl_->BlendEquation(GL_FUNC_ADD);
}
}

Powered by Google App Engine
This is Rietveld 408576698