1// Portable math support for the darktable extraction.2// SPDX-License-Identifier: AGPL-3.0-or-later3456789101112131415161718192021typedef int gboolean;22static double deg2rad(double x) { return x * M_PI / 180.0; }23static float deg2radf(float x) { return x * (float)M_PI / 180.0f; }24static float rad2degf(float x) { return x * 180.0f / (float)M_PI; }25static void mat3mul(float *out, const float *a, const float *b) {26 float t[9] = {0};27 for(int i=0;i<3;i++) for(int j=0;j<3;j++) for(int k=0;k<3;k++) t[i*3+j] += a[i*3+k]*b[k*3+j];28 memcpy(out,t,sizeof(t));29}30static void mat3mulv(float *out, const float *a, const float *b) {31 for(int i=0;i<3;i++) out[i]=a[i*3]*b[0]+a[i*3+1]*b[1]+a[i*3+2]*b[2];32}33static int mat3inv(float *o, const float *m) {34 const float d=m[0]*(m[4]*m[8]-m[5]*m[7])-m[1]*(m[3]*m[8]-m[5]*m[6])+m[2]*(m[3]*m[7]-m[4]*m[6]);35 if(fabsf(d)<1e-15f) return 1;36 float t[9]={m[4]*m[8]-m[5]*m[7],m[2]*m[7]-m[1]*m[8],m[1]*m[5]-m[2]*m[4],37 m[5]*m[6]-m[3]*m[8],m[0]*m[8]-m[2]*m[6],m[2]*m[3]-m[0]*m[5],38 m[3]*m[7]-m[4]*m[6],m[1]*m[6]-m[0]*m[7],m[0]*m[4]-m[1]*m[3]};39 for(int i=0;i<9;i++) o[i]=t[i]/d;40 return 0;41}