1 pièce(s) jointe(s)
Trouver, découvrir une propriété non publiée
Bonjour,
aujourd'hui c'est un truc pas mal tordu (et qui me torture bien bien les méninges), alors je pose d'abord le contexte, comme ça vous pourrez y revenir facilement après avoir lu la question plus bas :
La vie, de bas en haut, dans les deux cas :
1- déclarations :
Code:
1 2 3 4 5 6
| type TFPCustomImage = class(TPersistent) // FPImage
type TLazIntfImage = class(TFPCustomImage) // intfGraphics
var DestIntfImage: TLazIntfImage; // mon projet / mon unité
//et dans mon code / ma procédure il y a
DestCanvas := TLazCanvas.Create(DestIntfImage); // on cherche DestInfImage |
--start here et remonte--
2- utilisation :
Code:
1 2 3 4 5 6 7 8
| type TFPCustomImage = class(TPersistent) // FPImage
type TFPPixelCanvas = class (TFPCustomCanvas) // FPPixlCanv
type TFPImageCanvas = class (TFPPixelCanvas) // FPImgCanvas
type TLazCanvas = class(TFPImageCanvas) // LazCanvas
var DestCanvas: TLazCanvas; // mon projet / mon unité
//et dans mon code / ma procédure il y a
DestCanvas.Interpolation := ... // le mot "Interpolation" est introuvable dans TLazCanvas et dans ses ancêtres !? |
--start here et remonte--
On notera qu'on part de deux points différents (TLazCanvas ci-dessus et TLazIntfImage pour le point 1) mais qu'on se retrouve à la même arrivée : TPersistent, par le biais des sacs de nœuds indémêlables.
L'idée, l'action que je cherche à réaliser, c'est d'avoir des infos sur le filtre d'interpolation qui est en service au moment où StretchDraw est appelé.
Dans le tuto du web, on lit ça :
Code:
1 2 3 4 5 6 7 8 9 10 11
| ...
//Prepare the source
SourceIntfImage := TLazIntfImage.Create(0, 0);
SourceIntfImage.LoadFromBitmap(SourceBitmap.Handle, 0);
// Execute the stretch draw via TFPSharpInterpolation
DestCanvas.Interpolation := TFPSharpInterpolation.Create; // ça !
DestCanvas.StretchDraw(0, 0, DestWidth, DestHeight, SourceIntfImage); // et son utilisation
// Reload the image into the TBitmap
... |
où l'on voit bien la mise en place du filtre FPSharp, ok, mais j'ai quand même noté dans un coin de mon code :
Code:
1 2
| // si pas DestCanvas.Interpolation := TUnFiltre.Create,
// DestCanvas.StretchDraw utilisera Mitchell par défaut (voir fpcanvas.inc ligne 720) |
et on peut lire dans fpcanvas.inc :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| procedure TFPCustomCanvas.StretchDraw(x, y, w, h: integer; source: TFPCustomImage);
var i : TFPCustomInterpolation;
FreeInterpolation : boolean;
IP : TFPCustomInterpolation;
begin
FreeInterpolation := not assigned (FInterpolation);
if FreeInterpolation then
IP := TMitchelInterpolation.Create ////////// <<<<<<<<<<<
else
IP := FInterpolation;
try
with IP do
begin
Initialize (source, self);
Execute (x,y,w,h);
end;
finally
if FreeInterpolation then
IP.Free;
end;
end; |
Sauf que...
Sauf que si je mets un ShowMessage(DestCanvas.Interpolation.ClassName); avant l'utilisation DestCanvas.StretchDraw(0, 0, DestWidth, DestHeight, SourceIntfImage); je me prends un SIGSEGV tellement sévère que même Ctrl-F2 ne rattrape pas l'EDI : il me faut tuer le process en mémoire en passant par une autre console (ouf, merci Linux !), le bureau est complètement bloqué, c'est du lourd, du très lourd, faites attention si vous voulez jouer avec ça !
Impossible donc de connaître le filtre utilisé si je ne rajoute pas DestCanvas.Interpolation := TUnFiltre.Create; et si je mets ça, ça ne sert à rien ensuite de demander qui est le filtre.
Voilà, je ne sais pas si c'est bien clair (pour moi ça l'est) : comment savoir si un filtre est prêt à être utilisé alors que je n'ai pas appelé la proc qui va le définir ?
Car, in fine, il doit bien l'être, défini, ce filtre par défaut, puisqu'il fonctionne, puisque la proc fonctionne sans son appel et donne une image correspondant aux caractéristiques de Mitchell.
Une idée, quelqu'un, quitte à aller bidouiller dans des .pas, .pp, .inc où je ne mets habituellement pas mon clavier ?
Perso, je ne vois absolument pas quoi aller bidouiller, et comment : je ne vous en voudrai pas si vous donnez votre langue au chat, mais vous pourrez toujours me dire comment vous appréciez ma nouvelle petite (150x100) image de test, agrandie à 300x200 à gauche avec le filtre Sharp (appel en place), à droite avec Mitchell (appel à Sharp commenté, remarquez combien le damier est moche) :
Pièce jointe 292500
Merci,