Files
pico-launcher/arm9/source/gui/views/Label2DView.cpp
2025-11-25 17:41:31 +01:00

68 lines
2.0 KiB
C++

#include "common.h"
#include "gui/OamManager.h"
#include "gui/OamBuilder.h"
#include "gui/IVramManager.h"
#include "gui/VramContext.h"
#include "gui/GraphicsContext.h"
#include "core/StringUtil.h"
#include "gui/palette/GradientPalette.h"
#include "Label2DView.h"
void Label2DView::InitVram(const VramContext& vramContext)
{
const auto objVramManager = vramContext.GetObjVramManager();
if (objVramManager)
{
_vramOffset = objVramManager->Alloc((_actualWidth * _actualHeight) >> 1);
_vramAddress = objVramManager->GetVramAddress(_vramOffset);
}
}
void Label2DView::UpdateTileBuffer()
{
LabelView::UpdateTileBuffer();
_tileBufferUpdated = true;
}
void Label2DView::Draw(GraphicsContext& graphicsContext)
{
if (!graphicsContext.IsVisible(GetBounds()))
return;
u32 hCellCount = _actualWidth >> 5;
u32 vCellCount = _actualHeight >> 4;
u32 cellCount = hCellCount * vCellCount;
auto oams = graphicsContext.GetOamManager().AllocOams(cellCount);
int xOffset = _position.x;
if (_hAlign == Alignment::Center)
xOffset += ((int)_width - (int)_stringWidth) / 2;
else if (_hAlign == Alignment::End)
xOffset += (int)_width - (int)_stringWidth;
u32 paletteRow = graphicsContext.GetPaletteManager().AllocRow(
GradientPalette(_backgroundColor, _foregroundColor), _position.y, _position.y + _height);
u32 i = 0;
for (u32 y = 0; y < vCellCount; y++)
{
for (u32 x = 0; x < hCellCount; x++)
{
OamBuilder::OamWithSize<32, 16>(
xOffset + x * 32,
_position.y + y * 16,
(_vramOffset + i * 256) >> 7)
.WithPalette16(paletteRow)
.WithPriority(graphicsContext.GetPriority())
.Build(oams[i]);
i++;
}
}
}
void Label2DView::VBlank()
{
if (_tileBufferUpdated)
{
memcpy((void*)_vramAddress, _tileBuffer.get(), _tileBufferSize);
_tileBufferUpdated = false;
_stringWidth = _newStringWidth;
}
}