diff options
Diffstat (limited to 'netosd.c')
| -rw-r--r-- | netosd.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/netosd.c b/netosd.c new file mode 100644 index 0000000..5bfdab6 --- /dev/null +++ b/netosd.c @@ -0,0 +1,78 @@ +/* + * netosd.c: OSD over network + * + * See the README file for copyright information and how to reach the author. + * + */ + +#include "netosd.h" +#include "osdworker.h" + +////////////////////////////////////////////////////////////////////////////////////////////////// +cNetOSD::cNetOSD(int Left, int Top) : cOsd(Left, Top) +{ +#ifdef DEBUG + fprintf(stderr,"[ffnetdev] NetOSD: Constructor cNetOSD.\n"); +#endif +} + +cNetOSD::~cNetOSD() +{ +#ifdef DEBUG + fprintf(stderr,"[ffnetdev] NetOSD: Destructor cNetOSD.\n"); +#endif + + cOSDWorker::ClearScreen(); +} + +eOsdError cNetOSD::CanHandleAreas(const tArea *Areas, int NumAreas) +{ + eOsdError Result = cOsd::CanHandleAreas(Areas, NumAreas); + if (Result == oeOk) { + if (NumAreas > 1) // Handle only one big area (because we support VNC colour map mode) + return oeTooManyAreas; // We cannot handle multiple areas having different colour maps. We need a single colourmap. Thus, only one area. + int TotalMemory = 0; + for (int i = 0; i < NumAreas; i++) { + if (Areas[i].bpp != 1 && Areas[i].bpp != 2 && Areas[i].bpp != 4 && Areas[i].bpp != 8) + return oeBppNotSupported; + if ((Areas[i].Width() & (8 / Areas[i].bpp - 1)) != 0) + return oeWrongAlignment; + TotalMemory += Areas[i].Width() * Areas[i].Height() / (8 / Areas[i].bpp); + } +#ifdef DEBUG + fprintf(stderr, "[ffnetdev] NetOSD: CanHandleAreas: OSD area size: %d bytes.\r\n", TotalMemory); +#endif + if (TotalMemory > MAXOSDMEMORY) + return oeOutOfMemory; + } + return Result; +} + +void cNetOSD::Flush(void) +{ + cBitmap *Bitmap; + + for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) + { + int x1=0, x2=0, y1=0, y2=0; + if (Bitmap->Dirty(x1, y1, x2, y2)) + { + // commit colors: + int NumColors; + const tColor *Colors = Bitmap->Colors(NumColors); + if (Colors) { + cOSDWorker::SendCMAP(NumColors , Colors); + } +#ifdef DEBUG + fprintf(stderr, "[ffnetdev] NetOSD: Left: %d, Top: %d, X0: %d, Y0: %d, Width: %d, Height: %d\n", + Left(), Top(), Bitmap->X0(), Bitmap->Y0(), Bitmap->Width(), Bitmap->Height()); + fprintf(stderr, "[ffnetdev] NetOSD: Dirty area x1: %d, y1: %d, x2: %d, y2: %d\n",x1,y1,x2,y2); +#endif + // commit modified data: + cOSDWorker::SendScreen(Bitmap->Width(), Left()+x1 +Bitmap->X0(), Top()+y1+Bitmap->Y0(), x2-x1+1, y2-y1+1, Bitmap->Data(x1, y1)); + } + Bitmap->Clean(); + } +} + + |
