HRESULT CVidSubtitler::Display() { if(m_ShowSubtitle) { CBFont* font = Game->m_VideoFont?Game->m_VideoFont:Game->m_SystemFont; int Height = font->GetTextHeight((BYTE*)m_Subtitles[m_CurrentSubtitle]->m_Text, Game->m_Renderer->m_Width); font->DrawText((BYTE*)m_Subtitles[m_CurrentSubtitle]->m_Text, 0, Game->m_Renderer->m_Height-Height-5, Game->m_Renderer->m_Width, TAL_CENTER); } return S_OK; }
HRESULT CAdItem::Display(int X, int Y) { int Width = 0; if(m_CurrentSprite){ RECT rc; m_CurrentSprite->GetBoundingRect(&rc, 0, 0); Width = rc.right - rc.left; } m_PosX = X + Width/2; m_PosY = Y; HRESULT ret; if(m_CurrentSprite) ret = m_CurrentSprite->Draw(X, Y, this, 100, 100, m_AlphaColor); else ret = S_OK; if(m_DisplayAmount){ int AmountX = X; int AmountY = Y + m_AmountOffsetY; if(m_AmountAlign==TAL_RIGHT){ Width -= m_AmountOffsetX; AmountX -= m_AmountOffsetX; } AmountX += m_AmountOffsetX; CBFont* Font = m_Font?m_Font:Game->m_SystemFont; if(Font){ if(m_AmountString) Font->DrawText((BYTE*)m_AmountString, AmountX, AmountY, Width, m_AmountAlign); else{ char Str[256]; sprintf(Str, "%d", m_Amount); Font->DrawText((BYTE*)Str, AmountX, AmountY, Width, m_AmountAlign); } } } return ret; }
HRESULT CUIButton::Display(int OffsetX, int OffsetY) { if (!m_Visible) return S_OK; CUITiledImage *back = NULL; CBSprite *image = NULL; CBFont *font = 0; //RECT rect; //CBPlatform::SetRect(&rect, OffsetX + m_PosX, OffsetY + m_PosY, OffsetX+m_PosX+m_Width, OffsetY+m_PosY+m_Height); //m_Hover = (!m_Disable && CBPlatform::PtInRect(&rect, Game->m_MousePos)!=FALSE); m_Hover = (!m_Disable && Game->m_ActiveObject == this && (Game->m_Interactive || Game->m_State == GAME_SEMI_FROZEN)); if ((m_Press && m_Hover && !Game->m_MouseLeftDown) || m_OneTimePress && CBPlatform::GetTime() - m_OneTimePressTime >= 100) Press(); if (m_Disable) { if (m_BackDisable) back = m_BackDisable; if (m_ImageDisable) image = m_ImageDisable; if (m_Text && m_FontDisable) font = m_FontDisable; } else if (m_Press || m_OneTimePress || m_StayPressed) { if (m_BackPress) back = m_BackPress; if (m_ImagePress) image = m_ImagePress; if (m_Text && m_FontPress) font = m_FontPress; } else if (m_Hover) { if (m_BackHover) back = m_BackHover; if (m_ImageHover) image = m_ImageHover; if (m_Text && m_FontHover) font = m_FontHover; } else if (m_CanFocus && IsFocused()) { if (m_BackFocus) back = m_BackFocus; if (m_ImageFocus) image = m_ImageFocus; if (m_Text && m_FontFocus) font = m_FontFocus; } if (!back && m_Back) back = m_Back; if (!image && m_Image) image = m_Image; if (m_Text && !font) { if (m_Font) font = m_Font; else font = Game->m_SystemFont; } int ImageX = OffsetX + m_PosX; int ImageY = OffsetY + m_PosY; if (image && m_CenterImage) { RECT rc; image->GetBoundingRect(&rc, 0, 0); ImageX += (m_Width - (rc.right - rc.left)) / 2; ImageY += (m_Height - (rc.bottom - rc.top)) / 2; } if (back) back->Display(OffsetX + m_PosX, OffsetY + m_PosY, m_Width, m_Height); //if(image) image->Draw(ImageX +((m_Press||m_OneTimePress)&&back?1:0), ImageY +((m_Press||m_OneTimePress)&&back?1:0), NULL); if (image) image->Draw(ImageX + ((m_Press || m_OneTimePress) && back ? 1 : 0), ImageY + ((m_Press || m_OneTimePress) && back ? 1 : 0), m_PixelPerfect ? this : NULL); if (font && m_Text) { int text_offset = (m_Height - font->GetTextHeight((byte *)m_Text, m_Width)) / 2; font->DrawText((byte *)m_Text, OffsetX + m_PosX + ((m_Press || m_OneTimePress) ? 1 : 0), OffsetY + m_PosY + text_offset + ((m_Press || m_OneTimePress) ? 1 : 0), m_Width, m_Align); } if (!m_PixelPerfect || !m_Image) Game->m_Renderer->m_RectList.Add(new CBActiveRect(Game, this, NULL, OffsetX + m_PosX, OffsetY + m_PosY, m_Width, m_Height, 100, 100, false)); // reset unused sprites if (m_Image && m_Image != image) m_Image->Reset(); if (m_ImageDisable && m_ImageDisable != image) m_ImageDisable->Reset(); if (m_ImageFocus && m_ImageFocus != image) m_ImageFocus->Reset(); if (m_ImagePress && m_ImagePress != image) m_ImagePress->Reset(); if (m_ImageHover && m_ImageHover != image) m_ImageHover->Reset(); m_Press = m_Hover && Game->m_MouseLeftDown && Game->m_CapturedObject == this; return S_OK; }
HRESULT CUIWindow::Display(int OffsetX, int OffsetY) { // go exclusive if(m_Mode==WINDOW_EXCLUSIVE || m_Mode==WINDOW_SYSTEM_EXCLUSIVE) { if(!m_ShieldWindow) m_ShieldWindow = new CUIWindow(Game); if(m_ShieldWindow) { m_ShieldWindow->m_PosX = m_ShieldWindow->m_PosY = 0; m_ShieldWindow->m_Width = Game->m_Renderer->m_Width; m_ShieldWindow->m_Height = Game->m_Renderer->m_Height; m_ShieldWindow->Display(); } } else if(m_IsMenu) { if(!m_ShieldButton) { m_ShieldButton = new CUIButton(Game); m_ShieldButton->SetName("close"); m_ShieldButton->SetListener(this, m_ShieldButton, 0); m_ShieldButton->m_Parent = this; } if(m_ShieldButton) { m_ShieldButton->m_PosX = m_ShieldButton->m_PosY = 0; m_ShieldButton->m_Width = Game->m_Renderer->m_Width; m_ShieldButton->m_Height = Game->m_Renderer->m_Height; m_ShieldButton->Display(); } } if(!m_Visible) return S_OK; if(m_FadeBackground) Game->m_Renderer->FadeToColor(m_FadeColor); if(m_Dragging) { m_PosX += (Game->m_MousePos.x - m_DragFrom.x); m_PosY += (Game->m_MousePos.y - m_DragFrom.y); m_DragFrom.x = Game->m_MousePos.x; m_DragFrom.y = Game->m_MousePos.y; } if(!m_FocusedWidget || (!m_FocusedWidget->m_CanFocus || m_FocusedWidget->m_Disable || !m_FocusedWidget->m_Visible)) { MoveFocus(); } bool PopViewport = false; if(m_ClipContents) { if(!m_Viewport) m_Viewport = new CBViewport(Game); if(m_Viewport) { m_Viewport->SetRect(m_PosX+OffsetX, m_PosY+OffsetY, m_PosX+m_Width+OffsetX, m_PosY+m_Height+OffsetY); Game->PushViewport(m_Viewport); PopViewport = true; } } CUITiledImage* back = m_Back; CBSprite* image = m_Image; CBFont* font = m_Font; if(!IsFocused()) { if(m_BackInactive) back = m_BackInactive; if(m_ImageInactive) image = m_ImageInactive; if(m_FontInactive) font = m_FontInactive; } if(m_AlphaColor!=0) Game->m_Renderer->m_ForceAlphaColor = m_AlphaColor; if(back) { back->Display(m_PosX + OffsetX, m_PosY + OffsetY, m_Width, m_Height); } if(image) { image->Draw(m_PosX + OffsetX, m_PosY + OffsetY, m_Transparent?NULL:this); } if(!CBPlatform::IsRectEmpty(&m_TitleRect) && font && m_Text) { font->DrawText((BYTE*)m_Text, m_PosX+OffsetX+m_TitleRect.left, m_PosY+OffsetY+m_TitleRect.top, m_TitleRect.right-m_TitleRect.left, m_TitleAlign, m_TitleRect.bottom-m_TitleRect.top); } if(!m_Transparent && !image) Game->m_Renderer->m_RectList.Add(new CBActiveRect(Game, this, NULL, m_PosX+OffsetX, m_PosY+OffsetY, m_Width, m_Height, 100, 100, false)); for(int i=0; i<m_Widgets.GetSize(); i++) { m_Widgets[i]->Display(m_PosX+OffsetX, m_PosY+OffsetY); } if(m_AlphaColor!=0) Game->m_Renderer->m_ForceAlphaColor = 0; if(PopViewport) { Game->PopViewport(); } return S_OK; }
HRESULT CUIEdit::Display(int OffsetX, int OffsetY) { if (!m_Visible) return S_OK; // hack! TTextEncoding OrigEncoding = Game->m_TextEncoding; Game->m_TextEncoding = TEXT_ANSI; if (m_Back) m_Back->Display(OffsetX + m_PosX, OffsetY + m_PosY, m_Width, m_Height); if (m_Image) m_Image->Draw(OffsetX + m_PosX, OffsetY + m_PosY, NULL); // prepare fonts CBFont *font; CBFont *sfont; if (m_Font) font = m_Font; else font = Game->m_SystemFont; if (m_FontSelected) sfont = m_FontSelected; else sfont = font; bool focused = IsFocused(); m_SelStart = MAX(m_SelStart, 0); m_SelEnd = MAX(m_SelEnd, 0); m_SelStart = MIN(m_SelStart, strlen(m_Text)); m_SelEnd = MIN(m_SelEnd, strlen(m_Text)); //int CursorWidth = font->GetCharWidth(m_CursorChar[0]); int CursorWidth = font->GetTextWidth((byte *)m_CursorChar); int s1, s2; bool CurFirst; // modify scroll offset if (m_SelStart >= m_SelEnd) { while (font->GetTextWidth((byte *)m_Text + m_ScrollOffset, std::max(0, m_SelEnd - m_ScrollOffset)) > m_Width - CursorWidth - 2 * m_FrameWidth) { m_ScrollOffset++; if (m_ScrollOffset >= strlen(m_Text)) break; } m_ScrollOffset = std::min(m_ScrollOffset, m_SelEnd); s1 = m_SelEnd; s2 = m_SelStart; CurFirst = true; } else { while (font->GetTextWidth((byte *)m_Text + m_ScrollOffset, std::max(0, m_SelStart - m_ScrollOffset)) + sfont->GetTextWidth((byte *)(m_Text + std::max(m_ScrollOffset, m_SelStart)), m_SelEnd - std::max(m_ScrollOffset, m_SelStart)) > m_Width - CursorWidth - 2 * m_FrameWidth) { m_ScrollOffset++; if (m_ScrollOffset >= strlen(m_Text)) break; } m_ScrollOffset = std::min(m_ScrollOffset, m_SelEnd); s1 = m_SelStart; s2 = m_SelEnd; CurFirst = false; } int AlignOffset = 0; for (int Count = 0; Count < 2; Count++) { // draw text int xxx, yyy, width, height; xxx = m_PosX + m_FrameWidth + OffsetX; yyy = m_PosY + m_FrameWidth + OffsetY; width = m_PosX + m_Width + OffsetX - m_FrameWidth; height = std::max(font->GetLetterHeight(), sfont->GetLetterHeight()); if (Game->m_TextRTL) xxx += AlignOffset; TTextAlign Align = TAL_LEFT; // unselected 1 if (s1 > m_ScrollOffset) { if (Count) font->DrawText((byte *)m_Text + m_ScrollOffset, xxx, yyy, width - xxx, Align, height, s1 - m_ScrollOffset); xxx += font->GetTextWidth((byte *)m_Text + m_ScrollOffset, s1 - m_ScrollOffset); AlignOffset += font->GetTextWidth((byte *)m_Text + m_ScrollOffset, s1 - m_ScrollOffset); } // cursor if (focused && CurFirst) { if (Count) { if (CBPlatform::GetTime() - m_LastBlinkTime >= m_CursorBlinkRate) { m_LastBlinkTime = CBPlatform::GetTime(); m_CursorVisible = !m_CursorVisible; } if (m_CursorVisible) font->DrawText((byte *)m_CursorChar, xxx, yyy, width - xxx, Align, height, 1); } xxx += CursorWidth; AlignOffset += CursorWidth; } // selected int s3 = std::max(s1, m_ScrollOffset); if (s2 - s3 > 0) { if (Count) sfont->DrawText((byte *)m_Text + s3, xxx, yyy, width - xxx, Align, height, s2 - s3); xxx += sfont->GetTextWidth((byte *)m_Text + s3, s2 - s3); AlignOffset += sfont->GetTextWidth((byte *)m_Text + s3, s2 - s3); } // cursor if (focused && !CurFirst) { if (Count) { if (CBPlatform::GetTime() - m_LastBlinkTime >= m_CursorBlinkRate) { m_LastBlinkTime = CBPlatform::GetTime(); m_CursorVisible = !m_CursorVisible; } if (m_CursorVisible) font->DrawText((byte *)m_CursorChar, xxx, yyy, width - xxx, Align, height, 1); } xxx += CursorWidth; AlignOffset += CursorWidth; } // unselected 2 if (Count) font->DrawText((byte *)m_Text + s2, xxx, yyy, width - xxx, Align, height); AlignOffset += font->GetTextWidth((byte *)m_Text + s2); AlignOffset = (m_Width - 2 * m_FrameWidth) - AlignOffset; if (AlignOffset < 0) AlignOffset = 0; } Game->m_Renderer->m_RectList.Add(new CBActiveRect(Game, this, NULL, OffsetX + m_PosX, OffsetY + m_PosY, m_Width, m_Height, 100, 100, false)); Game->m_TextEncoding = OrigEncoding; return S_OK; }