void Projectile::GetPaletteCopy(Animation *anim[], Palette *&pal) { if (pal) return; for (unsigned int i=0;i<MAX_ORIENT;i++) { if (anim[i]) { Sprite2D* spr = anim[i]->GetFrame(0); if (spr) { pal = spr->GetPalette()->Copy(); break; } } } }
void ScriptedAnimation::GetPaletteCopy() { if (palette) return; //it is not sure that the first position will have a resource in it //therefore the cycle for (unsigned int i=0;i<3*MAX_ORIENT;i++) { if (anims[i]) { Sprite2D* spr = anims[i]->GetFrame(0); if (spr) { palette = spr->GetPalette()->Copy(); //we need only one palette, so break here break; } } } }
Sprite2D* BAMImporter::GetFrameInternal(unsigned short findex, unsigned char mode, bool BAMsprite, const unsigned char* data, AnimationFactory* datasrc) { Sprite2D* spr = 0; if (BAMsprite) { bool RLECompressed = (frames[findex].FrameData & 0x80000000) == 0; assert(data); const unsigned char* framedata = data; framedata += (frames[findex].FrameData & 0x7FFFFFFF) - DataStart; if (RLECompressed) { spr = core->GetVideoDriver()->CreateSpriteBAM8( frames[findex].Width, frames[findex].Height, true, framedata, datasrc, palette, CompressedColorIndex); } else { spr = core->GetVideoDriver()->CreateSpriteBAM8( frames[findex].Width, frames[findex].Height, false, framedata, datasrc, palette, CompressedColorIndex ); } } else { void* pixels = GetFramePixels(findex); spr = core->GetVideoDriver()->CreateSprite8( frames[findex].Width, frames[findex].Height, 8, pixels, palette->col, true, 0 ); } spr->XPos = (ieWordSigned)frames[findex].XPos; spr->YPos = (ieWordSigned)frames[findex].YPos; if (mode == IE_SHADED) { // CHECKME: is this ever used? Should we modify the sprite's palette // without creating a local copy for this sprite? Palette* pal = spr->GetPalette(); pal->CreateShadedAlphaChannel(); pal->Release(); } return spr; }
/** Draws the Control on the Output Display */ void WorldMapControl::Draw(unsigned short XWin, unsigned short YWin) { WorldMap* worldmap = core->GetWorldMap(); if (!Width || !Height) { return; } if(!Changed) return; Changed = false; Video* video = core->GetVideoDriver(); Region r( XWin+XPos, YWin+YPos, Width, Height ); Region clipbackup; video->GetClipRect(clipbackup); video->SetClipRect(&r); video->BlitSprite( worldmap->GetMapMOS(), MAP_TO_SCREENX(0), MAP_TO_SCREENY(0), true, &r ); unsigned int i; unsigned int ec = worldmap->GetEntryCount(); for(i=0;i<ec;i++) { WMPAreaEntry *m = worldmap->GetEntry(i); if (! (m->GetAreaStatus() & WMP_ENTRY_VISIBLE)) continue; int xOffs = MAP_TO_SCREENX(m->X); int yOffs = MAP_TO_SCREENY(m->Y); Sprite2D* icon = m->GetMapIcon(worldmap->bam); if( icon ) { if (m == Area) { Palette *pal = icon->GetPalette(); icon->SetPalette(pal_selected); video->BlitSprite( icon, xOffs, yOffs, true, &r ); icon->SetPalette(pal); pal->Release(); } else { video->BlitSprite( icon, xOffs, yOffs, true, &r ); } video->FreeSprite( icon ); } if (AnimPicture && !strnicmp(m->AreaResRef, currentArea, 8) ) { video->BlitSprite( AnimPicture, xOffs, yOffs, true, &r ); } } // Draw WMP entry labels if (ftext==NULL) { video->SetClipRect(&clipbackup); return; } for(i=0;i<ec;i++) { WMPAreaEntry *m = worldmap->GetEntry(i); if (! (m->GetAreaStatus() & WMP_ENTRY_VISIBLE)) continue; Sprite2D *icon=m->GetMapIcon(worldmap->bam); int h=0,w=0,xpos=0,ypos=0; if (icon) { h=icon->Height; w=icon->Width; xpos=icon->XPos; ypos=icon->YPos; video->FreeSprite( icon ); } Region r2 = Region( MAP_TO_SCREENX(m->X-xpos), MAP_TO_SCREENY(m->Y-ypos), w, h ); if (!m->GetCaption()) continue; int tw = ftext->CalcStringWidth( (unsigned char*)m->GetCaption() ) + 5; int th = ftext->maxHeight; Palette* text_pal = pal_normal; if (Area == m) { text_pal = pal_selected; } else { if (! (m->GetAreaStatus() & WMP_ENTRY_VISITED)) { text_pal = pal_notvisited; } } ftext->Print( Region( r2.x + (r2.w - tw)/2, r2.y + r2.h, tw, th ), ( const unsigned char * ) m->GetCaption(), text_pal, 0, true ); } video->SetClipRect(&clipbackup); }