Browse Source

♻️ Leverage 'Point' in art_draw functions

pull/2753/head
Juliano Leal Goncalves 5 years ago committed by Anders Jenbo
parent
commit
20d356a6eb
  1. 20
      Source/DiabloUI/art_draw.cpp
  2. 6
      Source/DiabloUI/art_draw.h
  3. 2
      Source/DiabloUI/button.cpp
  4. 4
      Source/DiabloUI/credits.cpp
  5. 22
      Source/DiabloUI/diabloui.cpp
  6. 17
      Source/DiabloUI/progress.cpp
  7. 4
      Source/DiabloUI/text_draw.cpp
  8. 2
      Source/interfac.cpp
  9. 31
      Source/qol/monhealthbar.cpp
  10. 9
      Source/qol/xpbar.cpp

20
Source/DiabloUI/art_draw.cpp

@ -6,9 +6,9 @@
namespace devilution { namespace devilution {
void DrawArt(Sint16 screenX, Sint16 screenY, Art *art, int nFrame, Uint16 srcW, Uint16 srcH) void DrawArt(Point screenPosition, Art *art, int nFrame, Uint16 srcW, Uint16 srcH)
{ {
if (screenY >= gnScreenHeight || screenX >= gnScreenWidth || art->surface == nullptr) if (screenPosition.y >= gnScreenHeight || screenPosition.x >= gnScreenWidth || art->surface == nullptr)
return; return;
SDL_Rect srcRect; SDL_Rect srcRect;
@ -23,7 +23,7 @@ void DrawArt(Sint16 screenX, Sint16 screenY, Art *art, int nFrame, Uint16 srcW,
srcRect.w = srcW; srcRect.w = srcW;
if (srcH != 0 && srcH < srcRect.h) if (srcH != 0 && srcH < srcRect.h)
srcRect.h = srcH; srcRect.h = srcH;
SDL_Rect dstRect = { screenX, screenY, srcRect.w, srcRect.h }; SDL_Rect dstRect = MakeSdlRect(screenPosition.x, screenPosition.y, srcRect.w, srcRect.h);
ScaleOutputRect(&dstRect); ScaleOutputRect(&dstRect);
if (art->surface->format->BitsPerPixel == 8 && art->palette_version != pal_surface_palette_version) { if (art->surface->format->BitsPerPixel == 8 && art->palette_version != pal_surface_palette_version) {
@ -36,9 +36,9 @@ void DrawArt(Sint16 screenX, Sint16 screenY, Art *art, int nFrame, Uint16 srcW,
ErrSdl(); ErrSdl();
} }
void DrawArt(const Surface &out, Sint16 screenX, Sint16 screenY, Art *art, int nFrame, Uint16 srcW, Uint16 srcH) void DrawArt(const Surface &out, Point screenPosition, Art *art, int nFrame, Uint16 srcW, Uint16 srcH)
{ {
if (screenY >= gnScreenHeight || screenX >= gnScreenWidth || art->surface == nullptr) if (screenPosition.y >= gnScreenHeight || screenPosition.x >= gnScreenWidth || art->surface == nullptr)
return; return;
SDL_Rect srcRect; SDL_Rect srcRect;
@ -51,11 +51,7 @@ void DrawArt(const Surface &out, Sint16 screenX, Sint16 screenY, Art *art, int n
srcRect.w = srcW; srcRect.w = srcW;
if (srcH != 0 && srcH < srcRect.h) if (srcH != 0 && srcH < srcRect.h)
srcRect.h = srcH; srcRect.h = srcH;
SDL_Rect dstRect; SDL_Rect dstRect = MakeSdlRect(screenPosition.x, screenPosition.y, srcRect.w, srcRect.h);
dstRect.x = screenX;
dstRect.y = screenY;
dstRect.w = srcRect.w;
dstRect.h = srcRect.h;
if (art->surface->format->BitsPerPixel == 8 && art->palette_version != pal_surface_palette_version) { if (art->surface->format->BitsPerPixel == 8 && art->palette_version != pal_surface_palette_version) {
if (SDLC_SetSurfaceColors(art->surface.get(), out.surface->format->palette) <= -1) if (SDLC_SetSurfaceColors(art->surface.get(), out.surface->format->palette) <= -1)
@ -67,9 +63,9 @@ void DrawArt(const Surface &out, Sint16 screenX, Sint16 screenY, Art *art, int n
ErrSdl(); ErrSdl();
} }
void DrawAnimatedArt(Art *art, int screenX, int screenY) void DrawAnimatedArt(Art *art, Point screenPosition)
{ {
DrawArt(screenX, screenY, art, GetAnimationFrame(art->frames)); DrawArt(screenPosition, art, GetAnimationFrame(art->frames));
} }
int GetAnimationFrame(int frames, int fps) int GetAnimationFrame(int frames, int fps)

6
Source/DiabloUI/art_draw.h

@ -5,11 +5,11 @@
namespace devilution { namespace devilution {
void DrawArt(Sint16 screenX, Sint16 screenY, Art *art, int nFrame = 0, Uint16 srcW = 0, Uint16 srcH = 0); void DrawArt(Point screenPosition, Art *art, int nFrame = 0, Uint16 srcW = 0, Uint16 srcH = 0);
void DrawArt(const Surface &out, Sint16 screenX, Sint16 screenY, Art *art, int nFrame = 0, Uint16 srcW = 0, Uint16 srcH = 0); void DrawArt(const Surface &out, Point screenPosition, Art *art, int nFrame = 0, Uint16 srcW = 0, Uint16 srcH = 0);
void DrawAnimatedArt(Art *art, int screenX, int screenY); void DrawAnimatedArt(Art *art, Point screenPosition);
int GetAnimationFrame(int frames, int fps = 60); int GetAnimationFrame(int frames, int fps = 60);

2
Source/DiabloUI/button.cpp

@ -21,7 +21,7 @@ void RenderButton(UiButton *button)
} else { } else {
frame = UiButton::DEFAULT; frame = UiButton::DEFAULT;
} }
DrawArt(button->m_rect.x, button->m_rect.y, button->m_art, frame, button->m_rect.w, button->m_rect.h); DrawArt({ button->m_rect.x, button->m_rect.y }, button->m_art, frame, button->m_rect.w, button->m_rect.h);
SDL_Rect textRect = button->m_rect; SDL_Rect textRect = button->m_rect;
if (!button->m_pressed) if (!button->m_pressed)

4
Source/DiabloUI/credits.cpp

@ -146,8 +146,8 @@ void CreditsRenderer::Render()
prev_offset_y_ = offsetY; prev_offset_y_ = offsetY;
SDL_FillRect(DiabloUiSurface(), nullptr, 0x000000); SDL_FillRect(DiabloUiSurface(), nullptr, 0x000000);
DrawArt(PANEL_LEFT - 320, UI_OFFSET_Y, &ArtBackgroundWidescreen); DrawArt({ PANEL_LEFT - 320, UI_OFFSET_Y }, &ArtBackgroundWidescreen);
DrawArt(PANEL_LEFT, UI_OFFSET_Y, &ArtBackground); DrawArt({ PANEL_LEFT, UI_OFFSET_Y }, &ArtBackground);
if (font == nullptr) if (font == nullptr)
return; return;

22
Source/DiabloUI/diabloui.cpp

@ -681,8 +681,8 @@ void DrawSelector(const SDL_Rect &rect)
int frame = GetAnimationFrame(art->frames); int frame = GetAnimationFrame(art->frames);
int y = rect.y + (rect.h - art->h()) / 2; // TODO FOCUS_MED appares higher than the box int y = rect.y + (rect.h - art->h()) / 2; // TODO FOCUS_MED appares higher than the box
DrawArt(rect.x, y, art, frame); DrawArt({ rect.x, y }, art, frame);
DrawArt(rect.x + rect.w - art->w(), y, art, frame); DrawArt({ rect.x + rect.w - art->w(), y }, art, frame);
} }
void UiClearScreen() void UiClearScreen()
@ -739,9 +739,9 @@ void Render(const UiImage *uiImage)
x += xOffset; x += xOffset;
} }
if (uiImage->m_animated) { if (uiImage->m_animated) {
DrawAnimatedArt(uiImage->m_art, x, uiImage->m_rect.y); DrawAnimatedArt(uiImage->m_art, { x, uiImage->m_rect.y });
} else { } else {
DrawArt(x, uiImage->m_rect.y, uiImage->m_art, uiImage->m_frame, uiImage->m_rect.w); DrawArt({ x, uiImage->m_rect.y }, uiImage->m_art, uiImage->m_frame, uiImage->m_rect.w);
} }
} }
@ -765,11 +765,11 @@ void Render(const UiScrollbar *uiSb)
{ {
// Bar background (tiled): // Bar background (tiled):
{ {
const std::size_t bgYEnd = DownArrowRect(uiSb).y; const int bgYEnd = DownArrowRect(uiSb).y;
std::size_t bgY = uiSb->m_rect.y + uiSb->m_arrow->h(); int bgY = uiSb->m_rect.y + uiSb->m_arrow->h();
while (bgY < bgYEnd) { while (bgY < bgYEnd) {
std::size_t drawH = std::min(bgY + uiSb->m_bg->h(), bgYEnd) - bgY; std::size_t drawH = std::min(bgY + uiSb->m_bg->h(), bgYEnd) - bgY;
DrawArt(uiSb->m_rect.x, bgY, uiSb->m_bg, 0, SCROLLBAR_BG_WIDTH, drawH); DrawArt({ uiSb->m_rect.x, bgY }, uiSb->m_bg, 0, SCROLLBAR_BG_WIDTH, drawH);
bgY += drawH; bgY += drawH;
} }
} }
@ -778,18 +778,18 @@ void Render(const UiScrollbar *uiSb)
{ {
const SDL_Rect rect = UpArrowRect(uiSb); const SDL_Rect rect = UpArrowRect(uiSb);
const int frame = static_cast<int>(scrollBarState.upArrowPressed ? ScrollBarArrowFrame_UP_ACTIVE : ScrollBarArrowFrame_UP); const int frame = static_cast<int>(scrollBarState.upArrowPressed ? ScrollBarArrowFrame_UP_ACTIVE : ScrollBarArrowFrame_UP);
DrawArt(rect.x, rect.y, uiSb->m_arrow, frame, rect.w); DrawArt({ rect.x, rect.y }, uiSb->m_arrow, frame, rect.w);
} }
{ {
const SDL_Rect rect = DownArrowRect(uiSb); const SDL_Rect rect = DownArrowRect(uiSb);
const int frame = static_cast<int>(scrollBarState.downArrowPressed ? ScrollBarArrowFrame_DOWN_ACTIVE : ScrollBarArrowFrame_DOWN); const int frame = static_cast<int>(scrollBarState.downArrowPressed ? ScrollBarArrowFrame_DOWN_ACTIVE : ScrollBarArrowFrame_DOWN);
DrawArt(rect.x, rect.y, uiSb->m_arrow, frame, rect.w); DrawArt({ rect.x, rect.y }, uiSb->m_arrow, frame, rect.w);
} }
// Thumb: // Thumb:
if (SelectedItemMax > 0) { if (SelectedItemMax > 0) {
const SDL_Rect rect = ThumbRect(uiSb, SelectedItem, SelectedItemMax + 1); const SDL_Rect rect = ThumbRect(uiSb, SelectedItem, SelectedItemMax + 1);
DrawArt(rect.x, rect.y, uiSb->m_thumb); DrawArt({ rect.x, rect.y }, uiSb->m_thumb);
} }
} }
@ -1014,6 +1014,6 @@ void DrawMouse()
if (IsHardwareCursor() || sgbControllerActive) if (IsHardwareCursor() || sgbControllerActive)
return; return;
DrawArt(MousePosition.x, MousePosition.y, &ArtCursor); DrawArt(MousePosition, &ArtCursor);
} }
} // namespace devilution } // namespace devilution

17
Source/DiabloUI/progress.cpp

@ -63,22 +63,21 @@ void ProgressFree()
void ProgressRender(BYTE progress) void ProgressRender(BYTE progress)
{ {
SDL_FillRect(DiabloUiSurface(), nullptr, 0x000000); SDL_FillRect(DiabloUiSurface(), nullptr, 0x000000);
DrawArt(0, 0, &ArtBackground); DrawArt({ 0, 0 }, &ArtBackground);
Sint16 x = GetCenterOffset(280); Point position = { GetCenterOffset(280), GetCenterOffset(144, gnScreenHeight) };
Sint16 y = GetCenterOffset(144, gnScreenHeight);
DrawArt(x, y, &ArtPopupSm, 0, 280, 140); DrawArt(position, &ArtPopupSm, 0, 280, 140);
DrawArt(GetCenterOffset(227), y + 52, &ArtProgBG, 0, 227); DrawArt({ GetCenterOffset(227), position.y + 52 }, &ArtProgBG, 0, 227);
if (progress != 0) { if (progress != 0) {
DrawArt(GetCenterOffset(227), y + 52, &ProgFil, 0, 227 * progress / 100); DrawArt({ GetCenterOffset(227), position.y + 52 }, &ProgFil, 0, 227 * progress / 100);
} }
DrawArt(GetCenterOffset(110), y + 99, &SmlButton, 2, 110); DrawArt({ GetCenterOffset(110), position.y + 99 }, &SmlButton, 2, 110);
if (msgSurface != nullptr) { if (msgSurface != nullptr) {
SDL_Rect dscRect = { SDL_Rect dscRect = {
static_cast<Sint16>(x + 50 + 1), static_cast<Sint16>(position.x + 50 + 1),
static_cast<Sint16>(y + 8 + 1), static_cast<Sint16>(position.y + 8 + 1),
static_cast<Uint16>(msgSurface->w), static_cast<Uint16>(msgSurface->w),
static_cast<Uint16>(msgSurface->h) static_cast<Uint16>(msgSurface->h)
}; };

4
Source/DiabloUI/text_draw.cpp

@ -90,11 +90,11 @@ void DrawArtStr(const char *text, const SDL_Rect &rect, UiFlags flags, bool draw
} }
uint8_t w = FontTables[size][static_cast<uint8_t>(text[i]) + 2]; uint8_t w = FontTables[size][static_cast<uint8_t>(text[i]) + 2];
w = (w != 0) ? w : FontTables[size][0]; w = (w != 0) ? w : FontTables[size][0];
DrawArt(sx, sy, &ArtFonts[size][color], static_cast<uint8_t>(text[i]), w); DrawArt({ sx, sy }, &ArtFonts[size][color], static_cast<uint8_t>(text[i]), w);
sx += w; sx += w;
} }
if (drawTextCursor && GetAnimationFrame(2, 500) != 0) { if (drawTextCursor && GetAnimationFrame(2, 500) != 0) {
DrawArt(sx, sy, &ArtFonts[size][color], '|'); DrawArt({ sx, sy }, &ArtFonts[size][color], '|');
} }
} }

