summaryrefslogtreecommitdiff
path: root/osdworker.c
diff options
context:
space:
mode:
authorzwer <zwer@1f4bef6d-8e0a-0410-8695-e467da8aaccf>2006-05-16 22:38:03 +0000
committerzwer <zwer@1f4bef6d-8e0a-0410-8695-e467da8aaccf>2006-05-16 22:38:03 +0000
commitf51775ee88873001e3349066a7aab66d12e973c0 (patch)
tree49cde6a7c4563f7f614874858b1f91789e866bc2 /osdworker.c
parent1213ecc20171d1ad307b6b5975fad1f5a3e10a64 (diff)
downloadvdr-plugin-ffnetdev-f51775ee88873001e3349066a7aab66d12e973c0.tar.gz
vdr-plugin-ffnetdev-f51775ee88873001e3349066a7aab66d12e973c0.tar.bz2
- add ColorMap support
git-svn-id: svn://svn.berlios.de/ffnetdev/trunk@19 1f4bef6d-8e0a-0410-8695-e467da8aaccf
Diffstat (limited to 'osdworker.c')
-rw-r--r--osdworker.c129
1 files changed, 72 insertions, 57 deletions
diff --git a/osdworker.c b/osdworker.c
index c354685..9b6c3fd 100644
--- a/osdworker.c
+++ b/osdworker.c
@@ -47,20 +47,15 @@ cOSDWorker::cOSDWorker(void)
ServerFormat.blueShift = 0;
ServerFormat.blueMax = 255;
- m_pOsdBitmap = NULL;
-
- numOSDColors = 1;
- memset(&OSDColors, 0, sizeof(OSDColors));
-
m_pOsdBitmap = new cBitmap(720, 576, 8, 0, 0);
- m_pOsdBitmap->DrawRectangle(0, 0, 720, 576, clrTransparent);
memset(&m_lasttime, 0, sizeof(m_lasttime));
memset(&m_lastupdate, 0, sizeof(m_lastupdate));
memset(&ClientFormat, 0, sizeof(ClientFormat));
- ClientFormat.trueColour = 1;
+ ClientFormat.trueColour = 0;
m_bOSDisClear = true;
+ m_bColorsChanged = false;
}
cOSDWorker::~cOSDWorker() {
@@ -75,8 +70,7 @@ cOSDWorker::~cOSDWorker() {
if (m_pSendBuffer != NULL)
delete [] m_pSendBuffer;
- if (m_pOsdBitmap != NULL)
- delete m_pOsdBitmap;
+ delete m_pOsdBitmap;
}
@@ -158,31 +152,47 @@ void cOSDWorker::CreateSendBuffer(int SendBufferSize)
bool cOSDWorker::ClearScreen(void)
{
- if ((m_Instance == NULL) || (m_Instance->m_pOsdBitmap == NULL))
- return false;
+ int iOldNumColors, iNumColors;
+
+ if ((m_Instance == NULL) || (m_Instance->m_pOsdBitmap == NULL))
+ return false;
- // this should be improved;
- // 1) maybe we should send a our very "special" pseudo encoding[CLEAR_SCREEN] to our "special" VNC client to get an empty screen really fast
+ // this should be improved;
+ // 1) maybe we should send a our very "special" pseudo encoding[CLEAR_SCREEN] to our "special" VNC client to get an empty screen really fast
- memset(&(m_Instance->m_lasttime), 0, sizeof(m_Instance->m_lasttime));
-
- m_Instance->m_pOsdBitmap->DrawRectangle(0, 0, 720, 576, clrTransparent);
- m_Instance->SendScreen();
+ memset(&(m_Instance->m_lasttime), 0, sizeof(m_Instance->m_lasttime));
- rfbBellMsg fu;
- fu.type=rfbBell;
- OSDWrite((unsigned char*)&fu, sz_rfbBellMsg);
+ m_Instance->m_pOsdBitmap->Colors(iOldNumColors);
+ m_Instance->m_pOsdBitmap->DrawRectangle(0, 0, 720, 576, clrTransparent);
+ m_Instance->m_pOsdBitmap->Colors(iNumColors);
+ if (iNumColors != iOldNumColors)
+ m_Instance->m_bColorsChanged = true;
+
+ m_Instance->SendScreen();
+
+ /*
+ rfbBellMsg fu;
+ fu.type=rfbBell;
+ OSDWrite((unsigned char*)&fu, sz_rfbBellMsg);
+ */
- m_Instance->m_bOSDisClear = true;
+ m_Instance->m_bOSDisClear = true;
- return true;
+ return true;
}
bool cOSDWorker::DrawBitmap(int x1, int y1, cBitmap &pOsdBitmap)
{
+ int iOldNumColors, iNumColors;
+
if (m_Instance->m_pOsdBitmap != NULL)
{
+ m_Instance->m_pOsdBitmap->Colors(iOldNumColors);
m_Instance->m_pOsdBitmap->DrawBitmap(x1, y1, pOsdBitmap);
+ m_Instance->m_pOsdBitmap->Colors(iNumColors);
+ if (iNumColors != iOldNumColors)
+ m_Instance->m_bColorsChanged = true;
+
return true;
}
@@ -214,8 +224,12 @@ bool cOSDWorker::SendScreen(int x1, int y1, int x2, int y2)
m_Instance->m_lastupdate = curtime;
}
- if (m_Instance->m_pEncoder != NULL)
- m_Instance->m_pEncoder->SetLocalFormat(m_Instance->ServerFormat, 720, 576);
+ if (m_Instance->m_bColorsChanged)
+ {
+ int numOSDColors;
+ const tColor *OSDColors = (tColor*)m_Instance->m_pOsdBitmap->Colors(numOSDColors);
+ cOSDWorker::SendCMAP(numOSDColors, OSDColors);
+ }
RECT rect = {x1, y1, x2, y2};
fu.type=rfbFramebufferUpdate;
@@ -253,7 +267,7 @@ bool cOSDWorker::GetOSDColors(const tColor **OSDColors, int *numOSDColors)
bool cOSDWorker::SendCMAP(int NumColors, const tColor *Colors)
{
- if (m_Instance == NULL)
+ if ((m_Instance == NULL) || (m_Instance->m_pEncoder == NULL))
return false;
rfbSetColourMapEntriesMsg scme;
@@ -265,7 +279,7 @@ bool cOSDWorker::SendCMAP(int NumColors, const tColor *Colors)
int i;
if ((m_Instance->state==HANDSHAKE_OK) && !(m_Instance->ClientFormat.trueColour)) {
- dsyslog("[ffnetdev] VNC: SendColourMapEntries");
+ dsyslog("[ffnetdev] VNC: SendColourMapEntries\n");
scme.type=rfbSetColourMapEntries;
scme.firstColour = Swap16IfLE(0);
scme.nColours = Swap16IfLE((CARD16)NumColors);
@@ -274,33 +288,31 @@ bool cOSDWorker::SendCMAP(int NumColors, const tColor *Colors)
for(i=0; i<NumColors; i++)
{
- red = ((Colors[i]&0x00FF0000) >> 16);
- green = ((Colors[i]&0x0000FF00) >> 8);
- blue = ((Colors[i]&0x000000FF) );
+ red = ((Colors[i]&0x00FF0000) >> 16);
+ green = ((Colors[i]&0x0000FF00) >> 8);
+ blue = ((Colors[i]&0x000000FF) );
+ dsyslog("[ffnetdev] VNC: SendColors r=%x g=%x b=%x\n", red, green, blue);
- if (m_Instance->UseAlpha) {
+ if (m_Instance->UseAlpha)
+ {
alpha = ((Colors[i]&0xFF000000) >> 24);
OSDWrite( (unsigned char*) &alpha, 2);
- }
+ }
- OSDWrite( (unsigned char*) &red, 2);
- OSDWrite( (unsigned char*) &green, 2);
- OSDWrite( (unsigned char*) &blue, 2);
-
- m_Instance->OSDColors[i] = Colors[i];
+ OSDWrite( (unsigned char*) &red, 2);
+ OSDWrite( (unsigned char*) &green, 2);
+ OSDWrite( (unsigned char*) &blue, 2);
}
- m_Instance->numOSDColors = NumColors;
- if (m_Instance->m_pEncoder != NULL)
- m_Instance->m_pEncoder->SetLocalFormat(m_Instance->ServerFormat, 720, 576);
+ m_Instance->m_pEncoder->SetLocalFormat(m_Instance->ServerFormat, 720, 576);
+
+ m_Instance->m_bColorsChanged = false;
return true;
}
else {
- for (i=0; i<NumColors; i++)
- m_Instance->OSDColors[i] = Colors[i];
- m_Instance->numOSDColors = NumColors;
- if (m_Instance->m_pEncoder != NULL)
- m_Instance->m_pEncoder->SetLocalFormat(m_Instance->ServerFormat, 720, 576);
+ m_Instance->m_pEncoder->SetLocalFormat(m_Instance->ServerFormat, 720, 576);
+
+ m_Instance->m_bColorsChanged = false;
return false;
}
@@ -391,6 +403,9 @@ void cOSDWorker::HandleClientRequests(cTBSelect *select)
ClientFormat = msg.spf.format;
dsyslog("[ffnetdev] VNC: RGB %d %d %d %d %d %d\n",
ClientFormat.redShift, ClientFormat.redMax, ClientFormat.greenShift, ClientFormat.greenMax, ClientFormat.blueShift, ClientFormat.blueMax);
+
+ //if (m_pEncoder != NULL)
+ // m_pEncoder->SetRemoteFormat(ClientFormat);
break;
case rfbFixColourMapEntries: if (!RFBRead( ((char*)&msg.fcme)+1, sz_rfbFixColourMapEntriesMsg-1))
return;
@@ -466,27 +481,27 @@ void cOSDWorker::HandleClientRequests(cTBSelect *select)
}
break;
case rfbEncSpecialUseAlpha:
- if (m_pEncoder == NULL)
- {
- isyslog("[ffnetdev] VNC: ->Special FFnetDev Encoding: client wants alpha channel.\n");
- }
+ isyslog("[ffnetdev] VNC: ->Special FFnetDev Encoding: client wants alpha channel.\n");
UseAlpha = true;
break;
default:
esyslog("[ffnetdev] VNC: ->Unknown encoding or unknown pseudo encoding.\n");
}
- if (m_pEncoder != NULL)
- {
- m_pEncoder->Init();
- m_pEncoder->SetLocalFormat(ServerFormat, 720, 576);
- m_pEncoder->SetCompressLevel(6);
- m_pEncoder->SetQualityLevel(9);
- m_pEncoder->SetRemoteFormat(ClientFormat);
- }
- ClearScreen();
}
+
+ if (m_pEncoder != NULL)
+ {
+ m_pEncoder->Init();
+ m_pEncoder->SetLocalFormat(ServerFormat, 720, 576);
+ m_pEncoder->SetCompressLevel(6);
+ m_pEncoder->SetQualityLevel(9);
+ m_pEncoder->SetRemoteFormat(ClientFormat);
+ }
+
+ ClearScreen();
+
break;
case rfbFramebufferUpdateRequest:
if (!RFBRead( ((char*)&msg.fur)+1, sz_rfbFramebufferUpdateRequestMsg-1))