From 21b1fd476fb9a3e3bc52097af6ea21fda0e09a46 Mon Sep 17 00:00:00 2001 From: dscho Date: Thu, 27 Apr 2006 01:01:41 +0000 Subject: add rotate and flip example --- examples/.cvsignore | 3 +- examples/Makefile.am | 2 +- examples/pnmshow.c | 2 ++ examples/rotate.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++ examples/rotatetemplate.c | 52 +++++++++++++++++++++++++++ 5 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 examples/rotate.c create mode 100644 examples/rotatetemplate.c (limited to 'examples') 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 #include +#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 +#include +#include + +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 + -- cgit v1.2.1