Some thoughts - we record some info on each scanline - mostly about the new edges that are added. Perhaps we could keep deltas of how many edges come and go per scanline and then sum them up at the start to figure out if any scanline has a lot of crossings?

One slight optimization in the non-tileflag version of CopyRLE.

for (i, from, to) {
    int delta;
    if ((delta = alphaRow[i]) != 0) {
        cache.add(val);
        val += delta;
        // Range Check only needed here?
        runLen = 1;
        alphaRow[i] = 0;  // Optional - avoids clear later?
    } else {
        runLen++;
    }
}

It avoids prev and having to add "prev + delta" for the very common case of delta == 0.

Also, RLE tends to be more useful if the index of the values is larger than your data storage unit - which is why Pisces used RLE when it was on embedded since they were using bytes to store the alpha caches, but shapes could be larger than 256 units. You seem to be using integers which means there is no run long enough to require having to break it up into multiple segments, you can just store the horizontal index of the next change of value and its value. This also means you don't have to sum up counts to figure out where a partial row starts, you just scan for the first index that is in range (remembering the previous alpha value to be used for the beginning of the range)...

                        ...jim

Reply via email to