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 Feladata: Kép tárolása, pixelszintű módosítása stb. (Szürkeárnyalatos és RGB) Interface: 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: Feladata: Négy byte-os képek tárolása és modosítása Interface: 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 Feladata: Absztrakt feladatosztály, minden Task-ot ebből kell származtatni. Attribútumok: KPicture* KOutput – kimeneti kép. std::vector
* KInputList – bemeneti képek vektora. A feltöltését magunknak kell megoldanunk. Pl. egy dialógusablakkal stb. Interface: 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. Használata: - Létrehozzuk: MatrixDialog* Dial = new MatrixDialog(5); //(ötször ötös mátrixhoz) - Futtatjuk: Dial->F_Run(); - 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. Használata: - Létrehozzuk: ParamDialog* Dial = new ParamDialog; - Hozzáadjuk a paraméterneveket: Dial->F_AddParam(„peremeter neve”); // annyit, mennyit akarunk - Futtatjuk: Dial->F_Run(); - 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. Használata: - Létrehozzuk: PlistDialog* Dial = new PListDialog; - Futtatjuk: Dial->F_Run(); - Megkapjuk a képek listáját: std::vector 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! :)