]> source.dussan.org Git - tigervnc.git/commitdiff
Added PlayerOptions::setPF(). This function calculates all PixelFormat
authorgeorge82 <george82@3789f03b-4d11-0410-bbf8-ca57d06f2519>
Wed, 16 Mar 2005 16:07:47 +0000 (16:07 +0000)
committergeorge82 <george82@3789f03b-4d11-0410-bbf8-ca57d06f2519>
Wed, 16 Mar 2005 16:07:47 +0000 (16:07 +0000)
struct properties by rgb order, rm, gm, bm.

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@248 3789f03b-4d11-0410-bbf8-ca57d06f2519

rfbplayer/PlayerOptions.cxx
rfbplayer/PlayerOptions.h

index fc38c2de5361c993b96c2ef70958aab66a87ede0..aea0efea836fb03b513259d2152576704fae3057 100644 (file)
@@ -72,4 +72,71 @@ void PlayerOptions::writeDefaults() {
   loopPlayback = DEFAULT_LOOP_PLAYBACK;
   askPixelFormat = DEFAULT_ASK_PF; 
   autoStoreSettings = DEFAULT_STORE_SETTINGS;
+}
+
+void PlayerOptions::setPF(PixelFormat *newPF) {
+  memcpy(&PF, newPF, sizeof(PixelFormat));
+}
+
+bool PlayerOptions::setPF(int rgb_order, int rm, int gm, int bm, bool big_endian) {
+  PixelFormat newPF;
+  
+  // Calculate the colour bits per pixel
+  int bpp = rm + gm + bm;
+  if (bpp < 0) {
+    return false;
+  } else if (bpp <= 8 ) {
+    newPF.bpp = 8;
+  } else if (bpp <= 16) {
+    newPF.bpp = 16;
+  } else if (bpp <= 32) {
+    newPF.bpp = 32;
+  } else {
+    return false;
+  }
+  newPF.depth = bpp;
+
+  // Calculate the r, g and b bits shifts
+  switch (rgb_order) {
+  case RGB_ORDER:
+    newPF.redShift = gm + bm;
+    newPF.greenShift = bm;
+    newPF.blueShift = 0;
+    break;
+  case RBG_ORDER:
+    newPF.redShift = bm + gm;
+    newPF.blueShift = gm;
+    newPF.greenShift = 0;
+    break;
+  case GRB_ORDER:
+    newPF.greenShift = rm + bm;
+    newPF.redShift = bm;
+    newPF.blueShift = 0;
+    break;
+  case GBR_ORDER:
+    newPF.greenShift = bm + rm;
+    newPF.blueShift = rm;
+    newPF.redShift = 0;
+    break;
+  case BGR_ORDER:
+    newPF.blueShift = gm + rm;
+    newPF.greenShift = rm;
+    newPF.redShift = 0;
+    break;
+  case BRG_ORDER:
+    newPF.blueShift = rm + gm;
+    newPF.redShift = gm;
+    newPF.greenShift = 0;
+    break;
+  default:
+    return false;
+  }
+
+  newPF.trueColour = true;
+  newPF.bigEndian = big_endian;
+  newPF.redMax = (1 << rm) - 1;
+  newPF.greenMax = (1 << gm) - 1;
+  newPF.blueMax = (1 << bm) - 1;
+  setPF(&newPF);
+  return true;
 }
\ No newline at end of file
index 79930c2cc2336912bc415bb3d35dd093375cdfc7..2a56b3feed478a858be4e9ea016f7433c8905e62 100644 (file)
@@ -23,6 +23,8 @@
 
 #include <windows.h>
 
+#include <rfb/PixelFormat.h>
+
 #include <rfb_win32/registry.h>
 
 // Supported pixel formats
 #define PF_D24_RGB888 3
 #define PF_MODES 3
 
+// The R, G and B values order in the pixel
+#define RGB_ORDER 0
+#define RBG_ORDER 1
+#define GRB_ORDER 2
+#define GBR_ORDER 3
+#define BGR_ORDER 4
+#define BRG_ORDER 5
+
 // Default options values
 #define DEFAULT_PF PF_AUTO
 #define DEFAULT_INIT_TIME -1
 #define DEFAULT_FULL_SCREEN FALSE
 #define DEFAULT_STORE_SETTINGS FALSE
 
+using namespace rfb;
+
 class PlayerOptions {
 public:
   PlayerOptions();
   void readFromRegistry();
   void writeToRegistry();
   void writeDefaults();
+  void setPF(PixelFormat *pf);
+  bool setPF(int rgb_order, int rm, int gm, int bm, bool big_endian=false);
   long initTime;
   double playbackSpeed;
   bool autoPlay;
   bool fullScreen;
   long pixelFormat;
+  PixelFormat PF;
   bool acceptBell;
   bool acceptCutText;
   bool loopPlayback;