Développement de plugins en Delphi / C / ASM

Discussion de programmation pour éviter d'empiéter dans les autres forums

Modérateurs : Modérateurs, Développeurs

Antonio
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 12830
Inscription : 28 oct. 2003 22:49

Développement de plugins en Delphi / C / ASM

Message par Antonio »

Avec la version 5.6, il est possible de développer des plugins pour PhotoFiltre dans différents langages. Des exemples seront bientôt disponibles :

A) Principe en Delphi

Code : Tout sélectionner

var
  Bitmap: TBitmap;
  Buffer: Pointer;
  Width, Height, I: Integer;

BeginFilter;
Bitmap := TBitmap.Create;
try
  // création d'un bitmap en 24 bits de la taille de la sélection
  Width := GetSelWidth;
  Height := GetSelHeight;
  Bitmap.PixelFormat := pf24bit;
  Bitmap.Width := Width;
  Bitmap.Height := Height;
  // copie la sélection dans le bitmap
  GetSelBitmap(Image.piBitmap);
  // parcourt chaque ligne
  for I := 0 to Height - 1 do
  begin
    Buffer := Bitmap.Scanline[I];
    // action sur buffer
  end;
  // met à jour la sélection PhotoFiltre
  SetSelBitmap(Bitmap);
finally
  Bitmap.Free;
  EndFilter;
end;
B) Principe en C ou autre (à la syntaxe près bien sûr)

Merci à PF (il se reconnaîtra :wink: ) pour l'idée de la structure TPlgImage !

Code : Tout sélectionner

var
  Image: TPlgImage;
  I: Integer;

BeginFilter;
try
  // création d'un bitmap en 24 bits de la taille de la sélection
  Image.piWidth := GetSelWidth;
  Image.piHeight := GetSelHeight;
  CreateDBmp(@Image);  // c'est PhotoFiltre qui s'en charge
  // copie la sélection dans le bitmap
  GetSelBitmap(Image.piBitmap);
  // parcourt chaque ligne
  for I := 0 to Height - 1 do
  begin
    GetScanLineDBmp(@Image, I);
    // action sur Image.piBuffer
  end;
  // met à jour la sélection PhotoFiltre
  SetSelBitmap(Image.piBitmap);
finally
  FreeDBmp(@Image);
  EndFilter;
end;
C) Unités de réference en Delphi

Voici les unités de référence en Delphi, les versions C et ASM seront bientôt disponibles :
http://photofiltre.free.fr/plugins/src/plugins.zip

D) Le document de référence

Pour avoir une description des différentes fonctions, c'est ici :
http://photofiltre.free.fr/plugins/plgref.htm
Heis Spiter
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 2038
Inscription : 28 oct. 2003 13:39
Version de PhotoFiltre : 6.2.7/9.0.0
Système d'exploitation : Windows XP Pro SP2
Processeur : Intel Pentium IV 3.2 Ghz HT
Mémoire RAM : 1536 Mo DDR
Localisation : 63

Message par Heis Spiter »

J'vais essayer de faire ceci en PureBasic histoire de voir si ca fonctionne :roll: Je garanti rien de rien...
Heis Spiter
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 2038
Inscription : 28 oct. 2003 13:39
Version de PhotoFiltre : 6.2.7/9.0.0
Système d'exploitation : Windows XP Pro SP2
Processeur : Intel Pentium IV 3.2 Ghz HT
Mémoire RAM : 1536 Mo DDR
Localisation : 63

Message par Heis Spiter »

Ca pourrais avoir cette tête bien que rien de sûr...

Code : Tout sélectionner

Image$: TPlgImage
I: Integer
; création d'un bitmap en 24 bits de la taille de la sélection 
Image$.piWidth = GetSelWidth$
Image$.piHeight = GetSelHeight$
CreateDBmp(@Image$); c'est PhotoFiltre qui s'en charge 
; copie la sélection dans le bitmap 
GetSelBitmap(Image$.piBitmap)
; parcourt chaque ligne
For I = 0 To Height - 1 do 
  GetScanLineDBmp(@Image$, I)
  ; action sur Image$.piBuffer 
Next 
; met à jour la sélection PhotoFiltre 
SetSelBitmap(Image$.piBitmap)  
FreeDBmp(@Image$)
Bon ya des truc qui m'ennuient ! Les points entre deux variables... C'est pour les assembler ? Ou j'ai raté un truc ? De plus les variables non image$ sont elles des chiffres ? Ou des lettres ? Je corrigerais en conséquent
Benjamin
Membre d'honneur
Membre d'honneur
Messages : 1075
Inscription : 29 oct. 2003 14:53
Version de PhotoFiltre : 6.0
Système d'exploitation : Windows 2000 SP 4
Processeur : Pentium IV 2,4Ghz
Mémoire RAM : 512Mo DDR 333
Localisation : 21

