void DriverTexture::setData(const unsigned char* memory) { if(!memory) return; if(!data) { if(usesPalette()) data = new unsigned char[256*256]; else data = new unsigned char[256*256*2]; } memcpy(data,memory,(usesPalette() ? 256*256 : 256*256*2)); };
void DriverTexture::setScanLine(int y, const unsigned char* scanLineData) { if(!scanLineData || y < 0 || y > 255) return; if(!data) { if(usesPalette()) data = new unsigned char[256*256]; else data = new unsigned char[256*256*2]; } if(usesPalette()) memcpy(data+256*y,scanLineData,256); else memcpy(data+256*2*y,scanLineData,256*2); };
DriverTexture::DriverTexture(unsigned short newFlags, short newCarnum) { flags = newFlags; carnum = newCarnum; if(usesPalette()) data = new unsigned char[256*256]; else data = new unsigned char[256*256*2]; };
const unsigned char* DriverTexture::getScanLine(int i) const { if(i < 0 || i > 255) return NULL; if(usesPalette()) return data+256*i; return data+512*i; };
void DriverTexture::setFlags(unsigned short newFlags) { bool usedPalette = usesPalette(); flags = newFlags; if(data) { if(usedPalette != usesPalette()) { delete[] data; data = NULL; } } if(!data) { if(usesPalette()) data = new unsigned char[256*256]; else data = new unsigned char[256*256*2]; } };
void DriverTexture::setTruecolor(bool isTruecolor) { if(isTruecolor && usesPalette()) { if(data) delete[] data; data = new unsigned char[256*256*2]; flags &= ~16; } else if(!isTruecolor && !usesPalette()) { if(data) delete[] data; data = new unsigned char[256*256]; flags |= 16; } if(!data) { if(usesPalette()) data = new unsigned char[256*256]; else data = new unsigned char[256*256*2]; } };
DriverTexture::DriverTexture(const DriverTexture& other) { flags = other.flags; carnum = other.carnum; if(usesPalette()) { data = new unsigned char[256*256]; memcpy(data, other.getData(), 256*256*sizeof(unsigned char)); } else { data = new unsigned char[256*256*2]; memcpy(data, other.getData(), 256*256*2*sizeof(unsigned char)); } };
bool TempSpriteHandler::load(int16 dataVar, int32 size, int32 offset) { if (isDummy(size)) return true; // Sprite available? if (!_sprite) return false; // Sprite requested? if (!isSprite(size)) return false; // Index sane? int index = getIndex(size); if ((index < 0) || (index >= Draw::kSpriteCount)) return false; SurfacePtr sprite = _vm->_draw->_spritesArray[index]; // Target sprite exists? if (!sprite) return false; // Load the sprite if (!_sprite->writeSprite(*sprite)) return false; // Handle palette if (usesPalette(size)) { if (!_sprite->writePalette((byte *)_vm->_global->_pPaletteDesc->vgaPal)) return false; _vm->_video->setFullPalette(_vm->_global->_pPaletteDesc); } if (index == 21) { // We wrote into the backbuffer, blit _vm->_draw->forceBlit(); _vm->_video->retrace(); } else if (index == 20) // We wrote into the frontbuffer, retrace _vm->_video->retrace(); return true; }
bool TempSpriteHandler::save(int16 dataVar, int32 size, int32 offset) { if (isDummy(size)) return true; SurfacePtr sprite = createSprite(dataVar, size, offset); if (!sprite) return false; // Save the sprite if (!_sprite->readSprite(*sprite)) return false; // Handle palette if (usesPalette(size)) if (!_sprite->readPalette((const byte *)_vm->_global->_pPaletteDesc->vgaPal)) return false; return true; }
int DriverTexture::load(IOHandle handle, IOCallbacks* callbacks) { cleanup(); if(!handle || !callbacks) return -1; callbacks->read(&flags,2,1,handle); callbacks->read(&carnum,2,1,handle); if(usesPalette()) { data = new unsigned char[256*256]; callbacks->read(data,1,256*256,handle); } else { data = new unsigned char[256*256*2]; callbacks->read(data,1,2*256*256,handle); } return getRequiredSize(); };
int DriverTexture::save(IOHandle handle, IOCallbacks* callbacks) { if(!handle || !callbacks) return 1; callbacks->write(&flags,2,1,handle); callbacks->write(&carnum,2,1,handle); if(usesPalette()) { if(data) { callbacks->write(data,256*256,1,handle); } else { data = new unsigned char[256*256]; memset(data,0,256*256); callbacks->write(data,256*256,1,handle); delete[] data; data = NULL; } } else { if(data) { callbacks->write(data,256*256*2,1,handle); } else { data = new unsigned char[256*256*2]; memset(data,0,256*256*2); callbacks->write(data,256*256*2,1,handle); delete[] data; data = NULL; } } return 0; };
unsigned int DriverTexture::getRequiredSize() { if(usesPalette()) return 4+256*256; return 4+256*256*2; };