ntk 2.2.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +156 -151
  2. package/lib/app.js +54 -21
  3. package/lib/cleanup.js +14 -0
  4. package/lib/drawable.js +12 -18
  5. package/lib/events_map.js +92 -98
  6. package/lib/fontconfig.js +123 -17
  7. package/lib/glyphset.js +40 -21
  8. package/lib/image.js +138 -0
  9. package/lib/index.js +123 -57
  10. package/lib/path.js +734 -0
  11. package/lib/picture.js +84 -41
  12. package/lib/pixmap.js +50 -39
  13. package/lib/rasterize.js +178 -0
  14. package/lib/renderingcontext_2d.js +1078 -695
  15. package/lib/renderingcontext_opengl.js +53 -46
  16. package/lib/renderingcontext_x11.js +59 -67
  17. package/lib/text/font.js +196 -0
  18. package/lib/text/fontmanager.js +233 -0
  19. package/lib/text/fontsource.js +179 -0
  20. package/lib/text/glyphs.js +456 -0
  21. package/lib/text/layout.js +356 -0
  22. package/lib/text/shape.js +141 -0
  23. package/lib/trapezoid.js +131 -0
  24. package/lib/widgets/css.js +676 -0
  25. package/lib/widgets/highlight.js +97 -0
  26. package/lib/widgets/htmlview.js +879 -0
  27. package/lib/widgets/markdown.js +148 -0
  28. package/lib/widgets/markdownview.js +487 -0
  29. package/lib/widgets/mermaid.js +720 -0
  30. package/lib/widgets/svgview.js +528 -0
  31. package/lib/widgets/tex.js +681 -0
  32. package/lib/window.js +642 -308
  33. package/package.json +60 -56
  34. package/examples/example-await.js +0 -23
  35. package/examples/example-co.js +0 -13
  36. package/examples/example.js +0 -14
  37. package/examples/fill-styles.js +0 -39
  38. package/examples/glclock.js +0 -100
  39. package/examples/glxpixmap.js +0 -12
  40. package/examples/gradient.js +0 -41
  41. package/examples/package.json +0 -17
  42. package/examples/simpletex.js +0 -72
  43. package/examples/teapot.js +0 -104
  44. package/examples/teapot.json +0 -6
  45. package/examples/text-rendering.js +0 -44
  46. package/lib/fontface.js +0 -103
  47. package/lib/widgets/webview.js +0 -33
