diff options
author | dscho <dscho> | 2006-04-27 01:01:41 +0000 |
---|---|---|
committer | dscho <dscho> | 2006-04-27 01:01:41 +0000 |
commit | 21b1fd476fb9a3e3bc52097af6ea21fda0e09a46 (patch) | |
tree | 06d57c0a60e2a22655e3ee371154b9201469d394 | |
parent | 6370f25f136d837b66f56080e34e7773e6e020c9 (diff) | |
download | libtdevnc-21b1fd476fb9a3e3bc52097af6ea21fda0e09a46.tar.gz libtdevnc-21b1fd476fb9a3e3bc52097af6ea21fda0e09a46.zip |
add rotate and flip example
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | examples/.cvsignore | 3 | ||||
-rw-r--r-- | examples/Makefile.am | 2 | ||||
-rw-r--r-- | examples/pnmshow.c | 2 | ||||
-rw-r--r-- | examples/rotate.c | 92 | ||||
-rw-r--r-- | examples/rotatetemplate.c | 52 |
6 files changed, 153 insertions, 2 deletions
@@ -1,3 +1,7 @@ +2006-04-27 Johannes E. Schindelin <Johannes.Schindelin@gmx.de> + * examples/{rotate.c, rotatetemplate.c}: add modified pnmshow + which demonstrates fast rotating and flipping. + 2006-04-26 Karl Runge <runge@karlrunge.com> * all Makefile.am: use -I $(top_srcdir) instead of -I .. so VPATH builds will work. diff --git a/examples/.cvsignore b/examples/.cvsignore index 7d110e0..88ce9f4 100644 --- a/examples/.cvsignore +++ b/examples/.cvsignore @@ -14,4 +14,5 @@ colourmaptest regiontest mac filetransfer - +backchannel +rotate diff --git a/examples/Makefile.am b/examples/Makefile.am index 5c14e12..a705fe5 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -18,5 +18,5 @@ noinst_HEADERS=radon.h noinst_PROGRAMS=example pnmshow regiontest pnmshow24 fontsel \ vncev storepasswd colourmaptest simple simple15 $(MAC) \ - $(FILETRANSFER) backchannel $(BLOOPTEST) camera + $(FILETRANSFER) backchannel $(BLOOPTEST) camera rotate diff --git a/examples/pnmshow.c b/examples/pnmshow.c index 9e4a509..6268577 100644 --- a/examples/pnmshow.c +++ b/examples/pnmshow.c @@ -2,11 +2,13 @@ #include <rfb/rfb.h> #include <rfb/keysym.h> +#ifndef HAVE_HANDLEKEY static void HandleKey(rfbBool down,rfbKeySym key,rfbClientPtr cl) { if(down && (key==XK_Escape || key=='q' || key=='Q')) rfbCloseClient(cl); } +#endif int main(int argc,char** argv) { diff --git a/examples/rotate.c b/examples/rotate.c new file mode 100644 index 0000000..66fca80 --- /dev/null +++ b/examples/rotate.c @@ -0,0 +1,92 @@ +#include <stdio.h> +#include <rfb/rfb.h> +#include <rfb/keysym.h> + +static int gcd(int x, int y) +{ + if (x == 0) + return y; + return gcd((y % x), x); +} + +#define CONCAT2(a,b) a##b +#define CONCAT2E(a,b) CONCAT2(a,b) +#define CONCAT3(a,b,c) a##b##c +#define CONCAT3E(a,b,c) CONCAT3(a,b,c) + +#define FUNCNAME rfbRotate +#define FUNC(i, j) (h - 1 - j + i * h) +#define SWAPDIMENSIONS +#define OUT 8 +#include "rotatetemplate.c" +#define OUT 16 +#include "rotatetemplate.c" +#define OUT 32 +#include "rotatetemplate.c" +#undef FUNCNAME +#undef FUNC + +#define FUNCNAME rfbRotateCounterClockwise +#define FUNC(i, j) (j + (w - 1 - i) * h) +#define OUT 8 +#include "rotatetemplate.c" +#define OUT 16 +#include "rotatetemplate.c" +#define OUT 32 +#include "rotatetemplate.c" +#undef FUNCNAME +#undef FUNC +#undef SWAPDIMENSIONS + +#define FUNCNAME rfbFlipHorizontally +#define FUNC(i, j) ((w - 1 - i) + j * w) +#define OUT 8 +#include "rotatetemplate.c" +#define OUT 16 +#include "rotatetemplate.c" +#define OUT 32 +#include "rotatetemplate.c" +#undef FUNCNAME +#undef FUNC + +#define FUNCNAME rfbFlipVertically +#define FUNC(i, j) (i + (h - 1 - j) * w) +#define OUT 8 +#include "rotatetemplate.c" +#define OUT 16 +#include "rotatetemplate.c" +#define OUT 32 +#include "rotatetemplate.c" +#undef FUNCNAME +#undef FUNC + +#define FUNCNAME rfbRotateHundredAndEighty +#define FUNC(i, j) ((w - 1 - i) + (h - 1 - j) * w) +#define OUT 8 +#include "rotatetemplate.c" +#define OUT 16 +#include "rotatetemplate.c" +#define OUT 32 +#include "rotatetemplate.c" +#undef FUNCNAME +#undef FUNC + +static void HandleKey(rfbBool down,rfbKeySym key,rfbClientPtr cl) +{ + if(down) { + if (key==XK_Escape || key=='q' || key=='Q') + rfbCloseClient(cl); + else if (key == 'r') + rfbRotate(cl->screen); + else if (key == 'R') + rfbRotateCounterClockwise(cl->screen); + else if (key == 'f') + rfbFlipHorizontally(cl->screen); + else if (key == 'F') + rfbFlipVertically(cl->screen); + } +} + +#define HAVE_HANDLEKEY +#include "pnmshow.c" + diff --git a/examples/rotatetemplate.c b/examples/rotatetemplate.c new file mode 100644 index 0000000..57dc052 --- /dev/null +++ b/examples/rotatetemplate.c @@ -0,0 +1,52 @@ +#define OUT_T CONCAT3E(uint,OUT,_t) +#define FUNCTION CONCAT2E(FUNCNAME,OUT) + +static void FUNCTION(rfbScreenInfoPtr screen) +{ + OUT_T* buffer = (OUT_T*)screen->frameBuffer; + int i, j, w = screen->width, h = screen->height; + OUT_T* newBuffer = (OUT_T*)malloc(w * h * sizeof(OUT_T)); + + for (j = 0; j < h; j++) + for (i = 0; i < w; i++) + newBuffer[FUNC(i, j)] = buffer[i + j * w]; + + memcpy(buffer, newBuffer, w * h * sizeof(OUT_T)); + free(newBuffer); + +#ifdef SWAPDIMENSIONS + screen->width = h; + screen->paddedWidthInBytes = h * OUT / 8; + screen->height = w; + + { + rfbClientIteratorPtr iterator; + rfbClientPtr cl; + iterator = rfbGetClientIterator(screen); + while ((cl = rfbClientIteratorNext(iterator)) != NULL) + cl->newFBSizePending = 1; + } +#endif + + rfbMarkRectAsModified(screen, 0, 0, screen->width, screen->height); +} + +#if OUT == 32 +void FUNCNAME(rfbScreenInfoPtr screen) { + if (screen->serverFormat.bitsPerPixel == 32) + CONCAT2E(FUNCNAME,32)(screen); + else if (screen->serverFormat.bitsPerPixel == 16) + CONCAT2E(FUNCNAME,16)(screen); + else if (screen->serverFormat.bitsPerPixel == 8) + CONCAT2E(FUNCNAME,8)(screen); + else { + rfbErr("Unsupported pixel depth: %d\n", + screen->serverFormat.bitsPerPixel); + return; + } +} +#endif + +#undef FUNCTION +#undef OUT + |