clone

a photo toolkit for your phone that never uploads: fuji film looks for raw files, social crops, error level analysis

main
gudpics / native / compat.h
compat.h 1.5K
1// Portable math support for the darktable extraction.2// SPDX-License-Identifier: AGPL-3.0-or-later3#include <assert.h>4#include <float.h>5#include <limits.h>6#include <math.h>7#include <stdint.h>8#include <stdio.h>9#include <stdlib.h>10#include <string.h>11#define DT_ALIGNED_PIXEL12#define DT_ALIGNED_ARRAY13#define DT_OMP_FOR()14#define TRUE 115#define FALSE 016#define MIN(a,b) ((a)<(b)?(a):(b))17#define MAX(a,b) ((a)>(b)?(a):(b))18#define CLAMP(x,a,b) MIN(MAX((x),(a)),(b))19#define dt_isnan isnan20#define dt_fast_hypotf hypotf21typedef 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}