+/*
+source
+x = porter duff operator
+g = good guy
+a = android
+* = hv 4.6.1
+
+cin 5.1 overlayframe TRANSFER_MODEs
+x DST [Da, Dc]
+x DST_ATOP [Sa, Sc * (1 - Da) + Dc * Sa]
+x DST_IN [Da * Sa, Dc * Sa]
+x DST_OUT [Da * (1 - Sa), Dc * (1 - Sa)]
+x DST_OVER [Sa * (1 - Da) + Da, Sc * (1 - Da) + Dc]
+x SRC [Sa, Sc]
+x SRC_ATOP [Da, Sc * Da + Dc * (1 - Sa)]
+x SRC_IN [Sa * Da, Sc * Da]
+x SRC_OUT [Sa * (1 - Da), Sc * (1 - Da)]
+x SRC_OVER [Sa + Da * (1 - Sa), Sc + (1 - Sa) * Dc]
+g OR [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
+a XOR [Sa * (1 - Da) + Da * (1 - Sa), Sc * (1 - Da) + Dc * (1 Sa)]
+* NORMAL [Sa + Da * (1 - Sa), Sc * Sa + Dc * (1 Sa)])
+* ADDITION [(Sa + Da), (Sc + Dc)]
+* SUBTRACT [(Sa - Da), (Sc Dc)]
+* MULTIPLY [(Sa * Da), Sc * Dc]
+* DIVIDE [(Sa / Da), (Sc / Dc)]
+* REPLACE [Sa, Sc] (fade = 1)
+* MAX [max(Sa, Da), MAX(Sc, Dc)]
+* MIN [min(Sa, Da), MIN(Sc, Dc)]
+g AVERAGE [(Sa + Da) * 0.5, (Sc + Dc) * 0.5]
+a DARKEN [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + min(Sc, Dc)]
+a LIGHTEN [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + max(Sc, Dc)]
+
+https://developer.android.com/reference/android/graphics/PorterDuff.Mode.html
+ ADD Saturate(S + D)
+ CLEAR [0, 0]
+ DARKEN [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + min(Sc, Dc)]
+ DST [Da, Dc]
+ DST_ATOP [Sa, Sa * Dc + Sc * (1 - Da)]
+ DST_IN [Sa * Da, Sa * Dc]
+ DST_OUT [Da * (1 - Sa), Dc * (1 - Sa)]
+ DST_OVER [Sa + (1 - Sa)*Da, Rc = Dc + (1 - Da)*Sc]
+ LIGHTEN [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + max(Sc, Dc)]
+ MULTIPLY [Sa * Da, Sc * Dc]
+ OVERLAY (defined, but unspecified in android)
+ SCREEN [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
+ SRC [Sa, Sc]
+ SRC_ATOP [Da, Sc * Da + (1 - Sa) * Dc]
+ SRC_IN [Sa * Da, Sc * Da]
+ SRC_OUT [Sa * (1 - Da), Sc * (1 - Da)]
+ SRC_OVER [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
+ XOR [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc]
+
+https://docs.gimp.org/2.6/en/gimp-concepts-layer-modes.html
+ Normal [M]
+ Dissolve [I + dots]
+ Multiply [M * I]
+ Divide [I / M]
+ Screen [1 - (1-M)*(1-I)]
+ Overlay [I * (I + 2*M*(1-I))]
+ Dodge [I / (1-M)]
+ Burn [1 - (1-I) / M]
+ Hard light [M>0.5 ? (1 - (1-2*(M-0.5))*(1 - I) : 2*M*I]
+ Soft light [((1-I)*M + Screen()) * I]
+ Grain extract [I - M + 0.5]
+ Grain merge [I + M - 0.5]
+ Difference [abs(I-M)]
+ Addition [min((I+M),1.0)]
+ Subtract [max((I-M),0.0)]
+ Darken only [min(M,I)]
+ Lighten only [max(M,I)]
+ Hue [hue(M) + sat(I)+val(I)]
+ Saturation [sat(M) + hue(I)+val(I)]
+ Color [hue(M)+sat(M) + val(I)]
+ Value [val(M) + sat(I)+hue(I)]
+
+*/
+