Mam bufor w postaci jednowymiarowej tablicy dynamicznej:
var
Bits: array of RGBTriple;
Jest w takiej a nie innej formie, bo tego wymagają microsoftowe funkcje z bibliotek GDI (GetDIBits i SetDIBits). Praca z bitmapą w takiej postaci jest raczej mało praktyczna (zwłaszcza, gdy dokonuje się przekształceń wierzchołków 3D na punkty 2D, pasujących do współrzędnych ekranu), potrzebuję więc sposobu, by móc ten bufor interpretować jako tablicę dwuwymiarową. Celowo piszę interpretować, bo chcę uniknąć konwersji (ta jest czasochłonna, a mi zależy na szybkości).
Póki co wymyśliłem to tak, że mam wskaźnik do statycznej, dwuwymiarowej tablicy, który działa jak maska (alias) dla bufora.
type
TBitMask = array[0..1079, 0..1919] of RGBTriple;
var
Bits: array of RGBTriple;
BitMask: ^TBitMask;
//procedura
SetLength(Bits, 1920 * 1080);
BitMask := @Bits[0];
No a potem mogę używać równorzędnie:
//procedura
Bits[1921] := 14;
BitMask[1, 1] := 14;
//oba powyższe dają ten sam efekt
Problem jest taki, że to działa tylko przy statycznym określeniu wielkości tablicy-maski, a ta docelowo ma się zmieniać w zależności od ustawień, więc consty odpadają... Ktoś ma pomysł jak (byle niezbyt kosztownie pod względem szybkości) to obejść?
Wiem, że dosyć łatwo można konwertować same współrzędne i np. zrobić funkcję pomocniczą, która pobierze współrzędne 2D (X i Y) i zwróci współrzędną w 1D:
function Get1D(const AX, AY, ABitmapWidth: Integer): Integer; inline;
begin
Result := AY * ABitmapWidth + AX;
end;
Niestety jest to spora strata szybkości (ok. 5 ms), gdy wywołuje się taką funkcję w pętli ponad 2 miliony razy. Potrzebuję czegoś szybszego. W ostateczności zrobię dynamiczną, dwuwymiarową tablicę wskaźników na RGBTriple i po prostu w pętli przypiszę każde pole tej tablicy do odpowiedniego adresu w buforze (niestety takie rozwiązanie zjada mi całe 2-3 ms).

