]> source.dussan.org Git - tigervnc.git/commitdiff
Finished PixelFormatList class implementation.
authorgeorge82 <george82@3789f03b-4d11-0410-bbf8-ca57d06f2519>
Sat, 19 Mar 2005 08:45:45 +0000 (08:45 +0000)
committergeorge82 <george82@3789f03b-4d11-0410-bbf8-ca57d06f2519>
Sat, 19 Mar 2005 08:45:45 +0000 (08:45 +0000)
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
rfbplayer/PixelFormatList.h

index 1cb0f690a709a066257e82c4b242d4ad7acb0b59..b2d7ab22e4e50290f642dcac0dd127059443531a 100644 (file)
@@ -20,6 +20,9 @@
 
 #include <rfbplayer/PixelFormatList.h>
 
+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 <PixelFormatListElement>::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
index 41ca0f2287891b3881f8bb467745a4720cf63eef..f3b4e1fa9b13b243a99ec7a43fa9db0c913f7eb2 100644 (file)
@@ -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 @@ 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 <PixelFormatListElement>::iterator getIterator(int index);
   list <PixelFormatListElement> PFList;
+  int PF_DEFAULT_COUNT;
 };
\ No newline at end of file