From 0c298e5c6a7d4c465e381e5aaa496170f06f2c67 Mon Sep 17 00:00:00 2001 From: george82 Date: Sat, 19 Mar 2005 08:45:45 +0000 Subject: [PATCH] Finished PixelFormatList class implementation. Added these methods: readUserDefinedPF(); writeUserDefinedPF(); getDefaultPFCount(); getUserPFCount(); getIndexByPFName(); isDefaultPF(); git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@251 3789f03b-4d11-0410-bbf8-ca57d06f2519 --- rfbplayer/PixelFormatList.cxx | 70 +++++++++++++++++++++++++++++++++++ rfbplayer/PixelFormatList.h | 16 +++++++- 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/rfbplayer/PixelFormatList.cxx b/rfbplayer/PixelFormatList.cxx index 1cb0f690..b2d7ab22 100644 --- a/rfbplayer/PixelFormatList.cxx +++ b/rfbplayer/PixelFormatList.cxx @@ -20,6 +20,9 @@ #include +using namespace rfb; +using namespace rfb::win32; + PixelFormatList::PixelFormatList() { PixelFormatListElement PFElem; @@ -52,6 +55,8 @@ PixelFormatList::PixelFormatList() { PFElem.setName("24-bits depth (BGR888)"); PFElem.setPF(&PixelFormat(32,24,0,1,255,255,255,0,8,16)); PFList.push_back(PFElem); + + PF_DEFAULT_COUNT = PFList.size(); } PixelFormatListElement PixelFormatList::operator[](int index) { @@ -66,6 +71,9 @@ void PixelFormatList::add(char *format_name, PixelFormat PF) { } void PixelFormatList::insert(int index, char *format_name, PixelFormat PF) { + if (isDefaultPF(index)) + rdr::Exception("PixelFormatList:can't insert to the default pixel format place"); + PixelFormatListElement PFElem; PFElem.setName(format_name); PFElem.setPF(&PF); @@ -73,6 +81,8 @@ void PixelFormatList::insert(int index, char *format_name, PixelFormat PF) { } void PixelFormatList::remove(int index) { + if (isDefaultPF(index)) + rdr::Exception("PixelFormatList:can't remove the default pixel format"); PFList.erase(getIterator(index)); } @@ -86,4 +96,64 @@ list ::iterator PixelFormatList::getIterator(int index) if (i++ == index) break; } return iter; +} + +bool PixelFormatList::isDefaultPF(int index) { + if (index < PF_DEFAULT_COUNT) return true; + return false; +} + +void PixelFormatList::readUserDefinedPF(HKEY root, const char *keypath) { + RegKey regKey; + regKey.createKey(root, keypath); + int count = regKey.getInt(_T("PixelFormatCount"), 0); + if (count > 0) { + // Erase all user defined pixel formats + int upf_count = getUserPFCount(); + if (upf_count > 0) { + for(int i = 0; i < upf_count; i++) { + remove(PF_DEFAULT_COUNT); + } + } + // Add the user defined pixel formats from the registry + for(int i = 0; i < count; i++) { + char upf_name[20] = "\0"; + sprintf(upf_name, "%s%i", "Upf", i); + int size = sizeof(PixelFormatListElement); + PixelFormatListElement *pPFElem = 0;// = &PFElem; + regKey.getBinary(upf_name, (void**)&pPFElem, &size); + PFList.push_back(*pPFElem); + if (pPFElem) delete pPFElem; + } + } +} + +void PixelFormatList::writeUserDefinedPF(HKEY root, const char *keypath) { + RegKey regKey; + + // Delete all user defined pixel formats from the regisry + regKey.createKey(root, keypath);//_T("Software\\TightVnc\\RfbPlayer\\UserDefinedPF")); + int count = regKey.getInt(_T("PixelFormatCount"), 0); + for (int i = 0; i < count; i++) { + char upf_name[20] = "\0"; + sprintf(upf_name, "%s%i", "Upf", i); + regKey.deleteValue(upf_name); + } + regKey.setInt(_T("PixelFormatCount"), 0); + + // Write new user defined pixel formats to the registry + regKey.setInt(_T("PixelFormatCount"), getUserPFCount()); + for (i = 0; i < getUserPFCount(); i++) { + char upf_name[20] = "\0"; + sprintf(upf_name, "%s%i", "Upf", i); + regKey.setBinary(upf_name, (void *)&operator[](i+getDefaultPFCount()), + sizeof(PixelFormatListElement)); + } +} + +int PixelFormatList::getIndexByPFName(const char *format_name) { + for (int i = 0; i < PixelFormatList::count(); i++) { + if (_stricmp(operator[](i).format_name, format_name) == 0) return i; + } + return -1; } \ No newline at end of file diff --git a/rfbplayer/PixelFormatList.h b/rfbplayer/PixelFormatList.h index 41ca0f22..f3b4e1fa 100644 --- a/rfbplayer/PixelFormatList.h +++ b/rfbplayer/PixelFormatList.h @@ -26,6 +26,8 @@ #include #include +#include + // Definition indexes of the default pixel formats #define PF_BGR233 0 #define PF_RGB555 1 @@ -34,7 +36,6 @@ #define PF_BGR565 4 #define PF_RGB888 5 #define PF_BGR888 6 -#define PF_DEFAULT_COUNT 7 using namespace rfb; using namespace std; @@ -44,6 +45,9 @@ using namespace std; class PixelFormatListElement { public: + PixelFormatListElement() { + format_name[0] = 0; + } char format_name[256]; PixelFormat PF; void setName(const char *name) { @@ -59,13 +63,23 @@ public: class PixelFormatList { public: PixelFormatList(); + PixelFormatListElement operator[](int index); void add(char *format_name, PixelFormat PF); void insert(int index, char *format_name, PixelFormat PF); void remove(int index); + + void readUserDefinedPF(HKEY root, const char *keypath); + void writeUserDefinedPF(HKEY root, const char *keypath); + int count() { return PFList.size(); } + int getDefaultPFCount() { return PF_DEFAULT_COUNT; } + int getUserPFCount() { return max(0, count() - PF_DEFAULT_COUNT); } + int getIndexByPFName(const char *format_name); + bool isDefaultPF(int index); protected: list ::iterator getIterator(int index); list PFList; + int PF_DEFAULT_COUNT; }; \ No newline at end of file -- 2.39.5