mirror of
https://github.com/arabine/open-story-teller.git
synced 2025-12-07 01:15:14 +01:00
139 lines
3.2 KiB
C++
139 lines
3.2 KiB
C++
#include <iostream>
|
|
#include <memory>
|
|
#include "imgui.h"
|
|
#include "IconsFontAwesome5.h"
|
|
#include "SDL.h"
|
|
#include "imgui-knobs.h"
|
|
|
|
#include "ost_common.h"
|
|
#include "ost_wrapper.h"
|
|
#include "picture.h"
|
|
|
|
static SDL_Texture *display_texture{nullptr};
|
|
|
|
|
|
// OST stubs
|
|
extern "C" void system_putc(char ch)
|
|
{
|
|
std::cout << ch;
|
|
std::flush(std::cout);
|
|
}
|
|
|
|
|
|
static color_t image_buffer[320][240];
|
|
|
|
extern "C" void ost_display_draw_h_line(uint16_t y, uint8_t *pixels, uint8_t *palette)
|
|
{
|
|
color_t color;
|
|
|
|
for(uint16_t i = 0; i < 320; i++)
|
|
{
|
|
uint8_t val = pixels[i];
|
|
|
|
if (val > 15)
|
|
{
|
|
val = 0;
|
|
}
|
|
|
|
const uint8_t *palettePtr = &palette[val * 4];
|
|
color.r = palettePtr[0];
|
|
color.g = palettePtr[1];
|
|
color.b = palettePtr[2];
|
|
|
|
image_buffer[i][y] = color;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void ost_impl_show_image(SDL_Renderer *renderer, const char *fileName)
|
|
{
|
|
decompress(fileName);
|
|
|
|
display_texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB565, SDL_TEXTUREACCESS_TARGET, 320, 240);
|
|
|
|
// Switch the renderer to the texture
|
|
SDL_SetRenderTarget(renderer, display_texture);
|
|
SDL_RenderClear(renderer);
|
|
|
|
for (uint16_t y = 0; y < 240; y++)
|
|
{
|
|
for(uint16_t x = 0; x < 320; x++)
|
|
{
|
|
SDL_SetRenderDrawColor(renderer, image_buffer[x][y].r, image_buffer[x][y].g, image_buffer[x][y].b, 255);
|
|
SDL_RenderDrawPoint(renderer, x, 239 - y);
|
|
}
|
|
}
|
|
|
|
SDL_RenderPresent(renderer);
|
|
|
|
// Switch back to main screen renderer
|
|
SDL_SetRenderTarget(renderer, NULL);
|
|
}
|
|
|
|
|
|
// Emulated hardware
|
|
void draw_ost_device(SDL_Renderer *renderer, double deltaTime)
|
|
{
|
|
static int load = 0;
|
|
|
|
if (load == 0)
|
|
{
|
|
load = 1;
|
|
ost_impl_show_image(renderer, "assets/images/example.bmp");
|
|
}
|
|
|
|
|
|
ImGui::Begin("OST device");
|
|
|
|
ImDrawList* draw_list = ImGui::GetWindowDrawList();
|
|
|
|
if (ImGui::Button("OK"))
|
|
{
|
|
std::cout << "OK button clicked" << std::endl;
|
|
}
|
|
ImGui::SameLine();
|
|
if (ImGui::Button("Home"))
|
|
{
|
|
std::cout << "Choose RIGHT" << std::endl;
|
|
}
|
|
ImGui::SameLine();
|
|
if (ImGui::Button("Pause"))
|
|
{
|
|
std::cout << "Choose RIGHT" << std::endl;
|
|
}
|
|
ImGui::SameLine();
|
|
if (ImGui::Button("Rotate LEFT"))
|
|
{
|
|
std::cout << "Choose LEFT" << std::endl;
|
|
}
|
|
ImGui::SameLine();
|
|
if (ImGui::Button("Rotate RIGHT"))
|
|
{
|
|
std::cout << "Choose RIGHT" << std::endl;
|
|
}
|
|
|
|
ImGui::NewLine();
|
|
|
|
// Contenu de l'écran
|
|
|
|
if (display_texture != nullptr)
|
|
{
|
|
ImGui::Image(display_texture, ImVec2((float)320, (float)240));
|
|
}
|
|
else
|
|
{
|
|
ImVec2 canvas_pos = ImGui::GetCursorScreenPos(); // ImDrawList API uses screen coordinates!
|
|
ImVec2 canvas_size(320, 240);
|
|
|
|
// Rectangle vide
|
|
draw_list->AddRectFilledMultiColor(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), IM_COL32(50, 50, 50, 255), IM_COL32(50, 50, 60, 255), IM_COL32(60, 60, 70, 255), IM_COL32(50, 50, 60, 255));
|
|
// contour blanc
|
|
draw_list->AddRect(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), IM_COL32(255, 255, 255, 255));
|
|
}
|
|
|
|
ImGui::End();
|
|
}
|
|
|
|
|