aboutsummaryrefslogtreecommitdiffstats
path: root/common/rfb/EncodeManagerBPP.cxx
diff options
context:
space:
mode:
authorPierre Ossman <ossman@cendio.se>2014-03-14 15:59:46 +0100
committerPierre Ossman <ossman@cendio.se>2014-07-14 16:03:42 +0200
commitc0397269fcab67e9acd4fdcbc29f24d79ed0ef39 (patch)
tree41ac251e5a595a37b832a61626723a89258bb018 /common/rfb/EncodeManagerBPP.cxx
parenta088f1ab3923482998174b9db8949cf06d0761af (diff)
downloadtigervnc-c0397269fcab67e9acd4fdcbc29f24d79ed0ef39.tar.gz
tigervnc-c0397269fcab67e9acd4fdcbc29f24d79ed0ef39.zip
Move image encoding logic into a central EncodeManager class
This allows us to apply a lot more server logic independently of which encoder is in use. Most of this class are things moved over from the Tight encoder.
Diffstat (limited to 'common/rfb/EncodeManagerBPP.cxx')
-rw-r--r--common/rfb/EncodeManagerBPP.cxx101
1 files changed, 101 insertions, 0 deletions
diff --git a/common/rfb/EncodeManagerBPP.cxx b/common/rfb/EncodeManagerBPP.cxx
new file mode 100644
index 00000000..f58466cb
--- /dev/null
+++ b/common/rfb/EncodeManagerBPP.cxx
@@ -0,0 +1,101 @@
+/* Copyright (C) 2000-2003 Constantin Kaplinsky. All Rights Reserved.
+ * Copyright (C) 2011 D. R. Commander. All Rights Reserved.
+ * Copyright 2014 Pierre Ossman for Cendio AB
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+#define CONCAT2(a,b) a##b
+#define CONCAT2E(a,b) CONCAT2(a,b)
+
+#define UBPP CONCAT2E(U,BPP)
+
+inline bool EncodeManager::checkSolidTile(const Rect& r,
+ rdr::UBPP colourValue,
+ const PixelBuffer *pb)
+{
+ int w, h;
+ const rdr::UBPP* buffer;
+ int stride, pad;
+
+ w = r.width();
+ h = r.height();
+
+ buffer = (const rdr::UBPP*)pb->getBuffer(r, &stride);
+ pad = stride - w;
+
+ while (h--) {
+ int w_ = w;
+ while (w_--) {
+ if (*buffer != colourValue)
+ return false;
+ buffer++;
+ }
+ buffer += pad;
+ }
+
+ return true;
+}
+
+inline bool EncodeManager::analyseRect(int width, int height,
+ const rdr::UBPP* buffer, int stride,
+ struct RectInfo *info, int maxColours)
+{
+ int pad;
+
+ rdr::UBPP colour;
+ int count;
+
+ rdr::UBPP c0, c1, ci = 0;
+ int i, n0, n1, ni;
+
+ info->rleRuns = 0;
+ info->palette.clear();
+
+ pad = stride - width;
+
+ // For efficiency, we only update the palette on changes in colour
+ colour = buffer[0];
+ count = 0;
+ while (height--) {
+ int w_ = width;
+ while (w_--) {
+ if (*buffer != colour) {
+ if (!info->palette.insert(colour, count))
+ return false;
+ if (info->palette.size() > maxColours)
+ return false;
+
+ // FIXME: This doesn't account for switching lines
+ info->rleRuns++;
+
+ colour = *buffer;
+ count = 0;
+ }
+ buffer++;
+ count++;
+ }
+ buffer += pad;
+ }
+
+ // Make sure the final pixels also get counted
+ if (!info->palette.insert(colour, count))
+ return false;
+ if (info->palette.size() > maxColours)
+ return false;
+
+ return true;
+}