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

138 lines
5.3 KiB
C++

#include "common.h"
#include <algorithm>
#include <libtwl/dma/dmaNitro.h>
#include "gui/IVramManager.h"
#include "gui/OamManager.h"
#include "gui/OamBuilder.h"
#include "gui/GraphicsContext.h"
#include "core/math/ColorConverter.h"
#include "core/math/RgbMixer.h"
#include "chipFilled.h"
#include "gui/palette/DirectPalette.h"
#include "gui/palette/GradientPalette.h"
#include "themes/material/MaterialColorScheme.h"
#include "ChipView.h"
void ChipView::Draw(GraphicsContext& graphicsContext)
{
if (!graphicsContext.IsVisible(GetBounds()))
return;
u32 paletteRow;
auto bgColor = _materialColorScheme->GetColor(_backgroundColor);
Rgb<8, 8, 8> fgColor;
if (_isSelected)
{
fgColor = _materialColorScheme->secondaryContainer;
if (_isFocused)
fgColor = RgbMixer::Lerp(fgColor, _materialColorScheme->onSurfaceVariant, 12, 100);
u16 chipPltt[16];
for (int i = 0; i < 16; i++)
{
auto blendFactors = ColorConverter::FromXBGR555(chipFilledPal[i]);
auto palColor = Rgb<8, 8, 8>(
(bgColor.r * blendFactors.g + fgColor.r * (blendFactors.r + blendFactors.b) + 16) / 31,
(bgColor.g * blendFactors.g + fgColor.g * (blendFactors.r + blendFactors.b) + 16) / 31,
(bgColor.b * blendFactors.g + fgColor.b * (blendFactors.r + blendFactors.b) + 16) / 31);
chipPltt[i] = ColorConverter::ToGBGR565(palColor.Clamped());
}
paletteRow = graphicsContext.GetPaletteManager().AllocRow(
DirectPalette(chipPltt), _position.y, _position.y + 20);
if (!_isFocused)
{
_label.SetBackgroundColor(_materialColorScheme->secondaryContainer);
_label.SetForegroundColor(_materialColorScheme->onSecondaryContainer);
}
else
{
_label.SetBackgroundColor(fgColor);
_label.SetForegroundColor(_materialColorScheme->onSecondaryContainer);
}
}
else
{
auto selectorFullColor = _materialColorScheme->onSurfaceVariant;
auto outlineColor = _isFocused ? _materialColorScheme->onSurfaceVariant : _materialColorScheme->outline;
fgColor = _isFocused ? RgbMixer::Lerp(bgColor, selectorFullColor, 12, 100) : bgColor;
u16 chipPltt[16];
for (int i = 0; i < 16; i++)
{
auto blendFactors = ColorConverter::FromXBGR555(chipFilledPal[i]);
auto palColor = Rgb<8, 8, 8>(
(fgColor.r * blendFactors.r + bgColor.r * blendFactors.g + outlineColor.r * blendFactors.b + 16) / 31,
(fgColor.g * blendFactors.r + bgColor.g * blendFactors.g + outlineColor.g * blendFactors.b + 16) / 31,
(fgColor.b * blendFactors.r + bgColor.b * blendFactors.g + outlineColor.b * blendFactors.b + 16) / 31);
chipPltt[i] = ColorConverter::ToGBGR565(palColor.Clamped());
}
paletteRow = graphicsContext.GetPaletteManager().AllocRow(
DirectPalette(chipPltt), _position.y, _position.y + 20);
if (!_isFocused)
{
_label.SetBackgroundColor(_materialColorScheme->GetColor(_backgroundColor));
_label.SetForegroundColor(_materialColorScheme->onSurfaceVariant);
}
else
{
_label.SetBackgroundColor(fgColor);
_label.SetForegroundColor(_materialColorScheme->onSurfaceVariant);
}
}
int width = GetWidth();
auto oams = graphicsContext.GetOamManager().AllocOams(2);
OamBuilder::OamWithSize<64, 32>(_position, _vramOffset >> 7)
.WithPalette16(paletteRow)
.WithPriority(graphicsContext.GetPriority())
.Build(oams[0]);
OamBuilder::OamWithSize<64, 32>(
_position.x + width - 48 - 16,
_position.y, _vramOffset >> 7)
.WithPalette16(paletteRow)
.WithPriority(graphicsContext.GetPriority())
.WithHFlip()
.Build(oams[1]);
DrawIcon(graphicsContext, fgColor);
_label.SetPosition(_position.x + (_iconVramOffset == 0xFFFFFFFF ? 10 : 22), _position.y + 3);
_label.Draw(graphicsContext);
}
void ChipView::DrawIcon(GraphicsContext& graphicsContext, const Rgb<8, 8, 8>& fgColor)
{
if (_iconVramOffset == 0xFFFFFFFF)
return;
u32 iconPaletteRow;
if (_isFocused)
{
iconPaletteRow = graphicsContext.GetPaletteManager().AllocRow(
GradientPalette(fgColor, _materialColorScheme->primary),
_position.y, _position.y + 20);
}
else
{
iconPaletteRow = graphicsContext.GetPaletteManager().AllocRow(
GradientPalette(
_isSelected
? _materialColorScheme->secondaryContainer
: _materialColorScheme->GetColor(_backgroundColor),
_materialColorScheme->primary),
_position.y, _position.y + 20);
}
auto iconOam = graphicsContext.GetOamManager().AllocOams(1);
OamBuilder::OamWithSize<16, 16>(_position.x + 5, _position.y + 4, _iconVramOffset >> 7)
.WithPalette16(iconPaletteRow)
.WithPriority(graphicsContext.GetPriority())
.Build(iconOam[0]);
}
ChipView::VramToken ChipView::UploadGraphics(IVramManager& vramManager)
{
u32 vramOffset = vramManager.Alloc(chipFilledTilesLen);
dma_ntrCopy32(3, chipFilledTiles, vramManager.GetVramAddress(vramOffset), chipFilledTilesLen);
return ChipView::VramToken(vramOffset);
}