Warning: Declaration of ElementorPro\Modules\Payments\Classes\Payment_Button::render_button($tag = 'a') should be compatible with Elementor\Widget_Button::render_button(?Elementor\Widget_Base $instance = NULL) in /web/htdocs/www.colorwave.it/home/blog/wp-content/plugins/elementor-pro/modules/payments/classes/payment-button.php on line 534
Costruire le funzioni di Undo/Redo – class AREA_RESTORE – Colowave

class AREA_RESTORE

Analizziamo la dichiarazione della classe

[sourcecode language=”cpp”]

class AFX_EXT_CLASS AREA_RESTORE : public ACTION
{
public:
AREA_RESTORE(void);
~AREA_RESTORE(void);

void *AllocArea(IRECT rect, int pxsize);
UBYTE *GetArea(IRECT *rect,float *angle);
void SetBitmap(Bitmap *img);
void *GetBitmap();
virtual bool Do(class OPERATION_CALL *doc);
virtual DB_OBJECT *New();

USE_FILE
USE_PRIVATE_STRUCT
};
[/sourcecode]

I metodi presenti nella classe sono in parte riscritture delle classi virtuali da ACTION, dalla quale è derivata, ed in parte specifici delle funzioni svolte: sono funzioni riscritte la New(), la Do() e quelle definite nella macro USE_FILE; sono invece specifici della funzione la AllocArea, GetArea, GetBitmap e SetBitmap, il cui significato sarà spiegato di seguito. In questo articolo analizzeremo solo le funzioni AllocArea e GetArea, in quanto utilizzate effettivamente nella SPECTRAL_IMAGE. Le altre due funzioni sono usate in altri contesti, e per ora non ne è necessaria la descrizione.

AllocArea

La funzione alloca un buffer per la memorizzazione di un’area della bitmap. L’area è allocata alle dimensioni definite nel parametro rect, e per dimensioni dei pixel pari a pxsize:

[sourcecode language=”cpp”]
void *AREA_RESTORE::AllocArea(IRECT rect, int pxsize)
{
GETSTR
STR->rect=rect;
STR->buf=(UBYTE *)Malloc(rect.dx*rect.dy*pxsize);
return STR->buf;
}
[/sourcecode]

La funzione è molto semplice: sfrutta la Malloc della classe ACTIONdalla quale deriva per allocare un buffer void di dimensioni sufficienti alla memorizzazione dell’area (la memoria verrà rilasciata automaticamente dal distruttore di ACTION). Viene rimandato un puntatore void alla memoria allocata.

GetArea

[sourcecode language=”cpp”]

UBYTE *AREA_RESTORE::GetArea(IRECT *rect,float *angle)
{
GETSTR
*angle=STR->angle;
*rect=STR->rect;
return STR->buf;
}

[/sourcecode]

La funzione rimanda il buffer dell’area allocata da AllocArea per le azioni successive (ripristino o  inizializzazione, come spiegherò di seguito).

Ora sappiamo che AREA_RESTORE ha il banale compito di allocare la memoria necessaria al salvataggio di un’area, di permetterne l’accesso in modifica attraverso il suo puntatore ed in seguito eliminare il buffer quando non più necessario. Analizzeremo ora il meccanismo nel quale è inserita la classe. A questo scopo analizzeremo il modo in cui viene usata la classe in SPECTRAL_IMAGE.

Pages: 1 2 3 4 5 6 7
%d bloggers like this:
Skip to toolbar