Développement des plugins


Développement des modules externes (plugins) pour PhotoFiltre et PhotoFiltre Studio.
Date du document : Avril 2005


Contenu de ce document

I) Introduction
II) Les différents types de modules
    A) Les modules de type Filtre
    B) Les modules de type Image
    C) Les modules de type Importation
    D) Les modules de type Exportation
    E) Les modules de type Outil
III) Options de compilation de la librairie
IV) Les fonctions exportées
V) Les constantes et les structures d'échange
VI) Les fonctions d'initialisation de l'entête
VII) Les fonctions d'informations sur la langue en cours
VIII) Les fonctions d'exécution
IX) Conseils
X) Annexes

    A) Unités Delphi
    B) Autorisation de développement


I) Introduction

Les modules externes (plugins) sont propres à PhotoFiltre et il n'y a pas pour le moment de
compatibilité directe avec les modules d'autres applications. Ils sont stockés dans le dossier
'Plugins' avec l'extension '.pfl' (PhotoFiltre Library). Ce sont de simples DLL développées en
Delphi mais elles doivent respecter certaines règles au niveau de l'export des fonctions.
A chaque démarrage, PhotoFiltre scanne ce dossier et charge tous les modules reconnus.


II) Les différents types de modules

PhotoFiltre gère plusieurs types de modules. Chaque type est placé dans un menu dédié.

A) Les modules de type Filtre

Ils sont disponibles uniquement en mode 16 millions de couleurs (24 bits) sans transparence
et s'appliquent à la sélection de l'image en cours.

Règles :
- Ils doivent tenir compte de la sélection en cours
- Ne doivent jamais modifier la taille de l'image
- Les fonctions Annuler/Défaire sont disponibles après l'exécution
- Ils sont placés dans le menu Filtre/Autre

Exemples : Réduction yeux rouges, réglages automatiques

B) Les modules de type Image

Ils sont disponibles quelque soit le nombre de couleurs et la transparence et s'appliquent à
l'image entière en cours. Ils sont destinés aux fonctions modifiant la taille de l'image, la transparence
ou le nombre de couleurs.

Règles :
- Les fonctions Annuler/Défaire sont disponibles après l'exécution
- Ils sont placés dans le menu Image/Autre

Exemples : Cadres extérieurs avec texture, insertion de copyright

C) Les modules de type Importation

Ils sont destinés aux fonctions d'importation et sont toujours disponibles (avec ou sans image).

Règles :
- Doivent créer une nouvelle image
- Ne doivent jamais modifier les images en cours (autre que l'image créée)
- Les fonctions Annuler/Défaire ne sont pas disponibles
- Ils sont placés dans le menu Fichier/Importation

Exemples : Importations d'appareil photo numérique, JPEG2000, formats divers

D) Les modules de type Exportation

Ils sont destinés aux fonctions d'exportation de l'image en cours.

Règles :
- Ne doivent jamais modifier les images en cours
- Les fonctions Annuler/Défaire ne sont pas disponibles
- Ils sont placés dans le menu Fichier/Exportation

Exemples : JPEG2000, Format binaire

E) Les modules de type Outil

Ils sont destinés aux fonctions qui ne peuvent pas être classées dans les types ci-dessus.

Règles :
- Ne doivent jamais modifier les images en cours
- Les fonctions Annuler/Défaire ne sont pas disponibles
- Ils sont placés dans le menu Outils/Autre

Exemples : Création d'images, éditeur de sélection, rotation JPEG sans perte, diaporama

III) Options de compilation de la librairie

Toutes les procédure et fonctions possèdent la directive 'stdcall' (standard API).
Les entiers (Integer) sont sur 32 bits. Le type LongBool est un boolean sur 32 bits.
Le passage des chaînes de caractères se fait par pointeur PChar et par buffer..
Les échanges de bitmap se font au format RGB 24 bits (format natif PhotoFiltre).

IV) Les fonctions exportées

function RegisterPluginHeader: PPluginHeader;


Renvoie un pointeur sur l'adresse de la structure d'entête (voir plus bas)

function RegisterPluginLanguage: PPluginLanguage;


Renvoie un pointeur sur l'adresse de la structure de langue (voir plus bas)
Permet au module de récupérer la langue utilisée par PhotoFiltre. Cette fonction est facultative.

function RegisterPluginStruct: PPluginStruct;


Renvoie un pointeur sur l'adresse de la structure d'exécution (voir plus bas)

