mirror of
https://github.com/LNH-team/pico-launcher.git
synced 2026-01-12 02:29:24 +01:00
138 lines
5.3 KiB
C++
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);
|
|
} |