dslinux/user/pixil/packages/dvdview/dvdview/libvideogfx/libvideogfx/nanox Makefile.am Makefile.in dispimg.cc dispimg.hh imgwin.cc imgwin.hh sem.c sem.h server.cc server.hh

amadeus dslinux_amadeus at user.in-berlin.de
Tue Oct 3 13:25:43 CEST 2006


Update of /cvsroot/dslinux/dslinux/user/pixil/packages/dvdview/dvdview/libvideogfx/libvideogfx/nanox
In directory antilope:/tmp/cvs-serv11916/packages/dvdview/dvdview/libvideogfx/libvideogfx/nanox

Added Files:
	Makefile.am Makefile.in dispimg.cc dispimg.hh imgwin.cc 
	imgwin.hh sem.c sem.h server.cc server.hh 
Log Message:
adding pristine copy of pixil to HEAD so I can branch from it

--- NEW FILE: Makefile.in ---
# Makefile.in generated automatically by automake 1.4 from Makefile.am

# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.


SHELL = @SHELL@

srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@

bindir = @bindir@
sbindir = @sbindir@
libexecdir = @libexecdir@
datadir = @datadir@
sysconfdir = @sysconfdir@
sharedstatedir = @sharedstatedir@
localstatedir = @localstatedir@
libdir = @libdir@
infodir = @infodir@
mandir = @mandir@
includedir = @includedir@
oldincludedir = /usr/include

DESTDIR =

pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@

top_builddir = ../..

ACLOCAL = @ACLOCAL@
AUTOCONF = @AUTOCONF@
AUTOMAKE = @AUTOMAKE@
AUTOHEADER = @AUTOHEADER@

INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
INSTALL_DATA = @INSTALL_DATA@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
transform = @program_transform_name@

NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_alias = @build_alias@
build_triplet = @build@
host_alias = @host_alias@
host_triplet = @host@
target_alias = @target_alias@
target_triplet = @target@
AS = @AS@
CC = @CC@
CXX = @CXX@
DLLTOOL = @DLLTOOL@
LIBTOOL = @LIBTOOL@
LIBVIDEOGFX_BINARY_AGE = @LIBVIDEOGFX_BINARY_AGE@
LIBVIDEOGFX_INTERFACE_AGE = @LIBVIDEOGFX_INTERFACE_AGE@
LIBVIDEOGFX_MAJOR_VERSION = @LIBVIDEOGFX_MAJOR_VERSION@
LIBVIDEOGFX_MICRO_VERSION = @LIBVIDEOGFX_MICRO_VERSION@
LIBVIDEOGFX_MINOR_VERSION = @LIBVIDEOGFX_MINOR_VERSION@
LIBVIDEOGFX_VERSION = @LIBVIDEOGFX_VERSION@
LN_S = @LN_S@
LT_AGE = @LT_AGE@
LT_CURRENT = @LT_CURRENT@
LT_RELEASE = @LT_RELEASE@
LT_REVISION = @LT_REVISION@
MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
OBJDUMP = @OBJDUMP@
PACKAGE = @PACKAGE@
RANLIB = @RANLIB@
VERSION = @VERSION@
X_LDFLAGS = @X_LDFLAGS@

noinst_LTLIBRARIES = libvideogfx-x11.la

libvideogfx_x11_la_SOURCES =  	dispimg.cc		dispimg.hh		imgwin.cc		imgwin.hh		server.cc		server.hh


INCLUDES =  	-I$(top_srcdir)

mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = ../../config.h
CONFIG_CLEAN_FILES = 
LTLIBRARIES =  $(noinst_LTLIBRARIES)


DEFS = @DEFS@ -I. -I$(srcdir) -I../..
CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
X_CFLAGS = @X_CFLAGS@
X_LIBS = @X_LIBS@
X_EXTRA_LIBS = @X_EXTRA_LIBS@
X_PRE_LIBS = @X_PRE_LIBS@
libvideogfx_x11_la_LDFLAGS = 
libvideogfx_x11_la_LIBADD = 
libvideogfx_x11_la_OBJECTS =  dispimg.lo imgwin.lo server.lo
CXXFLAGS = @CXXFLAGS@
CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
CXXLD = $(CXX)
CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
DIST_COMMON =  Makefile.am Makefile.in


DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)

TAR = gtar
GZIP_ENV = --best
DEP_FILES =  .deps/dispimg.P .deps/imgwin.P .deps/server.P
SOURCES = $(libvideogfx_x11_la_SOURCES)
OBJECTS = $(libvideogfx_x11_la_OBJECTS)

all: all-redirect
.SUFFIXES:
.SUFFIXES: .S .c .cc .lo .o .s
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
	cd $(top_srcdir) && $(AUTOMAKE) --gnu libvideogfx/x11/Makefile

Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
	cd $(top_builddir) \
	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status


mostlyclean-noinstLTLIBRARIES:

clean-noinstLTLIBRARIES:
	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)

distclean-noinstLTLIBRARIES:

maintainer-clean-noinstLTLIBRARIES:

.s.o:
	$(COMPILE) -c $<

.S.o:
	$(COMPILE) -c $<

mostlyclean-compile:
	-rm -f *.o core *.core

clean-compile:

distclean-compile:
	-rm -f *.tab.c

maintainer-clean-compile:

.s.lo:
	$(LIBTOOL) --mode=compile $(COMPILE) -c $<

.S.lo:
	$(LIBTOOL) --mode=compile $(COMPILE) -c $<

mostlyclean-libtool:
	-rm -f *.lo

clean-libtool:
	-rm -rf .libs _libs

distclean-libtool:

maintainer-clean-libtool:

libvideogfx-x11.la: $(libvideogfx_x11_la_OBJECTS) $(libvideogfx_x11_la_DEPENDENCIES)
	$(CXXLINK)  $(libvideogfx_x11_la_LDFLAGS) $(libvideogfx_x11_la_OBJECTS) $(libvideogfx_x11_la_LIBADD) $(LIBS)
.cc.o:
	$(CXXCOMPILE) -c $<
.cc.lo:
	$(LTCXXCOMPILE) -c $<

tags: TAGS

ID: $(HEADERS) $(SOURCES) $(LISP)
	list='$(SOURCES) $(HEADERS)'; \
	unique=`for i in $$list; do echo $$i; done | \
	  awk '    { files[$$0] = 1; } \
	       END { for (i in files) print i; }'`; \
	here=`pwd` && cd $(srcdir) \
	  && mkid -f$$here/ID $$unique $(LISP)

TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
	tags=; \
	here=`pwd`; \
	list='$(SOURCES) $(HEADERS)'; \
	unique=`for i in $$list; do echo $$i; done | \
	  awk '    { files[$$0] = 1; } \
	       END { for (i in files) print i; }'`; \
	test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)

mostlyclean-tags:

clean-tags:

distclean-tags:
	-rm -f TAGS ID

maintainer-clean-tags:

distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)

subdir = libvideogfx/x11

distdir: $(DISTFILES)
	here=`cd $(top_builddir) && pwd`; \
	top_distdir=`cd $(top_distdir) && pwd`; \
	distdir=`cd $(distdir) && pwd`; \
	cd $(top_srcdir) \
	  && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu libvideogfx/x11/Makefile
	@for file in $(DISTFILES); do \
	  d=$(srcdir); \
	  if test -d $$d/$$file; then \
	    cp -pr $$d/$$file $(distdir)/$$file; \
	  else \
	    test -f $(distdir)/$$file \
	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
	    || cp -p $$d/$$file $(distdir)/$$file || :; \
	  fi; \
	done

DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)

-include $(DEP_FILES)

mostlyclean-depend:

clean-depend:

distclean-depend:
	-rm -rf .deps

maintainer-clean-depend:

%.o: %.c
	@echo '$(COMPILE) -c $<'; \
	$(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
	@-cp .deps/$(*F).pp .deps/$(*F).P; \
	tr ' ' '\012' < .deps/$(*F).pp \
	  | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
	    >> .deps/$(*F).P; \
	rm .deps/$(*F).pp

%.lo: %.c
	@echo '$(LTCOMPILE) -c $<'; \
	$(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
	@-sed -e 's/^\([^:]*\)\.o[ 	]*:/\1.lo \1.o :/' \
	  < .deps/$(*F).pp > .deps/$(*F).P; \
	tr ' ' '\012' < .deps/$(*F).pp \
	  | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
	    >> .deps/$(*F).P; \
	rm -f .deps/$(*F).pp

%.o: %.cc
	@echo '$(CXXCOMPILE) -c $<'; \
	$(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
	@-cp .deps/$(*F).pp .deps/$(*F).P; \
	tr ' ' '\012' < .deps/$(*F).pp \
	  | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
	    >> .deps/$(*F).P; \
	rm .deps/$(*F).pp

%.lo: %.cc
	@echo '$(LTCXXCOMPILE) -c $<'; \
	$(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
	@-sed -e 's/^\([^:]*\)\.o[ 	]*:/\1.lo \1.o :/' \
	  < .deps/$(*F).pp > .deps/$(*F).P; \
	tr ' ' '\012' < .deps/$(*F).pp \
	  | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
	    >> .deps/$(*F).P; \
	rm -f .deps/$(*F).pp
info-am:
info: info-am
dvi-am:
dvi: dvi-am
check-am: all-am
check: check-am
installcheck-am:
installcheck: installcheck-am
install-exec-am:
install-exec: install-exec-am

install-data-am:
install-data: install-data-am

install-am: all-am
	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
install: install-am
uninstall-am:
uninstall: uninstall-am
all-am: Makefile $(LTLIBRARIES)
all-redirect: all-am
install-strip:
	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
installdirs:


mostlyclean-generic:

clean-generic:

distclean-generic:
	-rm -f Makefile $(CONFIG_CLEAN_FILES)
	-rm -f config.cache config.log stamp-h stamp-h[0-9]*

maintainer-clean-generic:
mostlyclean-am:  mostlyclean-noinstLTLIBRARIES mostlyclean-compile \
		mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
		mostlyclean-generic

mostlyclean: mostlyclean-am

clean-am:  clean-noinstLTLIBRARIES clean-compile clean-libtool \
		clean-tags clean-depend clean-generic mostlyclean-am

clean: clean-am

distclean-am:  distclean-noinstLTLIBRARIES distclean-compile \
		distclean-libtool distclean-tags distclean-depend \
		distclean-generic clean-am
	-rm -f libtool

distclean: distclean-am

maintainer-clean-am:  maintainer-clean-noinstLTLIBRARIES \
		maintainer-clean-compile maintainer-clean-libtool \
		maintainer-clean-tags maintainer-clean-depend \
		maintainer-clean-generic distclean-am
	@echo "This command is intended for maintainers to use;"
	@echo "it deletes files that may require special tools to rebuild."

maintainer-clean: maintainer-clean-am

.PHONY: mostlyclean-noinstLTLIBRARIES distclean-noinstLTLIBRARIES \
clean-noinstLTLIBRARIES maintainer-clean-noinstLTLIBRARIES \
mostlyclean-compile distclean-compile clean-compile \
maintainer-clean-compile mostlyclean-libtool distclean-libtool \
clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
distclean-tags clean-tags maintainer-clean-tags distdir \
mostlyclean-depend distclean-depend clean-depend \
maintainer-clean-depend info-am info dvi-am dvi check check-am \
installcheck-am installcheck install-exec-am install-exec \
install-data-am install-data install-am install uninstall-am uninstall \
all-redirect all-am all installdirs mostlyclean-generic \
distclean-generic clean-generic maintainer-clean-generic clean \
mostlyclean distclean maintainer-clean


.PHONY: files

files:
	@files=`ls $(DISTFILES) 2> /dev/null`; for p in $$files; do \
	  echo $$p; \
	done

# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

--- NEW FILE: sem.h ---
/* sem.h*/

#define MWSEM_OK	0
#define MWSEM_ERR	(-1)
#define MWSEM_TIMEDOUT	1	/* time out while waiting on semaphore*/
#define MWSEM_MAXWAIT	(~0)	/* timeout value to never time out*/

typedef int	MWSEMAPHORE;		/* Sys V IPC semaphore ID*/

#define GetServerSemaphore()	GdCreateSemaphore(1,1,1)
#define GetClientSemaphore()	GdCreateSemaphore(1,0,0)
#define LockRegion(id)		GdSemWait(id)
#define UnlockRegion(id)	GdSemPost(id)

MWSEMAPHORE	GdCreateSemaphore(int public, int create, int initial_value);
void		GdDestroySemaphore(MWSEMAPHORE id);
int		GdSemTryWait(MWSEMAPHORE id);
int		GdSemWait(MWSEMAPHORE id);
int		GdSemWaitTimeout(MWSEMAPHORE id, unsigned int timeout);
int		GdSemValue(MWSEMAPHORE id);
int		GdSemPost(MWSEMAPHORE id);

--- NEW FILE: Makefile.am ---
## Makefile.am for libvideogfx/libvideogfx/x11

noinst_LTLIBRARIES = libvideogfx-x11.la

libvideogfx_x11_la_SOURCES = \
	dispimg.cc	\
	dispimg.hh	\
	imgwin.cc	\
	imgwin.hh	\
	server.cc	\
	server.hh

INCLUDES = \
	-I$(top_srcdir)

.PHONY: files

files:
	@files=`ls $(DISTFILES) 2> /dev/null`; for p in $$files; do \
	  echo $$p; \
	done

--- NEW FILE: server.hh ---
/*********************************************************************
  libvideogfx/x11/server.hh

  purpose:

  notes:

  to do:

  author(s):
   - Dirk Farin, farin at ti.uni-mannheim.de

  modifications:
 *********************************************************************/

#ifndef LIBVIDEOGFX_X11_SERVER_HH
#define LIBVIDEOGFX_X11_SERVER_HH

#include <nano-X.h>

class X11Server
{
public:
  virtual ~X11Server() { }

  virtual int AskDisplay() const = 0;
};

extern const X11Server& default_x11server;

#endif

--- NEW FILE: dispimg.cc ---
/* Output routines for Microwindows*/
/* Copyright (c) 2001 by Greg Haerr <greg at censoft.com>*/
#include "config.h"

#include <time.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>

#include <iostream.h>
#include <iomanip.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <nano-X.h>

#include "libvideogfx/types.hh"
#include "server.hh"
#include "dispimg.hh"

extern bool fullscreen;

struct DisplayImage_Data {
  DisplayImage_Data()
    : mayUseMITSHM(true),
      d_initialized(false),
      d_data(NULL)
    {
    }

  ~DisplayImage_Data()
    {
      if (d_initialized)
	{
	      d_ximg->data = NULL;
	      if (d_data) delete[] d_data;
	      GrDestroyGC(d_gc);
	}
    }

  // user parameters

  bool mayUseMITSHM;

  // internal parameters

  bool        d_initialized;
  bool        d_UseShmExt;

  GR_WINDOW_ID   d_win;
  GR_GC_ID       d_gc;

  XImage*  d_ximg;
  uint8*   d_data;
  bool     d_WaitForCompletion;
  int      d_CompletionType;
  int	   d_width,d_height;
};

#define MWPORTRAIT_GRAREA	8	/* no framebuffer, use GrArea instead*/

/* common blitter parameter structure*/
typedef struct {
	void *		dstaddr;	/* dst drawable*/
	MWCOORD		dstx, dsty;	/* dst x,y*/
	MWCOORD		dstw, dsth;	/* dst w,h*/
	int		dstbpp;		/* dst bits per pixel*/
	int		dstbytespp;	/* dst bytes per pixel*/
	int		dstpitch;	/* dst bytes per scanline*/
	int		dstxres, dstyres;/* dst total size, for portrait flipping*/

	void *		srcaddr;	/* src drawable*/
	MWCOORD		srcx, srcy;	/* src x,y*/
	MWCOORD		srcw, srch;	/* src w,h if stretchblit*/
	int		srcbpp;		/* src bits per pixel*/
	int		srcbytespp;	/* src bytes per pixel*/
	int		srcpitch;	/* src bytes per scanline*/

	unsigned long 	rop;		/* raster opcode*/

	GR_WINDOW_ID	wid;		/* window id for GrArea*/
	GR_GC_ID	gc;		/* graphics context for GrArea*/

	//void *		alphachan;	/* alpha chan for MWROP_BLENDCHANNEL*/
	//MWPIXELVAL	fgcolor;	/* fg/bg color for MWROP_BLENDFGBG*/
	//MWPIXELVAL	bgcolor;
	//MWPIXELVAL	transcolor;	/* trans color for MWROP_SRCTRANSCOPY*/
} BLITARGS, *PBLITARGS;

#define SRCX	args->srcx
#define SRCY	args->srcy
#define SRCH	args->srch
#define SRCW	args->srcw
#define DSTX	args->dstx
#define DSTY	args->dsty
#define DSTH	args->dsth
#define DSTW	args->dstw
#define SPITCH	args->srcpitch
#define DPITCH	args->dstpitch
#define DSTXRES	args->dstxres
#define DSTYRES	args->dstyres
#define BYTESPP	args->dstbytespp		/* must be same as srcbpp*/

/*
 * These conversion blits are a major pain.
 * Mess with them at your own risk ;-)
 */
static void
ConvBlit16(PBLITARGS args)
{
	unsigned short *ilineptr;
	unsigned short *olineptr;
	unsigned int x, y;

	if (args->rop == MWPORTRAIT_RIGHT) {
		/* right portrait mode conversion*/
		unsigned int linerem = SPITCH/2 - SRCW;
		ilineptr = (unsigned short *)(((char *)args->srcaddr) +
			SRCY*SPITCH + SRCX*BYTESPP);
		olineptr = (unsigned short *)args->dstaddr;
		for (y=0; y<DSTH; ++y) {
			unsigned int ox =
				(DSTH-1-y + DSTXRES-DSTH - (DSTY+SRCY)) * BYTESPP;
			for (x=0; x<DSTW; ++x) {
				unsigned int oy = (x + DSTX + SRCX) * DPITCH;
				olineptr[(oy + ox)/2] = *ilineptr++;
			}
			ilineptr += linerem;
		}
	} 
	else if (args->rop == MWPORTRAIT_LEFT) {
		/* left portrait mode conversion*/
		unsigned int linerem = SPITCH/2 - SRCW;
		ilineptr = (unsigned short *)((char *)args->srcaddr + SRCY*SPITCH + SRCX*BYTESPP);
		olineptr = (unsigned short *)args->dstaddr;
		for (y=0; y<DSTH; ++y) {
			unsigned int ox = (y + DSTY + SRCY) * BYTESPP;
			for (x=0; x<DSTW; ++x) {
				unsigned int oy =
				    (DSTW-1-x + DSTYRES-DSTW - (DSTX+SRCX)) * DPITCH;
				olineptr[(oy + ox)/2] = *ilineptr++;
			}
			ilineptr += linerem;
		}
	}
	else if (args->rop == MWPORTRAIT_NONE) {
		/* straight blit, no conversion*/
		unsigned int srclinerem = SPITCH/2;
		unsigned int dstlinerem = DPITCH/2;
		unsigned int srcoffset = SRCY*SPITCH + SRCX*BYTESPP;
		unsigned int dstoffset = DSTY*DPITCH + DSTX*BYTESPP;
		ilineptr = (unsigned short *)((char *)args->srcaddr + srcoffset);
		olineptr = (unsigned short *)((char *)args->dstaddr + dstoffset);
		for (y=0; y<DSTH; ++y) {
			memcpy(olineptr, ilineptr, DSTW<<1);
			olineptr += dstlinerem;
			ilineptr += srclinerem;
		}
	}
	else {
		unsigned char *buf;

		/* check pitch/bytespp same, no malloc*/
		if (SRCY || SRCX || (SPITCH != DPITCH)) {
			/* straight blit, convert pitch, don't draw on framebuffer*/
			unsigned int linerem = SPITCH/2;
			unsigned int srcoffset = SRCY*SPITCH + SRCX*BYTESPP;
			ilineptr = (unsigned short *)((char *)args->srcaddr + srcoffset);
			buf = (unsigned char *)malloc(DSTW * DSTH * 2);
			olineptr = (unsigned short *)buf;
			for (y=0; y<DSTH; ++y) {
				memcpy(olineptr, ilineptr, DSTW<<1);
				olineptr += DSTW;
				ilineptr += linerem;
			}
		} else buf = (unsigned char *)args->srcaddr;

		GrArea(args->wid, args->gc, DSTX, DSTY, DSTW, DSTH, buf, MWPF_TRUECOLOR565);
		GrFlush();

		if (buf != args->srcaddr)
			free(buf);
	}
}

#if LATER
static void
ConvBlit24(PBLITARGS args)
{
	unsigned long *ilineptr;
	unsigned long *olineptr;
	unsigned int x, y;

	if (args->rop == MWPORTRAIT_RIGHT) {
		/* right portrait mode conversion*/
		unsigned int linerem = SPITCH - SRCW*3;
		ilineptr = (unsigned long *)(((char *)args->srcaddr) +
			SRCY*SPITCH + SRCX*BYTESPP);
		olineptr = (unsigned long *)args->dstaddr;
		for (y=0; y<DSTH; ++y) {
			unsigned int ox =
				(DSTH-1-y + DSTXRES-DSTH - (DSTY+SRCY)) * BYTESPP;
			for (x=0; x<DSTW; ++x) {
				unsigned int oy = (x + DSTX + SRCX) * DPITCH;
				olineptr[(oy + ox)] = *ilineptr++;
				olineptr[(oy + ox + 1)] = *ilineptr++;
				olineptr[(oy + ox + 2)] = *ilineptr++;
			}
			ilineptr += linerem;
		}
	} 
	else if (args->rop == MWPORTRAIT_LEFT) {
		/* left portrait mode conversion*/
		unsigned int linerem = SPITCH - SRCW*3;
		ilineptr = (unsigned long *)((char *)args->srcaddr + SRCY*SPITCH + SRCX*BYTESPP);
		olineptr = (unsigned long *)args->dstaddr;
		for (y=0; y<DSTH; ++y) {
			unsigned int ox = (y + DSTY + SRCY) * BYTESPP;
			for (x=0; x<DSTW; ++x) {
				unsigned int oy =
				    (DSTW-1-x + DSTYRES-DSTW - (DSTX+SRCX)) * DPITCH;
				olineptr[(oy + ox)] = *ilineptr++;
				olineptr[(oy + ox + 1)] = *ilineptr++;
				olineptr[(oy + ox + 2)] = *ilineptr++;
			}
			ilineptr += linerem;
		}
	}
	else if (args->rop == MWPORTRAIT_NONE) {
		/* straight blit, no conversion*/
		unsigned int srclinerem = SPITCH;
		unsigned int dstlinerem = DPITCH;
		unsigned int srcoffset = SRCY*SPITCH + SRCX*BYTESPP;
		unsigned int dstoffset = DSTY*DPITCH + DSTX*BYTESPP;
		ilineptr = (unsigned long *)((char *)args->srcaddr + srcoffset);
		olineptr = (unsigned long *)((char *)args->dstaddr + dstoffset);
		for (y=0; y<DSTH; ++y) {
			memcpy(olineptr, ilineptr, DSTW*3);
			olineptr += dstlinerem;
			ilineptr += srclinerem;
		}
	}
	else {
		unsigned char *buf;

		/* check pitch/bytespp same, no malloc*/
		if (SRCY || SRCX || (SPITCH != DPITCH)) {
			/* straight blit, convert pitch, don't draw on framebuffer*/
			unsigned int linerem = SPITCH;
			unsigned int dstw3 = DSTW*3;
			unsigned int srcoffset = SRCY*SPITCH + SRCX*BYTESPP;
			ilineptr = (unsigned long *)((char *)args->srcaddr + srcoffset);
			buf = (unsigned char *)malloc(DSTW * DSTH * 3);
			olineptr = (unsigned long *)buf;
			for (y=0; y<DSTH; ++y) {
				memcpy(olineptr, ilineptr, dstw3);
				olineptr += dstw3;
				ilineptr += linerem;
			}
		} else buf = (unsigned char *)args->srcaddr;

		GrArea(args->wid, args->gc, DSTX, DSTY, DSTW, DSTH, buf, MWPF_TRUECOLOR888);
		GrFlush();

		if (buf != args->srcaddr)
			free(buf);
	}
}
#endif /* LATER*/

static void
ConvBlit32(PBLITARGS args)
{
	unsigned long *ilineptr;
	unsigned long *olineptr;
	unsigned int x, y;

	if (args->rop == MWPORTRAIT_RIGHT) {
		/* right portrait mode conversion*/
		unsigned int linerem = SPITCH/4 - SRCW;
		ilineptr = (unsigned long *)(((char *)args->srcaddr) +
			SRCY*SPITCH + SRCX*BYTESPP);
		olineptr = (unsigned long *)args->dstaddr;
		for (y=0; y<DSTH; ++y) {
			unsigned int ox =
				(DSTH-1-y + DSTXRES-DSTH - (DSTY+SRCY)) * BYTESPP;
			for (x=0; x<DSTW; ++x) {
				unsigned int oy = (x + DSTX + SRCX) * DPITCH;
				olineptr[(oy + ox)/4] = *ilineptr++;
			}
			ilineptr += linerem;
		}
	} 
	else if (args->rop == MWPORTRAIT_LEFT) {
		/* left portrait mode conversion*/
		unsigned int linerem = SPITCH/4 - SRCW;
		ilineptr = (unsigned long *)((char *)args->srcaddr + SRCY*SPITCH + SRCX*BYTESPP);
		olineptr = (unsigned long *)args->dstaddr;
		for (y=0; y<DSTH; ++y) {
			unsigned int ox = (y + DSTY + SRCY) * BYTESPP;
			for (x=0; x<DSTW; ++x) {
				unsigned int oy =
				    (DSTW-1-x + DSTYRES-DSTW - (DSTX+SRCX)) * DPITCH;
				olineptr[(oy + ox)/4] = *ilineptr++;
			}
			ilineptr += linerem;
		}
	}
	else if (args->rop == MWPORTRAIT_NONE) {
		/* straight blit, no conversion*/
		unsigned int srclinerem = SPITCH/4;
		unsigned int dstlinerem = DPITCH/4;
		unsigned int srcoffset = SRCY*SPITCH + SRCX*BYTESPP;
		unsigned int dstoffset = DSTY*DPITCH + DSTX*BYTESPP;
		ilineptr = (unsigned long *)((char *)args->srcaddr + srcoffset);
		olineptr = (unsigned long *)((char *)args->dstaddr + dstoffset);
		for (y=0; y<DSTH; ++y) {
			memcpy(olineptr, ilineptr, DSTW<<2);
			olineptr += dstlinerem;
			ilineptr += srclinerem;
		}
	}
	else {
		unsigned char *buf;

		/* check pitch/bytespp same, no malloc*/
		if (SRCY || SRCX || (SPITCH != DPITCH)) {
			/* straight blit, convert pitch, don't draw on framebuffer*/
			unsigned int linerem = SPITCH/4;
			unsigned int srcoffset = SRCY*SPITCH + SRCX*BYTESPP;
			ilineptr = (unsigned long *)((char *)args->srcaddr + srcoffset);
			buf = (unsigned char *)malloc(DSTW * DSTH * 4);
			olineptr = (unsigned long *)buf;
			for (y=0; y<DSTH; ++y) {
				memcpy(olineptr, ilineptr, DSTW<<2);
				olineptr += DSTW;
				ilineptr += linerem;
			}
		} else buf = (unsigned char *)args->srcaddr;

		GrArea(args->wid, args->gc, DSTX, DSTY, DSTW, DSTH, buf, MWPF_TRUECOLOR0888);
		GrFlush();

		if (buf != args->srcaddr)
			free(buf);
	}
}

static void
ConvBlit(PBLITARGS args)
{
	assert(args->dstbpp == args->srcbpp);
	assert(args->dstbytespp == args->srcbytespp);

	switch (args->dstbpp) {
	case 16:
		ConvBlit16(args);
		break;
#if LATER
	case 24:
		ConvBlit32(args);
		break;
#endif
	case 32:
		ConvBlit32(args);
		break;
	default:
		printf("No conversion blitter for %d bpp\n", args->dstbpp);
		break;
	}
}
//--------------------------------------------

DisplayImage_X11::DisplayImage_X11()
{
  d_data = new DisplayImage_Data;
}


void DisplayImage_X11::UseMITSHM(bool flag=true) { d_data->mayUseMITSHM=flag; }

XImage& DisplayImage_X11::AskXImage() { assert(d_data->d_ximg); return *d_data->d_ximg; }


static XImage ximage;

void DisplayImage_X11::Create(int w,int h,GR_WINDOW_ID win,const X11Server* server)
{
  int bpp = 0;
  int red_mask, green_mask, blue_mask;
  GR_SCREEN_INFO sinfo;

  if (d_data->d_initialized)
    return;

  d_data->d_width  = w;
  d_data->d_height = h;
  int roundedwidth  = (w+15); roundedwidth  -= roundedwidth %16;

  d_data->d_win = win;
  d_data->d_gc = GrNewGC();
  d_data->d_UseShmExt=false;
  d_data->d_WaitForCompletion=false;

  // Create XImage structure
  // try 16,15,24,32, then 8
	GrGetScreenInfo(&sinfo);
	d_data->d_ximg = &ximage;
	d_data->d_ximg->width = roundedwidth;
	d_data->d_ximg->height = h;
	switch (sinfo.pixtype) {
	case MWPF_TRUECOLOR0888:
	case MWPF_TRUECOLOR565:
	case MWPF_TRUECOLOR555:
		bpp = sinfo.bpp;
		red_mask = sinfo.rmask;
		green_mask = sinfo.gmask;
		blue_mask = sinfo.bmask;
		break;
	default:
		printf("Unsupported screen bits per pixel\n");
		break;
	}
	d_data->d_ximg->bits_per_pixel = bpp;
	d_data->d_ximg->red_mask = red_mask;
	d_data->d_ximg->green_mask = green_mask;
	d_data->d_ximg->blue_mask = blue_mask;
	// note: must be dword right-padded for later blit?
	d_data->d_ximg->bytes_per_line = roundedwidth * bpp/8;
	d_data->d_ximg->byte_order = LSBFirst;		// FIXME, add to SCREENINFO
	d_data->d_data = new uint8[d_data->d_ximg->bytes_per_line*h];
	d_data->d_ximg->data = (char*)d_data->d_data;

	if (GrOpenClientFramebuffer() == NULL)
		printf("Can't directly map framebuffer, using GrArea\n");

  d_data->d_initialized = true; 
}


DisplayImage_X11::~DisplayImage_X11()
{
  GrCloseClientFramebuffer();
  delete d_data;
}

void DisplayImage_X11::PutImage(int srcx0,int srcy0,int w,int h, int dstx0,int dsty0)
{
#if 0
  if (d_data->d_WaitForCompletion)
    while (1)
      {
        XEvent xev;
        
        XNextEvent(d_data->d_display, &xev);
        if (xev.type == d_data->d_CompletionType)
          break;
      }
#endif

      if (w==0) w=d_data->d_width;
      if (h==0) h=d_data->d_height;

#if 0
      // FIXME must deal with srcx0, srcy0
      if (srcx0 || srcy0) cout << "srcx0/srcy0 NOT 0!!\n";
      int type = (d_data->d_ximg->bits_per_pixel == 32)?
      	MWPF_TRUECOLOR0888: MWPF_TRUECOLOR565;
      GrArea(d_data->d_win, d_data->d_gc, dstx0, dsty0, w, h,
      	d_data->d_ximg->data, type);
      GrFlush();
#else
	GR_WINDOW_FB_INFO fbinfo;
	BLITARGS	  args;
	GrGetWindowFBInfo(d_data->d_win, &fbinfo);

	if (::fullscreen)
		args.rop = fbinfo.physpixels? MWPORTRAIT_NONE: MWPORTRAIT_GRAREA;
	else args.rop = fbinfo.physpixels? fbinfo.portrait_mode: MWPORTRAIT_GRAREA;

	args.dstx = dstx0;
	args.dsty = dsty0;
	args.dstaddr = fbinfo.physpixels;	/* can't use winpixels for portrait conversion*/
	if (args.rop != MWPORTRAIT_GRAREA) {
		/* dstx is framebuffer relative for non-GrArea*/
		args.dstx += fbinfo.x;
		args.dsty += fbinfo.y;
	}
	args.dstw = w;
	args.dsth = h;
	args.dstbpp = fbinfo.bpp;
	args.dstbytespp = fbinfo.bytespp;
	if (args.rop == MWPORTRAIT_GRAREA)
		args.dstpitch = d_data->d_ximg->bytes_per_line;
	else args.dstpitch = fbinfo.pitch;
	args.dstxres = fbinfo.xres;
	args.dstyres = fbinfo.yres;

	args.srcaddr = d_data->d_ximg->data;
	args.srcx = srcx0;
	args.srcy = srcy0;
	args.srcw = d_data->d_ximg->width;
	args.srch = d_data->d_ximg->height;
	args.srcbpp = d_data->d_ximg->bits_per_pixel;
	args.srcbytespp = (d_data->d_ximg->bits_per_pixel+7)/8;
	args.srcpitch = d_data->d_ximg->bytes_per_line;

	args.wid = d_data->d_win;
	args.gc = d_data->d_gc;

// FIXME REMOVE
if (args.dsth != args.srch) printf("src != dst h\n");
if (args.dstw != args.srcw) printf("src != dst w\n");

	ConvBlit(&args);
#endif
}

--- NEW FILE: imgwin.hh ---
/*********************************************************************
  libvideogfx/x11/imgwin.hh

  purpose:
    X11-wrapper classes that simplify window creation and
    displaying true color images in them.

  notes:

  to do:
    - There seems to be a problem with MultiWindowRefresh. Some
      parts of the image sometimes don't get updated. At the moment
      everything seems to work, though.

  author(s):
   - Dirk Farin, farin at ti.uni-mannheim.de

  modifications:
   31/Jul/2000 - Dirk Farin - new function: MultiWindowRefresh
   03/Aug/1999 - Dirk Farin - new class: ImageWindow_Autorefresh_X11
   29/Jul/1999 - Dirk Farin - first implementation
 *********************************************************************/

#ifndef LIBVIDEOGFX_X11_IMGWIN_HH
#define LIBVIDEOGFX_X11_IMGWIN_HH

#include "dispimg.hh"

#include "libvideogfx/graphics/lowlevel/img2raw.hh"

/* Wrapper class for creating one X11 window with the highest color depth possible.
 */
class ImageWindow_X11
{
public:
  ImageWindow_X11();
  ~ImageWindow_X11(); // Window will be closed in destructor.

  void SetPosition(int x,int y) { d_xpos=x; d_ypos=y; }

  void Create(int w,int h,const char* title,const X11Server* server=NULL,GR_WINDOW_ID parent=0);
  void Close();

  GR_WINDOW_ID   AskWindow();
  int AskDisplay();

private:
  bool        d_initialized;

  struct NXSpecificData* d_nxdata; // This hides Nano-X datatypes from global namespace.

  int d_xpos,d_ypos;
};


/* Enhanced ImageWindow_X11-class that can accept an image and that watches
   X11 events to automatically redraw itself.
   To get fully automatic redrawing you have to create a new thread that
   calls RedrawForever() which will never return.
*/
class ImageWindow_Autorefresh_X11 : public ImageWindow_X11,     // the window itself
				    private DisplayImage_X11,   // the image to be displayed
				    private Image2Raw           // the transformation for image representation convertion
{
public:
   ImageWindow_Autorefresh_X11();
  ~ImageWindow_Autorefresh_X11();

  void Create(int w,int h,const char* title,const X11Server* server=NULL,GR_WINDOW_ID parent=0);
  void Close();

  void Display_const(const Image_YUV<Pixel>&);
  void Display_const(const Image_RGB<Pixel>&);
  void Display      (      Image_YUV<Pixel>&);  // Input image contents may be destroyed
  void Display      (      Image_RGB<Pixel>& i) { Display_const(i); }


  // --- user interaction ---

  char CheckForKeypress();
  char WaitForKeypress();    // Image will be refreshed while waiting for the keypress.

  void CheckForRedraw();
  void RedrawForever();

private:
  bool d_lastimg_was_RGB;
  bool d_lastimg_was_YUV;

  void Redraw(GR_EVENT_EXPOSURE& ev);

  friend int MultiWindowRefresh(ImageWindow_Autorefresh_X11*const*,int nWindows);
};

/* MultiWindowRefresh also checks for keypresses. The window index of the window,
   in which the keypress has occured, is returned. Otherwise -1 is returned.
 */
int MultiWindowRefresh(ImageWindow_Autorefresh_X11*const*,int nWindows);

#endif

--- NEW FILE: sem.c ---
/* System V IPC semaphores */
/* Copyright (c) 2001 by Greg Haerr <greg at censoft.com>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <errno.h>
#include "sem.h"

/* Not defined by many operating systems, use configure to detect */
#if !defined(HAVE_SEMUN)
union semun {
	int val;
	struct semid_ds *buf;
	ushort *array;
};
#endif

static struct sembuf op_trywait[2] = {
	{ 0, -1, (IPC_NOWAIT|SEM_UNDO) } /* Decrement semaphore, no block */
};
static struct sembuf op_wait[2] = {
	{ 0, -1, SEM_UNDO }		/* Decrement semaphore */
};
static struct sembuf op_post[1] = {
	{ 0, 1, (IPC_NOWAIT|SEM_UNDO) }	/* Increment semaphore */
};

MWSEMAPHORE
GdCreateSemaphore(int public, int create, int initial_value)
{
	int		id;
	int		flags = 0666;
	key_t		key;
	union semun	init;

#define GR_NAMED_SOCKET "/tmp/.nano-X"
	key = public? ftok(GR_NAMED_SOCKET, public): IPC_PRIVATE;
	if (create)
		flags |= IPC_CREAT;

	/* Keep trying to create sem while we don't own the requested key */
	//do {
		//if (key != IPC_PRIVATE)
			//++key;
		id = semget(key, 1, flags);
	//} while (id < 0 && key != IPC_PRIVATE && errno == EACCES);

	/* Report the error if we eventually failed */
	if (id < 0) {
		printf("Couldn't create semaphore");
		return -1;
	}

	if (create) {
		/* Initialize semaphore */
		init.val = initial_value;
		semctl(id, 0, SETVAL, init);
	}
	return id;
}

void
GdDestroySemaphore(MWSEMAPHORE id)
{
	union semun dummy;

	dummy.val = 0;
	semctl(id, 0, IPC_RMID, dummy);
}

int
GdSemWait(MWSEMAPHORE id)
{
	int retval = MWSEM_OK;

tryagain:
	if (semop(id, op_wait, 1) < 0) {
		if (errno == EINTR)
			goto tryagain;
		printf("Semaphore operation error");
		retval = MWSEM_ERR;
	}
	return retval;
}

#if 0
int
GdSemTryWait(MWSEMAPHORE id)
{
	int retval = MWSEM_OK;

tryagain:
	if (semop(id, op_trywait, 1) < 0) {
		if (errno == EINTR)
			goto tryagain;
		retval = MWSEM_TIMEDOUT;
	}
	return retval;
}

int
GdSemWaitTimeout(MWSEMAPHORE id, unsigned int timeout)
{
	int retval;

	/* Try the easy cases first */
	if (timeout == 0)
		return GdSemTryWait(id);
	if (timeout == MWSEM_MAXWAIT)
		return GdSemWait(id);

	/* We have to busy wait... */
	timeout += GsGetTickCount();
	do {
		retval = GdSemTryWait(id);
		if (retval == MWSEM_OK)
			break;
		GsDelay(1);
	} while (GsGetTickCount() < timeout);

	return retval;
}

int
GdSemValue(MWSEMAPHORE id)
{
	int semval;
	int value;
	
	value = 0;
  tryagain:
	semval = semctl(id, 0, GETVAL);
	if (semval < 0) {
		if (errno == EINTR)
			goto tryagain;
	} else {
		value = semval;
	}
	return value;
}
#endif

int
GdSemPost(MWSEMAPHORE id)
{
	int retval = MWSEM_OK;

tryagain:
	if (semop(id, op_post, 1) < 0) {
		if (errno == EINTR)
			goto tryagain;
		printf("Semaphore operation error");
		retval = MWSEM_ERR;
	}
	return retval;
}

--- NEW FILE: imgwin.cc ---
/*
 * imgwin.cc
 */
#include "config.h"

#include <time.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include <stdlib.h>

#include <iostream.h>
#include <iomanip.h>

#include <nano-X.h>

#include "libvideogfx/init.hh"

#include "server.hh"
#include "imgwin.hh"

#include "libvideogfx/graphics/color/colorspace.hh"

bool fullscreen;

struct NXSpecificData
{
  int		d_display;
  GR_WINDOW_ID	d_win;
};


ImageWindow_X11::ImageWindow_X11()
  : d_initialized(false),
    d_xpos(-1),d_ypos(-1)
{
  d_nxdata = new NXSpecificData;
}


ImageWindow_X11::~ImageWindow_X11()
{
  Close();

  if (d_nxdata) { delete d_nxdata; d_nxdata=NULL; }
}

void ImageWindow_X11::Close()
{
  if (!d_initialized)
    return;

  GrUnmapWindow(d_nxdata->d_win);
  GrFlush();
  d_initialized=false;
}


GR_WINDOW_ID ImageWindow_X11::AskWindow()  { assert(d_initialized); return d_nxdata->d_win; }
int          ImageWindow_X11::AskDisplay() { return d_nxdata->d_display; }


void ImageWindow_X11::Create(int w,int h,const char* title,const X11Server* server,GR_WINDOW_ID parent)
{
  assert(!d_initialized);

  d_nxdata->d_display = default_x11server.AskDisplay();

  // Create window
  GR_WINDOW_ID parent_window;
  if (parent)
    parent_window = parent;
  else
    parent_window = GR_ROOT_WINDOW_ID;

  int flags = 0;
  if (::fullscreen == true) {
    flags = GR_WM_PROPS_NODECORATE | GR_WM_PROPS_NOAUTOMOVE |
    GR_WM_PROPS_NOAUTORESIZE;
    d_xpos = 0;
    d_ypos = 0;
  } else {
    flags = GR_WM_PROPS_APPWINDOW | GR_WM_PROPS_NOAUTORESIZE;
    if (d_xpos >= 0 && d_ypos >= 0)
      flags |= GR_WM_PROPS_NOAUTOMOVE;
  }
  d_nxdata->d_win = GrNewWindowEx(flags, (unsigned char *)title,
  	parent_window, d_xpos, d_ypos, w, h, MWRGB(0,0,0));
  
  GrSelectEvents(d_nxdata->d_win, GR_EVENT_MASK_EXPOSURE|GR_EVENT_MASK_KEY_DOWN);
  GrMapWindow(d_nxdata->d_win);
  GrFlush();

#if 0
  while (1)
    {
      XEvent xev;
      XNextEvent(d_x11data->d_display,&xev);

      if (xev.type == Expose)
        break;
    }
#endif
  d_initialized = true; 
}


ImageWindow_Autorefresh_X11::ImageWindow_Autorefresh_X11()
  : d_lastimg_was_RGB(false),
    d_lastimg_was_YUV(false)
{
}

ImageWindow_Autorefresh_X11::~ImageWindow_Autorefresh_X11()
{
}

void ImageWindow_Autorefresh_X11::Create(int w,int h,const char*title,const X11Server* server,GR_WINDOW_ID win)
{
  ImageWindow_X11::Create(w,h,title,server,win);
  DisplayImage_X11::Create(w,h,AskWindow(),server);
}

void ImageWindow_Autorefresh_X11::Close()
{
  ImageWindow_X11::Close();
}

void ImageWindow_Autorefresh_X11::Display_const(const Image_RGB<Pixel>& img)
{
  if (!d_lastimg_was_RGB)
    {
      XImage& ximg = AskXImage();

      RawImageSpec_RGB spec;
      spec.bytes_per_line = ximg.bytes_per_line;
      spec.bits_per_pixel = ximg.bits_per_pixel;
      spec.little_endian  = (ximg.byte_order==LSBFirst);
      spec.SetRGBMasks(ximg.red_mask,ximg.green_mask,ximg.blue_mask);

      SetOutputSpec(spec);

      d_lastimg_was_RGB = true;
      d_lastimg_was_YUV = false;
    }
  
  TransformRGB(img,(uint8*)(AskXImage().data));
  PutImage();
}

void ImageWindow_Autorefresh_X11::Display_const(const Image_YUV<Pixel>& img)
{
  if (!d_lastimg_was_YUV)
    {
      XImage& ximg = AskXImage();

      RawImageSpec_RGB spec;
      spec.bytes_per_line = ximg.bytes_per_line;
      spec.bits_per_pixel = ximg.bits_per_pixel;
      spec.little_endian  = (ximg.byte_order==LSBFirst);
      spec.SetRGBMasks(ximg.red_mask,ximg.green_mask,ximg.blue_mask);

      SetOutputSpec(spec);

      d_lastimg_was_RGB = false;
      d_lastimg_was_YUV = true;
    }
  
  TransformYUV(img,(uint8*)(AskXImage().data));
  PutImage();
}

void ImageWindow_Autorefresh_X11::Display(Image_YUV<Pixel>& img)
{
  if (!d_lastimg_was_YUV)
    {
      XImage& ximg = AskXImage();

      RawImageSpec_RGB spec;
      spec.bytes_per_line = ximg.bytes_per_line;
      spec.bits_per_pixel = ximg.bits_per_pixel;
      spec.little_endian  = (ximg.byte_order==LSBFirst);
      spec.SetRGBMasks(ximg.red_mask,ximg.green_mask,ximg.blue_mask);

      SetOutputSpec(spec);

      d_lastimg_was_RGB = false;
      d_lastimg_was_YUV = true;
    }
  
  TransformYUV(img,(uint8*)(AskXImage().data));
  PutImage();
}

void ImageWindow_Autorefresh_X11::CheckForRedraw()
{
#if 0
  XEvent event;
  while (XCheckWindowEvent(AskDisplay(),AskWindow(),ExposureMask,&event))
      Redraw(event.xexpose);
#endif
}


void ImageWindow_Autorefresh_X11::RedrawForever()
{
#if 0
  XEvent event;
  for (;;)
    {
      XWindowEvent(AskDisplay(),AskWindow(),ExposureMask,&event);
      Redraw(event.xexpose);
    }
#endif
}


char ImageWindow_Autorefresh_X11::CheckForKeypress()
{
#if 0
  XEvent event;
  if (XCheckWindowEvent(AskDisplay(),AskWindow(),KeyPressMask,&event))
    {
      char buf;

      if (XLookupString(&event.xkey,&buf,1,NULL,NULL) > 0)
	return buf;
      else
	return 0;
    }
  else
    return 0;
#endif
}


char ImageWindow_Autorefresh_X11::WaitForKeypress()
{
#if 0
  XEvent event;

  for (;;)
    {
      XWindowEvent(AskDisplay(),AskWindow(),KeyPressMask|ExposureMask,&event);

      if (event.type == Expose)
	{
	  Redraw(event.xexpose);
	}
      else
	{
	  char buf;

	  if (XLookupString(&event.xkey,&buf,1,NULL,NULL) > 0)
	    return buf;
	  else
	    return 0;
	}
    }
#endif
}


void ImageWindow_Autorefresh_X11::Redraw(GR_EVENT_EXPOSURE& ev)
{
  PutImage(ev.x     , ev.y,
	   ev.width , ev.height,
	   ev.x     , ev.y);
}


/* All windows have to be on the same X-server.
 */
int MultiWindowRefresh(ImageWindow_Autorefresh_X11*const* windows,int nWindows)
{
#if 0
  XEvent ev;
  bool refresh_occured=false;

  while (!refresh_occured)
    {
      XMaskEvent(windows[0]->AskDisplay(),ExposureMask|KeyPressMask,&ev);
      for (int i=0;i<nWindows;i++)
	{
	  if (ev.xany.window == windows[i]->AskWindow())
	    {
	      if (ev.type == Expose)
		{
		  windows[i]->Redraw(ev.xexpose);
		  refresh_occured=true;
		}
	      else if (ev.type == KeyPress)
		return i;
	    }
	}
    }

#endif
  return -1;
}

--- NEW FILE: server.cc ---
/*
 *  server.cc
 */

#include "config.h"

#include "server.hh"

class X11Server_Default : public X11Server
{
public:
  X11Server_Default()
    {
      display = GrOpen();
    }
  
  ~X11Server_Default()
    {
      /* NOTE: eigentlich sollte der server schon wieder zugemacht werden,
	 aber wenn globale Windows erstellt werden kann es passieren, dass
	 der Server vor den Windows zugemacht wird, was dann schiefgeht. */
      // GrClose();
    }
    
  int AskDisplay() const { return display; }

private:
  int display;
};

static X11Server_Default default_x11server_OBJECT;
const X11Server& default_x11server = default_x11server_OBJECT;




--- NEW FILE: dispimg.hh ---
/*********************************************************************
  libvideogfx/x11/dispimg.hh

  purpose:
   Wrapper class around X11 XImage. Whenever possible the MIT-SHM
   extension is used for storing the images.

  notes:
   - Create() is not multi-threading save as X11-errors are caught

  to do:
   - Check that different endian schemes on client and server are working.
   - Try to redefine interface so that hardward YUV2RGB convertion is possible.
   - Support for other display depths.

  author(s):
   - Dirk Farin, farin at ti.uni-mannheim.de

  modifications:
   21/Jan/2000 - Dirk Farin - X11 specific data is now hidden to circumvent
                              global namespace pollution by definitions in
                              X11-header files.
   20/Oct/1999 - Dirk Farin - Bugfix. mayUseMITSHM was uninitialized
   29/Jul/1999 - Dirk Farin - Integration into ULib, changes in user interface.
   07/Jul/1999 - Dirk Farin - robust handling of MIT-SHM failures
   25/Jan/1999 - Dirk Farin - support 8bit displays
   14/Jan/1999 - Dirk Farin - Bugfix: 24 and 32bit display code now working
   07/Jan/1999 - Dirk Farin - support for 24 and 32bit deep displays
   03/Jan/1999 - Dirk Farin - support for X11 shared memory extension
   30/Dec/1998 - Dirk Farin - first implementation (16 bit deep displays only, 5:6:5 format)
 *********************************************************************/

#ifndef LIBVIDEOGFX_X11_DISPIMG_HH
#define LIBVIDEOGFX_X11_DISPIMG_HH

#include "libvideogfx/nanox/server.hh"

typedef struct {
	int width;
	int height;
	int bytes_per_line;
	int bits_per_pixel;
	int byte_order;		// LSBFirst
	int red_mask;
	int green_mask;
	int blue_mask;
	char *data;
} XImage;

#define LSBFirst 0

class DisplayImage_X11
{
public:
  DisplayImage_X11();
  ~DisplayImage_X11();

  void UseMITSHM(bool flag=true);

  void Create(int w,int h,GR_WINDOW_ID win,const X11Server* server=NULL);

  XImage& AskXImage();

  void PutImage(int srcx0=0,int srcy0=0,int w=0,int h=0, int dstx0=0,int dsty0=0);

private:
  struct DisplayImage_Data* d_data;
};

#endif




More information about the dslinux-commit mailing list