refacto ts + ajout de dessin simple + ajout pinceau

WIP lib graphique
This commit is contained in:
Marc
2022-02-08 13:35:49 +01:00
parent a3547ac244
commit 47e764132f
13 changed files with 255 additions and 66 deletions
+7
View File
@@ -0,0 +1,7 @@
import { Bitmap } from '@jimp/core'
declare global {
interface Pencil extends Bitmap {
color: number[],
}
}
+1
View File
@@ -1,5 +1,6 @@
{ {
"dependencies": { "dependencies": {
"@types/jimp": "^0.2.28",
"@types/node": "^17.0.14", "@types/node": "^17.0.14",
"node-gyp": "^8.4.1" "node-gyp": "^8.4.1"
} }
+21 -3
View File
@@ -58,9 +58,9 @@ async function readImgFile(filepath) {
/** /**
* @param { number } x * @param { number } x
* @param { number } y * @param { number } y
* @param { import('@jimp/core').Bitmap } bitmap * @param { import('@jimp/core').Bitmap | Pencil } bitmap
*/ */
function drawBitmap(x, y, bitmap) { function drawBitmap(x, y, bitmap, handleTransparency = true) {
for(let dy = 0; dy < bitmap.height; dy++) { for(let dy = 0; dy < bitmap.height; dy++) {
let bitmapLineEnd = bitmap.width * screen.byteDepth * (dy + 1) let bitmapLineEnd = bitmap.width * screen.byteDepth * (dy + 1)
let bitmapLineStart = bitmap.width * screen.byteDepth * dy let bitmapLineStart = bitmap.width * screen.byteDepth * dy
@@ -94,7 +94,25 @@ function drawBitmap(x, y, bitmap) {
const line = bitmap.data.subarray(bitmapLineStart, bitmapLineEnd) const line = bitmap.data.subarray(bitmapLineStart, bitmapLineEnd)
buffer.set(Array.from(line), dx * screen.byteDepth + screen.width * (dy + y) * screen.byteDepth)
const bufferPlacement = dx * screen.byteDepth + screen.width * (dy + y) * screen.byteDepth
if(handleTransparency) {
const currentLine = buffer.subarray(bufferPlacement, bufferPlacement + line.length)
for(let i=0; i < line.length; i += 4) {
const transparency = line.readUInt8(i+3) / 255
if(transparency < 1) {
/** @type { Uint8Array } */
const newLine = new Uint8Array(3)
for(let j=0; j < 3; j++) {
newLine[j] = (currentLine.readUInt8(j+i)*1-transparency + line.readUInt8(j+i)*transparency)
}
line.set(newLine, i)
}
}
}
buffer.set(Array.from(line), bufferPlacement)
} }
} }
@@ -10,7 +10,13 @@ async function init() {
mount("dummy", "/tmp", "tmpfs", flags.MS_NODEV, "") mount("dummy", "/tmp", "tmpfs", flags.MS_NODEV, "")
} }
/**
* @type { string[] }
*/
const after = [] // list of init script to load before const after = [] // list of init script to load before
/**
* @type { string[] }
*/
const before = [] const before = []
module.exports = { module.exports = {
+29 -20
View File
@@ -1,27 +1,36 @@
//@ts-check //@ts-check
const graphics = require('../../chibrax/graphics') const graphics = require('../../chibrax/graphics')
const shapes = require('../lib/shapes')
const path = require('path')
graphics.clear() graphics.clear()
drawChibrax() drawChibrax()
const bitmap = shapes.createBitmap(400, 400)
const pencil = shapes.pencilFromBitmap(bitmap, [0,255, 0,255])
shapes.drawCircle(pencil, 200, 200, 190)
graphics.drawBitmap(0, 0, pencil)
graphics.flip() graphics.flip()
function drawChibrax() { function drawChibrax() {
//LA LETTRE C //LA LETTRE C
for(let i = 0; i < 100; i++) { for(let i = 0; i < 100; i++) {
for(let j = 0; j < 10; j++) { for(let j = 0; j < 10; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
for(let i = 0; i < 20; i++) { for(let i = 0; i < 20; i++) {
for(let j = 10; j < 110; j++) { for(let j = 10; j < 110; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
for(let i = 0; i < 100; i++) { for(let i = 0; i < 100; i++) {
for(let j = 110; j < 120; j++) { for(let j = 110; j < 120; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
@@ -29,106 +38,106 @@ function drawChibrax() {
//LA LETTRE H //LA LETTRE H
for(let i = 110; i < 130; i++) { for(let i = 110; i < 130; i++) {
for(let j = 0; j < 100; j++) { for(let j = 0; j < 100; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
for(let i = 110; i < 210; i++) { for(let i = 110; i < 210; i++) {
for(let j = 50; j < 60; j++) { for(let j = 50; j < 60; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
for(let i = 210; i < 230; i++) { for(let i = 210; i < 230; i++) {
for(let j = 0; j < 100; j++) { for(let j = 0; j < 100; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
//LA LETTRE I //LA LETTRE I
for(let i = 240; i < 260; i++) { for(let i = 240; i < 260; i++) {
for(let j = 0; j < 100; j++) { for(let j = 0; j < 100; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
//LA LETTRE B //LA LETTRE B
for(let i = 270; i < 280; i++) { for(let i = 270; i < 280; i++) {
for(let j = 0; j < 100; j++) { for(let j = 0; j < 100; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
for(let i = 380; i < 390; i++) { for(let i = 380; i < 390; i++) {
for(let j = 0; j < 100; j++) { for(let j = 0; j < 100; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
for(let i = 270; i < 390; i++) { for(let i = 270; i < 390; i++) {
for(let j = 0; j < 10; j++) { for(let j = 0; j < 10; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
for(let i = 270; i < 390; i++) { for(let i = 270; i < 390; i++) {
for(let j = 50; j < 60; j++) { for(let j = 50; j < 60; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
for(let i = 270; i < 390; i++) { for(let i = 270; i < 390; i++) {
for(let j = 90; j < 100; j++) { for(let j = 90; j < 100; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
//LA LETTRE R //LA LETTRE R
for(let i = 400; i < 410; i++) { for(let i = 400; i < 410; i++) {
for(let j = 0; j < 100; j++) { for(let j = 0; j < 100; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
for(let i = 510; i < 520; i++) { for(let i = 510; i < 520; i++) {
for(let j = 0; j < 100; j++) { for(let j = 0; j < 100; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
for(let i = 400; i < 520; i++) { for(let i = 400; i < 520; i++) {
for(let j = 0; j < 10; j++) { for(let j = 0; j < 10; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
for(let i = 400; i < 520; i++) { for(let i = 400; i < 520; i++) {
for(let j = 50; j < 60; j++) { for(let j = 50; j < 60; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
//LA LETTRE E //LA LETTRE E
for(let i = 530; i < 630; i++) { for(let i = 530; i < 630; i++) {
for(let j = 0; j < 10; j++) { for(let j = 0; j < 10; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
for(let i = 530; i < 550; i++) { for(let i = 530; i < 550; i++) {
for(let j = 10; j < 110; j++) { for(let j = 10; j < 110; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
for(let i = 530; i < 630; i++) { for(let i = 530; i < 630; i++) {
for(let j = 50; j < 60; j++) { for(let j = 50; j < 60; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
for(let i = 530; i < 630; i++) { for(let i = 530; i < 630; i++) {
for(let j = 110; j < 120; j++) { for(let j = 110; j < 120; j++) {
graphics.setPixel(i,j, [0,0,255,0]) graphics.setPixel(i,j, [0,0,255, 255])
} }
} }
+20 -3
View File
@@ -7,6 +7,10 @@ let aliases = require("../lib/sheebr/aliases")
let { spawn } = require('child_process') let { spawn } = require('child_process')
//utiliser ce code au lieux de execSync permet d'afficher le stdout au fur et a mesure ce qui fait qu'on a les logs quand une application throw une erreur //utiliser ce code au lieux de execSync permet d'afficher le stdout au fur et a mesure ce qui fait qu'on a les logs quand une application throw une erreur
/**
* @param { string } cmd
* @param { import('child_process').SpawnOptionsWithoutStdio } [option]
*/
async function spawnAndWait(cmd, option) { async function spawnAndWait(cmd, option) {
const child = spawn(cmd, option) const child = spawn(cmd, option)
@@ -36,6 +40,10 @@ async function start(){
} }
} }
/**
* @param { string } input
* @returns
*/
async function evaluate(input){ async function evaluate(input){
let lexer = new Lexer(input) let lexer = new Lexer(input)
let args = lexer.scanTokens() let args = lexer.scanTokens()
@@ -70,12 +78,13 @@ async function evaluate(input){
} }
/**
* @param {string[]} args
*/
async function evaluateProgram(args){ async function evaluateProgram(args){
let found = false; let found = false;
for(let path of environment.path){ for(let path of environment.path.split(':')){
let tobreak = false; let tobreak = false;
const files = fs.readdirSync(path); const files = fs.readdirSync(path);
if(files.includes(`${args[0]}.js`)){ if(files.includes(`${args[0]}.js`)){
@@ -95,6 +104,10 @@ async function evaluateProgram(args){
} }
} }
/**
* @param {string[]} args
* @returns
*/
function evaluateEnvironmentVariables(args){ function evaluateEnvironmentVariables(args){
let newArgs = [] let newArgs = []
for(let arg of args){ for(let arg of args){
@@ -111,6 +124,10 @@ function evaluateEnvironmentVariables(args){
return newArgs; return newArgs;
} }
/**
* @param { string[] } args
* @returns
*/
function evaluateAliases(args){ function evaluateAliases(args){
if(args[0] in aliases){ if(args[0] in aliases){
return aliases[args[0]].concat(args.slice(1)) return aliases[args[0]].concat(args.slice(1))
+13
View File
@@ -0,0 +1,13 @@
// Faire une lib en relatif
// Faire une api a la xorg
// Faire une api de changement de resolution
// Faire des courbes de bézier
// Géré la transparence
// Objet de Forme => { stroke & fill }
// fonts
+101
View File
@@ -0,0 +1,101 @@
//@ts-check
/**
* DICKPICK is a image drawing library
*/
const graphics = require('../../chibrax/graphics')
/**
* @param { number } x
* @param { number } y
* @param { number } dx length on the x axis
* @param { number } dy length on the y axis
* @param { string } color
*/
function drawRect(x, y, dx, dy, color) {
const bitmap = {
data: Buffer.alloc(dx*dy*4, Buffer.from(graphics.parseHexColor(color))),
width: dx,
height: dy
}
graphics.drawBitmap(x,y, bitmap)
}
/**
*
* @param { import('@jimp/core').Bitmap } Bitmap
* @param { number[] } color
* @returns { Pencil }
*/
function pencilFromBitmap(Bitmap, color) {
return { ...Bitmap, color }
}
/**
* @param { number } width
* @param { number } height
* @returns
*/
function createBitmap(width, height) {
const data = Buffer.alloc(width * height * 4, Buffer.from([0, 0, 0, 0]));
return { width, height, data }
}
/**
* @param { Pencil } pencil
* @param { number } x
* @param { number } y
*/
function setPixel(pencil, x, y) {
pencil.data.set(pencil.color, y*pencil.width*4 + x*4)
}
/**
*
* @param { number } x
* @param { number } y
* @param { number } xc
* @param { number } yc
* @param { Pencil } pencil
*/
function symetrie8Axes(xc, yc, x, y, pencil) {
setPixel(pencil, x+xc, y+yc)
setPixel(pencil, x+xc,-y+yc)
setPixel(pencil, -x+xc,-y+yc)
setPixel(pencil, -x+xc,y+yc)
setPixel(pencil, y+xc,x+yc)
setPixel(pencil, y+xc,-x+yc)
setPixel(pencil, -y+xc,-x+yc)
setPixel(pencil, -y+xc,x+yc,)
}
/**
* BresenhamCircle
* @param { Pencil } pencil
* @param { number } xc
* @param { number } yc
* @param { number } r
*/
function drawCircle(pencil, xc, yc, r) {
let x = 0
let y = r
let d = 3 - (2 * r);
symetrie8Axes(xc, yc, x, y, pencil);
while(x <= y) {
if(d <= 0) {
d = d + (4 * x) + 6;
}
else {
d = d + (4 * x) - (4 * y) + 10;
y = y - 1;
}
x = x + 1;
symetrie8Axes(xc, yc, x, y, pencil);
}
}
module.exports = { drawRect, setPixel, pencilFromBitmap, createBitmap, drawCircle }
@@ -1,3 +1,7 @@
//@ts-check
/**
* @type {{ [key: string]: string[] }}
*/
const aliases = { const aliases = {
ls: ["ls", "--color"] ls: ["ls", "--color"]
} }
@@ -1,9 +1,13 @@
//@ts-check
/**
* @type {{ [key: string]: string }}
*/
let environment = { let environment = {
path: ["/usr/bin", "/usr/sbin", "/usr/lib/sheebr", "/usr/local/bin", "/usr/local/sbin/"], path: ["/usr/bin", "/usr/sbin", "/usr/lib/sheebr", "/usr/local/bin", "/usr/local/sbin/"].join(':'),
ls_color: JSON.stringify({ ls_color: JSON.stringify({
di: [01, 34], di: [1, 34],
ln: [01, 36], ln: [1, 36],
ex: [01, 32] ex: [1, 32]
}), }),
node: "/usr/local/bin/node" node: "/usr/local/bin/node"
} }
+8 -3
View File
@@ -1,8 +1,13 @@
//@ts-check
const { isAlpha } = require('./utils') const { isAlpha } = require('./utils')
class Lexer{ class Lexer{
/**
* @param { string } source
*/
constructor(source){ constructor(source){
/** @type { string[] } */
this.tokens = []; this.tokens = [];
this.current = 0; this.current = 0;
this.start = 0; this.start = 0;
@@ -46,9 +51,9 @@ class Lexer{
this.tokens.push(content) this.tokens.push(content)
} }
addToken(tokenType, value=""){ //addToken(tokenType, value=""){
this.tokens.push(Token(tokenType, value)) // this.tokens.push(Token(tokenType, value))
} //}
} }
+4
View File
@@ -24,6 +24,10 @@ async function getline(str) {
}) })
} }
/**
* @param { string } str
* @returns
*/
function isAlpha(str){ function isAlpha(str){
return /^[a-zA-Z]*$/.test(str) return /^[a-zA-Z]*$/.test(str)
} }
@@ -1,5 +1,5 @@
{ {
"include": ["./**/*"], "include": ["./definitions.d.ts", "./rootfs overrides/**/*"],
"compilerOptions": { "compilerOptions": {
// Tells TypeScript to read JS files, as // Tells TypeScript to read JS files, as
// normally they are ignored as source files // normally they are ignored as source files