function RegisterCompatibility: Integer;


Permet de gérer la compatibilité des modules.
Les modules développés en C++, C, ASM et autre que Delphi 6 doivent renvoyer une compatibilité
supérieure ou égale à 2.

function RegisterApplication: PApplication;


Renvoie l'adresse de l'application du module. Elle est facultative si le module n'utilise pas de fiche de
paramétrage. Si un module crée une fiche cette fonction est obligatoire car elle est utilisée en interne.
(les modules en C++, C et ASM doivent gérer eux même cette fonction)

function RegisterPluginGlyph: HBitmap;


Renvoie un handle de bitmap utilisé dans l'affichage de la barre des modules.
Le bitmap doit être de dimensions 19 x19 pixels.

function Execute: Integer;


Fonction principale qui exécute le module. Renvoie 0 en cas d'échec ou d'annulation ou 1 en cas de
réussite. La valeur renvoyée est importante car elle permet d'administrer les fonctions Annuler/Défaire.

procedure SetPointClick(Point: TPoint; Button: Integer);


Pour les modules de type doPreview et doColorPicker (voir ShowForm). Elle est exécutée par PhotoFiltre
à chaque clic sur l'image et permet au module de récupérer la position et le bouton enfoncé.
Point : Position (X, Y) du clic relative au fond

Button : 0 pour le bouton gauche et 1 pour le droit
Version Studio
Pour avoir une position relative au calque il faut utiliser la fonction GetLayerPos


procedure SetColorPicker(Color: TColor);


Pour les modules de type doColorPicker (voir ShowForm). Elle est exécutée par PhotoFiltre à chaque
clic sur l'image et permet au module de récupérer la couleur sous le curseur.

V) Les constantes et les structures d'échange

const
    MaxLongStr = 256;
    MaxShortStr = 64;
    RGBColorCount = 256 * 256 * 256; // 16 millions de couleurs

var
    PluginErrorMsg: string = 'Erreur pendant l''exécution du module !';

type
    PApplication = ^TApplication;

    PPluginHeader = ^TPluginHeader;
    TPluginHeader = packed record
        <liste de champs>

    end;

    PPluginLanguage = ^TPluginLanguage;
    TPluginLanguage = packed record
        <liste de champs>
    end;

    PPlgImage = ^TPlgImage;
    TPlgImage = packed record
        piSize: Integer; // Taille de la structure
        piWidth: Integer; // Largeur en pixels
        piHeight: Integer; // Hauteur en pixels
        piWidthSize: Integer; // Taille X utile en octets (piWidth * piByteCount)
        piScanlineSize: Integer; // Scanline complete en octets (alignement 32 bits)
        piByteCount: Integer; // Nombre d'octets par pixels
        piDataSize: Integer; // Taille totale du buffer (piScanlineSize * piHeight)
        piBuffer: Pointer; // Adresse du buffer de travail
        piBitmap: TBitmap; // Pointeur vers un objet TBitmap
        piHandle: HBitmap; // Handle du bitmap Windows
     end;

    PPluginStruct = ^TPluginStruct;
    TPluginStruct = packed record
        <indicateurs>
        <fonctions>
     end;

     EPluginException = class(Exception);

VI) Les fonctions d'initialisation de l'entête

Elles permettent de décrire le module, son type, son auteur et quelques autres informations
complémentaires. Ces fonctions sont à utiliser dans la fonction RegisterPluginHeader.

procedure SetHeaderAuthor(Author: string);


Nom et copyright de l'auteur. La longueur est tronquée à MaxShortStr.

procedure SetHeaderCaption(Caption: string);


Nom du module. C'est également le titre qui apparaît dans les menus PhotoFiltre.
La longueur est tronquée à 30 caractères.
Le titre peut se terminer par '...' pour indiquer une boîte de paramétrage.

procedure SetHeaderComment(Comment: string);


Commentaire sur 3 lignes maximum (#13 pour les sauts de ligne).
La longueur est tronquée à MaxLongStr.

procedure SetHeaderMenuOptions(Options: TMenuOptions);


type
    TMenuOption = (moRGBColors, moIndexdColors, moTransparent, moNoTransparent,
        moSelected, moNotSelected, moNeedImage, moNeedMoreThanOneImage);
    TMenuOptions = set of TMenuOption;

Permet de désactiver le menu au niveau de PhotoFiltre si certaines conditions ne sont pas respectées :
moRGBColors : l'image en cours doit être en 16 millions de couleurs
moIndexedColors : l'image en cours doit être en mode couleurs indexées
moTransparent : l'image en cours doit être transparente
moNoTransparent : l'image en cours ne doit pas être transparente
moSelected : l'image en cours doit avoir une sélection
moNotSelected : l'image en cours ne doit avoir de sélection
moNeedImage : au moins une image doit être ouverte
moNeedMoreThanOneImage : au moins deux images doivent être ouvertes
moLayered : l'image en cours contient plus d'un calque
moNotLayered : l'image en cours contient un seul calque (fond)
moRGBAColors : l'image en cours doit être en mode RGB avec couche Alpha
moNotRGBAColors : l'image en cours ne doit pas être en mode RGB avec couche Alpha
moImageJpeg : l'image en cours doit être de type JPEG (jpg, jpeg, jpe, jfif)
moImageGif : l'image en cours doit être de type GIF
moImagePng : l'image en cours doit être de type PNG
moImageBmp : l'image en cours doit être de type BMP (bmp ou rle)
moImageTiff : l'image en cours doit être de type TIFF (tif ou tiff)
moImagePfs : l'image en cours doit être de type PFS
moJpegExifData : l'image en cours est de type JPEG avec EXIF

procedure SetHeaderPluginType(PluginType: TPluginType);


type TPluginType = (ptFilter, ptImage, ptFileImport, ptFileExport, ptTool);

Détermine le type du module.

procedure SetHeaderVersion(Version: string);


Version et date du module.
La longueur est tronquée à MaxShortStr.


VII) Les fonctions d'informations sur la langue en cours

Elles permettent de récupérer les informations sur la langue utilisée par PhotoFiltre. Ces fonctions
peuvent être utilisées dans RegisterPluginHeader et Execute afin de préparer la traduction des modules.
Elles sont disponibles uniquement si la fonction RegisterPluginLanguage est exportée.

function GetLanguageCode: string;


Renvoie le code (sur deux caractères) de la langue utilisée par PhotoFiltre.
Exemples : "FR", "EN".

function GetLanguageStr: string;


Renvoie la langue utilisée par PhotoFiltre.
Exemples : "Français", "English".


VIII) Les fonctions d'exécution

Elle permettent de faire communiquer PhotoFiltre avec le module.
Ces fonctions sont à utiliser dans la fonction exportée Execute.


Tout niveau de compatibilité
(voir RegisterCompatibility pour plus d'information)

procedure BeginFilter(Msg: string = ''; ChangeCursor: Boolean = True);


Affiche le message de début de traitement du filtre dans la barre de statut.
si Msg est une chaîne vide c'est le message par défaut qui est utilisé.
ChangeCursor indique si le curseur doit prendre la forme du sablier pendant le traitement.

procedure EndFilter;


Affiche le message de fin de traitement du filtre dans la barre de statut.

function MainHandle: HWND;


Renvoie le handle Windows da la fenêtre principale de PhotoFiltre. A utiliser avec précaution !

function ImageExists: Boolean;


Renvoie vrai si au moins une image est ouverte.

function XP_ThemesEnabled: Boolean;


Renvoie vrai si PhotoFiltre utilise les thèmes Windows XP pour l'affichage.
(Sous Windows XP uniquement)

function GetImgRect: TRect;


Renvoie les dimensions de l'image en cours sous forme d'un rectangle (0, 0, Largeur, Hauteur).
Renvoie un rectangle nul si aucune image.

function GetImgWidth: Integer;


Renvoie la largeur de l'image en cours. Renvoie 0 si aucune image.

function GetImgHeight: Integer;


Renvoie la hauteur de l'image en cours. Renvoie 0 si aucune image.


function IsSelected: Boolean;



Renvoie vrai si une sélection est en cours dans l'image active.

function GetSelRect: TRect;


Renvoie le rectangle de sélection (limites maximum) de l'image en cours.
Equivaut à GetImgRect si aucune sélection.

function GetSelWidth: Integer;


Renvoie la largeur de la sélection en cours. Renvoie 0 si aucune sélection.
Equivaut à GetImgWidth si aucune sélection.

function GetSelHeight: Integer;


Renvoie la hauteur de la sélection en cours. Renvoie 0 si aucune sélection.
Equivaut à GetImgHeight si aucune sélection.

function GetBitmap(Bitmap: TBitmap): Boolean;



Renvoie une copie de l'image en cours.
Le bitmap doit être en 24 bits et de taille identique à l'image en cours.
(voir GetImgRect, GetImgWidth et GetImgHeight pour les dimensions de l'image)
La transparence et le nombre de couleurs ne sont pas gérés, il faut utiliser les fonctions
GetTransparentColor et GetColorCount si nécessaire.
Renvoie vrai en cas de réussite.
Version Studio
Renvoie l'image aplatie si elle contient plusieurs calques.
(fond blanc en cas de transparence ou mode RGBA)

function SetBitmap(Bitmap: TBitmap): Boolean;


Modifie l'image en cours (contenu et taille). Le bitmap doit être au format 24 bits.
La transparence et le nombre de couleurs ne sont pas gérés, il faut utiliser les fonctions
SetTransparentColor et SetColorCount si nécessaire.
Renvoie vrai en cas de réussite.
Version Studio
Agit sur le fond uniquement
Pas de redimensionnement avec DisableLayersPainting
Pas de redimensionnement en mode RGBA

function GetSelBitmap(Bitmap: TBitmap): Boolean;


Renvoie une copie de la partie de l'image sélectionnée.
Le bitmap doit être en 24 bits et de taille identique à la sélection.
(voir GetSelRect, GetSelWidth et GetSelHeight pour les dimensions de la sélection)
La transparence et le nombre de couleurs ne sont pas gérés, il faut utiliser les fonctions
GetTransparentColor et GetColorCount si nécessaire.
Renvoie vrai en cas de réussite.
Version Studio
Action sur le calque en cours (de type image uniquement)

function SetSelBitmap(Bitmap: TBitmap; Option: TSelectionOption = soAuto);


type TSelectionOption = (soAuto, soNone);

Modifie la partie de l'image sélectionnée.
Le bitmap doit être en 24 bits et de taille identique à la sélection.
(voir GetSelRect, GetSelWidth et GetSelHeight pour les dimensions de la sélection)
Applique le masque de sélection en fonction de la valeur de Option :
soAuto : lissage automatique
soNone : aucun lissage (pour dessiner un contour par exemple)
Version Studio
Action sur le calque en cours (de type image uniquement)

function GetSelMask(Bitmap: TBitmap): Boolean;


Renvoie le masque de sélection de l'image en cours.
Le bitmap doit être en 24 bits et de taille identique à l'image en cours.
(voir GetImgRect, GetImgWidth et GetImgHeight pour les dimensions de l'image)
La partie sélectionnée est en blanc et le reste en noir (le lissage du bord est en niveaux de gris).
Renvoie vrai en cas de réussite.
Version Studio
Action sur le calque en cours (de type image uniquement)
Renvoie l'intersection avec le masque du calque

function GetColorCount: Integer;


Renvoie le nombre de couleurs de l'image en cours.
Renvoie -1 si aucune image.
Version Studio
Ne fonctionne pas en mode calque ni en mode RGBA

function SetColorCount(ColorCount: Integer): Integer;


Modifie le nombre de couleurs de l'image en cours.
Aucune vérification quand au format de l'image.
Attention, cette procédure modifie toute l'image en cours. Elle doit être utilisée avec prudence dans
les modules de type Image.
Renvoie le nombre de couleurs de l'image en cas de réussite, 0 en cas d'échec.
Version Studio
Ne fonctionne pas en mode calque ni en mode RGBA

function GetTransparentColor: TColor;


Renvoie la couleur de transparence de l'image en cours.
Renvoie clNone si la transparence de l'image n'est pas disponible.
Version Studio
Ne fonctionne pas en mode calque ni en mode RGBA

function SetTransparentColor(Color: TColor): Boolean;


Permet de modifier la transparence de l'image en cours.
Si Color vaut clNone, la transparence de l'image est annulée, sinon la couleur de transparence est
modifiée et la transparence est activée.
Cette fonction est disponible en mode couleurs indexées uniquement (<= 256 couleurs).
Attention, cette procédure modifie toute l'image en cours. Elle doit être utilisée avec prudence dans
les modules de type Image.
Renvoie vrai en cas de réussite.
Version Studio
Ne fonctionne pas en mode calque ni en mode RGBA

procedure SetAlphaBlend(Alpha: TAlphaRange);


type TAlphaRange = 0..100;

Restaure un pourcentage du Bitmap Undo pour créer un effet de semi-transparence.
Disponible en mode 16 millions de couleurs sans transparence pour les modules de type Filtre.
Renvoie vrai en cas de réussite.
Version Studio
Action sur le calque en cours (de type image uniquement)

function DrawSelBorder(Width: Integer; Color: TColor; Antialias: Boolean): Boolean;


Dessine un contour (sur l'image en cours) ayant la forme de la sélection.
Pas de lissage en mode couleur indexée.
Disponible pour les modules de type Image ou Filtre.
Renvoie vrai en cas de réussite.
Version Studio
Disponible aussi en cas de transparence

procedure RestoreUndoBitmap;


Restaure l'image en cours en utilisant la dernière version Undo.
A utiliser dans les modules de type Filtre avec aperçu.

procedure ResetSaveMenu;


Désactive le menu et bouton d'enregistrement pour simuler un enregistrement réussi.
A utiliser dans les modules de type Exportation.

function GetImgFileName: string;


Renvoie le nom complet de l'image (avec chemin si l'image provient d'un fichier).

function SetImgFileName(FileName: string): Boolean;


Modifie le nom du fichier de l'image en cours.
A utiliser dans les modules de type Exportation.

function EnumImages(EnumImageProc: TEnumImageProc): Boolean;


type TEnumImageProc = function (pFileName: PChar; Width, Height, NbColors: Integer;
    TransColor: TColor): LongBool; stdcall;

Parcourt la liste des images ouvertes dans PhotoFiltre et exécute l'action EnumImageProc avec les
paramètres suivants :
pFileName : nom de l'image (la gestion du buffer est faite par PhotoFiltre)
Width : largeur de l'image
Height : hauteur de l'image
NbColors : nombre de couleurs de l'image
TransColor : couleur de transparence de l'image ou clNone si l'image n'est pas transparente

Doit être utilisée avant GetBitmapByName et GetThumbByName.

function GetBitmapByName(Bitmap: TBitmap; FileName: string): Boolean;


Renvoie une copie au format 24 bits de l'image correspondant au nom de fichier.
Cette image doit être ouverte dans PhotoFiltre.
Le bitmap doit être en 24 bits et de taille identique à l'image (voir la fonction EnumImages).
Renvoie vrai en cas de réussite.
Version Studio
Renvoie l'image aplatie si elle contient plusieurs calques.

function GetImgInfosByName(FileName: string; var ImageInfos: TImageInfos): Boolean;


type
    TImageInfos = record
         FileName: string;
         Width, Height: Integer;
         ColorCount: Integer;
         TransparentColor: TColor;
     end;

Permet de Récupérer les informations sur une image ouverte.
(Voir également EnumImages, GetBitmapByName et GetThumbByName)

function GetThumb(Bitmap: TBitmap; BkColor: TColor; BorderSize, ShadowSize: Integer;
    ShadowBkColor: TColor;  var R: TRect): Boolean;



Renvoie une miniature (vignette) de l'image en cours.
Le bitmap doit être au format 24 bits, ses dimensions ne sont pas modifiées.
La taille de la vignette est calculée en fonction de cette taille tout en conservant les proportions.
BkColor
: couleur du fond (zone non affichée)
BorderSize
: Taille de la marge (comprise entre 1 et 50 pixels)
ShadowSize : Taille de l'ombrage (comprise entre 1 et 10 pixels)
ShadowBkColor : couleur du fond utilisée par l'ombre pour simuler l'opacité
R : récupère la région dans la quelle la vignette est affichée (sans les bords ni l'ombre)
Version Studio
Renvoie une miniature de l'image aplatie si elle contient plusieurs calques.

function GetThumbByName(Bitmap: TBitmap; FileName: string; BkColor: TColor;
    BorderSize, ShadowSize: Integer;  ShadowBkColor: TColor; var R: TRect): Boolean;



Renvoie la miniature de l'image correspondant au nom du fichier.
L'image doit être ouverte dans PhotoFiltre (voir GetThumb et EnumImages)
Version Studio
Renvoie une miniature de l'image aplatie si elle contient plusieurs calques.

procedure NewImage(Bitmap: TBitmap; FileName: string; Option: TImageOption;
    ColorCount: Integer = RVBColorCount; TransColor: TColor = clNone);



type TImageOption = (ioCreate, ioFile);

Crée une nouvelle fenêtre contenant l'image passée en paramètre. Le bitmap doit être au format 24 bits.
Si FileName est une chaîne vide, une valeur par défaut sera affectée (du type 'Sans titre n').
Les valeurs possibles pour Option sont les suivantes :
ioCreate :la source est une image créée ou importée. Les fonctions d'enregistrement sont activées.
ioFile : la source provient d'un fichier. Les fonctions d'enregistrement sont désactivées.
ColorCount : nombre de couleurs de l'image (aucune vérification)
TransColor : Active une couleur de transparence si la valeur est différente de clNone.

procedure ShowForm(Form: TForm; Option: TDialogOption;
    MainFormCenter: Boolean = True;
 CloseWaiting: Boolean = True);


type TDialogOption = (doModal, doPreview, doColorPicker);

Affiche une fiche de paramétrage du module. Il ne faut jamais utiliser directement les méthodes
Show ou ShowModal pour éviter les conflits avec PhotoFiltre.
Les valeurs possibles pour Option sont les suivantes :
doModal : la fenêtre principale et la palette d'outils sont désactivées
(ceci implique tous les menus et tous les boutons)
doPreview et doColorPicker : les boutons de zoom restent actifs pour un aperçu et la fonction exportée
SetPointClick est appelée en cas de clique sur l'image.
doColorPicker : le mode pipette est activé et la fonction exportée SetDialogColor est appelée en
cas de clique sur l'image.
doPreview et doColorPicker sont applicables seulement si une image est ouverte, sinon la valeur
doModal est utilisée par défaut.
MainFormCenter : centre la fiche dans la fenêtre principale.
CloseWaiting : attend que la fiche se ferme avant de rendre la main.

function GetExePath: string;


Renvoie le chemin de localisation du programme PhotoFiltre.

function GetIniFile: string;


Renvoie le nom complet (avec chemin) du fichier d'initialisation.
Permet d'éviter la création d'un nouveau fichier d'initialisation pour le module.

function GetOpenPath: string;


Renvoie le chemin en cours pour l'ouverture d'une image.

function GetPluginPath: string;


Renvoie le chemin de localisation des modules (plugins).

function GetSavePath: string;


Renvoie le chemin en cours pour l'enregistrement d'une image.


Fonctions disponibles uniquement pour une compatibilité supérieure ou égale à 2
(Développement en C, ASM, ..., voir RegisterCompatibility pour plus d'information)

procedure PrepareDialog(Handle: HWND; Option: TDialogOption; MainFormCenter,
     CloseWaiting: Boolean);



Permet de préparer une boîte de dialogue. Voir ShowForm pour plus de détails.


function CreateDBmp(pImg: PPlgImage): Boolean;


Demande à PhotoFiltre de créer un bitmap au format 24 bits. Les champs piWidth et piHeight doivent
être renseignés avant l'appel. les autres champs sont mis à jour par PhotoFiltre.
Renvoie vrai en cas de réussite.


function FreeDBmp(pImg: PPlgImage): Boolean;


Demande à PhotoFiltre de supprimer le bitmap associé à la structure.

Renvoie vrai en cas de réussite.


function ReleaseHandleDBmp(pImg: PPlgImage): Boolean;


Dans certains cas, il est nécessaire de libérer le bitmap associé avant la suppression.

Renvoie vrai en cas de réussite.


function GetScanLineDBmp(pImg: PPlgImage; Row: Integer): Pointer;


Renvoie un pointeur vers une ligne (scanline) du bitmap associé à la structure.
Le champ piBuffer est automatiquement mis à jour avec cette valeur.


Fonctions disponibles uniquement pour une compatibilité supérieure ou égale à 3
(complément pour toutes version de PhotoFiltre, voir RegisterCompatibility)

Fonctions disponibles uniquement pour une compatibilité supérieure ou égale à 3
(voir RegisterCompatibility pour plus d'information)

function GetSelSelMask(Bitmap: TBitmap): Boolean;


Renvoie la partie sélectionné du masque de sélection de l'image en cours au format 24 bits.
Le bitmap doit être en 24 bits et de taille identique à l'image en cours.
(voir GetSelRect, GetSelWidth et GetSelHeight pour les dimensions de la sélection)
La partie sélectionnée est en blanc et le reste en noir (le lissage du bord est en niveaux de gris).
Renvoie vrai en cas de réussite.

Version Studio
Action sur le calque en cours (de type image uniquement)
Renvoie l'intersection avec le masque du calque


function GetImgageDPI: Integer;



Renvoie le nombre de DPI (pixels/pouces) de l'image en cours.
Le résultat est multiplié par 1000 pour éviter les problèmes de virgule flottante.
Renvoie 0 si aucune image.

function SetImageDPI(DPI: Integer): Integer;


Modifie le nombre de DPI (pixels/pouces) de l'image en cours.
La valeur DPI est divisée par 1000 avant l'affectation pour éviter les problèmes de virgule flottante.
Renvoie DPI en cas de réussite, 0 en cas d'échec.


function SetSelMask(Bitmap: TBitmap; Flag: Integer): Boolean;


Modifie la sélection en cours en forçant un mode bitmap (baguette magique). Ce n'est pas le contenu
qui est modifié mais la forme de sélection elle même. Le masque doit être au format 24 bits et de
taille identique au fond. Flag est ignoré pour les versions autres que Studio.

(voir GetImgRect, GetImgWidth et GetImgHeight pour les dimensions de l'image)

Version Studio
Le masque est relatif au fond et doit respecter les dimensions du fond si Flag vaut 0, sinon le masque
est relatif au calque en cours et doit respecter les dimensions du calque.
(voir GetLayerRect, GetLayerWidth et GetLayerHeight pour les dimensions du calque)


function ResetUndoArea(R: TRect): TRect;


Permet au module de modifier la région du undo/redo lorsque le filtre doit débordé (extérieur au contour
de sélection par exemple). Renvoie la région réellement modifiée.


function SetApplicationState(State: TApplicationState): Integer;


Type TApplicationState = (asMinimize, asRestore, asMaximize, asHideForms, asShowForms);

Permet au plugin de modifier l'état de l'application.
asMinimize : Minimise l'application, et masque les palettes d'outils et la fenêtre principale du plugin
asRestore : Restaure l'application, et affiche les palettes d'outils et la fenêtre principale du plugin
asMaximize : Maximise la fenêtre principale de PhotoFiltre
asHideForms : Masque l'application, les palettes d'outils et la fenêtre principale du plugin
asShowForms : Affiche l'application, les palettes d'outils et la fenêtre principale du plugin

function GetSelShape(Points: PPoint): Integer;


Points est un pointeurs vers une liste de points de type Windows.

Si Points vaut nil, la fonction renvoie le code de la forme de la sélection en cours :
- Renvoie < 0 pour les formes prédéfinies
- Renvoie > 0 pour les polygones (correspond au nombre de points composants le polygone)
- Renvoie 0 si aucune sélection en cours ou pour les sélections de type baguette magique

Si Points est différent de nil et si la sélection est de type polygone, la fonction remplit le tableau de
points et renvoie le nombre de points. Le buffer Points doit contenir suffisament de place pour tous les
points. Les coordonnées des points sont relatifs au rectangle de sélection.


Fonctions disponibles uniquement pour une compatibilité supérieure ou égale à 4
(PhotoFiltre Studio uniquement, voir RegisterCompatibility pour plus d'information)

function IsStudioVersion: Boolean;


Renvoie vrai si le plugin est exécuté depuis la version Studio.

function GetLayerRect: TRect;


Renvoie le rectangle de délimitation du calque en cours (de l'image en cours).

function GetLayerWidth: Integer;


Renvoie la largeur du calque en cours (de l'image en cours).

function GetLayerHeight: Integer;


Renvoie la hauteur du calque en cours (de l'image en cours).

function GetLayerPos: TPoint;


Renvoie la position haut/gauche du calque en cours (de l'image en cours).

function GetLayerBitmap(Bitmap: TBitmap): Boolean;


Renvoie une copie du calque en cours (de l'image en cours).
Le bitmap doit être en 24 bits et de taille identique au calque en cours.
(voir GetLayerRect, GetLayerWidth et GetLayerHeight pour les dimensions du calque)
Renvoie vrai en cas de réussite.

function SetLayerBitmap(Bitmap: TBitmap): Boolean;


Modifie le calque en cours (de l'image en cours).
Le bitmap doit être en 24 bits et de taille identique au calque en cours.
(voir GetLayerRect, GetLayerWidth et GetLayerHeight pour les dimensions du calque)
Renvoie vrai en cas de réussite.

function GetLayerAlpha(Bitmap: TBitmap): Boolean;


Renvoie une copie de la couche alpha du calque en cours (de l'image en cours).
Le bitmap doit être en 24 bits et de taille identique au calque en cours.
(voir GetLayerRect, GetLayerWidth et GetLayerHeight pour les dimensions du calque)
Le résultat est un bitmap en niveaux de gris (blanc pour les pixels transparents)
Renvoie vrai en cas de réussite.

function SetLayerAlpha(Bitmap: TBitmap): Boolean;


Modifie la couche alpha du calque en cours (de l'image en cours).
Le bitmap doit être en 24 bits et de taille identique au calque en cours.
Le bitmap doit être en niveaux de gris (blanc pour les pixels transparents)
(voir GetLayerRect, GetLayerWidth et GetLayerHeight pour les dimensions du calque)
Renvoie vrai en cas de réussite.

function GetSelAlpha(Bitmap: TBitmap): Boolean;


Renvoie une copie de la partie sélectionnée de la couche alpha du calque en cours.
Le bitmap doit être en 24 bits et de taille identique à la sélection.
(voir GetSelRect, GetSelWidth et GetSelHeight pour les dimensions de la sélection)
Le résultat est un bitmap en niveaux de gris (blanc pour les pixels transparents)
Renvoie vrai en cas de réussite.

function SetSelAlpha(Bitmap: TBitmap): Boolean;


Modifie la partie sélectionnée de la couche alpha du calque en cours.
Le bitmap doit être en 24 bits et de taille identique à la sélection.
Le bitmap doit être en niveaux de gris (blanc pour les pixels transparents)
(voir GetSelRect, GetSelWidth et GetSelHeight pour les dimensions de la sélection)
Renvoie vrai en cas de réussite.

function DisableLayersPainting(Disable: LongBool): Boolean;


Désactive temporairement l'affichage en mode calque pour optimiser les aperçus temps réel.
Il faut absolument réactiver l'affichage normal en fin d'exécution.

function GetImgageColorMode: TColorMode;


TColorMode = (cmNone, cmIndexed, cmRGB, cmRGBLayered, cmRGBA);

Renvoie le mode couleurs de l'image en cours.
Renvoie cmNone si aucune image.


IX) Conseils

A première vue, le nombre de fonctions peut sembler élevé mais en réalité chaque type de module
nécessite très peu de fonctions.

Par exemple un module de type Filtre se compose de la façon suivante :
    ShowForm (fiche de paramétrage facultatif)
    BeginFilter
    GetSelBitmap
    GetSelBitmap
    <traitement>
    SetSelBitmap
    EndFilter

Les modules de type Importation sont encore plus simple :
    ShowForm (fiche de paramétrage ou Boîte de dialogue)
    BeginFilter
    <ouverture et traitement>
    NewImage
    SetColorCount et SetTransparentColor si nécessaire.

Pour les modules de type Exportation :
    ShowForm (fiche de paramétrage ou Boîte de dialogue)
    BeginFilter
    GetBitmap
    GetColorCount et GetTransparentColor si nécessaire.
    <enregistrement>
    ResetSaveMenu (facultatif pour indiquer que l'image est déjà enregistrée)
    EndFilter

Seuls les modules de type Image sont plus compliqués car le nombre de fonctions peut être plus
important en fonction des traitements à effectuer (changement de format, transparence,
redimensionnement de l'image, ...).

X) Annexes

A) Unités Delphi pour le développement des modules

L'unité 'PlgInt.pas' est l'interface de base pour faire dialoguer PhotoFiltre avec les modules. Elle est
conforme aux API Windows mais est assez lourde à manipuler. Pour cette raison, j'ai implémenté
l'unité 'Plugin.pas' plus orientée Delphi. Elle gère les conversions de type (PChar, Integer, ...) afin de
simplifier l'utilisation des fonctions. Les deux unités doivent être présentes dans vos projets.

B) Autorisation de développement

Le développement des modules de type gratuiciel (freeware) est libre et ne nécessite aucune
autorisation particulière, mais il faut respecter les règles suivantes :
- pas de publicité quelque soit sa forme (bandeau, image, texte, message subliminal, ...)
- un lien vers le site officiel de l'auteur est autorisé (utilisez de préférence la boîte 'A propos')
- le développeur m'informe dans la mesure du possible de ses projets

Par contre, le développement des modules de type commercial (shareware et autres) est interdit
sans autorisation explicite de ma part (Antonio Da Cruz).

 


Copyright Antonio Da Cruz