mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-10 01:59:31 +00:00
LibWeb/Canvas: Support globalCompositionOperation
Canvas now supports compositing and various blending modes via the `globalCompositeOperation` attribute.
This commit is contained in:
parent
19ab213b16
commit
8575bddfe6
Notes:
github-actions[bot]
2025-02-05 11:28:07 +00:00
Author: https://github.com/skyz1
Commit: 8575bddfe6
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/3267
Reviewed-by: https://github.com/AtkinsSJ ✅
Reviewed-by: https://github.com/konradekk
16 changed files with 283 additions and 32 deletions
|
@ -7,9 +7,12 @@
|
|||
#include <AK/Assertions.h>
|
||||
#include <LibGfx/Filter.h>
|
||||
#include <LibGfx/SkiaUtils.h>
|
||||
#include <core/SkBlender.h>
|
||||
#include <core/SkColorFilter.h>
|
||||
#include <core/SkImageFilter.h>
|
||||
#include <core/SkString.h>
|
||||
#include <effects/SkImageFilters.h>
|
||||
#include <effects/SkRuntimeEffect.h>
|
||||
|
||||
namespace Gfx {
|
||||
|
||||
|
@ -140,4 +143,85 @@ sk_sp<SkImageFilter> to_skia_image_filter(Gfx::Filter const& filter)
|
|||
});
|
||||
}
|
||||
|
||||
sk_sp<SkBlender> to_skia_blender(Gfx::CompositingAndBlendingOperator compositing_and_blending_operator)
|
||||
{
|
||||
switch (compositing_and_blending_operator) {
|
||||
case CompositingAndBlendingOperator::Normal:
|
||||
return SkBlender::Mode(SkBlendMode::kSrcOver);
|
||||
case CompositingAndBlendingOperator::Multiply:
|
||||
return SkBlender::Mode(SkBlendMode::kMultiply);
|
||||
case CompositingAndBlendingOperator::Screen:
|
||||
return SkBlender::Mode(SkBlendMode::kScreen);
|
||||
case CompositingAndBlendingOperator::Overlay:
|
||||
return SkBlender::Mode(SkBlendMode::kOverlay);
|
||||
case CompositingAndBlendingOperator::Darken:
|
||||
return SkBlender::Mode(SkBlendMode::kDarken);
|
||||
case CompositingAndBlendingOperator::Lighten:
|
||||
return SkBlender::Mode(SkBlendMode::kLighten);
|
||||
case CompositingAndBlendingOperator::ColorDodge:
|
||||
return SkBlender::Mode(SkBlendMode::kColorDodge);
|
||||
case CompositingAndBlendingOperator::ColorBurn:
|
||||
return SkBlender::Mode(SkBlendMode::kColorBurn);
|
||||
case CompositingAndBlendingOperator::HardLight:
|
||||
return SkBlender::Mode(SkBlendMode::kHardLight);
|
||||
case CompositingAndBlendingOperator::SoftLight:
|
||||
return SkBlender::Mode(SkBlendMode::kSoftLight);
|
||||
case CompositingAndBlendingOperator::Difference:
|
||||
return SkBlender::Mode(SkBlendMode::kDifference);
|
||||
case CompositingAndBlendingOperator::Exclusion:
|
||||
return SkBlender::Mode(SkBlendMode::kExclusion);
|
||||
case CompositingAndBlendingOperator::Hue:
|
||||
return SkBlender::Mode(SkBlendMode::kHue);
|
||||
case CompositingAndBlendingOperator::Saturation:
|
||||
return SkBlender::Mode(SkBlendMode::kSaturation);
|
||||
case CompositingAndBlendingOperator::Color:
|
||||
return SkBlender::Mode(SkBlendMode::kColor);
|
||||
case CompositingAndBlendingOperator::Luminosity:
|
||||
return SkBlender::Mode(SkBlendMode::kLuminosity);
|
||||
case CompositingAndBlendingOperator::Clear:
|
||||
return SkBlender::Mode(SkBlendMode::kClear);
|
||||
case CompositingAndBlendingOperator::Copy:
|
||||
return SkBlender::Mode(SkBlendMode::kSrc);
|
||||
case CompositingAndBlendingOperator::SourceOver:
|
||||
return SkBlender::Mode(SkBlendMode::kSrcOver);
|
||||
case CompositingAndBlendingOperator::DestinationOver:
|
||||
return SkBlender::Mode(SkBlendMode::kDstOver);
|
||||
case CompositingAndBlendingOperator::SourceIn:
|
||||
return SkBlender::Mode(SkBlendMode::kSrcIn);
|
||||
case CompositingAndBlendingOperator::DestinationIn:
|
||||
return SkBlender::Mode(SkBlendMode::kDstIn);
|
||||
case CompositingAndBlendingOperator::SourceOut:
|
||||
return SkBlender::Mode(SkBlendMode::kSrcOut);
|
||||
case CompositingAndBlendingOperator::DestinationOut:
|
||||
return SkBlender::Mode(SkBlendMode::kDstOut);
|
||||
case CompositingAndBlendingOperator::SourceATop:
|
||||
return SkBlender::Mode(SkBlendMode::kSrcATop);
|
||||
case CompositingAndBlendingOperator::DestinationATop:
|
||||
return SkBlender::Mode(SkBlendMode::kDstATop);
|
||||
case CompositingAndBlendingOperator::Xor:
|
||||
return SkBlender::Mode(SkBlendMode::kXor);
|
||||
case CompositingAndBlendingOperator::Lighter:
|
||||
return SkBlender::Mode(SkBlendMode::kPlus);
|
||||
case CompositingAndBlendingOperator::PlusDarker:
|
||||
// https://drafts.fxtf.org/compositing/#porterduffcompositingoperators_plus_darker
|
||||
// FIXME: This does not match the spec, however it looks like Safari, the only popular browser supporting this operator.
|
||||
return SkRuntimeEffect::MakeForBlender(SkString(R"(
|
||||
vec4 main(vec4 source, vec4 destination) {
|
||||
return saturate(saturate(destination.a + source.a) - saturate(destination.a - destination) - saturate(source.a - source));
|
||||
}
|
||||
)"))
|
||||
.effect->makeBlender(nullptr);
|
||||
case CompositingAndBlendingOperator::PlusLighter:
|
||||
// https://drafts.fxtf.org/compositing/#porterduffcompositingoperators_plus_lighter
|
||||
return SkRuntimeEffect::MakeForBlender(SkString(R"(
|
||||
vec4 main(vec4 source, vec4 destination) {
|
||||
return saturate(source + destination);
|
||||
}
|
||||
)"))
|
||||
.effect->makeBlender(nullptr);
|
||||
default:
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue