4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #ifndef OVERLAYFRAME_INC
23 #define OVERLAYFRAME_INC
29 x = porter duff operator
34 cin 5.1 overlayframe TRANSFER_MODEs
36 x DST_ATOP [Sa, Sc * (1 - Da) + Dc * Sa]
37 x DST_IN [Da * Sa, Dc * Sa]
38 x DST_OUT [Da * (1 - Sa), Dc * (1 - Sa)]
39 x DST_OVER [Sa * (1 - Da) + Da, Sc * (1 - Da) + Dc]
41 x SRC_ATOP [Da, Sc * Da + Dc * (1 - Sa)]
42 x SRC_IN [Sa * Da, Sc * Da]
43 x SRC_OUT [Sa * (1 - Da), Sc * (1 - Da)]
44 x SRC_OVER [Sa + Da * (1 - Sa), Sc + (1 - Sa) * Dc]
45 g OR [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
46 a XOR [Sa * (1 - Da) + Da * (1 - Sa), Sc * (1 - Da) + Dc * (1 Sa)]
47 * NORMAL [Sa + Da * (1 - Sa), Sc * Sa + Dc * (1 Sa)])
48 * ADDITION [(Sa + Da), (Sc + Dc)]
49 * SUBTRACT [(Sa - Da), (Sc Dc)]
50 * MULTIPLY [(Sa * Da), Sc * Dc]
51 * DIVIDE [(Sa / Da), (Sc / Dc)]
52 * REPLACE [Sa, Sc] (fade = 1)
53 * MAX [max(Sa, Da), MAX(Sc, Dc)]
54 * MIN [min(Sa, Da), MIN(Sc, Dc)]
55 g AVERAGE [(Sa + Da) * 0.5, (Sc + Dc) * 0.5]
56 a DARKEN [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + min(Sc, Dc)]
57 a LIGHTEN [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + max(Sc, Dc)]
59 https://developer.android.com/reference/android/graphics/PorterDuff.Mode.html
62 DARKEN [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + min(Sc, Dc)]
64 DST_ATOP [Sa, Sa * Dc + Sc * (1 - Da)]
65 DST_IN [Sa * Da, Sa * Dc]
66 DST_OUT [Da * (1 - Sa), Dc * (1 - Sa)]
67 DST_OVER [Sa + (1 - Sa)*Da, Rc = Dc + (1 - Da)*Sc]
68 LIGHTEN [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + max(Sc, Dc)]
69 MULTIPLY [Sa * Da, Sc * Dc]
70 OVERLAY (defined, but unspecified in android)
71 SCREEN [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
73 SRC_ATOP [Da, Sc * Da + (1 - Sa) * Dc]
74 SRC_IN [Sa * Da, Sc * Da]
75 SRC_OUT [Sa * (1 - Da), Sc * (1 - Da)]
76 SRC_OVER [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
77 XOR [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc]
79 https://docs.gimp.org/2.6/en/gimp-concepts-layer-modes.html
84 Screen [1 - (1-M)*(1-I)]
85 Overlay [I * (I + 2*M*(1-I))]
88 Hard light [M>0.5 ? (1 - (1-2*(M-0.5))*(1 - I) : 2*M*I]
89 Soft light [((1-I)*M + Screen()) * I]
90 Grain extract [I - M + 0.5]
91 Grain merge [I + M - 0.5]
93 Addition [min((I+M),1.0)]
94 Subtract [max((I-M),0.0)]
95 Darken only [min(M,I)]
96 Lighten only [max(M,I)]
97 Hue [hue(M) + sat(I)+val(I)]
98 Saturation [sat(M) + hue(I)+val(I)]
99 Color [hue(M)+sat(M) + val(I)]
100 Value [val(M) + sat(I)+hue(I)]
104 #define TRANSFER_TYPES 23
106 #define TRANSFER_NORMAL 0
107 #define TRANSFER_ADDITION 1
108 #define TRANSFER_SUBTRACT 2
109 #define TRANSFER_MULTIPLY 3
110 #define TRANSFER_DIVIDE 4
111 #define TRANSFER_REPLACE 5
112 #define TRANSFER_MAX 6
113 #define TRANSFER_MIN 7
114 #define TRANSFER_AVERAGE 8
115 #define TRANSFER_DARKEN 9
116 #define TRANSFER_LIGHTEN 10
117 #define TRANSFER_DST 11
118 #define TRANSFER_DST_ATOP 12
119 #define TRANSFER_DST_IN 13
120 #define TRANSFER_DST_OUT 14
121 #define TRANSFER_DST_OVER 15
122 #define TRANSFER_SRC 16
123 #define TRANSFER_SRC_ATOP 17
124 #define TRANSFER_SRC_IN 18
125 #define TRANSFER_SRC_OUT 19
126 #define TRANSFER_SRC_OVER 20
127 #define TRANSFER_OR 21
128 #define TRANSFER_XOR 22
130 // Interpolation types
133 #define NEAREST_NEIGHBOR 0 // Nearest for enlargement and reduction
134 #define CUBIC_CUBIC 1 // Bicubic enlargement and reduction
135 #define CUBIC_LINEAR 2 // Bicubic enlargement and linear reduction
136 #define LINEAR_LINEAR 3 // Not explicitely called but used for user
137 #define LANCZOS_LANCZOS 4 // Just because we can