// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#pragma once

#include <efi/protocol/graphics-output.h>
#include <efi/system-table.h>

// Gets the current framebuffer graphics mode.
uint32_t get_gfx_mode(void);

// Gets the maximum framebuffer graphics mode index.
uint32_t get_gfx_max_mode(void);

// Returns the horizontal or vertical resolution of the current mode.
uint32_t get_gfx_hres(void);
uint32_t get_gfx_vres(void);

// Sets the framebuffer graphics mode.
void set_gfx_mode(uint32_t mode);

// Sets the graphics mode based on a string of the form "WxH" where W and H are
// integers representing width and height of the mode. This is usually obtained
// from the bootloader.fbres commandline argument.
void set_gfx_mode_from_cmdline(const char* fbres);

// Print all the supported framebuffer modes to the system console.
void print_fb_modes(void);

// Clears the screen and draws the Fuchsia logo.
void draw_logo(void);

typedef struct font_t {
    const uint16_t* data;
    unsigned width;
    unsigned height;
    efi_graphics_output_blt_pixel* color;
} fb_font;

// Draws provided text at coordinate x and y of the framebuffer.
void draw_text(const char* text, size_t length, fb_font* font, int x, int y);
void draw_version(const char*);

// Draws nodename in appropriate location based on mode.
void draw_nodename(const char* text);
