mirror of
https://github.com/danbulant/node-x11
synced 2026-07-05 03:00:42 +00:00
PutImage example: load and display logo from bmp file
This commit is contained in:
parent
aa5c4bac1c
commit
318b1afd1f
7 changed files with 181 additions and 0 deletions
|
|
@ -256,6 +256,17 @@ module.exports = {
|
||||||
return [format, args];
|
return [format, args];
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
||||||
|
PutImage: [
|
||||||
|
// format: 0 - Bitmap, 1 - XYPixmap, 2 - ZPixmap
|
||||||
|
function(format, drawable, gc, width, height, dstX, dstY, leftPad, depth, data) {
|
||||||
|
var padded = xutil.padded_length(data.length);
|
||||||
|
var reqLen = 6 + padded/4; // (length + 3) >> 2 ???
|
||||||
|
var padLength = padded - data.length;
|
||||||
|
var pad = new Buffer(padLength); // TODO: new pack format 'X' - skip amount of bytes supplied in numerical argument
|
||||||
|
return [ 'CCSLLSSssCCxxaa', [72, format, reqLen, drawable, gc, width, height, dstX, dstY, leftPad, depth, data, pad]];
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
PolyText8: [
|
PolyText8: [
|
||||||
function(drawable, gc, x, y, items) {
|
function(drawable, gc, x, y, items) {
|
||||||
|
|
|
||||||
45
test/bmp.js
Normal file
45
test/bmp.js
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
// http://atlc.sourceforge.net/bmp.html
|
||||||
|
// Any better format documentation?
|
||||||
|
|
||||||
|
var fs = require('fs');
|
||||||
|
var Pixmap = require('./pixmap').Pixmap;
|
||||||
|
var Buffer = require('buffer').Buffer;
|
||||||
|
require('../lib/x11/unpackbuffer').addUnpack(Buffer);
|
||||||
|
|
||||||
|
var reversed = new Buffer(256);
|
||||||
|
for (var i=0; i < 256; ++i)
|
||||||
|
{
|
||||||
|
var res = 0;
|
||||||
|
for (b = 0; b < 8; ++b)
|
||||||
|
{
|
||||||
|
res += ((i & (1 << b) ) >> b) << (7-b);
|
||||||
|
}
|
||||||
|
reversed[i] = res;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.decodeBuffer = function(buffer)
|
||||||
|
{
|
||||||
|
var h = buffer.unpack('CCLxxxxLLLLSSLLLL');
|
||||||
|
var header = {};
|
||||||
|
header.filesize = h[2];
|
||||||
|
header.data_offset = h[3];
|
||||||
|
header.header_size = h[4];
|
||||||
|
header.width = h[5];
|
||||||
|
header.height = h[6];
|
||||||
|
header.num_planes = h[7];
|
||||||
|
header.bpp = h[8];
|
||||||
|
header.compression = h[9];
|
||||||
|
header.data_size = h[10];
|
||||||
|
header.hresolution = h[11]; // pixels per METER!
|
||||||
|
header.vresolution = h[12];
|
||||||
|
// skipped: num colors, num important colors, palette
|
||||||
|
var data = buffer.slice(header.data_offset, header.data_offset+header.data_size);
|
||||||
|
// TODO: decode compressed bitmap
|
||||||
|
//console.log(header);
|
||||||
|
|
||||||
|
// mirror bits & invert
|
||||||
|
for (var i=0; i < data.length; ++i)
|
||||||
|
data[i] = 255 - reversed[data[i]];
|
||||||
|
|
||||||
|
return new Pixmap(header.bpp, header.width, header.height, data);
|
||||||
|
}
|
||||||
BIN
test/nodejs-black.bmp
Normal file
BIN
test/nodejs-black.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.2 KiB |
9
test/pixmap.js
Normal file
9
test/pixmap.js
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
function Pixmap(depth, width, height, buffer)
|
||||||
|
{
|
||||||
|
this.depth = depth;
|
||||||
|
this.width = width;
|
||||||
|
this.height = height;
|
||||||
|
this.data = buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.Pixmap = Pixmap;
|
||||||
48
test/putimage.js
Normal file
48
test/putimage.js
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
var Buffer = require('buffer').Buffer;
|
||||||
|
var x11 = require('../lib/x11');
|
||||||
|
var fs = require('fs');
|
||||||
|
var logo1bit = fs.readFileSync('./nodejs-black.bmp');
|
||||||
|
var pixmap = require('./bmp').decodeBuffer(logo1bit);
|
||||||
|
|
||||||
|
var xclient = x11.createClient();
|
||||||
|
var Exposure = x11.eventMask.Exposure;
|
||||||
|
var PointerMotion = x11.eventMask.PointerMotion;
|
||||||
|
|
||||||
|
var bitmap = new Buffer(128*128/8); // 16384 bits, 2048 bytes bitmap
|
||||||
|
for (var i=0; i < bitmap.length; ++i)
|
||||||
|
{
|
||||||
|
bitmap[i] = i % 256;
|
||||||
|
}
|
||||||
|
|
||||||
|
xclient.on('connect', function(display) {
|
||||||
|
var X = this;
|
||||||
|
var root = display.screen[0].root;
|
||||||
|
var white = display.screen[0].white_pixel;
|
||||||
|
var black = display.screen[0].black_pixel;
|
||||||
|
//console.log(display.screen[0]);
|
||||||
|
|
||||||
|
var wid = X.AllocID();
|
||||||
|
X.CreateWindow(
|
||||||
|
wid, root,
|
||||||
|
10, 10, 400, 300,
|
||||||
|
1, 1, 0,
|
||||||
|
{
|
||||||
|
backgroundPixel: white, eventMask: Exposure|PointerMotion
|
||||||
|
}
|
||||||
|
);
|
||||||
|
X.MapWindow(wid);
|
||||||
|
|
||||||
|
var gc = X.AllocID();
|
||||||
|
X.CreateGC(gc, wid, { foreground: black, background: white } );
|
||||||
|
|
||||||
|
X.on('event', function(ev) {
|
||||||
|
if (ev.type == 12) // expose
|
||||||
|
{
|
||||||
|
//X.PutImage(0, wid, gc, 128, 128, 20, 20, 0, 1, bitmap);
|
||||||
|
X.PutImage(0, wid, gc, pixmap.width, pixmap.height, 20, 20, 0, pixmap.depth, pixmap.data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
X.on('error', function(e) {
|
||||||
|
console.log(e);
|
||||||
|
});
|
||||||
|
});
|
||||||
20
test/query_pointer.js
Normal file
20
test/query_pointer.js
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
var x11 = require('../lib/x11');
|
||||||
|
var X = x11.createClient();
|
||||||
|
|
||||||
|
X.on('connect', function(display) {
|
||||||
|
|
||||||
|
var screen = display.screen[0];
|
||||||
|
var wid = X.AllocID();
|
||||||
|
X.CreateWindow(wid, screen.root, 10, 10, 400, 300, 1, 1, 0, { backgroundPixel: screen.white_pixel });
|
||||||
|
X.MapWindow(wid);
|
||||||
|
setInterval( function() {
|
||||||
|
X.QueryPointer(wid, function(res) {
|
||||||
|
console.log(res);
|
||||||
|
});
|
||||||
|
}, 1000);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
X.on('error', function(err) {
|
||||||
|
console.log(err);
|
||||||
|
});
|
||||||
48
test/query_pointer_benchmark_sync.js
Normal file
48
test/query_pointer_benchmark_sync.js
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
// test results:
|
||||||
|
|
||||||
|
// WinServ2008R2, Intel(R) Core(TM) i7 CPU 870 @ 2.93GHz + Xming 6.9.0.31
|
||||||
|
//
|
||||||
|
// 0.4.3/cygwin 32bit : 2900 +/- 300 req/sec
|
||||||
|
// 0.5.1/win32 : 5500 +/- 1000 req/sec
|
||||||
|
// cygwin x11perf -sync -pointer : 2800 +/- 200 req/sec
|
||||||
|
// cygwin x11perf -pointer : 5600 +/- 200 req/sec
|
||||||
|
|
||||||
|
//
|
||||||
|
// Ubuntu 11.04 32bit, Intel(R) Core(TM)2 Duo CPU T7250 @2.00GHz, XOrg 1:7.6+4ubuntu3.1
|
||||||
|
// 0.4.9pre :
|
||||||
|
// x11perf -sync -pointer :
|
||||||
|
// x11perf -pointer :
|
||||||
|
|
||||||
|
var x11 = require('../lib/x11');
|
||||||
|
var X = x11.createClient();
|
||||||
|
|
||||||
|
var total = 50000;
|
||||||
|
var num_qp_left = total;
|
||||||
|
var start = +new Date();
|
||||||
|
|
||||||
|
function benchmarkQP(wid)
|
||||||
|
{
|
||||||
|
X.QueryPointer(wid, function(res) {
|
||||||
|
num_qp_left--;
|
||||||
|
if (num_qp_left > 0)
|
||||||
|
benchmarkQP(wid);
|
||||||
|
else {
|
||||||
|
var end = +new Date();
|
||||||
|
var delta = (end - start)/1000
|
||||||
|
console.log( 'Finished ' + total + ' requests in ' + delta + ' sec, ' + total/delta + ' req/sec');
|
||||||
|
X.terminate();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
X.on('connect', function(display) {
|
||||||
|
var screen = display.screen[0];
|
||||||
|
var wid = X.AllocID();
|
||||||
|
X.CreateWindow(wid, screen.root, 10, 10, 400, 300, 1, 1, 0, { backgroundPixel: screen.white_pixel });
|
||||||
|
X.MapWindow(wid);
|
||||||
|
benchmarkQP(wid);
|
||||||
|
});
|
||||||
|
|
||||||
|
X.on('error', function(err) {
|
||||||
|
console.log(err);
|
||||||
|
});
|
||||||
Loading…
Reference in a new issue