Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Stilgar - Aprile 25, 2012, 02:52:50 pm

Titolo: Low, ma very low api
Inserito da: Stilgar - Aprile 25, 2012, 02:52:50 pm
Ciao a tutti.
Per rendere portabile una cosina che ho scritto in Delphi qualche anno fa, mi sono scontrato in una piccola conversione delle API di Windows.
Codice: [Seleziona]
 rgn := CreatePolygonRgn(p, 4, ALTERNATE);
  assert(rgn <> 0);
  Result := RectInRegion(rgn, rect);
  DeleteObject(rgn);   

Si parla di vedere se un rettangolo è contenuto in un'altro (alla base dell'algoritmo c'è questa esigenza).
Esistono alcune API già convertite ... quella in rosso (RectInRegion) no... ho googlato tutta ieri sera, e pensavo di convertire il codice Wine in FreePascal/LCL. Ho iniziato a fare l'analisi del codice di Wine, ma devo convertirne mezzo ... e non ne ho voglia (troppo codice da debugare poi ... per una singola funzione ...).

Suggerimenti e idee?
Se non esiste l'api portabile di riferimento, come devo convertire il codice?

Funzione :
Codice: [Seleziona]
function TShapeRelation.intersectsSeg(rect  :TRect; index  :Integer)  :Boolean;
var
  numNodes  :Integer;
  rgn  :THandle;
  p  :array[0..3] of TPoint;
  p1, p2  :TPoint;
begin
  Result := False;
  if self = nil then
    exit;
  if FDst = nil then
    exit;
  if (FDst.Shape = nil) then
    exit;
  numNodes := FNodes.Count;
  if index = 0 then
    p1 := FSrc.Point
  else
    p1 := TCPoint(FNodes[index - 1]).Point;

  if index = numNodes then
    p2 := FDst.point
  else
    p2 := TCPoint(FNodes[index]).Point;

  CalcSafeBox(p1, p2, handleSize, p);
  rgn := CreatePolygonRgn(p, 4, ALTERNATE);
  assert(rgn <> 0);
  Result := RectInRegion(rgn, rect);
  DeleteObject(rgn);
end;   

Questa applicazione avevo intenzione di rilasciarla su repository del forum.
Magari un giorno lo si potrà integrare con lazarus per come tool grafico (Delphi Architect ...), ma questo lo farà qualcun'altro :D
Grassssie.
Titolo: Re:Low, ma very low api
Inserito da: nomorelogic - Aprile 25, 2012, 04:31:51 pm
ciao ho dato un'occhiata in giro anche io ed ho trovato questo link
http://source.winehq.org/source/dlls/gdi32/region.c#L1127 (http://source.winehq.org/source/dlls/gdi32/region.c#L1127)

non sembra complicato se la guardi come una singola funzione che controlla l'intersezione tra i 2 quadrati

Titolo: Re:Low, ma very low api
Inserito da: Stilgar - Aprile 25, 2012, 04:34:42 pm
Grazie ;)
Il problema che mi sono posto.... non trovo la definizione di HRGN ... quindi non so come "castarla". :(
Titolo: Re:Low, ma very low api
Inserito da: nomorelogic - Aprile 25, 2012, 10:23:49 pm
a volte certi problemi è meglio non porseli ;)
Titolo: Re:Low, ma very low api
Inserito da: Stilgar - Aprile 26, 2012, 12:15:12 am
Ok, sono partito a convertire il C++ per una cazzosissima api :(

http://source.winehq.org/source/dlls/gdi32/region.c

Ci sarà da porconare alla grande in debug ;)
Poi committo tutto ... spero mi diate una mano a debugare questo osso ;)
Titolo: Re:Low, ma very low api
Inserito da: Microges2000 - Aprile 26, 2012, 07:58:04 am
Questo ti puo' dare una mano http://xplproject.googlecode.com/svn-history/r433/lazarus/units/general/kgraphics.pas
Titolo: Re:Low, ma very low api
Inserito da: Stilgar - Aprile 26, 2012, 09:21:20 am
Scarico e vedo cosa portare a casa :D
Grazie, se va bene, mi hai risparmiato decine di ore di traduzione :D (non oso pensare al debug ;) )