[prev in list] [next in list] [prev in thread] [next in thread] 

List:       tigervnc-commits
Subject:    [Tigervnc-commits] SF.net SVN: tigervnc:[4851] branches/1_2/common/rfb
From:       dcommander () users ! sourceforge ! net
Date:       2012-02-13 3:49:29
Message-ID: E1Rwmuv-000887-4X () sfp-svn-2 ! v30 ! ch3 ! sourceforge ! com
[Download RAW message or body]

Revision: 4851
          http://tigervnc.svn.sourceforge.net/tigervnc/?rev=4851&view=rev
Author:   dcommander
Date:     2012-02-13 03:49:28 +0000 (Mon, 13 Feb 2012)
Log Message:
-----------
Prevent the Tight encoder (specifically packPixels*()) from accidentally using the \
framebuffer as an intermediate buffer.

Modified Paths:
--------------
    branches/1_2/common/rfb/TightEncoder.h
    branches/1_2/common/rfb/TransImageGetter.cxx
    branches/1_2/common/rfb/TransImageGetter.h
    branches/1_2/common/rfb/tightEncode.h

Property Changed:
----------------
    branches/1_2/common/rfb/tightEncode.h

Modified: branches/1_2/common/rfb/TightEncoder.h
===================================================================
--- branches/1_2/common/rfb/TightEncoder.h	2012-02-12 22:20:48 UTC (rev 4850)
+++ branches/1_2/common/rfb/TightEncoder.h	2012-02-13 03:49:28 UTC (rev 4851)
@@ -100,9 +100,9 @@
     int paletteInsert(rdr::U32 rgb, int numPixels, int bpp);
     void paletteReset(void);
 
-    void fastFillPalette8(rdr::U8 *data, int stride, const Rect &r);
-    void fastFillPalette16(rdr::U16 *data, int stride, const Rect &r);
-    void fastFillPalette32(rdr::U32 *data, int stride, const Rect &r);
+    void fastFillPalette8(const rdr::U8 *data, int stride, const Rect &r);
+    void fastFillPalette16(const rdr::U16 *data, int stride, const Rect &r);
+    void fastFillPalette32(const rdr::U32 *data, int stride, const Rect &r);
 
     void fillPalette8(rdr::U8 *data, int count);
     void fillPalette16(rdr::U16 *data, int count);

Modified: branches/1_2/common/rfb/TransImageGetter.cxx
===================================================================
--- branches/1_2/common/rfb/TransImageGetter.cxx	2012-02-12 22:20:48 UTC (rev 4850)
+++ branches/1_2/common/rfb/TransImageGetter.cxx	2012-02-13 03:49:28 UTC (rev 4851)
@@ -56,12 +56,12 @@
   PixelTransformer::setColourMapEntries(firstCol, nCols);
 }
 
-rdr::U8 *TransImageGetter::getRawPixelsRW(const Rect &r, int *stride)
+const rdr::U8 *TransImageGetter::getRawPixelsR(const Rect &r, int *stride)
 {
   if (!offset.equals(Point(0, 0)))
-    return pb->getPixelsRW(r.translate(offset.negate()), stride);
+    return pb->getPixelsR(r.translate(offset.negate()), stride);
   else
-    return pb->getPixelsRW(r, stride);
+    return pb->getPixelsR(r, stride);
 }
 
 void TransImageGetter::getImage(void* outPtr, const Rect& r, int outStride)

Modified: branches/1_2/common/rfb/TransImageGetter.h
===================================================================
--- branches/1_2/common/rfb/TransImageGetter.h	2012-02-12 22:20:48 UTC (rev 4850)
+++ branches/1_2/common/rfb/TransImageGetter.h	2012-02-13 03:49:28 UTC (rev 4851)
@@ -72,11 +72,11 @@
     // padding will be outStride-r.width() pixels).
     void getImage(void* outPtr, const Rect& r, int outStride=0);
 
-    // getRawPixelsRW() gets the given rectangle of data directly from the
+    // getRawPixelsR() gets the given rectangle of data directly from the
     // underlying PixelBuffer, bypassing the translation logic. Only use
     // this when doing something that's independent of the client's pixel
     // format.
-    rdr::U8 *getRawPixelsRW(const Rect &r, int *stride);
+    const rdr::U8 *getRawPixelsR(const Rect &r, int *stride);
 
     // setPixelBuffer() changes the pixel buffer to be used.  The new pixel
     // buffer MUST have the same pixel format as the old one - if not you

