void MemBufferEntry::mergeDestroy() { if (wrmask) chunkCopy(realAddr, getAddr(), wrmask); mePool.in(this); }
void MemBufferEntry::initializeData(MemOpsType::iterator mit) { mit--; // skip itself MemBufferEntry *prevEntry = *mit; if (prevEntry->getChunkIndex() == getChunkIndex()) { // Copy from previous version I(prevEntry!=this); I(*(prevEntry->getVersionRef()) < *ver); initializeData(prevEntry); }else{ // Copy from memory chunkCopy(getAddr(), getRealAddr(), chunkDataMask); } }
void THChunkRenderer::decodeChunks(const unsigned char* data, int datalen, bool complex) { if(complex) { while(!_isDone() && datalen > 0) { unsigned char b = *data; --datalen; ++data; if(b == 0) { chunkFillToEndOfLine(0xFF); } else if(b < 0x40) { int amt = b; if(datalen < amt) amt = datalen; chunkCopy(amt, data); data += amt; datalen -= amt; } else if((b & 0xC0) == 0x80) { chunkFill(b - 0x80, 0xFF); } else { int amt; unsigned char colour = 0; if(b == 0xFF) { if(datalen < 2) { break; } amt = (int)data[0]; colour = data[1]; data += 2; datalen -= 2; } else { amt = b - 60 - (b & 0x80) / 2; if(datalen > 0) { colour = *data; ++data; --datalen; } } chunkFill(amt, colour); } } } else { while(!_isDone() && datalen > 0) { unsigned char b = *data; --datalen; ++data; if(b == 0) { chunkFillToEndOfLine(0xFF); } else if(b < 0x80) { int amt = b; if(datalen < amt) amt = datalen; chunkCopy(amt, data); data += amt; datalen -= amt; } else { chunkFill(0x100 - b, 0xFF); } } } chunkFinish(0xFF); }