v86/src/browser/dummy_screen.js

181 lines
3.7 KiB
JavaScript

"use strict";
/**
* @constructor
*
* @param {BusConnector} bus
*/
function DummyScreenAdapter(bus)
{
var
graphic_image_data,
/** @type {number} */
cursor_row,
/** @type {number} */
cursor_col,
graphical_mode_width,
graphical_mode_height,
// are we in graphical mode now?
is_graphical = false,
// Index 0: ASCII code
// Index 1: Background color
// Index 2: Foreground color
text_mode_data,
// number of columns
text_mode_width,
// number of rows
text_mode_height;
this.bus = bus;
bus.register("screen-set-mode", function(data)
{
this.set_mode(data);
}, this);
bus.register("screen-fill-buffer-end", function(data)
{
var min = data[0];
var max = data[1];
this.update_buffer(min, max);
}, this);
bus.register("screen-put-char", function(data)
{
//console.log(data);
this.put_char(data[0], data[1], data[2], data[3], data[4]);
}, this);
bus.register("screen-text-scroll", function(rows)
{
console.log("scroll", rows);
}, this);
bus.register("screen-update-cursor", function(data)
{
this.update_cursor(data[0], data[1]);
}, this);
bus.register("screen-update-cursor-scanline", function(data)
{
this.update_cursor_scanline(data[0], data[1]);
}, this);
bus.register("screen-set-size-text", function(data)
{
this.set_size_text(data[0], data[1]);
}, this);
bus.register("screen-set-size-graphical", function(data)
{
this.set_size_graphical(data[0], data[1]);
}, this);
this.put_char = function(row, col, chr, bg_color, fg_color)
{
if(row < text_mode_height && col < text_mode_width)
{
var p = 3 * (row * text_mode_width + col);
text_mode_data[p] = chr;
text_mode_data[p + 1] = bg_color;
text_mode_data[p + 2] = fg_color;
}
};
this.destroy = function()
{
};
this.set_mode = function(graphical)
{
is_graphical = graphical;
};
this.clear_screen = function()
{
};
/**
* @param {number} cols
* @param {number} rows
*/
this.set_size_text = function(cols, rows)
{
if(cols === text_mode_width && rows === text_mode_height)
{
return;
}
text_mode_data = new Int32Array(cols * rows * 3);
text_mode_width = cols;
text_mode_height = rows;
};
this.set_size_graphical = function(width, height)
{
graphical_mode_width = width;
graphical_mode_height = height;
};
this.set_scale = function(s_x, s_y)
{
};
this.update_cursor_scanline = function(start, end)
{
};
this.update_cursor = function(row, col)
{
if(row !== cursor_row || col !== cursor_col)
{
cursor_row = row;
cursor_col = col;
}
};
this.update_buffer = function(min, max)
{
if(max < min)
{
return;
}
var min_y = min / graphical_mode_width | 0;
var max_y = max / graphical_mode_width | 0;
};
this.get_text_screen = function()
{
var screen = [];
for(var i = 0; i < text_mode_height; i++)
{
screen.push(this.get_text_row(i));
}
return screen;
};
this.get_text_row = function(i)
{
var row = "";
var offset = 3 * i * text_mode_width;
for(var j = 0; j < text_mode_width; j++)
{
row += String.fromCharCode(text_mode_data[offset + 3 * j]);
}
return row;
};
}