Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Stilgar - Settembre 07, 2012, 11:57:42 pm

Titolo: Nintendo DS e semplici operazioni sui bit ...
Inserito da: Stilgar - Settembre 07, 2012, 11:57:42 pm
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:
Codice: [Seleziona]
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.
Codice: [Seleziona]
 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)
Titolo: Re:Nintendo DS e semplici operazioni sui bit ...
Inserito da: Legolas - Settembre 08, 2012, 10:01:20 am
Da come il disegno "svacca" soltanto in un quadrante, potrebbe forse essere qualche problema di segno
Titolo: Re:Nintendo DS e semplici operazioni sui bit ...
Inserito da: Stilgar - Settembre 10, 2012, 10:55:46 am
Ciao,
 la rogna era nel disegno del pixel in quanto tale.
Allego eseguibile per emulatore.
Il codice è diventato :
Codice: [Seleziona]

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.
;)