Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



X11 a kreslení pixelů

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: X11 a kreslení pixelů

Autor: frca

11:33:33 14.04.2011

[img]http://img847.imageShack.us/img847/8457/obrazeke.png[/img]

Citovat příspěvek

 

Re: X11 a kreslení pixelů

Autor: frca

11:30:27 14.04.2011

Trochu zajímavější příklad:
[code]// g++ main.cpp -lX11 -o x11example -O3 -Wall
#include
#include
#include
#include

#include // gettimeofday

#include
#include // XSizeHints // http://www.sfr-fresh.com/unix/misc/Tk-804.029.tar.gz/dox/structXSizeHints.html
#include // XA_WM_SIZE_HINTS

typedef struct {
unsigned long flags;
unsigned long functions;
unsigned long decorations;
long inputMode;
unsigned long status;
} Hints;

void undecorate(Display* d, Window w) {
Hints hints;
Atom property;
hints.flags = 2; // Specify that we're changing the window decorations.
hints.decorations = 0; // 0 (false) means that window decorations should go bye-bye.
property = XInternAtom(d,"_MOTIF_WM_HINTS",True);
XChangeProperty(d, w, property, property, 32, PropModeReplace, (unsigned char *)&hints, 5);
}

unsigned long getMsec() {
timeval t;
gettimeofday(&t, NULL);
unsigned long M = 1000;
unsigned long msec=((unsigned long)t.tv_sec)*M+((unsigned long)t.tv_usec)/M;
return msec;
}

void printFps() {
static unsigned long msec0 = getMsec();
unsigned long msec1 = getMsec();
static unsigned long frames = 0;
++frames;
if (msec1 - msec0 >= 1000) {
printf("%f fps\n", float(frames)/float(msec1-msec0)*1000.0f);
frames = 0;
msec0 = msec1;
}
}

#define GAMELOOP 1

int main(void) {
XEvent e;
int width = 1024, height = 768;
/* open connection with the server */
Display* d = XOpenDisplay(NULL);
if (d == NULL) {
fprintf(stderr, "Cannot open display\n");
exit(1);
}
int s = DefaultScreen(d);
/* create window */
Window w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, width, height, 1,
BlackPixel(d, s), WhitePixel(d, s));

XSizeHints* hints;
hints = XAllocSizeHints();
hints->flags = PMinSize|PMaxSize;
hints->min_width = width;
hints->min_height = height;
hints->max_width = width;
hints->max_height = height;
XSetWMSizeHints(d, w, hints, XA_WM_NORMAL_HINTS);

undecorate(d, w);

/* select kind of events we are interested in */
XSelectInput(d, w, ExposureMask | KeyPressMask | KeyReleaseMask);

// register interest in the delete window message // http://linuxsoftware.co.nz/blog/2008/08/12/handling-window-close-in-an-x11-app
Atom wmDeleteMessage = XInternAtom(d, "WM_DELETE_WINDOW", False);
XSetWMProtocols(d, w, &wmDeleteMessage, 1);

GC gc = DefaultGC(d, DefaultScreen(d));

XImage* image = XCreateImage(d, NULL, 24, ZPixmap, 0, NULL, width, height, 32, 0);
image->data = (char *) malloc (image->bytes_per_line * height);
XInitImage(image);

/* map (show) the window */
XMapWindow(d, w);

int frame = 0;
/* event loop */
while (1) {
#if GAMELOOP
while(XPending(d))
#endif
{
XNextEvent(d, &e);
/* draw or redraw the window */
if (e.type == Expose) {
}
if (e.type == KeyPress) {
if (e.xkey.keycode == 9) // exit on Esc
goto close;
}
if (e.type == KeyRelease) {
}
if (e.type == ClientMessage && e.xclient.data.l[0] == wmDeleteMessage) {
goto close;
}
}
#if GAMELOOP
for (int y = 0; y != height; ++y) {
unsigned char* component = (unsigned char*)(image->data+y*image->bytes_per_line);
for (int x = 0; x != width; ++x) {
int xf = x+frame;
*(component++) = xf^y; // B
*(component++) = xf+y; // G
*(component++) = xf&y; // R
component++;
}
}
XPutImage(d,w, gc,image, 0, 0, 0, 0, width, height);
printFps();
#endif
++frame;
}
close:
/* close connection to server */
XCloseDisplay(d);
free(image->data);
return 0;
}[/code]

Zobrazuje to tento horizontálně scrollující obrázek:
[img]http://img847.imageshack.us/img847/8457/obrazeke.png[/img]

Citovat příspěvek

 

Re: X11 a kreslení pixelů

Autor: frca

20:53:14 08.04.2011

Ten náhodný generátor je divný, teď to vidím, dosaďte si tam libovolný jiný ;)

Citovat příspěvek

 

Re: X11 a kreslení pixelů

Autor: frca

20:52:16 08.04.2011

Mezitím jsem přišel na trochu jiný způsob, ale myslím, že je taky dobrý:
[code]
#include
#include
#include
#include
#include
#include