package/package.json CHANGED
@@ -1,56 +1,60 @@
1
- {
2
- "name": "ntk",
3
- "author": "Andrey Sidorov <sidorares@yandex.ru>",
4
- "description": "Desktop UI tollkit/widgets set",
5
- "keywords": [
6
- "ui",
7
- "gui",
8
- "widgets",
9
- "desktop"
10
- ],
11
- "homepage": "https://github.com/sidorares/ntk",
12
- "version": "2.2.0",
13
- "maintainers": [
14
- {
15
- "name": "Andrey Sidorov",
16
- "email": "sidoares@yandex.ru"
17
- }
18
- ],
19
- "bugs": {
20
- "url": "http://github.com/sidorares/ntk/issues"
21
- },
22
- "licenses": [
23
- {
24
- "type": "MIT"
25
- }
26
- ],
27
- "repository": {
28
- "type": "git",
29
- "url": "http://github.com/sidorares/ntk.git"
30
- },
31
- "main": "./lib/index.js",
32
- "engines": {
33
- "node": "*"
34
- },
35
- "devDependencies": {
36
- "mocha": "*",
37
- "should": "*"
38
- },
39
- "dependencies": {
40
- "bezier": "^0.1.0",
41
- "canvas-fontstyle": "^1.0.1",
42
- "extrude-polyline": "^1.0.6",
43
- "font-scanner": "^0.1.1",
44
- "freetype2": "^0.3.1",
45
- "gaussian-convolution-kernel": "^1.0.0",
46
- "keysym": "0.0.6",
47
- "parse-color": "^1.0.0",
48
- "pnltri": "^2.1.1",
49
- "weak-napi": "^1.0.2",
50
- "x11": "^2.3.0"
51
- },
52
- "scripts": {
53
- "test": "mocha",
54
- "prepublish": "npm prune"
55
- }
56
- }
1
+ {
2
+ "name": "ntk",
3
+ "version": "3.0.0",
4
+ "description": "Desktop UI toolkit for X11 with canvas-like 2d and OpenGL rendering",
5
+ "author": "Andrey Sidorov <sidorares@yandex.ru>",
6
+ "license": "MIT",
7
+ "keywords": [
8
+ "ui",
9
+ "gui",
10
+ "widgets",
11
+ "desktop",
12
+ "x11",
13
+ "canvas",
14
+ "xrender"
15
+ ],
16
+ "homepage": "https://github.com/sidorares/ntk",
17
+ "bugs": {
18
+ "url": "https://github.com/sidorares/ntk/issues"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/sidorares/ntk.git"
23
+ },
24
+ "type": "module",
25
+ "main": "./lib/index.js",
26
+ "exports": {
27
+ ".": "./lib/index.js"
28
+ },
29
+ "files": [
30
+ "lib"
31
+ ],
32
+ "engines": {
33
+ "node": ">=20.19.0"
34
+ },
35
+ "dependencies": {
36
+ "@dagrejs/dagre": "^3.0.0",
37
+ "bidi-js": "^1.0.3",
38
+ "canvas-fontstyle": "^1.0.1",
39
+ "css-select": "^7.0.0",
40
+ "domutils": "^4.0.2",
41
+ "extrude-polyline": "^1.0.6",
42
+ "fontkit": "^2.0.4",
43
+ "highlight.js": "^11.11.1",
44
+ "htmlparser2": "^12.0.0",
45
+ "jpeg-js": "^0.4.4",
46
+ "katex": "^0.18.1",
47
+ "keysym": "0.0.6",
48
+ "linebreak": "^1.1.0",
49
+ "marked": "^18.0.7",
50
+ "mermaid": "^11.16.0",
51
+ "parse-color": "^1.0.0",
52
+ "pngjs": "^7.0.0",
53
+ "postcss": "^8.5.23",
54
+ "x11": "^3.1.0",
55
+ "yoga-layout": "^3.2.1"
56
+ },
57
+ "scripts": {
58
+ "test": "node --test"
59
+ }
60
+ }
@@ -1,23 +0,0 @@
1
- var ntk = require('../lib');
2
-
3
- async function test() {
4
- var app = await ntk.createClient();
5
- var wnd = app.createWindow({title: "Close me!", x: 100, y: 100, width: 300, height: 300});
6
-
7
- // await wnd.mapped(); - map() + wait for 'is visible' event
8
-
9
- wnd.map();
10
-
11
- var tree = await wnd.tree;
12
- var pointer = await wnd.pointer;
13
- var ctx = await wnd.getContext('2d');
14
-
15
- // all in parallel
16
- let [tree, pointer, ctx] = await [wnd.tree, wnd.pointer, wnd.getContext('2d')]
17
-
18
- wnd.on('mousedown', function(ev) {
19
- console.log(ev);
20
- });
21
- }
22
-
23
- test();
@@ -1,13 +0,0 @@
1
- var ntk = require('../lib');
2
- var co = require('co');
3
-
4
- co(function*() {
5
-
6
- var app = yield ntk.createClient();
7
- var wnd = app.createWindow({title: "Close me!", x: 100, y: 100, width: 300, height: 300});
8
- wnd.map();
9
- wnd.on('mousedown', function(ev) {
10
- console.log(ev);
11
- });
12
-
13
- });
@@ -1,14 +0,0 @@
1
- var ntk = require('../lib');
2
-
3
- ntk.createClient(main);
4
-
5
- function main(err, app) {
6
- var mainwnd = app.createWindow({title: "Close me!"})
7
- .on('mouseout', function(ev) { console.log('Out'); })
8
- .on('mouseover', function(ev) { console.log('In'); })
9
- .on('mousedown', function(ev) {
10
- ev.window.unmap();
11
- setTimeout(function() { ev.window.map(); }, 1000);
12
- })
13
- .map();
14
- }
@@ -1,39 +0,0 @@
1
- var ntk = require('../lib');
2
-
3
- ntk.createClient( (err, app) => {
4
- var wnd = app.createWindow({ width: 800, height: 600});
5
- var ctx = wnd.getContext('2d');
6
-
7
- var text = 'This is Test test';
8
-
9
- var lastx = 0;
10
- var lasty = 0;
11
-
12
- wnd.on('expose', (ev) => {
13
- ctx.fillStyle = 'white';
14
- ctx.fillRect(ev.x, ev.y, ev.width, ev.height, 1, 0.5, 0.5, 1);
15
- ctx.font = "50px 'Times New Roman'";
16
- var w = ctx.measureText(text).width;
17
- ctx.fillStyle = ctx.createLinearGradient(0, 0, w, 100)
18
- .addColorStop(0, 'red')
19
- .addColorStop(1, 'blue');
20
- ctx.fillStyle = 'red'; //'rgba(200, 200, 180, 0.7)';
21
- ctx.fillText(text, 100, 100);// 750 - w, 250);
22
- });
23
- var shift = 0;
24
- wnd.on('keydown', function(ev) {
25
- if (ev.codepoint == 8)
26
- text = text.slice(0, -1);
27
- else if (ev.codepoint)
28
- text = text + String.fromCodePoint(ev.codepoint);
29
-
30
- wnd.emit('expose', { x: 0, y: 0, width: 1000, height: 1000});
31
- });
32
- wnd.on('mousemove', function(ev) {
33
- lastx = ev.x;
34
- lasty = ev.y;
35
- wnd.emit('expose', { x: 0, y: 0, width: 1000, height: 1000});
36
- });
37
- wnd.map();
38
- });
39
-
@@ -1,100 +0,0 @@
1
- var ntk = require('../lib');
2
-
3
- var width = 300;
4
- var height = 300;
5
- var angle = 0;
6
-
7
- function draw(gl) {
8
- gl.Enable(gl.BLEND);
9
- gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
10
- gl.Viewport(0, 0, width, height);
11
- gl.MatrixMode(gl.PROJECTION);
12
- gl.LoadIdentity();
13
- if (width < height)
14
- gl.Frustum(-1.0, 1.0, -height/width, height/width, -35.0, 20);
15
- else
16
- gl.Frustum(-width/height, width/height, -1, 1, -35.0, 20);
17
- gl.MatrixMode(gl.MODELVIEW);
18
- gl.LoadIdentity();
19
-
20
- gl.ClearColor(0.3,0.3,0.3,0.0);
21
- gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
22
-
23
- gl.Color3f(1, 0, 0);
24
- for (var i=0; i < 12; ++i) {
25
- gl.Rotatef(30, 0, 0, 1);
26
- gl.Begin(gl.QUADS);
27
- gl.Vertex3f(-0.01, 0.8, 0);
28
- gl.Vertex3f(-0.01, 1.0, 0);
29
- gl.Vertex3f(0.01, 1.0, 0);
30
- gl.Vertex3f(0.01, 0.8, 0);
31
- gl.End();
32
- }
33
- gl.LoadIdentity();
34
- gl.Color4f(0, 0, 1, 0.3);
35
- for (var i=0; i < 60; ++i) {
36
- gl.Rotatef(6, 0, 0, 1);
37
- gl.PointSize(8);
38
- gl.Begin(gl.POINTS);
39
- gl.Vertex3f(0, 0.99, 0);
40
- gl.End();
41
- gl.Begin(gl.QUADS);
42
- gl.Vertex3f(-0.003, 0.85, 0);
43
- gl.Vertex3f(-0.003, 1.0, 0);
44
- gl.Vertex3f(0.003, 1.0, 0);
45
- gl.Vertex3f(0.003, 0.85, 0);
46
- gl.End();
47
- }
48
-
49
- var t = new Date();
50
- gl.LoadIdentity();
51
- gl.Color4f(1, 1, 1, 0.5);
52
- gl.Rotatef(-(t.getSeconds()*6000+6*t.getMilliseconds())/1000, 0, 0, 1);
53
- gl.Begin(gl.TRIANGLES);
54
- gl.Vertex3f(-0.02, -0.1, 0);
55
- gl.Vertex3f(0, 0.9, 0);
56
- gl.Vertex3f(0.02, -0.1, 0);
57
- gl.End();
58
-
59
- gl.LoadIdentity();
60
- gl.Color4f(0.5, 0.5, 0.1, 0.5);
61
- gl.Rotatef(-t.getMinutes()*6 -t.getSeconds()/10 - t.getMilliseconds()/10000, 0, 0, 1);
62
- gl.Begin(gl.TRIANGLES);
63
- gl.Vertex3f(-0.05, -0.1, 0);
64
- gl.Vertex3f(0, 0.8, 0);
65
- gl.Vertex3f(0.05, -0.1, 0);
66
- gl.End();
67
-
68
- gl.LoadIdentity();
69
- gl.Color4f(0, 0, 0, 0.5);
70
- gl.Rotatef(-(t.getHours()*30 + t.getMinutes()/2), 0, 0, 1);
71
- gl.Begin(gl.TRIANGLES);
72
- gl.Vertex3f(-0.08, -0.1, 0);
73
- gl.Vertex3f(0, 0.6, 0);
74
- gl.Vertex3f(0.08, -0.1, 0);
75
- gl.End();
76
-
77
- }
78
-
79
- ntk.createClient(function(err, app) {
80
-
81
- var wnd = app.createWindow({title: "GL clock", x: 100, y: 100, width: 300, height: 300});
82
- wnd.map();
83
- var gl = wnd.getContext('opengl');
84
-
85
- gl.Enable(gl.POINT_SMOOTH);
86
-
87
- function drawAndFinish() {
88
- draw(gl);
89
- gl.SwapBuffers();
90
- gl.Finish(drawAndFinish);
91
- }
92
- drawAndFinish();
93
-
94
- wnd.on('resize', function(ev) {
95
- width = ev.width;
96
- height = ev.height;
97
- draw(gl);
98
- gl.SwapBuffers();
99
- });
100
- });
@@ -1,12 +0,0 @@
1
- var ntk = require('../lib');
2
- var Pixmap = require('../lib/pixmap');
3
-
4
- ntk.createClient(function(err, app) {
5
- var wnd = app.createWindow({title: 'opengl drawable as texture example', x: 100, y: 100, width: 300, height: 300});
6
- wnd.map();
7
- var xpixmap = new Pixmap(app, {parent: wnd, width: 512, height: 512, depth: 24});
8
- var gl = wnd.getContext('opengl');
9
- var pixmap = gl.CreateGLXPixmap(xpixmap);
10
- console.log('gl.BindTexImage(', pixmap.id, 0x20DE );
11
- //gl.BindTexImage(pixmap.id, 0x20DE);
12
- });
@@ -1,41 +0,0 @@
1
- var ntk = require('../lib');
2
-
3
- var width = 300;
4
- var height = 300;
5
- var angle = 0;
6
-
7
- function draw(gl) {
8
- //gl.Enable(gl.BLEND);
9
- //gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
10
- gl.Viewport(0, 0, width, height);
11
- gl.MatrixMode(gl.PROJECTION);
12
- gl.LoadIdentity();
13
- gl.Frustum(-1.0, 1.0, -1, 1, -35.0, 20);
14
- gl.MatrixMode(gl.MODELVIEW);
15
- gl.LoadIdentity();
16
-
17
- gl.ClearColor(0.3,0.3,0.3,0.0);
18
- gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
19
- gl.Begin(gl.QUADS);
20
- gl.Color3f(1, 0, 0);
21
- gl.Vertex3f(-1, -1, 0);
22
- gl.Vertex3f(1, -1, 0);
23
- gl.Color3f(1, 1, 0);
24
- gl.Vertex3f(1, 1, 0);
25
- gl.Vertex3f(-1, 1, 0);
26
- gl.End();
27
- }
28
-
29
- ntk.createClient(main);
30
- function main(err, app) {
31
- var wnd = app.createWindow({title: 'simple opengl gradient', x: 100, y: 100, width: 300, height: 300});
32
- wnd.map();
33
- var gl = wnd.getContext('opengl');
34
- gl.Enable(gl.POINT_SMOOTH);
35
- wnd.on('resize', function(ev) {
36
- width = ev.width;
37
- height = ev.height;
38
- draw(gl);
39
- gl.SwapBuffers();
40
- });
41
- }
@@ -1,17 +0,0 @@
1
- {
2
- "name": "examples",
3
- "version": "1.0.0",
4
- "description": "",
5
- "main": "example-await.js",
6
- "scripts": {
7
- "test": "echo \"Error: no test specified\" && exit 1"
8
- },
9
- "keywords": [],
10
- "author": "",
11
- "license": "ISC",
12
- "dependencies": {
13
- "baboon-image": "^2.1.0",
14
- "bunny": "^1.0.1",
15
- "teapot": "^1.0.0"
16
- }
17
- }
@@ -1,72 +0,0 @@
1
- var ntk = require('../lib');
2
-
3
- var width = 300;
4
- var height = 300;
5
- var angle = 0;
6
- var angley = 0;
7
-
8
- function resize(gl) {
9
- gl.Viewport(0, 0, width, height);
10
- gl.MatrixMode(gl.PROJECTION);
11
- gl.LoadIdentity();
12
- if (width < height)
13
- gl.Frustum(-1.0, 1.0, -height/width, height/width, -35.0, 20);
14
- else
15
- gl.Frustum(-width/height, width/height, -1.0, 1.0, -35.0, 20);
16
- }
17
-
18
- function draw(gl) {
19
- gl.MatrixMode(gl.MODELVIEW);
20
-
21
- gl.ClearColor(0.3,0.3,0.3,0.0);
22
- gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
23
-
24
- gl.LoadIdentity();
25
- gl.Rotatef(-90 + 360*angle/width, 0, 0, 1);
26
- // gl.Rotatef(angley, 0, 1, 0);
27
- gl.Begin(gl.TRIANGLE_STRIP);
28
- gl.TexCoord2f(0.0,0.0);
29
- gl.Vertex3f(-1, -1, 0);
30
-
31
- gl.TexCoord2f(1.0, 0.0);
32
- gl.Vertex3f(1, -1, 0);
33
-
34
- gl.TexCoord2f(0.0, 1.0);
35
- gl.Vertex3f(-1, 1, 0);
36
-
37
- gl.TexCoord2f(1.0,1.0);
38
- gl.Vertex3f(1, 1, 0);
39
- gl.End();
40
- gl.SwapBuffers();
41
- }
42
-
43
- var texture = require('baboon-image');
44
-
45
- ntk.createClient(function(err, app) {
46
-
47
- var wnd = app.createWindow({width: width, height: height});
48
- wnd.map();
49
- var visual = parseInt(require('child_process').execSync('glxinfo -i -b').toString());
50
- var gl = wnd.getContext('opengl', visual);
51
- gl.Enable(gl.TEXTURE_2D);
52
- gl.GenTextures(1, function(err, textures) {
53
- //gl.BindTexture(gl.TEXTURE_2D, textures[0]);
54
- gl.BindTexture(gl.TEXTURE_2D, 1);
55
- gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
56
- gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
57
-
58
- gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGB, 512, 512, 0, gl.RGB, gl.UNSIGNED_BYTE, texture.data);
59
- draw(gl);
60
-
61
- wnd.on('resize', function(ev) {
62
- width = ev.width;
63
- height = ev.height;
64
- resize(gl);
65
- draw(gl);
66
- }).on('mousemove', function(ev) {
67
- angle = ev.x;
68
- angley = ev.y;
69
- draw(gl);
70
- });
71
- });
72
- });
@@ -1,104 +0,0 @@
1
- var ntk = require('../lib');
2
-
3
- var width = 300;
4
- var height = 300;
5
- var angle = 0;
6
-
7
- var model = require('./teapot.json');
8
-
9
- function makeList(gl, callback)
10
- {
11
- gl.GenLists(1, function(err, list) {
12
- listId = list;
13
- gl.NewList(list, gl.COMPILE);
14
- gl.Begin(gl.TRIANGLES);
15
- for (var i=0; i < model.indices.length; i+=3) {
16
- for (var t=i; t < i+3; t++) {
17
- tr = model.indices[t];
18
- var x = model.vertexNormals[tr*3 + 0];
19
- var y = model.vertexNormals[tr*3 + 1];
20
- var z = model.vertexNormals[tr*3 + 2];
21
- gl.Normal3f(x, y, z);
22
- var x = model.vertexPositions[tr*3 + 0];
23
- var y = model.vertexPositions[tr*3 + 1];
24
- var z = model.vertexPositions[tr*3 + 2];
25
- gl.Vertex3f(x, y, z);
26
- }
27
- }
28
- gl.End();
29
- gl.EndList();
30
- callback(list);
31
- });
32
- }
33
-
34
- var scale = 0.1;
35
- var rotx = 0;
36
- var roty = 0;
37
- var lightangle = 0;
38
-
39
- function draw(gl, list) {
40
- {
41
- var pos = [5.0, Math.sin(lightangle)*100, Math.cos(lightangle)*100.0, 0.0]
42
- var red = [ 0.8, 0.1, 0.0, 1.0 ];
43
- var green = [ 0.0, 0.8, 0.2, 1.0 ];
44
- var blue = [ 0.2, 0.2, 1.0, 1.0 ];
45
-
46
- gl.Lightfv(gl.LIGHT0, gl.POSITION, pos);
47
- gl.Enable(gl.CULL_FACE);
48
- gl.Enable(gl.LIGHTING);
49
- gl.Enable(gl.LIGHT0);
50
- gl.Enable(gl.DEPTH_TEST);
51
- gl.Enable(gl.NORMALIZE);
52
- gl.ShadeModel(gl.SMOOTH);
53
-
54
- gl.Enable(gl.BLEND);
55
- gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
56
- gl.Viewport(0, 0, width, height);
57
- gl.MatrixMode(gl.PROJECTION);
58
- gl.LoadIdentity();
59
- if (width < height)
60
- gl.Frustum(-1.0, 1.0, -height/width, height/width, -35.0, 20);
61
- else
62
- gl.Frustum(-width/height, width/height, -1, 1, -35.0, 20);
63
- gl.MatrixMode(gl.MODELVIEW);
64
- gl.LoadIdentity();
65
-
66
- gl.ClearColor(0.3,0.3,0.3,0.0);
67
- gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
68
-
69
- gl.Scalef(scale, scale, scale);
70
- gl.Color3f(1, 0, 0);
71
- gl.Rotatef(rotx, 0, 1, 0);
72
- gl.Rotatef(-roty, 1, 0, 0);
73
- gl.CallList(list)
74
- gl.SwapBuffers();}
75
- }
76
-
77
- ntk.createClient(function(err, app) {
78
- var wnd = app.createWindow({title: "Close me!", x: 100, y: 100, width: 300, height: 300});
79
- wnd.map();
80
- var gl = wnd.getContext('opengl');
81
- gl.Enable(gl.POINT_SMOOTH);
82
- makeList(gl, function(list) {
83
- draw(gl, list);
84
- setInterval(function() {
85
- lightangle += 0.1;
86
- draw(gl, list);
87
- }, 50);
88
- wnd.on('resize', function(ev) {
89
- width = ev.width;
90
- height = ev.height;
91
- draw(gl, list);
92
- }).on('mousemove', function(ev) {
93
- rotx = ev.x;
94
- roty = ev.y;
95
- draw(gl, list);
96
- }).on('mousedown', function(ev) {
97
- if (ev.keycode == 4)
98
- scale *= 0.9;
99
- else
100
- scale /= 0.9;
101
- draw(gl, list);
102
- });
103
- });
104
- });