Teoretycznie dużym przyśpieszeniem mogło by być, gdybyś zamiast getPixel() czytał dane obrazu bezpośrednio, przez zdobycie wskaźnika do samego obrazu przez getPixelsPtr() i samodzielnym czytaniu jego danych. Podobnie, zamiast setPixel, mógłbys stworzyć newImage bezpośrednio z własnej tablicy z użyciem Image::create().
Z pobocznych rad:
for(size_t x = 0; x < width; ++x)
for(size_t y = 0; y < height; ++y)
mix[x][y].r = mix[x][y].g = mix[x][y].b = 0;
Zamiast tego możesz ustawić domyślne wartości r, g, b w samej strukturze:
struct colorMix
{
unsigned r = 0, g = 0, b = 0;
};
Dalej:
for(size_t i = 0; i < n; ++i)
for(size_t j = 0; j < n; ++j)
To chyba nie jest kwadrat 2n+1 na 2n+1, nie?
if(t < 0)
t += border;
else if(t >= border)
t -= border;
Tutaj... zawijasz wokół krawędzi? Trochę to dziwne, lepiej chyba przeczytać wartość brzegową.