Modified: branches/1_2/common/rfb/tightEncode.h
===================================================================
--- branches/1_2/common/rfb/tightEncode.h	2012-02-12 22:20:48 UTC (rev 4850)
+++ branches/1_2/common/rfb/tightEncode.h	2012-02-13 03:49:28 UTC (rev 4851)
@@ -189,9 +189,10 @@
 
 void TIGHT_ENCODE (const Rect& r, rdr::OutStream *os, bool forceSolid)
 {
-  int stride = r.width();
+  int stride;
   rdr::U32 solidColor;
-  PIXEL_T *pixels = (PIXEL_T *)ig->getRawPixelsRW(r, &stride);
+  const PIXEL_T *rawPixels = (const PIXEL_T *)ig->getRawPixelsR(r, &stride);
+  PIXEL_T *pixels = NULL;
   bool grayScaleJPEG = (jpegSubsampling == SUBSAMP_GRAY && jpegQuality != -1);
 
 #if (BPP == 32)
@@ -201,34 +202,38 @@
 #endif
 
   if (forceSolid) {
+    // Subrectangle has already been determined to be solid.
     palNumColors = 1;
-    if (ig->willTransform()) {
-      ig->translatePixels(pixels, &solidColor, 1);
-      pixels = (PIXEL_T *)&solidColor;
-    }
-  }
-  else {
+    ig->translatePixels(rawPixels, &solidColor, 1);
+    pixels = (PIXEL_T *)&solidColor;
+  } else {
+    // Analyze subrectangle's colors to determine best encoding method.
     palMaxColors = r.area() / pconf->idxMaxColorsDivisor;
-    if (jpegQuality != -1) palMaxColors = pconf->palMaxColorsWithJPEG;
-    if (palMaxColors < 2 && r.area() >= pconf->monoMinRectSize) {
+    if (jpegQuality != -1)
+      palMaxColors = pconf->palMaxColorsWithJPEG;
+    if (palMaxColors < 2 && r.area() >= pconf->monoMinRectSize)
       palMaxColors = 2;
-    }
 
     if (clientpf.equal(serverpf) && clientpf.bpp >= 16) {
-      // This is so we can avoid translating the pixels when compressing
-      // with JPEG, since it is unnecessary
+      // Count the colors in the raw buffer, so we can avoid unnecessary pixel
+      // translation when encoding with JPEG.
       if (grayScaleJPEG) palNumColors = 0;
-      else FAST_FILL_PALETTE(pixels, stride, r);
+      else FAST_FILL_PALETTE(rawPixels, stride, r);
+
+      // JPEG can read from the raw buffer, but for the other methods, we need
+      // to translate the raw pixels into an intermediate buffer.
       if(palNumColors != 0 || jpegQuality == -1) {
         pixels = (PIXEL_T *)writer->getImageBuf(r.area());
         stride = r.width();
         ig->getImage(pixels, r);
       }
-    }
-    else {
+    } else {
+      // Pixel translation will be required, so create an intermediate buffer,
+      // translate the raw pixels into it, and count its colors.
       pixels = (PIXEL_T *)writer->getImageBuf(r.area());
       stride = r.width();
       ig->getImage(pixels, r);
+
       if (grayScaleJPEG) palNumColors = 0;
       else FILL_PALETTE(pixels, r.area());
     }
@@ -239,7 +244,10 @@
     // Truecolor image
 #if (BPP != 8)
     if (jpegQuality != -1) {
-      ENCODE_JPEG_RECT(pixels, stride, r, os);
+      if (pixels)
+        ENCODE_JPEG_RECT(pixels, stride, r, os);
+      else
+        ENCODE_JPEG_RECT((PIXEL_T *)rawPixels, stride, r, os);
       break;
     }
 #endif
@@ -458,7 +466,7 @@
   }
 }
 
-void FAST_FILL_PALETTE (PIXEL_T *data, int stride, const Rect& r)
+void FAST_FILL_PALETTE (const PIXEL_T *data, int stride, const Rect& r)
 {
 }
 
@@ -523,12 +531,13 @@
   paletteInsert (ci, (rdr::U32)ni, BPP);
 }
 
-void FAST_FILL_PALETTE (PIXEL_T *data, int stride, const Rect& r)
+void FAST_FILL_PALETTE (const PIXEL_T *data, int stride, const Rect& r)
 {
   PIXEL_T c0, c1, ci = 0, mask, c0t, c1t, cit;
   int n0, n1, ni;
   int w = r.width(), h = r.height();
-  PIXEL_T *rowptr, *colptr, *rowptr2, *colptr2, *dataend = &data[stride * h];
+  const PIXEL_T *rowptr, *colptr, *rowptr2, *colptr2,
+    *dataend = &data[stride * h];
   bool willTransform = ig->willTransform();
 
   if (willTransform) {
@@ -636,11 +645,12 @@
 
 bool CHECK_SOLID_TILE(Rect& r, rdr::U32 *colorPtr, bool needSameColor)
 {
-  PIXEL_T *buf, colorValue;
+  const PIXEL_T *buf;
+  PIXEL_T colorValue;
   int w = r.width(), h = r.height();
 
   int stride = w;
-  buf = (PIXEL_T *)ig->getRawPixelsRW(r, &stride);
+  buf = (const PIXEL_T *)ig->getRawPixelsR(r, &stride);
 
   colorValue = *buf;
   if (needSameColor && (rdr::U32)colorValue != *colorPtr)
@@ -648,7 +658,7 @@
 
   int bufPad = stride - w;
   while (h > 0) {
-    PIXEL_T *bufEndOfRow = buf + w;
+    const PIXEL_T *bufEndOfRow = buf + w;
     while (buf < bufEndOfRow) {
       if (colorValue != *(buf++))
         return false;


Property changes on: branches/1_2/common/rfb/tightEncode.h
___________________________________________________________________
Modified: svn:mergeinfo
   - /branches/1_1/common/rfb/tightEncode.h:4340,4342-4359,4361,4377,4396-4397,4400,4406,4408,4464,4486,4497,4499-4500,4536,4565,4616-4622
                
/branches/unified_buildsys/common/rfb/tightEncode.h:3892-3898
   + /branches/1_1/common/rfb/tightEncode.h:4340,4342-4359,4361,4377,4396-4397,4400,4406,4408,4464,4486,4497,4499-4500,4536,4565,4616-4622
                
/branches/unified_buildsys/common/rfb/tightEncode.h:3892-3898
/trunk/common/rfb/tightEncode.h:4841

This was sent by the SourceForge.net collaborative development platform, the world's \
largest Open Source development site.


------------------------------------------------------------------------------
Try before you buy = See our experts in action!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-dev2
_______________________________________________
Tigervnc-commits mailing list
Tigervnc-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tigervnc-commits


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic