FBIPF writing impl

This commit is contained in:
minjaesong
2022-08-19 13:26:37 +09:00
parent b3ac861946
commit 79f4584dd4
5 changed files with 65 additions and 7 deletions

View File

@@ -230,7 +230,7 @@ let headerBytes = [
0x1F, 0x54, 0x53, 0x56, 0x4D, 0x69, 0x50, 0x46, // magic 0x1F, 0x54, 0x53, 0x56, 0x4D, 0x69, 0x50, 0x46, // magic
imgw & 255, (imgw >>> 8) & 255, // width imgw & 255, (imgw >>> 8) & 255, // width
imgh & 255, (imgh >>> 8) & 255, // height imgh & 255, (imgh >>> 8) & 255, // height
((hasAlpha) ? 1 : 0), 0x00, // has alpha ((hasAlpha) ? 1 : 0), 0x00, // has alpha, iPF type 1
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // reserved 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // reserved
] ]

View File

@@ -248,7 +248,7 @@ let headerBytes = [
0x1F, 0x54, 0x53, 0x56, 0x4D, 0x69, 0x50, 0x46, // magic 0x1F, 0x54, 0x53, 0x56, 0x4D, 0x69, 0x50, 0x46, // magic
imgw & 255, (imgw >>> 8) & 255, // width imgw & 255, (imgw >>> 8) & 255, // width
imgh & 255, (imgh >>> 8) & 255, // height imgh & 255, (imgh >>> 8) & 255, // height
((hasAlpha) ? 1 : 0), 0x00, // has alpha ((hasAlpha) ? 1 : 0), 0x01, // has alpha, iPF Type 2
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // reserved 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // reserved
] ]

View File

@@ -525,6 +525,48 @@ Object.freeze(_TVDOS.DRV.FS.DEVCON)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
_TVDOS.DRV.FS.DEVFBIPF = {}
_TVDOS.DRV.FS.DEVFBIPF.pwrite = (fd, ptr, _1, _2) => {
let decodefun = ([graphics.decodeIpf1, graphics.decodeIpf2])[sys.peek(ptr + 13)]
// offset 24..27: gzipped size
let width = sys.peek(ptr+8) | (sys.peek(ptr+9) << 8)
let height = sys.peek(ptr+10) | (sys.peek(ptr+11) << 8)
let hasAlpha = (sys.peek(12) != 0)
println("Calling GPU")
decodefun(ptr + 24, -1048577, -1310721, width, height, hasAlpha)
println("Changing graphics mode")
graphics.setGraphicsMode(4)
println("cya!")
}
_TVDOS.DRV.FS.DEVFBIPF.bwrite = (fd, bytes) => {
// TODO pread the file
let fp = sys.malloc(bytes.length)
bytes.forEach((it,i) => {
sys.poke(fp + i, it)
})
_TVDOS.DRV.FS.DEVFBIPF.pwrite(fd, fp)
sys.free(fp)
}
_TVDOS.DRV.FS.DEVFBIPF.flush = () => {}
_TVDOS.DRV.FS.DEVFBIPF.close = () => {}
_TVDOS.DRV.FS.DEVFBIPF.isDirectory = () => false
_TVDOS.DRV.FS.DEVFBIPF.listFiles = () => undefined
_TVDOS.DRV.FS.DEVFBIPF.touch = () => {}
_TVDOS.DRV.FS.DEVFBIPF.mkDir = () => {}
_TVDOS.DRV.FS.DEVFBIPF.mkFile = () => {}
_TVDOS.DRV.FS.DEVFBIPF.remove = () => {}
_TVDOS.DRV.FS.DEVFBIPF.exists = () => true
Object.freeze(_TVDOS.DRV.FS.DEVFBIPF)
///////////////////////////////////////////////////////////////////////////////
// Legacy Serial filesystem, !!pending for removal!! // Legacy Serial filesystem, !!pending for removal!!
const filesystem = {}; const filesystem = {};
@@ -654,7 +696,20 @@ Object.freeze(filesystem);
const files = {} const files = {}
files.reservedNames = ["AUX","COM1","COM2","COM3","COM4","CON","FB1","FB2","FB3","FB4","LPT1","LPT2","LPT3","LPT4","MEM","NUL","PMEM0","PMEM1","PMEM2","PMEM3","PMEM4","PMEM5","PMEM6","PMEM7","PRN","RND","ZERO"] files.reservedNames = ["AUX", // unused
"COM1","COM2","COM3","COM4", // serial ports
"CON", // the tty
"FB1","FB2", // raw framebuffer, 256 colours, typ. 560x448
"FBIPF", // framebuffer that accepts IPF-formatted bytes, reduced colours, typ. 560x448
"HFB1","HFB2","HFB3","HFB4", // half-dimension framebuffers, 256 colours, typ. 280x224
"LPT1","LPT2","LPT3","LPT4", // reserved for "parallel ports"; unused
"MEM", // /dev/mem
"NUL", // /dev/null
"PMEM0","PMEM1","PMEM2","PMEM3","PMEM4","PMEM5","PMEM6","PMEM7", // /dev/mem for peripherals
"PRN", // a printer
"RND", // /dev/urandom
"XFB", // raw framebuffer, 4096 colours, typ. 560x448. Memory layout follows the gpu's (0..250779: RG-plane, 250880..262143: gap, 262144..513023: BA-plane)
"ZERO"] // /dev/zero
/** This function only creates a file descriptor; will not actually interact with the drives yet. */ /** This function only creates a file descriptor; will not actually interact with the drives yet. */
files.open = (fullpath) => { files.open = (fullpath) => {

View File

@@ -617,7 +617,7 @@ shell.execute = function(line) {
gotError = true gotError = true
serial.printerr(`[command.js] program quit with ${e}:\n${e.stack || '(stack trace unavailable)'}`) serial.printerr(`[command.js] program quit with ${e}:\n${e.stack || '(stack trace unavailable)'}`)
printerrln(`Program quit with error:\n${e.stack || '(stack trace unavailable)'}`) printerrln(`Program quit with ${e}:\n${e.stack || '(stack trace unavailable)'}`)
if (`${e}`.startsWith("InterruptedException")) if (`${e}`.startsWith("InterruptedException"))
errorlevel = SIGTERM.name errorlevel = SIGTERM.name

View File

@@ -411,7 +411,7 @@ TYPE 255 FRAME -
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
TSVM Interchangeable Picture Format (aka iPF Type 1) TSVM Interchangeable Picture Format (aka iPF Type 1/2)
Image is divided into 4x4 blocks and each block is serialised, then the entire file is gzipped Image is divided into 4x4 blocks and each block is serialised, then the entire file is gzipped
@@ -419,12 +419,15 @@ Image is divided into 4x4 blocks and each block is serialised, then the entire f
# File Structure # File Structure
\x1F T S V M i P F \x1F T S V M i P F
[HEADER] [HEADER]
[Blocks.gz] [Blocks.gz] or [Blocks] // gzipping is optional and only done for videos
- Header - Header
uint16 WIDTH uint16 WIDTH
uint16 HEIGHT uint16 HEIGHT
uint16 HAS ALPHA uint8 HAS ALPHA
uint8 IPF Type
0: Type 1
1: Type 2
byte[10] RESERVED byte[10] RESERVED
- *.gz - *.gz