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
diff --git a/rfbplayer/PixelFormatList.cxx b/rfbplayer/PixelFormatList.cxx
index 1cb0f69..b2d7ab2 100644
--- a/rfbplayer/PixelFormatList.cxx
+++ b/rfbplayer/PixelFormatList.cxx
@@ -20,6 +20,9 @@
#include <rfbplayer/PixelFormatList.h>
+using namespace rfb;
+using namespace rfb::win32;
+
PixelFormatList::PixelFormatList() {
PixelFormatListElement PFElem;
@@ -52,6 +55,8 @@
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::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::remove(int index) {
+ if (isDefaultPF(index))
+ rdr::Exception("PixelFormatList:can't remove the default pixel format");
PFList.erase(getIterator(index));
}
@@ -86,4 +96,64 @@
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 41ca0f2..f3b4e1f 100644
--- a/rfbplayer/PixelFormatList.h
+++ b/rfbplayer/PixelFormatList.h
@@ -26,6 +26,8 @@
#include <rfb/Exception.h>
#include <rfb/PixelFormat.h>
+#include <rfb_win32/registry.h>
+
// 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 @@
class PixelFormatListElement {
public:
+ PixelFormatListElement() {
+ format_name[0] = 0;
+ }
char format_name[256];
PixelFormat PF;
void setName(const char *name) {
@@ -59,13 +63,23 @@
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 <PixelFormatListElement>::iterator getIterator(int index);
list <PixelFormatListElement> PFList;
+ int PF_DEFAULT_COUNT;
};
\ No newline at end of file