Ejemplo n.º 1
0
void MemBufferEntry::mergeDestroy()
{
  if (wrmask)
    chunkCopy(realAddr, getAddr(), wrmask);

  mePool.in(this);
}
Ejemplo n.º 2
0
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);
  }
}
Ejemplo n.º 3
0
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);
}