/** Draws the Control on the Output Display */ void Button::DrawInternal(Region& rgn) { Video * video = core->GetVideoDriver(); // Button image if (!( Flags & IE_GUI_BUTTON_NO_IMAGE )) { Sprite2D* Image = NULL; switch (State) { case IE_GUI_BUTTON_UNPRESSED: case IE_GUI_BUTTON_LOCKED: case IE_GUI_BUTTON_LOCKED_PRESSED: Image = buttonImages[BUTTON_IMAGE_UNPRESSED]; break; case IE_GUI_BUTTON_FAKEPRESSED: case IE_GUI_BUTTON_PRESSED: Image = buttonImages[BUTTON_IMAGE_PRESSED]; break; case IE_GUI_BUTTON_SELECTED: Image = buttonImages[BUTTON_IMAGE_SELECTED]; break; case IE_GUI_BUTTON_DISABLED: case IE_GUI_BUTTON_FAKEDISABLED: Image = buttonImages[BUTTON_IMAGE_DISABLED]; break; } if (!Image) { Image = buttonImages[BUTTON_IMAGE_UNPRESSED]; } if (Image) { // FIXME: maybe it's useless... int xOffs = ( Width / 2 ) - ( Image->Width / 2 ); int yOffs = ( Height / 2 ) - ( Image->Height / 2 ); video->BlitSprite( Image, rgn.x + xOffs, rgn.y + yOffs, true ); } } if (State == IE_GUI_BUTTON_PRESSED) { //shift the writing/border a bit rgn.x += PushOffset.x; rgn.y += PushOffset.y; } // Button picture if (AnimPicture) { int xOffs = ( Width / 2 ) - ( AnimPicture->Width / 2 ); int yOffs = ( Height / 2 ) - ( AnimPicture->Height / 2 ); Region r( rgn.x + xOffs, rgn.y + yOffs, (int)(AnimPicture->Width * Clipping), AnimPicture->Height ); if (Flags & IE_GUI_BUTTON_CENTER_PICTURES) { video->BlitSprite( AnimPicture, rgn.x + xOffs + AnimPicture->XPos, rgn.y + yOffs + AnimPicture->YPos, true, &r ); } else { video->BlitSprite( AnimPicture, rgn.x + xOffs, rgn.y + yOffs, true, &r ); } } // Button picture int picXPos = 0, picYPos = 0; if (Picture && (Flags & IE_GUI_BUTTON_PICTURE) ) { // Picture is drawn centered picXPos = ( rgn.w / 2 ) - ( Picture->Width / 2 ) + rgn.x; picYPos = ( rgn.h / 2 ) - ( Picture->Height / 2 ) + rgn.y; if (Flags & IE_GUI_BUTTON_HORIZONTAL) { picXPos += Picture->XPos; picYPos += Picture->YPos; // Clipping: 0 = overlay over full button, 1 = no overlay int overlayHeight = Picture->Height * (1.0 - Clipping); if (overlayHeight < 0) overlayHeight = 0; if (overlayHeight >= Picture->Height) overlayHeight = Picture->Height; int buttonHeight = Picture->Height - overlayHeight; Region rb = Region(picXPos, picYPos, Picture->Width, buttonHeight); Region ro = Region(picXPos, picYPos + buttonHeight, Picture->Width, overlayHeight); video->BlitSprite( Picture, picXPos, picYPos, true, &rb ); // TODO: Add an option to add BLIT_GREY to the flags video->BlitGameSprite( Picture, picXPos, picYPos, BLIT_TINTED, SourceRGB, 0, 0, &ro, true); // do NOT uncomment this, you can't change Changed or invalidate things from // the middle of Window::DrawWindow() -- it needs moving to somewhere else //CloseUpColor(); } else { Region r( picXPos, picYPos, (int)(Picture->Width * Clipping), Picture->Height ); video->BlitSprite( Picture, picXPos + Picture->XPos, picYPos + Picture->YPos, true, &r ); } } // Composite pictures (paperdolls/description icons) if (!PictureList.empty() && (Flags & IE_GUI_BUTTON_PICTURE) ) { std::list<Sprite2D*>::iterator iter = PictureList.begin(); int xOffs = 0, yOffs = 0; if (Flags & IE_GUI_BUTTON_CENTER_PICTURES) { // Center the hotspots of all pictures xOffs = Width/2; yOffs = Height/2; } else if (Flags & IE_GUI_BUTTON_BG1_PAPERDOLL) { // Display as-is xOffs = 0; yOffs = 0; } else { // Center the first picture, and align the rest to that xOffs = Width/2 - (*iter)->Width/2 + (*iter)->XPos; yOffs = Height/2 - (*iter)->Height/2 + (*iter)->YPos; } for (; iter != PictureList.end(); ++iter) { video->BlitSprite( *iter, rgn.x + xOffs, rgn.y + yOffs, true ); } } // Button label if (hasText && ! ( Flags & IE_GUI_BUTTON_NO_TEXT )) { Palette* ppoi = normal_palette; int align = 0; if (State == IE_GUI_BUTTON_DISABLED) ppoi = disabled_palette; // FIXME: hopefully there's no button which sinks when selected // AND has text label //else if (State == IE_GUI_BUTTON_PRESSED || State == IE_GUI_BUTTON_SELECTED) { if (Flags & IE_GUI_BUTTON_ALIGN_LEFT) align |= IE_FONT_ALIGN_LEFT; else if (Flags & IE_GUI_BUTTON_ALIGN_RIGHT) align |= IE_FONT_ALIGN_RIGHT; else align |= IE_FONT_ALIGN_CENTER; if (Flags & IE_GUI_BUTTON_ALIGN_TOP) align |= IE_FONT_ALIGN_TOP; else if (Flags & IE_GUI_BUTTON_ALIGN_BOTTOM) align |= IE_FONT_ALIGN_BOTTOM; else align |= IE_FONT_ALIGN_MIDDLE; if (! (Flags & IE_GUI_BUTTON_MULTILINE)) { align |= IE_FONT_SINGLE_LINE; } Region r; if (Picture && (Flags & IE_GUI_BUTTON_PORTRAIT) == IE_GUI_BUTTON_PORTRAIT) { // constrain the label (status icons) to the picture bounds // FIXME: we are subtracting IE_FONT_PADDING because Font indents 5px, but we dont want that here r = Region(picXPos - IE_FONT_PADDING, picYPos + IE_FONT_PADDING, Picture->Width + IE_FONT_PADDING, Picture->Height); } else { r = Region( rgn.x, rgn.y, rgn.w - 2, rgn.h - 2); } font->Print( r, ( unsigned char * ) Text, ppoi, (ieByte) align, true ); } if (! (Flags&IE_GUI_BUTTON_NO_IMAGE)) { for (int i = 0; i < MAX_NUM_BORDERS; i++) { ButtonBorder *fr = &borders[i]; if (! fr->enabled) continue; Region r = Region( rgn.x + fr->dx1, rgn.y + fr->dy1, rgn.w - (fr->dx1 + fr->dx2 + 1), rgn.h - (fr->dy1 + fr->dy2 + 1) ); video->DrawRect( r, fr->color, fr->filled ); } } }
//it is not sure if we need tint at all bool ScriptedAnimation::Draw(const Region &screen, const Point &Pos, const Color &p_tint, Map *area, int dither, int orientation, int height) { if (FaceTarget) { SetOrientation(orientation); } // not sure if (twin) { twin->Draw(screen, Pos, p_tint, area, dither, -1, height); } Video *video = core->GetVideoDriver(); Sprite2D* frame; if (HandlePhase(frame)) { //expired return true; } //delayed if (justCreated) { return false; } ieDword flag = BLIT_TRANSSHADOW; //transferring flags to SDLdriver, this will have to be consolidated later if (Transparency & IE_VVC_TRANSPARENT) { flag |= BLIT_HALFTRANS; } Color tint = Tint; //darken, greyscale, red tint are probably not needed if the global tint works //these are used in the original engine to implement weather/daylight effects //on the other hand if (Transparency & IE_VVC_GREYSCALE) { flag |= BLIT_GREY; } if (Transparency & IE_VVC_SEPIA) { flag |= BLIT_SEPIA; } if (Transparency & BLIT_TINTED) { flag |= BLIT_TINTED; } if ((Transparency & IE_VVC_TINT)==IE_VVC_TINT) { tint = p_tint; } int cx = Pos.x + XPos; int cy = Pos.y - ZPos + YPos; if (SequenceFlags&IE_VVC_HEIGHT) cy-=height; if( SequenceFlags&IE_VVC_NOCOVER) { if (cover) SetSpriteCover(NULL); } else { if (!cover || (Dither!=dither) || (!cover->Covers(cx, cy, frame->XPos, frame->YPos, frame->Width, frame->Height)) ) { Dither = dither; Animation *anim = anims[Phase*MAX_ORIENT+Orientation]; SetSpriteCover(area->BuildSpriteCover(cx, cy, -anim->animArea.x, -anim->animArea.y, anim->animArea.w, anim->animArea.h, dither) ); } assert(cover->Covers(cx, cy, frame->XPos, frame->YPos, frame->Width, frame->Height)); } video->BlitGameSprite( frame, cx + screen.x, cy + screen.y, flag, tint, cover, palette, &screen); if (light) { video->BlitGameSprite( light, cx + screen.x, cy + screen.y, 0, tint, NULL, NULL, &screen); } return false; }