summaryrefslogtreecommitdiff
path: root/chickadee/graphics/color.scm
diff options
context:
space:
mode:
Diffstat (limited to 'chickadee/graphics/color.scm')
-rw-r--r--chickadee/graphics/color.scm147
1 files changed, 127 insertions, 20 deletions
diff --git a/chickadee/graphics/color.scm b/chickadee/graphics/color.scm
index ed89082..e30f7b0 100644
--- a/chickadee/graphics/color.scm
+++ b/chickadee/graphics/color.scm
@@ -1,5 +1,5 @@
;;; Chickadee Game Toolkit
-;;; Copyright © 2016, 2018, 2021 David Thompson <dthompson2@worcester.edu>
+;;; Copyright © 2016, 2018, 2021, 2023 David Thompson <dthompson2@worcester.edu>
;;;
;;; Licensed under the Apache License, Version 2.0 (the "License");
;;; you may not use this file except in compliance with the License.
@@ -21,8 +21,6 @@
(define-module (chickadee graphics color)
#:use-module (chickadee data bytestruct)
- #:use-module (chickadee graphics engine)
- #:use-module (chickadee graphics gl)
#:use-module (chickadee math)
#:use-module (ice-9 format)
#:use-module (ice-9 match)
@@ -120,15 +118,51 @@
db32-rain-forest
db32-stinger
- default-color-mask
- null-color-mask
- g:color-mask
- current-color-mask
+ %default-clear-color
+
+ <blend-component>
+ make-blend-component
+ blend-component?
+ blend-component-op
+ blend-component-src-factor
+ blend-component-dst-factor
+
+ <blend-mode>
+ make-blend-mode
+ blend-mode?
+ blend-mode-color
+ blend-mode-alpha
+
+ blend:alpha
+ blend:multiply
+ blend:subtract
+ blend:add
+ blend:lighten
+ blend:darken
+ blend:screen
+ blend:replace
+
+ <color-mask>
+ make-color-mask
color-mask?
color-mask-red?
color-mask-green?
color-mask-blue?
- color-mask-alpha?))
+ color-mask-alpha?
+
+ <color-target>
+ make-color-target
+ color-target?
+ color-target-format
+ color-target-blend-mode
+ color-target-mask
+
+ <color-operation>
+ make-color-operation
+ color-operation?
+ color-operation-clear-color
+ color-operation-load-op
+ color-operation-store-op))
(define-byterecord-type <color>
(%make-color r g b a)
@@ -358,11 +392,74 @@ a color object."
(define db32-rain-forest (make-color8 143 151 74))
(define db32-stinger (make-color8 138 111 48))
+(define %default-clear-color (make-color 0.0 0.0 0.0 0.0))
+
;;;
-;;; Color Masks
+;;; Color target
;;;
+(define-record-type <blend-component>
+ (%make-blend-component op src-factor dst-factor)
+ blend-component?
+ (op blend-component-op)
+ (src-factor blend-component-src-factor)
+ (dst-factor blend-component-dst-factor))
+
+(define* (make-blend-component #:key (op 'add) (src-factor 'one)
+ (dst-factor 'zero))
+ (%make-blend-component op src-factor dst-factor))
+
+(define-record-type <blend-mode>
+ (%make-blend-mode color alpha)
+ blend-mode?
+ (color blend-state-color)
+ (alpha blend-state-alpha))
+
+(define* (make-blend-mode color #:optional (alpha color))
+ (%make-blend-mode color alpha))
+
+(define blend:alpha
+ (make-blend-mode
+ (make-blend-component #:op 'add
+ #:src-factor 'src-alpha
+ #:dst-factor 'one-minus-src-alpha)))
+(define blend:multiply
+ (make-blend-mode
+ (make-blend-component #:op 'add
+ #:src-factor 'dst
+ #:dst-factor 'zero)))
+(define blend:subtract
+ (make-blend-mode
+ (make-blend-component #:op 'reverse-subtract
+ #:src-factor 'one
+ #:dst-factor 'zero)))
+(define blend:add
+ (make-blend-mode
+ (make-blend-component #:op 'add
+ #:src-factor 'one
+ #:dst-factor 'one)))
+(define blend:lighten
+ (make-blend-mode
+ (make-blend-component #:op 'max
+ #:src-factor 'one
+ #:dst-factor 'zero)))
+(define blend:darken
+ (make-blend-mode
+ (make-blend-component #:op 'min
+ #:src-factor 'one
+ #:dst-factor 'zero)))
+(define blend:screen
+ (make-blend-mode
+ (make-blend-component #:op 'add
+ #:src-factor 'one
+ #:dst-factor 'one-minus-src)))
+(define blend:replace
+ (make-blend-mode
+ (make-blend-component #:op 'add
+ #:src-factor 'one
+ #:dst-factor 'zero)))
+
(define-record-type <color-mask>
(make-color-mask red? green? blue? alpha?)
color-mask?
@@ -371,16 +468,26 @@ a color object."
(blue? color-mask-blue?)
(alpha? color-mask-alpha?))
-(define default-color-mask (make-color-mask #t #t #t #t))
-(define null-color-mask (make-color-mask #f #f #f #f))
+(define-record-type <color-target>
+ (%make-color-target format blend-mode mask)
+ color-target?
+ (format color-target-format)
+ (blend-mode color-target-blend-mode)
+ (mask color-target-mask))
+
+(define* (make-color-target #:key (format 'rgba8) blend-mode
+ (mask (make-color-mask #t #t #t #t)))
+ (%make-color-target format blend-mode mask))
-(define (bind-color-mask mask)
- (gl-color-mask (color-mask-red? mask)
- (color-mask-green? mask)
- (color-mask-blue? mask)
- (color-mask-alpha? mask)))
+(define-record-type <color-operation>
+ (%make-color-operation clear-color load-op store-op)
+ color-operation?
+ (clear-color color-operation-clear-color)
+ (load-op color-operation-load-op)
+ (store-op color-operation-store-op))
-(define-graphics-state g:color-mask
- current-color-mask
- #:default default-color-mask
- #:bind bind-color-mask)
+(define* (make-color-operation #:key
+ (clear-color %default-clear-color)
+ (load-op 'clear)
+ (store-op 'store))
+ (%make-color-operation clear-color load-op store-op))