typedef struct {
unsigned long flags;
unsigned long functions;
unsigned long decorations;
long inputMode;
unsigned long status;
} Hints;

int main(void) {
Display *d;
Window w;
XEvent e;
int s,i;
XSizeHints* hints;
XImage* image;
GC gc;
int width = 400;
int height = 300;
/* open connection with the server */
d = XOpenDisplay(NULL);
if (d == NULL) {
fprintf(stderr, "Cannot open display\n");
exit(1);
}
s = DefaultScreen(d);
/* create window */
w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 200, 200, 1,
BlackPixel(d, s), WhitePixel(d, s));

hints = XAllocSizeHints();
hints->flags = PMinSize|PMaxSize;
hints->min_width = width;
hints->min_height = height;
hints->max_width = width;
hints->max_height = height;
XSetWMSizeHints(d, w, hints, XA_WM_NORMAL_HINTS);

/* select kind of events we are interested in */
XSelectInput(d, w, ExposureMask | KeyPressMask);

Atom wmDeleteMessage = XInternAtom(d, "WM_DELETE_WINDOW", False);
XSetWMProtocols(d, w, &wmDeleteMessage, 1);

gc = DefaultGC(d, DefaultScreen(d));

image = XCreateImage(d, NULL, 24, ZPixmap, 0, NULL, width, height, 32, 0);
image->data = (char *) malloc (image->bytes_per_line * height);
XInitImage(image);
/* map (show) the window */
XMapWindow(d, w);
/* event loop */
while (1) {
while(XPending(d)) {
XNextEvent(d, &e);
if (e.type == Expose) {
}
if (e.type == KeyPress) {
}
if (e.type == ClientMessage && e.xclient.data.l[0] == wmDeleteMessage) {
goto close;
}
}
for (i = 0; i != image->bytes_per_line * height; ++i) {
image->data[i] = rand() % 255;
}
XPutImage(d,w, gc,image, 0,0, 0, 0, width, height);
}
close:
XCloseDisplay(d);
free(image->data);
return 0;
}
[/code]

Citovat příspěvek

 

Re: X11 a kreslení pixelů

Autor: dfasdfasdf

19:48:22 08.04.2011

obecne: dostanes objekt okna, graficku kontext, objekt malovaciho obdelniku (rectangle), barvy, pixely a postupne do okna/rectangle malujes barvou postupne pixely.

Citovat příspěvek

 

Re: X11 a kreslení pixelů

Autor: frca

15:30:51 08.04.2011

To byla řečnická otázka. Samozřejmě, že v X11 budu programovat přes xlib. Ale vraťme se k mému problému...

Citovat příspěvek

 

Re: X11 a kreslení pixelů

Autor: asdfasdf

14:03:21 08.04.2011

pod X11, tak jedine prez xlib, coz je knihovna pro pristup k funkcim X window systemu X11.

hledej klicova slova xlib, libx v dokumentech:

http://en.wikipedia.org/wiki/Xlib
http://en.wikipedia.org/wiki/X_Window_System
http://en.wikipedia.org/wiki/X_Window_System_protocols_and_architecture

Citovat příspěvek

 

Re: X11 a kreslení pixelů

Autor: frca

11:38:26 08.04.2011

Proč xlib? Rád bych pochopil, jak se tam řeší výše popsaný problém. Tutoriály jsou sice pěkné, ale přímou odpověď na moji otázku mi nedávají.

A nebo jinak: Jak udělám program, který bude postupně po řádcích vykreslovat pixely náhodných barev? Směřuju to prostě k tomu, že paleta (která je použitá v každém z uvedených tutoriálů) je nepoužitelná, protože by musela mít pow(2,24) barev.

Netrvám za každou cenu na kompletním zdrojáku. Stačilo by zhruba popsat postup a uvést použité funkce.
Díky.

Citovat příspěvek

 

Re: X11 a kreslení pixelů

Autor: dfsgdsfgdsg

10:44:12 08.04.2011

a proc ne OpenGL, SDL, GTK, Qt?
takze musis pouzit xlib, coz je primo X11 knihovna a vyse uvedene jsou postaveny
nad xlib.
ale s vyssimi knihovnami je pohodlnejsi prace nez s xlib.

http://www.x.org/docs/X11/xlib.pdf

http://www.xmission.com/~georgeps/documentation/tutorials/Xlib_Beginner.html

http://tronche.com/gui/x/xlib-tutorial/2nd-program-anatomy.html

http://xopendisplay.hilltopia.ca/2009/Jan/Xlib-tutorial-part-1----Beginnings.html

Citovat příspěvek

 

X11 a kreslení pixelů

Autor: frca

23:09:09 07.04.2011

Jak co nejrychleji vykreslím do okna pole barev (trojic bajtů představujících RGB RGB RGB..., mám ho v paměti, dynamicky se mění) na určitý řádek (přes X11)? Tzn. ne OpenGL, SDL nebo něco takového.

Např. toto: unsigned char pixels[] = {0,0,0, 15,212,94, 64,79,151};

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: