diff options
author | Sebastian Geerken <devnull@localhost> | 2013-12-09 14:44:42 +0100 |
---|---|---|
committer | Sebastian Geerken <devnull@localhost> | 2013-12-09 14:44:42 +0100 |
commit | 01f697091153846bdffc73b3150ba37c763301cc (patch) | |
tree | 84773dff07a8498e7cc62695d89a6ecb29378a82 /dw/fltkimgbuf.cc | |
parent | ee66f4f97e38d11e68b9515b7043aa8ac6f63c74 (diff) | |
parent | 6c7572f8bd23064f96ba716e1ba8ba8a34847001 (diff) |
Merge (large!).
Diffstat (limited to 'dw/fltkimgbuf.cc')
-rw-r--r-- | dw/fltkimgbuf.cc | 67 |
1 files changed, 50 insertions, 17 deletions
diff --git a/dw/fltkimgbuf.cc b/dw/fltkimgbuf.cc index 81d2dc2d..d9d653ec 100644 --- a/dw/fltkimgbuf.cc +++ b/dw/fltkimgbuf.cc @@ -143,7 +143,7 @@ void FltkImgbuf::init (Type type, int width, int height, double gamma, scaledBuffers = new lout::container::typed::List <FltkImgbuf> (true); else scaledBuffers = NULL; - + if (!isRoot()) { // Scaling for (int row = 0; row < root->height; row++) { @@ -228,31 +228,33 @@ inline void FltkImgbuf::scaleRowBeautiful (int row, const core::byte *data) { int sr1 = scaledY (row); int sr2 = scaledY (row + 1); + bool allRootRows = false; - for (int sr = sr1; sr < sr2; sr++) - copiedRows->set (sr, true); + // Don't rescale rows! + if (copiedRows->get(sr1)) return; - if (height > root->height) + if (height > root->height) { scaleBuffer (data, root->width, 1, rawdata + sr1 * width * bpp, width, sr2 - sr1, bpp, gamma); - else { - assert (sr1 ==sr2 || sr1 + 1 == sr2); + // Mark scaled rows done + for (int sr = sr1; sr < sr2 || sr == sr1; sr++) + copiedRows->set (sr, true); + } else { + assert (sr1 == sr2 || sr1 + 1 == sr2); int row1 = backscaledY(sr1), row2 = backscaledY(sr1 + 1); - // Draw only when all original lines are retrieved (speed). - bool allRootRows = true; - for (int r = row1; allRootRows && r < row2; r++) - allRootRows = allRootRows && root->copiedRows->get(r); - - if (allRootRows) - // We have to access root->rawdata (which has to be up to - // date), since a larger area than the single row is accessed - // here. + // Check all the necessary root lines already arrived, + // a larger area than a single row may be accessed here. + for (int r=row1; (allRootRows=root->copiedRows->get(r)) && ++r < row2; ); + if (allRootRows) { scaleBuffer (root->rawdata + row1 * root->width * bpp, root->width, row2 - row1, rawdata + sr1 * width * bpp, width, 1, bpp, gamma); + // Mark scaled row done + copiedRows->set (sr1, true); + } } } @@ -295,7 +297,7 @@ inline void FltkImgbuf::scaleBuffer (const core::byte *src, int srcWidth, int yo1 = y * srcHeight / destHeight; int yo2 = lout::misc::max ((y + 1) * srcHeight / destHeight, yo1 + 1); int n = (xo2 - xo1) * (yo2 - yo1); - + int v[bpp]; for(int i = 0; i < bpp; i++) v[i] = 0; @@ -328,7 +330,7 @@ void FltkImgbuf::copyRow (int row, const core::byte *data) for (Iterator <FltkImgbuf> it = scaledBuffers->iterator(); it.hasNext(); ) { FltkImgbuf *sb = it.getNext (); - sb->scaleRow(row, data); + sb->scaleRow (row, data); } } } @@ -427,6 +429,37 @@ int FltkImgbuf::getRootHeight () return root ? root->height : height; } +core::Imgbuf *FltkImgbuf::createSimilarBuf (int width, int height) +{ + return new FltkImgbuf (type, width, height, gamma); +} + +void FltkImgbuf::copyTo (Imgbuf *dest, int xDestRoot, int yDestRoot, + int xSrc, int ySrc, int widthSrc, int heightSrc) +{ + FltkImgbuf *fDest = (FltkImgbuf*)dest; + assert (bpp == fDest->bpp); + + int xSrc2 = lout::misc::min (xSrc + widthSrc, fDest->width - xDestRoot); + int ySrc2 = lout::misc::min (ySrc + heightSrc, fDest->height - yDestRoot); + + //printf ("copying from (%d, %d), %d x %d to (%d, %d) (root) => " + // "xSrc2 = %d, ySrc2 = %d\n", + // xSrc, ySrc, widthSrc, heightSrc, xDestRoot, yDestRoot, + // xSrc2, ySrc2); + + for (int x = xSrc; x < xSrc2; x++) + for (int y = ySrc; y < ySrc2; y++) { + int iSrc = x + width * y; + int iDest = xDestRoot + x + fDest->width * (yDestRoot + y); + + //printf (" (%d, %d): %d -> %d\n", x, y, iSrc, iDest); + + for (int b = 0; b < bpp; b++) + fDest->rawdata[bpp * iDest + b] = rawdata[bpp * iSrc + b]; + } +} + void FltkImgbuf::ref () { refCount++; |