2
Source/interfac.cpp

@ -171,7 +171,7 @@ void DrawCutscene()
{ {
lock_buf(1); lock_buf(1);
const Surface &out = GlobalBackBuffer(); const Surface &out = GlobalBackBuffer();
DrawArt(out, PANEL_X - (ArtCutsceneWidescreen.w() - PANEL_WIDTH) / 2, UI_OFFSET_Y, &ArtCutsceneWidescreen); DrawArt(out, { PANEL_X - (ArtCutsceneWidescreen.w() - PANEL_WIDTH) / 2, UI_OFFSET_Y }, &ArtCutsceneWidescreen);
CelDrawTo(out, { PANEL_X, 480 - 1 + UI_OFFSET_Y }, *sgpBackCel, 1); CelDrawTo(out, { PANEL_X, 480 - 1 + UI_OFFSET_Y }, *sgpBackCel, 1);
constexpr int ProgressHeight = 22; constexpr int ProgressHeight = 22;

31
Source/qol/monhealthbar.cpp

@ -63,46 +63,45 @@ void DrawMonsterHealthBar(const Surface &out)
const int width = healthBox.w(); const int width = healthBox.w();
const int height = healthBox.h(); const int height = healthBox.h();
int xPos = (gnScreenWidth - width) / 2; Point position = { (gnScreenWidth - width) / 2, 18 };
if (CanPanelsCoverView()) { if (CanPanelsCoverView()) {
if (invflag || sbookflag) if (invflag || sbookflag)
xPos -= SPANEL_WIDTH / 2; position.x -= SPANEL_WIDTH / 2;
if (chrflag || QuestLogIsOpen) if (chrflag || QuestLogIsOpen)
xPos += SPANEL_WIDTH / 2; position.x += SPANEL_WIDTH / 2;
} }
const int yPos = 18;
const int border = 3; const int border = 3;
const int maxLife = std::max(monster._mmaxhp, monster._mhitpoints); const int maxLife = std::max(monster._mmaxhp, monster._mhitpoints);
DrawArt(out, xPos, yPos, &healthBox); DrawArt(out, position, &healthBox);
DrawHalfTransparentRectTo(out, xPos + border, yPos + border, width - (border * 2), height - (border * 2)); DrawHalfTransparentRectTo(out, position.x + border, position.y + border, width - (border * 2), height - (border * 2));
int barProgress = (width * monster._mhitpoints) / maxLife; int barProgress = (width * monster._mhitpoints) / maxLife;
if (barProgress != 0) { if (barProgress != 0) {
DrawArt(out, xPos + border + 1, yPos + border + 1, &health, 0, barProgress, height - (border * 2) - 2); DrawArt(out, position + Displacement { border + 1, border + 1 }, &health, 0, barProgress, height - (border * 2) - 2);
} }
if (sgOptions.Gameplay.bShowMonsterType) { if (sgOptions.Gameplay.bShowMonsterType) {
Uint8 borderColors[] = { 248 /*undead*/, 232 /*demon*/, 150 /*beast*/ }; Uint8 borderColors[] = { 248 /*undead*/, 232 /*demon*/, 150 /*beast*/ };
Uint8 borderColor = borderColors[monster.MData->mMonstClass]; Uint8 borderColor = borderColors[monster.MData->mMonstClass];
int borderWidth = width - (border * 2); int borderWidth = width - (border * 2);
UnsafeDrawHorizontalLine(out, { xPos + border, yPos + border }, borderWidth, borderColor); UnsafeDrawHorizontalLine(out, { position.x + border, position.y + border }, borderWidth, borderColor);
UnsafeDrawHorizontalLine(out, { xPos + border, yPos + height - border - 1 }, borderWidth, borderColor); UnsafeDrawHorizontalLine(out, { position.x + border, position.y + height - border - 1 }, borderWidth, borderColor);
int borderHeight = height - (border * 2) - 2; int borderHeight = height - (border * 2) - 2;
UnsafeDrawVerticalLine(out, { xPos + border, yPos + border + 1 }, borderHeight, borderColor); UnsafeDrawVerticalLine(out, { position.x + border, position.y + border + 1 }, borderHeight, borderColor);
UnsafeDrawVerticalLine(out, { xPos + width - border - 1, yPos + border + 1 }, borderHeight, borderColor); UnsafeDrawVerticalLine(out, { position.x + width - border - 1, position.y + border + 1 }, borderHeight, borderColor);
} }
int barLabelY = yPos + 10 + (height - 11) / 2; int barLabelY = position.y + 10 + (height - 11) / 2;
DrawString(out, monster.mName, { { xPos - 1, barLabelY + 1 }, { width, height } }, UiFlags::AlignCenter | UiFlags::ColorBlack); DrawString(out, monster.mName, { position.x - 1, barLabelY + 1, width, height }, UiFlags::AlignCenter | UiFlags::ColorBlack);
UiFlags style = UiFlags::ColorSilver; UiFlags style = UiFlags::ColorSilver;
if (monster._uniqtype != 0) if (monster._uniqtype != 0)
style = UiFlags::ColorGold; style = UiFlags::ColorGold;
else if (monster.leader != 0) else if (monster.leader != 0)
style = UiFlags::ColorBlue; style = UiFlags::ColorBlue;
DrawString(out, monster.mName, { { xPos, barLabelY }, { width, height } }, UiFlags::AlignCenter | style); DrawString(out, monster.mName, { position.x, barLabelY, width, height }, UiFlags::AlignCenter | style);
if (monster._uniqtype != 0 || MonsterKillCounts[monster.MType->mtype] >= 15) { if (monster._uniqtype != 0 || MonsterKillCounts[monster.MType->mtype] >= 15) {
monster_resistance immunes[] = { IMMUNE_MAGIC, IMMUNE_FIRE, IMMUNE_LIGHTNING }; monster_resistance immunes[] = { IMMUNE_MAGIC, IMMUNE_FIRE, IMMUNE_LIGHTNING };
@ -111,10 +110,10 @@ void DrawMonsterHealthBar(const Surface &out)
int resOffset = 5; int resOffset = 5;
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
if ((monster.mMagicRes & immunes[i]) != 0) { if ((monster.mMagicRes & immunes[i]) != 0) {
DrawArt(out, xPos + resOffset, yPos + height - 6, &resistance, i * 2 + 1); DrawArt(out, position + Displacement { resOffset, height - 6 }, &resistance, i * 2 + 1);
resOffset += resistance.w() + 2; resOffset += resistance.w() + 2;
} else if ((monster.mMagicRes & resists[i]) != 0) { } else if ((monster.mMagicRes & resists[i]) != 0) {
DrawArt(out, xPos + resOffset, yPos + height - 6, &resistance, i * 2); DrawArt(out, position + Displacement { resOffset, height - 6 }, &resistance, i * 2);
resOffset += resistance.w() + 2; resOffset += resistance.w() + 2;
} }
} }

9
Source/qol/xpbar.cpp

@ -72,13 +72,12 @@ void DrawXPBar(const Surface &out)
const auto &player = Players[MyPlayerId]; const auto &player = Players[MyPlayerId];
const int backX = PANEL_LEFT + PANEL_WIDTH / 2 - 155; const Point back = { PANEL_LEFT + PANEL_WIDTH / 2 - 155, PANEL_TOP + PANEL_HEIGHT - 11 };
const int backY = PANEL_TOP + PANEL_HEIGHT - 11;
const int xPos = backX + 3; const int xPos = back.x + 3;
const int yPos = backY + 2; const int yPos = back.y + 2;
DrawArt(out, backX, backY, &xpbarArt); DrawArt(out, back, &xpbarArt);
const int8_t charLevel = player._pLevel; const int8_t charLevel = player._pLevel;

Loading…
Cancel
Save