81 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| //var logo = require('./node-png').readPng('./node-logo.png');
 | |
| var fs = require('fs');
 | |
| var Decoder = require('./png-decoder');
 | |
| var decoder = new Decoder();
 | |
| 
 | |
| var logo = {
 | |
|   data : Buffer.from(decoder.parse(fs.readFileSync('./screen.png'))),
 | |
|   width : decoder._IHDR.width,
 | |
|   height : decoder._IHDR.height
 | |
| };
 | |
| 
 | |
| var x11 = require('../../lib');
 | |
| 
 | |
| var Exposure = x11.eventMask.Exposure;
 | |
| 
 | |
| x11.createClient(function(err, display)
 | |
| {
 | |
|   var X = display.client;
 | |
|   X.require('render', function(err, Render) {
 | |
|     var root = display.screen[0].root;
 | |
|     main(root, X, Render, display);
 | |
|   });
 | |
| });
 | |
| 
 | |
| 
 | |
| function main(root, X, Render, display) {
 | |
| 
 | |
|   var win, picWin, pic, gc;
 | |
| 
 | |
|   win = X.AllocID();
 | |
|   X.CreateWindow(
 | |
|      win, root,
 | |
|      0, 0, logo.width, logo.height,
 | |
|      0, 0, 0, 0,
 | |
|      { eventMask: Exposure }
 | |
|   );
 | |
|   X.MapWindow(win);
 | |
| 
 | |
|   gc = X.AllocID();
 | |
|   X.CreateGC(gc, win);
 | |
| 
 | |
|   var logoPixmap = X.AllocID();
 | |
|   X.CreatePixmap(logoPixmap, win, 24, logo.width, logo.height);
 | |
| 
 | |
|   var rscreen = display.screen[0];
 | |
|   var screen =
 | |
|     rscreen.depths[rscreen.root_depth][
 | |
|       Object.keys(rscreen.depths[rscreen.root_depth])[0]];
 | |
| 
 | |
|   var rmask = parseInt(screen.red_mask, 10);
 | |
|   var gmask = parseInt(screen.green_mask, 10);
 | |
|   var bmask = parseInt(screen.blue_mask, 10);
 | |
| 
 | |
|   for (var y = 0; y < logo.height; y++) {
 | |
|     for (var x = 0; x < logo.width; x++) {
 | |
|       var pixel = Buffer.from([
 | |
|         logo.data[(x + logo.width * y) * 4],
 | |
|         logo.data[(x + logo.width * y) * 4 + 1],
 | |
|         logo.data[(x + logo.width * y) * 4 + 2], 0]).readInt32LE();
 | |
| 
 | |
|       logo.data[(x + logo.width * y) * 4 ] = (pixel & rmask) >> 16;
 | |
|       logo.data[(x + logo.width * y) * 4 + 1] = (pixel & gmask) >> 8;
 | |
|       logo.data[(x + logo.width * y) * 4 + 2] = (pixel & bmask) >> 0;
 | |
|       logo.data[(x + logo.width * y) * 4 + 3] = 0x00;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   X.PutImage(2, logoPixmap, gc, logo.width, logo.height, 0, 0, 0, 24, logo.data);
 | |
| 
 | |
|   var logoPicture = X.AllocID();
 | |
|   Render.CreatePicture(logoPicture, logoPixmap, Render.rgb24);
 | |
|   var winPicture = X.AllocID();
 | |
|   Render.CreatePicture(winPicture, win, Render.rgb24);
 | |
| 
 | |
|   X.on('event', function(ev) {
 | |
|     if (ev.name == 'Expose') {
 | |
|       Render.Composite(3, logoPicture, 0, winPicture, 0, 0, 0, 0, 0, 0, logo.width, logo.height);
 | |
|     }
 | |
|   });
 | |
| }
 |