Ciao a tutti.
Premettendo che i porchi li sto tirando con la Nintendo DS ... (o meglio l'emulatore).
Da quello che ricordo della programmazione VGA ... ho partorito questo semplice metodillo che uso in tutte le altre funzioni di disegno:
procedure TImageWrapper.setPixel(const x: smallint; const y: smallint; const color: word);
begin
if ((x < 0) or (y < 0)) then
exit;
if ((x >= Width) or (y >= Height)) then
exit;
case FMode of
pmCopy: (fData + (x + y * Width))^ := color;
pmXOR: (fData + (x + y * Width))^ := ((fData + (x + y * Width))^ or color) or (1 shl 15);
pmAND: (fData + (x + y * Width))^ := ((fData + (x + y * Width))^ and color) or (1 shl 15);
end;
end;
nb:Il registro dei colori non è a 8 bit ma a 5, quindi il rapporto cromatico è intorno a 0.125 su un RGB a 256 valori per elemento.
Il loop principale è un semplice ... for camuffato.
Prima l'asse y poi l'asse x.
while True do
begin
dc.color:= clWhite;
dc.image.Mode := pmCopy;
drawRectangle(0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1, dc);
dc.pattern := PenPatternSolid;
drawCircle(cx, cy, 20, dc);
dc.image.Mode := pmXOR;
drawCircle(cx + x, cy + y, 20, dc);
if y > 1 then
y -= 1
else
if x > 1 then
x -= 1;
swiWaitForVBlank();
end;
allogo il pessimo risultato.
Se qualcuno ha idee e suggerimenti, sono aperto ad ogni suggerimento (dopo una serata a porconare e 1 litro di sangira... per rendere più fluide le idee)
Ciao,
la rogna era nel disegno del pixel in quanto tale.
Allego eseguibile per emulatore.
Il codice è diventato :
procedure TImageWrapper.setPixel(const x: smallint; const y: smallint; const color: word);
var
oColor, nColor: word;
begin
if ((x < 0) or (y < 0)) then
exit;
if ((x >= Width) or (y >= Height)) then
exit;
oColor := (fData + (x + y * Width))^;
case FMode of
pmCopy: nColor := color;
pmXOR: nColor := oColor xor color;
pmAND: nColor := oColor and color;
end;
nColor := (1 shl 15) or nColor;
(fData + (x + y * Width))^ := nColor;
end;
Evidentemente il GCC o FreePascal non capivano bene di cosa avevo bisogno andando in memoria diretta.
Passando per la variabile opportina si comporta come volevo.
;)