gtk flood_fill

 ( nzmark | 2005. március 25., péntek - 10:38 )

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

oké, ez az image -s dolog működik a flood_fill szépen lefut. nekem csak 1bajom van ezzel az imagével, hogy eventeket nem kezeli le. míg a drawing area szépen lekezeli az egér gomb lenyomása, felengedése, mozgatása dolgot addig az image ezeket nem kezeli le.
tehát a drawing area -n rajzolok egy kört oda ahova az egérrel kattintok. majd átalakitom image-be és kitöltöm szépen a flood_fillel a gdk_image_get_pixel + put_pixel fügvényekkel ahogy a fent említett program csinálja. szépen működik is a kört kitölti, újrarajzoltatom az image-t gdk_draw_image és kész is van. na de, ha megint rajzolni akarok egy kört, akkor azt megint csak a drawing area-n tudom megtenni, de amit rajzolok egy kört az előzőnek a kitöltése eltűnik, hiszen az csak az image-n létezik a drawing arean nem. hogyan lehet ezeket szinkronba hozni? és miért ilyen bonyolult itt ez a dolog? miért ez a sokféle drawing area, image, pixmap.. kinek jó ez?
vagy a drawing arearól egyből csináljak egy imaget-t és csak az eventek lekezelésére hasznoljam, amúgy mindent az image-n csináljak? na ez most jutott az eszembe.

Sziasztok!

Segítségre lenne szükségem. Egy programot kell írjak amelyik alap primitíveket rajzol: egyenes, kör, ellipszis..., de mindezekez úgy hogy nem szabad használni a beépített függvényeket. Ez megy is szépen, nincs vele gond, hisz megvannak azok az algoritmusok amelyekkel ezeket el lehet készíteni. Viszont most egy komoly akadályba ütköztem, ugyanis ezeket a primitíveket ki is kell tudni tölteni. van egy nagyon frappáns algoritmus a flood_fill, ami ki tudja rekurzívan tölteni. Az a forrás ami nekem megvan egyszerűen getpixel(x,y) -nal lekérdezi az aktuális pixel színét és ez alapján dolgozik tovább. Sajnos nem nagyon tudtam átvinni ezt gtk felületre mert minduntalan akadályokba ütközök. Kezdődött ott a dolog, hogy a drawingarea terüreletn történő kattintás koordinátájáról nem tudom eldönteni, hogy mi a színe, getpixel ugyanis nincs. hasonló függvényt találtam neve: gdk_image_get_pixel() ez működik is, de ahhoz, hogy ezt használni tudjam előbb készíteni kell a drawingarea-ról egy image-t:
image = gdk_drawable_get_image (blabla)
így már hozzáférek a képponthoz és le tudom kérdezni. viszont a flood_fill algoritmus pöttyöket rak le, így minden lerakott pötty után egy gdk_widget_draw -val újrarajzoltatom, majd egy újabb image konvertálás után már be is olvadt az újonnan rajzolt képpont az image-be. mivel a flood_fill rekurzív és áthalad olykor a saját maga által rajzolt részen is, így mindig aktuálisan kell tartani a képpontokat ezért kell újrarajzoltatni.
de ez így borzasztóan lassú.. mindhatnám szánalmasan. sajnos olyan jól dokumentált ez a gtk/gdk, hogy semmi utalást nem találok arra, hogyan lehetne ezt normálisan megcsinálni. aki tud légyszíves segítsen nekem abban, hogyan tudnám használni a flood_fill algoritmust gtk alatt ahol drawingarea-n elkészített rajzok vannak.
flood_fill (eredeti):

void Flood_fill(const int x,const int y,
const int fill_color,const int old_color)
{
if(getpixel(x,y)==old_color)
{
putpixel(x,y,fill_color);

Flood_fill((x+1),y,fill_color,old_color);
Flood_fill((x-1),y,fill_color,old_color);
Flood_fill(x,(y+1),fill_color,old_color);
Flood_fill(x,(y-1),fill_color,old_color);
}
}

A legjobb az lenne, ha valaki megörvendeztetne egy kódrészlettel, amiben X,Y koordinátákon elhelyezkedő képpont színét tudja megvizsgálni, mivel erre egyelőre csak azt találtam, ha a drawingarea-t image-vé konvertálom, majd azon elvégzem az ellenőrzést, de ez így borzalmasan nyakatekert.

1. A GtkDrawingArea->window egy Server side kep (GdkWindow ha minen igaz :-)
2. A server side kepeken a rajzolast a szerver vegzi, azaz a Xserver csinalja a dolgokat (ettol elvileg gyors) es igy nem kell client->server kepmozgatasokat csinalni :-)
3. Viszont, ha nem akarod a server lehetosegeit hasznalni, akkor nem ott kene rajzolnod :-) (Gondolom ezt akarod csinalni...)

Szerintem a dolgot a kovetkezokeppen kene megoldanod...
1. Csinalsz egy client side kepet gdk_image_new
2. itt rajzolgatsz a [b:9e7174f86d]gdk_image_put_pixel[/b:9e7174f86d] es a [b:9e7174f86d]gdk_image_get_pixel[/b:9e7174f86d] fuggvenyekkel, nem esve abba a bunbe, hogy a mar sokszaz eve sokszazszor kelloen optimalizalva megirt kozkodokat hasznalod :-)
3. Ha ugy erzed, hogy meg kell jeleniteni a (felig)kesz mualkotast, akkor ezt a [b:9e7174f86d]gdk_draw_image[/b:9e7174f86d]-val barmikor megteheted

Zsiraf

p.s.: mintha gdk_widget_draw nem is letezne :-)