Message par Benjamin »

Moi je peux générer des .h(pp) avec C++Builder si tu veux...
Benjamin
Membre d'honneur
Membre d'honneur
Messages : 1075
Inscription : 29 oct. 2003 14:53
Version de PhotoFiltre : 6.0
Système d'exploitation : Windows 2000 SP 4
Processeur : Pentium IV 2,4Ghz
Mémoire RAM : 512Mo DDR 333
Localisation : 21

Message par Benjamin »

Non le : sert à définir le type de la variable (entier, chaîne de caractère)

En basic c'est le $ qui dit que c'est une chaîne de caractère en Delphi / Pascal pour définir une chaîne de caractère on met :string
Heis Spiter
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 2038
Inscription : 28 oct. 2003 13:39
Version de PhotoFiltre : 6.2.7/9.0.0
Système d'exploitation : Windows XP Pro SP2
Processeur : Intel Pentium IV 3.2 Ghz HT
Mémoire RAM : 1536 Mo DDR
Localisation : 63

Message par Heis Spiter »

Le blème c'est que pour l'instant je tente de comprendre comment faire la conversion entre C/C++/Delphi vers le pureBasic comme ca je pourrais aussi faire des plugins ;-) Tu ne serais plus seul ! :D
Benjamin
Membre d'honneur
Membre d'honneur
Messages : 1075
Inscription : 29 oct. 2003 14:53
Version de PhotoFiltre : 6.0
Système d'exploitation : Windows 2000 SP 4
Processeur : Pentium IV 2,4Ghz
Mémoire RAM : 512Mo DDR 333
Localisation : 21

Message par Benjamin »

c'est quoi le pureBasic? y a moyen de trouver une doc?

En fait il faudrait déjà pouvoir faire des dll avec... => C'est possible mais pas dans la version demo :(

en fait faudrait déjà traduire PlugIntf.pas en un fichier PureBasic
Dernière modification par Benjamin le 29 mars 2004 22:24, modifié 1 fois.
Antonio
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 12830
Inscription : 28 oct. 2003 22:49

Message par Antonio »

En VB je suis nul, je sais même pas comment on déclare un pointeur ni une structure, je peux pas vous aider
Benjamin
Membre d'honneur
Membre d'honneur
Messages : 1075
Inscription : 29 oct. 2003 14:53
Version de PhotoFiltre : 6.0
Système d'exploitation : Windows 2000 SP 4
Processeur : Pentium IV 2,4Ghz
Mémoire RAM : 512Mo DDR 333
Localisation : 21

Message par Benjamin »

Voilà un début de traduction en purebasic ;)

Code : Tout sélectionner

  #MaxLongStr = 256 + 1
  #MaxShortStr = 64 + 1

;type du plugin
  #PT_FILTER = 0
  #PT_IMAGE = 1
  #PT_FILE_IMPORT = 2
  #PT_FILE_EXPORT = 3
  #PT_TOOL = 4

;mode de dialogue
  #DM_MODAL = 0
  #DM_PREVIEW = 1
  #DM_COLOR_PICKER = 2

;flags de sélection
  #SF_AUTO = 0
  #SF_NONE = 1

;flags pour la création d'image
  #IF_CREATE = 0
  #IF_FILE = 1

;flags pour l'activation du menu
  #MF_RGB_COLORS = $00000001
  #MF_INDEXED_COLORS = $00000002
  #MF_TRANSPARENT = $00000004
  #MF_NOT_TRANSPARENT = $00000008
  #MF_SELECTED = $00000010
  #MF_NOT_SELECTED = $00000020
  #MF_NEED_IMAGE = $00000040
  #MF_NEED_MORE_THAN_ONE_IMAGE = $00000080
;test sur l'extension du fichier en cours
  #MF_IMAGE_JPEG = $00010000
  #MF_IMAGE_GIF = $00020000
  #MF_IMAGE_PNG = $00040000
  #MF_IMAGE_BMP = $00080000
  #MF_IMAGE_TIFF = $00100000
  #MF_IMAGE_PFS = $00200000

; pour RegisterApplication
; PApplication = ^TApplication

