From af6241d0101bf1944eef13692912719adb472d63 Mon Sep 17 00:00:00 2001 From: faiface Date: Tue, 11 Apr 2017 17:15:02 +0200 Subject: [PATCH] add ComposeMethod.Compose --- compose.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/compose.go b/compose.go index e64e439..46302ab 100644 --- a/compose.go +++ b/compose.go @@ -1,5 +1,7 @@ package pixel +import "errors" + // ComposeTarget is a BasicTarget capable of Porter-Duff composition. type ComposeTarget interface { BasicTarget @@ -26,3 +28,38 @@ const ( ComposePlus ComposeCopy ) + +// Compose composes two colors together according to the ComposeMethod. A is the foreground, B is +// the background. +func (cm ComposeMethod) Compose(a, b RGBA) RGBA { + var fa, fb float64 + + switch cm { + case ComposeOver: + fa, fb = 1, 1-a.A + case ComposeIn: + fa, fb = b.A, 0 + case ComposeOut: + fa, fb = 1-b.A, 0 + case ComposeAtop: + fa, fb = b.A, 1-a.A + case ComposeRover: + fa, fb = 1-b.A, 1 + case ComposeRin: + fa, fb = 0, a.A + case ComposeRout: + fa, fb = 0, 1-a.A + case ComposeRatop: + fa, fb = 1-b.A, a.A + case ComposeXor: + fa, fb = 1-b.A, 1-a.A + case ComposePlus: + fa, fb = 1, 1 + case ComposeCopy: + fa, fb = 1, 0 + default: + panic(errors.New("Compose: invalid ComposeMethod")) + } + + return a.Mul(Alpha(fa)).Add(b.Mul(Alpha(fb))) +}