#ifndef HYPERION_LAYOUT_H #define HYPERION_LAYOUT_H #include #include #include #include #include typedef struct {unsigned char a,b;unsigned weight;} LedBlend; /* Measured G4 rim samples, independent of LED count and wiring order. */ static const struct {double position;unsigned char region;} rim[]={ {0.2078431373,7},{0.3176470588,3},{0.5490196078,11},{0.7529411765,12}, {0.8392156863,13},{1.4941176471,10},{2.1843137255,9},{2.5490196078,1}, {2.8666666667,5},{3.4,15} }; 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){ double t=screen_perimeter(x,y);unsigned n=sizeof(rim)/sizeof(*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