;Structure pour récupérer les infos sur traduction
  Structure TPluginLanguage
    Code.b[2]
    Language.b[#MaxShortStr]
    Flags.l
  EndStructure

;Structure d'entête du plugin
  Structure TPluginHeader
    Caption.b[#MaxShortStr]
    Version.b[#MaxShortStr]
    PluginType.l
    Author.b[#MaxShortStr]
    Comment.b[#MaxLongStr]
    Reserved.b[#MaxLongStr]
    Flags.l
  EndStructure

;permet d'encapsuler un objet TBitmap Delphi (compatibilité de niveau 2)
;(Structure proposée par PF)

  Structure TPlgImage
    piSize.l ; // Taille de la structure
    piWidth.l ;Largeur en pixels
    piHeight.l ;Hauteur en pixels
    piWidthSize.l ;Taille X utile en octets (piWidth * piByteCount)
    piScanlineSize.l ;Scanline complete en octets (alignement 32 bits)
    piByteCount.l ;Nombre d'octets par pixels
    piDataSize.l ;Taille totale du buffer (piScanlineSize * piHeight)
    *piBuffer.l;Adresse du buffer de travail
    *piBitmap.l ;(TBitmap); // Pointeur vers un objet TBitmap Delphi
    piHandle.l;Handle du bitmap Windows 
  EndStructure
Bon ca compile mais par contre je ne suis pas sur de la traduction mais ca peut être un début...
Heis Spiter
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 2038
Inscription : 28 oct. 2003 13:39
Version de PhotoFiltre : 6.2.7/9.0.0
Système d'exploitation : Windows XP Pro SP2
Processeur : Intel Pentium IV 3.2 Ghz HT
Mémoire RAM : 1536 Mo DDR
Localisation : 63

Message par Heis Spiter »

:shock: Ben dis donc ! :roll: Bravo !
pf

Développement de plugins=>Avis Perso....

Message par pf »

Salut a tous,
Je viens de charger PureBasic pour voir, je connaissais pas....
Avec la version de Démo il me parrais impossible de faire un plugin:
"No DLL Creation" et "No Win32 API Support" (Benjamin a déja soulevé le problème).
Par contre avec une version complete($!?!$) et dans la mesure ou il peut:
manipuler les pointeurs (*piBitmap.l) et gerer les handles d'objets, c'est certainement possible.
En VB c'est impossible (DLL ActivX uniquement)

Sinon, Il est possible de se procurer Gratuitement et légalement le compilateur C/C++ v5.5 de Borland et l'assembleur MASM32 32bits (ML) de Microsoft.
On peut aussi trouver une foule d'editeurs au meme prix!.

Par contre, avec C++Builder, (ou VC++) il est tout a fait possible de recuperer les headers (voir meme le source) de l'exemple et de construire un plugin (avantage du C par rapport au C++), en modifiant quelques declarations.
Benjamin
Membre d'honneur
Membre d'honneur
Messages : 1075
Inscription : 29 oct. 2003 14:53
Version de PhotoFiltre : 6.0
Système d'exploitation : Windows 2000 SP 4
Processeur : Pentium IV 2,4Ghz
Mémoire RAM : 512Mo DDR 333
Localisation : 21

Message par Benjamin »

L'avantage de C++Builder c'est qu'il génére automatiquement un .hpp qui est une traduction de l'interface de l'unité Delphi en C++ avec un peu de modification je pense que ce header pourrait être utilisé en VC++ voir Borland C++ 5.5 (celui qui est gratuit)
Heis Spiter
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 2038
Inscription : 28 oct. 2003 13:39
Version de PhotoFiltre : 6.2.7/9.0.0
Système d'exploitation : Windows XP Pro SP2
Processeur : Intel Pentium IV 3.2 Ghz HT
Mémoire RAM : 1536 Mo DDR
Localisation : 63

Message par Heis Spiter »

J'ai la version payante donc la pas de problème, quand a C++ je l'avais déjà téléchargé mais j'aime pas. Et je sais mieux programmer en PureBasic
Antonio
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 12830
Inscription : 28 oct. 2003 22:49

Message par Antonio »

Ok pour la proposition hpp dePlgInt.pas et une adaptation de l'unité Plugins.pas en C++ en remplaçant les fonctions qui prennent en paramètre TBitmap par un TPlgImage. Comme ça on poura faire des remarques constructives. Le but étant de normaliser...donc tout le monde participe :wink:
Benjamin
Membre d'honneur
Membre d'honneur
Messages : 1075
Inscription : 29 oct. 2003 14:53
Version de PhotoFiltre : 6.0
Système d'exploitation : Windows 2000 SP 4
Processeur : Pentium IV 2,4Ghz
Mémoire RAM : 512Mo DDR 333
Localisation : 21

Message par Benjamin »

Sinon je me demande si ca serait pas plus simple de faire une interface COM/OLE car ca reste quand même une meilleure solution pour faire une ouverture multilangage car même PureBasic supporte de telles interface...