add new mode, pixel fuckery

This commit is contained in:
veejay
2023-10-04 21:33:53 +02:00
parent ea9b802ca6
commit 5efebacbb4

View File

@@ -39,7 +39,7 @@ vj_effect *chromamagick_init(int w, int h)
ve->parallel = 1; ve->parallel = 1;
ve->description = "Chroma Magic"; ve->description = "Chroma Magic";
ve->limits[0][0] = 0; ve->limits[0][0] = 0;
ve->limits[1][0] = 26; ve->limits[1][0] = 27;
ve->limits[0][1] = 0; ve->limits[0][1] = 0;
ve->limits[1][1] = 255; ve->limits[1][1] = 255;
ve->parallel = 1; ve->parallel = 1;
@@ -56,7 +56,7 @@ vj_effect *chromamagick_init(int w, int h)
"Difference Negate", "Additive", "Basecolor", "Freeze", "Unfreeze", "Difference Negate", "Additive", "Basecolor", "Freeze", "Unfreeze",
"Hardlight", "Multiply", "Divide", "Subtract", "Add", "Screen", "Hardlight", "Multiply", "Divide", "Subtract", "Add", "Screen",
"Difference", "Softlight", "Dodge", "Reflect", "Difference Replace", "Difference", "Softlight", "Dodge", "Reflect", "Difference Replace",
"Darken", "Lighten", "Modulo Add" "Darken", "Lighten", "Modulo Add", "Pixel Fuckery"
); );
@@ -367,17 +367,17 @@ static void chromamagic_additive(VJFrame *frame, VJFrame *frame2, int op_a) {
for(i=0; i < len; i++) { for(i=0; i < len; i++) {
a = (Y[i]*o1) >> 7; a = (Y[i]*o1) >> 7;
b = (Y2[i]*o2) >> 7; b = (Y2[i]*o2) >> 7;
Y[i] = a + (( 2 * b ) - 255); Y[i] = a + (( 2 * b ) - 255) & 0xff;
a = Cb[i]; a = Cb[i] - 128;
b = Cb2[i]; b = Cb2[i] - 128;
Cb[i] = a + ( ( 2 * b ) - 255 ); Cb[i] = (( a + ( ( 2 * b ) - 255 )) + 128 ) & 0xff;
a = Cr[i] ; a = Cr[i] - 128;
b = Cr2[i] ; b = Cr2[i] - 128;
Cr[i] = a + ( ( 2 * b ) - 255 ); Cr[i] = ((a + ( ( 2 * b ) - 255 )) + 128 ) & 0xff;
} }
} }
@@ -465,6 +465,45 @@ static void chromamagic_freeze(VJFrame *frame, VJFrame *frame2, int op_a) {
} }
static void chromamagic_pixelfuckery( VJFrame *frame, VJFrame *frame2, int op_a ) {
unsigned int i;
const int len = frame->len;
uint8_t *Y = frame->data[0];
uint8_t *Cb = frame->data[1];
uint8_t *Cr = frame->data[2];
uint8_t *Y2 = frame2->data[0];
uint8_t *Cb2 = frame2->data[1];
uint8_t *Cr2 = frame2->data[2];
int op_a_minus_b, a_minus_b;
for (i = 0; i < len; i++) {
op_a_minus_b = op_a - Y2[i];
a_minus_b = Y[i] - Y2[i];
if (a_minus_b != 0) {
Y[i] = 255 - ((op_a_minus_b * op_a_minus_b * 256) / a_minus_b);
}
op_a_minus_b = 256 - Cb2[i];
a_minus_b = Cb[i] - Cb2[i];
if (a_minus_b != 0) {
Cb[i] = 255 - ((op_a_minus_b * op_a_minus_b * 256) / a_minus_b);
}
op_a_minus_b = 256 - Cr2[i];
a_minus_b = Cr[i] - Cr2[i];
if (a_minus_b != 0) {
Cr[i] = 255 - ((op_a_minus_b * op_a_minus_b * 256) / a_minus_b);
}
}
}
static void chromamagic_unfreeze( VJFrame *frame, VJFrame *frame2, int op_a ) { static void chromamagic_unfreeze( VJFrame *frame, VJFrame *frame2, int op_a ) {
unsigned int i; unsigned int i;
const int len = frame->len; const int len = frame->len;
@@ -480,19 +519,19 @@ static void chromamagic_unfreeze( VJFrame *frame, VJFrame *frame2, int op_a ) {
for(i=0; i < len; i++) { for(i=0; i < len; i++) {
a = Y[i]; a = Y[i];
b = Y2[i]; b = Y2[i];
if( a > pixel_Y_lo_ ) if( a > pixel_Y_lo_ && a != 0 )
Y[i] = 255 - (( op_a - b) * (op_a - b)) / a; Y[i] = 255 - (( op_a - b) * (op_a - b)) / a;
a = Cb[i]; a = Cb[i];
b = Cb2[i]; b = Cb2[i];
if( a > pixel_U_lo_ ) if( a > pixel_U_lo_ && a != 0 )
Cb[i] = 255 - (( 256 - b) * ( 256 - b )) / a; Cb[i] = 255 - (( 256 - b) * ( 256 - b )) / a;
a = Cr[i]; a = Cr[i];
b = Cr2[i]; b = Cr2[i];
if( a > pixel_U_lo_ ) if( a > pixel_U_lo_ && a != 0)
Cr[i] = 255 - ((256 -b ) * (256 - b)) /a ; Cr[i] = 255 - ((256 -b ) * (256 - b)) /a ;
} }
} }
@@ -1012,6 +1051,9 @@ void chromamagick_apply(void *ptr, VJFrame *frame, VJFrame *frame2, int *args) {
case 26: case 26:
chromamagic_modadd( frame,frame2, op_a); chromamagic_modadd( frame,frame2, op_a);
break; break;
case 27:
chromamagic_pixelfuckery( frame, frame2, op_a );
break;
} }
} }