// 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 #include #define TC_MAX_ARG 16 #define TC_MAX_ARG_LENGTH 8 // matches vc title length typedef struct textcon textcon_t; typedef uint16_t vc_char_t; inline vc_char_t vc_char_make(uint8_t ch, uint8_t fg_color, uint8_t bg_color) { return static_cast(ch | ((fg_color & 0xf) << 8) | ((bg_color & 0xf) << 12)); } inline uint8_t vc_char_get_char(vc_char_t ch) { return static_cast(ch & 0xff); } inline uint8_t vc_char_get_fg_color(vc_char_t ch) { return static_cast((ch >> 8) & 0xf); } inline uint8_t vc_char_get_bg_color(vc_char_t ch) { return static_cast((ch >> 12) & 0xf); } typedef enum textcon_param { TC_INVALID, TC_SET_TITLE, TC_SHOW_CURSOR, TC_HIDE_CURSOR, } textcon_param_t; struct textcon { void (*putc)(textcon_t* tc, uint8_t c); // backing data vc_char_t* data; // dimensions of display int w; int h; // cursor position int x; // 0 < x <= w; cursor may be one position beyond right edge int y; // 0 < y < h // callbacks to update visible display void (*invalidate)(void* cookie, int x, int y, int w, int h); void (*movecursor)(void* cookie, int x, int y); void (*push_scrollback_line)(void* cookie, int y); void (*copy_lines)(void* cookie, int y_dest, int y_src, int count); void (*setparam)(void* cookie, int param, uint8_t* arg, size_t arglen); void* cookie; // scrolling region int scroll_y0; int scroll_y1; // saved cursor position int save_x; int save_y; uint8_t fg; uint8_t bg; // Escape sequence parameter parsing // Numeric arguments int num; // Argument currently being read int argn_count; // Number of arguments read into argn[] int argn[TC_MAX_ARG]; // String argument (e.g. for console title) int argstr_size; // Number of characters read into argstr[] uint8_t argstr[TC_MAX_ARG_LENGTH + 1]; }; void tc_init(textcon_t* tc, int w, int h, vc_char_t* data, uint8_t fg, uint8_t bg, int cursor_x, int cursor_y); void tc_copy_lines(textcon_t* tc, int y_dest, int y_src, int line_count); static inline void tc_putc(textcon_t* tc, uint8_t c) { tc->putc(tc, c); } void tc_seth(textcon_t* tc, int h);