[Cin] oops apparently 'subtract' mode is broken!

Andrew Randrianasulu randrianasulu at gmail.com
Sun Sep 25 13:12:00 CEST 2022


вс, 25 сент. 2022 г., 13:15 Andrew Randrianasulu <randrianasulu at gmail.com>:

> so I am officially confused!
>
> according to this
>
> https://emptyeasel.com/2008/11/14/layer-modes-part-three-difference-addition-subtraction-darken-lighten/
>
> color inversion in subtract mode IS normal thing.
>
> yet in original Cin something else happens ....
>
>
> may be Phyllis can replace our original red-green square  images with
> full-color gradients + photo, so effect will be more natural? Or add this
> into new appendix .....
>



more documentation, it seems Adobe products use shared code for this ....

https://www.rippletraining.com/blog/final-cut-pro-x/understanding-blend-modes-final-cut-pro/

--quote---

Subtract

Subtract does what it advertises; the color values of one layer are
subtracted from the other layer. This tends to have a net darkening effect.
Pixel values can’t fall below zero, so negative numbers are rendered to
black.


---end quote---


in older cingg code (from 4.6.mod era - earliest public code on Google
code) I see such construct :


/data/data/com.termux/files/home/cingg-g~nelerra-4.6.mod/cinelerra/overlayframe.C
     4762/69317  UTF-8        6%

                        break; \

                case TRANSFER_SUBTRACT: \

                        r = (temp_type)output[0] - (temp_type)input1; \

                        g = ((temp_type)output[1] -
(temp_type)chroma_offset) - \

                                ((temp_type)input2 -
(temp_type)chroma_offset) + \

                                (temp_type)chroma_offset; \

                        b = ((temp_type)output[2] -
(temp_type)chroma_offset) - \

                                ((temp_type)input3 -
(temp_type)chroma_offset) + \

                                (temp_type)chroma_offset; \

                        if(r < 0) r = 0; \

                        if(g < 0) g = 0; \

                        if(b < 0) b = 0; \

                        r = (r * opacity + output[0] * transparency) / max;
\

                        g = (g * opacity + output[1] * transparency) / max;
\

                        b = (b * opacity + output[2] * transparency) / max;
\                                                              break; \


---


so it basically had specific guard against going negative. Not sure if our
implementation does the same just in different place?


I see no specific handling of it in macros ...



overlayframe.h     [----] 38 L:[ 53+ 0  53/615] *(1572/17155b) 001[*][X]

// ADDITION<--->[(Sa + Da), (Sc + Dc)]

#define ALPHA_ADDITION(mx, Sa, Da) (Sa + Da)

#define COLOR_ADDITION(mx, Sc, Sa, Dc, Da) (Sc + Dc)

#define CHROMA_ADDITION COLOR_ADDITION


// SUBTRACT<--->[(Sa - Da), (Sc - Dc)]

#define ALPHA_SUBTRACT(mx, Sa, Da) (Sa - Da)

#define COLOR_SUBTRACT(mx, Sc, Sa, Dc, Da) (Sc - Dc)

#define CHROMA_SUBTRACT COLOR_SUBTRACT


but apparently you can add some comparing here ...just .. it went from
two-stage process to single stage for untrained eye and I am not sure where
to put those ifs?






>
> вс, 25 сент. 2022 г., 11:06 Andrew Randrianasulu <randrianasulu at gmail.com
> >:
>
>> I found Graphics-softlight mode behaving visually close...but not sure
>> how close to CinHV/CV subtract mode ...
>>
>>
>>
>> вс, 25 сент. 2022 г., 10:24 Andrew Randrianasulu <randrianasulu at gmail.com
>> >:
>>
>>> I was trying to repeat tuto at
>>>
>>> https://linuxvideoediting.blogspot.com/2022/01/transparent-text-effect-in-Cinelerra-part1.html?m=1
>>>
>>>
>>> so I loaded video, created empty new vid track, applied 'titles', 'blur'
>>> and 'invert video' to _empty track_, then set track's mode to subtract ....
>>> result was color inversion of original video on second vid track (
>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.cinelerra-gg.org/pipermail/cin/attachments/20220925/b9a5bdd1/attachment.htm>


More information about the Cin mailing list