Codebase list frei0r / fb13650 debian / patches / 020120331~0fade7e.patch
fb13650

Tree @fb13650 (Download .tar.gz)

020120331~0fade7e.patch @fb13650raw · history · blame

Description: Select0r: Endian proofing
Origin: upstream, http://git.dyne.org/frei0r/commit/?id=0fade7e
Author: Marko Cebokli <mc@mcpc14.site>
Forwarded: yes
Last-Update: 2012-12-23

--- a/src/filter/select0r/readme
+++ b/src/filter/select0r/readme
@@ -14,6 +14,9 @@
 Version 0.1
 "pre-alpha" (throw it out and see what happens... :-)
 
+** mar 2012
+Version 0.2
+is now endian independent
 
 
 DESCRIPTION
--- a/src/filter/select0r/select0r.c
+++ b/src/filter/select0r/select0r.c
@@ -627,7 +627,7 @@
 info->color_model=F0R_COLOR_MODEL_RGBA8888;
 info->frei0r_version=FREI0R_MAJOR_VERSION;
 info->major_version=0;
-info->minor_version=1;
+info->minor_version=2;
 info->num_params=9;
 info->explanation="Color based alpha selection";
 }
@@ -836,7 +836,10 @@
 float_rgba key;
 triplet d,n;
 int i;
-uint32_t a,t;
+uint32_t t;
+unsigned char *cin, *cout;
+float f1=1.0/256.0;
+unsigned char a1,a2;
 
 assert(instance);
 in=(inst*)instance;
@@ -853,11 +856,13 @@
 n.z=in->nud3;
 
 //convert to float
+cin=(unsigned char *)inframe;
 for (i=0;i<in->h*in->w;i++)
 	{
-	in->sl[i].r=((float)(inframe[i]&0x000000FF))*0.00392157;
-	in->sl[i].g=((float)((inframe[i]&0x0000FF00)>>8))*0.00392157;
-	in->sl[i].b=((float)((inframe[i]&0x00FF0000)>>16))*0.00392157;
+	in->sl[i].r=f1*(float)*cin++;
+	in->sl[i].g=f1*(float)*cin++;
+	in->sl[i].b=f1*(float)*cin++;
+	cin++;
 	}
 
 //make the selection
@@ -882,46 +887,63 @@
 		in->sl[i].a = 1.0 - in->sl[i].a;
 
 //apply alpha
+cin=(unsigned char *)inframe;
+cout=(unsigned char *)outframe;
 switch (in->op)
 	{
 	case 0:		//write on clear
 		for (i=0;i<in->h*in->w;i++)
 			{
-			a=((uint32_t)(in->sl[i].a*255.0))<<24;
-			outframe[i] = (inframe[i]&0x00FFFFFF) | a;
+			*cout++ = *cin++;	//copy R
+			*cout++ = *cin++;	//copy G
+			*cout++ = *cin++;	//copy B
+			*cout++ = (unsigned char)(in->sl[i].a*255.0);
+			cin++;
 			}
 		break;
 	case 1:		//max
 		for (i=0;i<in->h*in->w;i++)
 			{
-			a=((uint32_t)(in->sl[i].a*255.0))<<24;
-			t=((inframe[i]&0xFF000000)>a) ? inframe[i]&0xFF000000 : a;
-			outframe[i] = (inframe[i]&0x00FFFFFF) | t;
+			*cout++ = *cin++;	//copy R
+			*cout++ = *cin++;	//copy G
+			*cout++ = *cin++;	//copy B
+			a1 = *cin++;
+			a2 = (unsigned char)(in->sl[i].a*255.0);
+			*cout++ = (a1>a2) ? a1 : a2;
 			}
 		break;
 	case 2:		//min
 		for (i=0;i<in->h*in->w;i++)
 			{
-			a=((uint32_t)(in->sl[i].a*255.0))<<24;
-			t=((inframe[i]&0xFF000000)<a) ? inframe[i]&0xFF000000 : a;
-			outframe[i] = (inframe[i]&0x00FFFFFF) | t;
+			*cout++ = *cin++;	//copy R
+			*cout++ = *cin++;	//copy G
+			*cout++ = *cin++;	//copy B
+			a1 = *cin++;
+			a2 = (unsigned char)(in->sl[i].a*255.0);
+			*cout++ = (a1<a2) ? a1 : a2;
 			}
 		break;
 	case 3:		//add
 		for (i=0;i<in->h*in->w;i++)
 			{
-			a=((uint32_t)(in->sl[i].a*255.0))<<24;
-			t=((inframe[i]&0xFF000000)>>1)+(a>>1);
-			t = (t>0x7F800000) ? 0xFF000000 : t<<1;
-			outframe[i] = (inframe[i]&0x00FFFFFF) | t;
+			*cout++ = *cin++;	//copy R
+			*cout++ = *cin++;	//copy G
+			*cout++ = *cin++;	//copy B
+			a1 = *cin++;
+			a2 = (unsigned char)(in->sl[i].a*255.0);
+			t=(uint32_t)a1+(uint32_t)a2;
+			*cout++ = (t<=255) ? (unsigned char)t : 255;
 			}
 		break;
 	case 4:		//subtract
 		for (i=0;i<in->h*in->w;i++)
 			{
-			a=((uint32_t)(in->sl[i].a*255.0))<<24;
-			t= ((inframe[i]&0xFF000000)>a) ? (inframe[i]&0xFF000000)-a : 0;
-			outframe[i] = (inframe[i]&0x00FFFFFF) | t;
+			*cout++ = *cin++;	//copy R
+			*cout++ = *cin++;	//copy G
+			*cout++ = *cin++;	//copy B
+			a1 = *cin++;
+			a2 = (unsigned char)(in->sl[i].a*255.0);
+			*cout++ = (a1>a2) ? a1-a2 : 0;
 			}
 		break;
 	default: