diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2017-10-23 20:59:10 +0100 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2017-10-27 18:30:29 +0100 |
commit | 32c630f29ce6e0619de66cfbde3a8f24910f6269 (patch) | |
tree | 6a6bf69df93b96fc0076fb37f26f123ef433175d | |
parent | 6751a49bfc61f0f82d31cf6f1bbfe6821c784c52 (diff) |
Deltas - collapse multiple rows to a single row.private/mmeeks/deltas
Change-Id: Ia2a617c2adbbc4e66b7c773c2280ec609aead16e
-rw-r--r-- | kit/Delta.hpp | 20 | ||||
-rw-r--r-- | loleaflet/src/layer/tile/TileLayer.js | 32 | ||||
-rw-r--r-- | test/DeltaTests.cpp | 24 |
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]; |