#ifndef HYPERION_LAYOUT_H #define HYPERION_LAYOUT_H #include #include #include #include #include typedef struct {unsigned char a,b;unsigned weight;} LedBlend; #include #include #include #include "calibration.h" static double screen_perimeter(double x,double y){ double distances[]={y,1-x,1-y,x},positions[]={x,1+y,3-x,4-y};unsigned edge=0; for(unsigned i=1;i<4;i++)if(distances[i]=4?positions[edge]-4:positions[edge]; } static LedBlend layout_blend(double x,double y){ const RimPoint *rim=calibration_effective()==CAL_CUSTOM?calibration.points:g4_rim; double t=screen_perimeter(x,y);unsigned n=calibration_effective()==CAL_CUSTOM?calibration.count:sizeof(g4_rim)/sizeof(*g4_rim),right=0; while(right0 && n<=16384; LedBlend *mapping=valid?calloc(n,sizeof(*mapping)):NULL;valid=valid && mapping; const char *keys[]={"hmin","hmax","vmin","vmax"}; for(size_t i=0;valid && i=0 && coordinates[c]<=1;} } if(valid)valid=coordinates[0]<=coordinates[1] && coordinates[2]<=coordinates[3]; if(valid)mapping[i]=layout_blend((coordinates[0]+coordinates[1])/2,(coordinates[2]+coordinates[3])/2); } if(root)put(root); dlclose(lib); if(!valid){free(mapping);return false;} *result=mapping;*count=(unsigned)n;return true; } #endif