Description: Select0r: Endian proofing Origin: upstream, http://git.dyne.org/frei0r/commit/?id=0fade7e Author: Marko Cebokli 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;ih*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;ih*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;ih*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;ih*in->w;i++) { - a=((uint32_t)(in->sl[i].a*255.0))<<24; - t=((inframe[i]&0xFF000000)sl[i].a*255.0); + *cout++ = (a1h*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;ih*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: