/* * Copyright 2016 - 2022 Gary Talent (gary@drinkingtea.net). All rights reserved. */ #include #include #include "gfx.hpp" namespace nostalgia::core { ox::Error initConsole(Context *ctx) noexcept { constexpr auto TilesheetAddr = "/TileSheets/Charset.ng"; constexpr auto PaletteAddr = "/Palettes/Charset.npal"; setBgStatus(ctx, 0b0001); return loadBgTileSheet(ctx, 0, TilesheetAddr, PaletteAddr); } ox::Error loadSpriteTileSheet(Context*, int, const ox::FileAddress&, const ox::FileAddress&) noexcept { return OxError(0); } ox::Error loadBgTileSheet(Context *ctx, int section, const ox::FileAddress &tilesheetPath, const ox::FileAddress &palettePath) noexcept { oxRequire(tilesheet, readObj(ctx, tilesheetPath)); oxRequire(palette, readObj(ctx, palettePath ? palettePath : tilesheet->defaultPalette)); const unsigned bytesPerTile = tilesheet->bpp == 8 ? 64 : 32; const auto tiles = tilesheet->pixels.size() / bytesPerTile; constexpr int width = 8; const int height = 8 * static_cast(tiles); ox::Vector pixels; if (bytesPerTile == 64) { // 8 BPP pixels.resize(tilesheet->pixels.size()); for (std::size_t i = 0; i < tilesheet->pixels.size(); ++i) { pixels[i] = toColor32(palette->colors[tilesheet->pixels[i]]); } } else { // 4 BPP pixels.resize(tilesheet->pixels.size() * 2); for (std::size_t i = 0; i < tilesheet->pixels.size(); ++i) { pixels[i * 2 + 0] = toColor32(palette->colors[tilesheet->pixels[i] & 0xF]); pixels[i * 2 + 1] = toColor32(palette->colors[tilesheet->pixels[i] >> 4]); } } return renderer::loadBgTexture(ctx->rendererData(), section, pixels.data(), width, height); } void puts(Context *ctx, int column, int row, const char *str) noexcept { for (int i = 0; str[i]; ++i) { setTile(ctx, 0, column + i, row, static_cast(charMap[static_cast(str[i])])); } } }