summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@collabora.com>2017-10-23 20:59:10 +0100
committerMichael Meeks <michael.meeks@collabora.com>2017-10-27 18:30:29 +0100
commit32c630f29ce6e0619de66cfbde3a8f24910f6269 (patch)
tree6a6bf69df93b96fc0076fb37f26f123ef433175d
parent6751a49bfc61f0f82d31cf6f1bbfe6821c784c52 (diff)
Deltas - collapse multiple rows to a single row.private/mmeeks/deltas
Change-Id: Ia2a617c2adbbc4e66b7c773c2280ec609aead16e
-rw-r--r--kit/Delta.hpp20
-rw-r--r--loleaflet/src/layer/tile/TileLayer.js32
-rw-r--r--test/DeltaTests.cpp24
3 files changed, 53 insertions, 23 deletions
diff --git a/kit/Delta.hpp b/kit/Delta.hpp
index 82f871bbf..e1890370c 100644
--- a/kit/Delta.hpp
+++ b/kit/Delta.hpp
@@ -64,6 +64,7 @@ class DeltaGenerator {
// How do the rows look against each other ?
size_t lastMatchOffset = 0;
+ size_t lastCopy = 0;
for (int y = 0; y < prev._height; ++y)
{
// Life is good where rows match:
@@ -78,12 +79,25 @@ class DeltaGenerator {
if (prev._rows[match].identical(cur._rows[y]))
{
// TODO: if offsets are >256 - use 16bits?
+ if (lastCopy > 0)
+ {
+ char cnt = output[lastCopy];
+ if (output[lastCopy + 1] + cnt == (char)(match) &&
+ output[lastCopy + 2] + cnt == (char)(y))
+ {
+ output[lastCopy]++;
+ matched = true;
+ continue;
+ }
+ }
- // hopefully find blocks of this.
lastMatchOffset = match - y;
- output.push_back('c'); // copy-row
+ output.push_back('c'); // copy-row
+ lastCopy = output.size();
+ output.push_back(1); // count
output.push_back(match); // src
- output.push_back(y); // dest
+ output.push_back(y); // dest
+
matched = true;
continue;
}
diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index 23c529a3d..a647eea22 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -1306,13 +1306,20 @@ L.TileLayer = L.GridLayer.extend({
// FIXME; can we operate directly on the image ?
var imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
- var oldData = new Uint8ClampedArray(imgData);
+ var oldData = new Uint8ClampedArray(imgData.data);
+
var delta = img;
var pixSize = canvas.width * canvas.height * 4;
var offset = 0;
console.log('Applying a delta of length ' + delta.length + ' pix size: ' + pixSize + '\nhex: ' + hex2string(delta));
+ // Green-tinge the old-Data ...
+// for (var i = 0; i < pixSize; ++i)
+// {
+// oldData[i*4 + 1] = 128;
+// }
+
// wipe to grey.
// for (var i = 0; i < pixSize * 4; ++i)
// {
@@ -1325,15 +1332,19 @@ L.TileLayer = L.GridLayer.extend({
switch (delta[i])
{
case 99: // 'c': // copy row
- var srcRow = delta[i+1];
- var destRow = delta[i+2]
- i+= 3;
- console.log('copy row ' + srcRow + ' to ' + destRow);
- var src = srcRow * canvas.width * 4;
- var dest = destRow * canvas.width * 4;
- for (var i = 0; i < canvas.width * 4; ++i)
+ var count = delta[i+1];
+ var srcRow = delta[i+2];
+ var destRow = delta[i+3];
+ i+= 4;
+ console.log('copy ' + count + ' row(s) ' + srcRow + ' to ' + destRow);
+ for (var cnt = 0; cnt < count; ++cnt)
{
- imgData.data[dest + i] = oldData[src + i];
+ var src = (srcRow + cnt) * canvas.width * 4;
+ var dest = (destRow + cnt) * canvas.width * 4;
+ for (var j = 0; j < canvas.width * 4; ++j)
+ {
+ imgData.data[dest + j] = oldData[src + j];
+ }
}
break;
case 100: // 'd': // new run
@@ -1351,7 +1362,8 @@ L.TileLayer = L.GridLayer.extend({
imgData.data[offset - 2] = 256; // debug - blue terminator
break;
default:
- console.log('Unknown code ' + delta[i]);
+ console.log('ERROR: Unknown code ' + delta[i] +
+ ' at offset ' + i);
i = delta.length;
break;
}
diff --git a/test/DeltaTests.cpp b/test/DeltaTests.cpp
index 705b7d3ea..66868523c 100644
--- a/test/DeltaTests.cpp
+++ b/test/DeltaTests.cpp
@@ -84,15 +84,19 @@ std::vector<char> DeltaTests::applyDelta(
{
case 'c': // copy row.
{
- int srcRow = (uint8_t)(delta[i+1]);
- int destRow = (uint8_t)(delta[i+2]);
-
- std::cout << "copy row " << srcRow << " to " << destRow << "\n";
- const char *src = &pixmap[width * srcRow * 4];
- char *dest = &output[width * destRow * 4];
- for (size_t j = 0; j < width * 4; ++j)
- *dest++ = *src++;
- i += 3;
+ int count = (uint8_t)(delta[i+1]);
+ int srcRow = (uint8_t)(delta[i+2]);
+ int destRow = (uint8_t)(delta[i+3]);
+
+// std::cout << "copy " << count <<" row(s) " << srcRow << " to " << destRow << "\n";
+ for (int cnt = 0; cnt < count; ++cnt)
+ {
+ const char *src = &pixmap[width * (srcRow + cnt) * 4];
+ char *dest = &output[width * (destRow + cnt) * 4];
+ for (size_t j = 0; j < width * 4; ++j)
+ *dest++ = *src++;
+ }
+ i += 4;
break;
}
case 'd': // new run
@@ -102,7 +106,7 @@ std::vector<char> DeltaTests::applyDelta(
size_t length = (uint8_t)(delta[i+3]);
i += 4;
- std::cout << "new " << length << " at " << destCol << ", " << destRow << "\n";
+// std::cout << "new " << length << " at " << destCol << ", " << destRow << "\n";
CPPUNIT_ASSERT(length <= width - destCol);
char *dest = &output[width * destRow * 4 + destCol * 4];