A keretrendszer A linuxos keretrendszer az eredeti alapján készült (nagyrészt C++-ban), ezért nagyjából azzal azonos funkcionalitásokkal rendelkezik. Fordítás és futtatás A futtatáshoz elengedhetetlen, hogy a gépünkön telepítve legyen a GTK+. A fordításnál pedig linkeljük a glib2.0 és gtk2.0 könyvtárakat. Osztályszerkezet Képosztályok: KPicture Kép tárolása, pixelszintű módosítása stb. (Szürkeárnyalatos és RGB) void F_CreateFromScratch(int width, int height, char color_depth) Létrehoz egy képet a megadott értékek alapján (rendre: szélesség, magasság, színmélység) void F_CreateFromPicture(KPicture* Kpict) Létrehoz egy képet a megadott alapján. bool F_CreateFromFile(char* file_path) Kép létrehozása 'file_path' elérési útvonalú fájlból. Hamis, ha nem megfelelő formátumú a fájl, illetve, ha alfa csatornája is van. int F_GetSizeX() Szélesség lekérdezése. int F_GetSizeY() Magasság lekérdezése. char F_GetColorDepth() Színmélység lekérdezése. int F_GetDataSize() Adatméret lekérdezése ( = szélesség*magasság*színmélység). unsigned char F_GetPixel(int x, int y, char c_comp=0) Színérték lekérdezése x,y helyen illetve a pixel c_comp színkomponense (0 = Piros, 1 = Zöld, 2 = Kék) Ha szürkeárnyalatos a kép, akkor magát a pixelt adja vissza. A színkomponens megadása nem kötelező. void F_SetPixel(int x, int y, char color, char c_comp) Egy adott (x,y) pixel értékének megváltoztatása 'color' értékűre. Ha a kép RGB, akkor csak a színkomponens értékét változtatja meg. Lsd. az előbb.
void F_Delete() Törli a képet, így újra föl lehet használni. void F_SetTo(char value, char c_comp=0) 'Value' értékűre állítja az összes pixel 'c_comp' színkomponensét. Ha szürkeárnyalatos a kép, akkor a pixeleket. KPicture* F_CreateAClone() Egy másolatot készít a képről. bool F_CopyDataTo(KPicture* kdest) Átmásolja a képet 'kdest'-be. Ha nem azonos típusúak, akkor hamisat ad vissza bool F_ColorToGray(KPicture* kdest) Színes képet másol át szürkeárnyalatosba, kdest-nek azonos méretűnek kell lennie. (átlagol) bool F_GrayToColor(KPicture* kdest) Szürkeárnyalatos képet másol színesbe, kdest-nek azonos méretűnek kell lennie. bool F_IsSameType(KPicture* kpict) Igaz, ha kpict szélkessége, magassága és színmélysége ugyanaz. bool F_IsInited() Igaz, ha a kép már incializálódott. void F_LinkToWidget(GtkWidget** Image) Hozzáköti a képet egy GtkImage elemhez. KIntPicture: Négy byte-os képek tárolása és modosítása void F_CreateFromScratch(int SizeX, int SizeY) Létrehoz egy SizeX*SizeY dimenziójú képet. int F_GetPixel(int x, int y) Visszaad egy pixelt void F_SetPixel(int x, int y, int val) Az (x,y) pixel értékét 'val'-ra változtatja. KDoublePicture Hasonló a KintPicture-höz, csak double értékeket használ.
Task osztályok KTaskBase Absztrakt feladatosztály, minden Task-ot ebből kell származtatni. Attribútumok: KPicture* KOutput kimeneti kép. std::vector<kpicture*>* KInputList bemeneti képek vektora. A feltöltését magunknak kell megoldanunk. Pl. egy dialógusablakkal stb. void F_Init(KPicture* Input) = 0 Absztrakt függvény, mit a származtatott osztályban kell megvalósítani. Itt kell(ene) inicializálni a kimenetet. void F_Process(KPicture* Input) = 0 Ugyancsak absztrakt függvény. Itt történik a bemenő adat(ok) feldolgozása. void F_RunDialog() Csak azokban az osztályban kell újraírni, ahol dialógusablakot szeretnék használni az adatbevitelhez. void F_Finalize() Létrehoz egy új ablakot és hozzáköti a KOutput-t. Új algoritmus beillesztése: Örököltetünk egy osztályt a KtaskBase-ből (IDE függő) Be kell illesztenünk a Task-ot a TaskList-be: a main.cc-ben: 1. Az INCLUDES sekcióhoz hozzáadunk egy #include task_header.h sort. 2. A CREATE TASKS részben létrehozunk belőle egy példányt. 3. A REGISTER TASKS résznél pedig regisztráljuk az algoritmusunkat a Kwindow::MainMenu->F_RegisterTask(...) függvénnyel, első paraméter a Task, a második a neve, haramdikat csak akkor kell megadni, ha dialógus ablakot akarunk használni, akkor oda azt írjuk, hogy DIALOG_TASK
A Task-unkhoz tartozó.cc fájlnak nagyjából így kell kinéznie: #include "EnTaskom.h" EnTaskom::KSampleTask1() : KTaskBase() { // TODO: put constructor code here EnTaskom::~KSampleTask1() { // TODO: put destructor code here void EnTaskom::F_Init(KPicture* Input) { KOutput = new KPicture; KOutput->F_CreateFromScratch(Input->F_GetSizeX(), Input->F_GetSizeY(), Input->F_GetColorDepth()); void EnTaskom::F_Proces(KPicture* Input) { //... valamilyen feldolgozó rész Saját dialógusablakkal rendelkező alkalmazás készítése A keretrendszer három előre élkészített dialógustablakot tartalmaz: 1. MatrixDialog egy előre megadott méretű mátrixot tudunk vele bekérni. - Létrehozzuk: MatrixDialog* Dial = new MatrixDialog(5); //(ötször ötös mátrixhoz) - Lekérjük a mátrixot: double** matrix = Dial->F_GetParams(); 2. ParamDialog segítségével nevesített paramétereket kérhetünk a felhasználótól. - Létrehozzuk: ParamDialog* Dial = new ParamDialog; - Hozzáadjuk a paraméterneveket: Dial->F_AddParam( peremeter neve ); // annyit, mennyit akarunk - Megszerezzük a paraméterlistát: std::vector<double> lista = Dial->F_GetParamas(); // a hozzáadás sorrendjében kapjuk vissza az értékeket. 3. PListDialog a megnyitott képeket tehetjük be egy listába. - Létrehozzuk: PlistDialog* Dial = new PListDialog; - Megkapjuk a képek listáját: std::vector<kpicture*> lista = Dial->F_GetParamas();
Fontos tudnunk, hogy mikor elindítunk egy task-ot a menüből, akkor először az F_RunDialog() függvénye fog lefutni, tehát amikor a dialógusablakot létrehozzuk még nem tudunk semmit a bemeneti képről! Végül aki szeretne másféle dialógusablakot használni, annak ajánlom figyelmébe a www.gtk.org/api -n található API referenciát! :)