mirror of
https://github.com/konvajs/konva.git
synced 2025-06-28 15:23:44 +08:00
Alpha nodejs support
This commit is contained in:
parent
5f931cf250
commit
c8ddd27c2c
44
README.md
44
README.md
@ -1,4 +1,4 @@
|
|||||||
Before doing all dev stuff make sure you have node installed. After that, run `npm install` in the main directory to install the node module dependencies.
|
Before doing all dev stuff make sure you have node installed. After that, run `npm install --dev` in the main directory to install the node module dependencies.
|
||||||
|
|
||||||
Run `grunt --help` to see all build options.
|
Run `grunt --help` to see all build options.
|
||||||
|
|
||||||
@ -23,6 +23,48 @@ KineticJS is covered with hundreds of tests and well over a thousand assertions.
|
|||||||
|
|
||||||
Run `grunt gen-doc` and see created 'documentation' folder.
|
Run `grunt gen-doc` and see created 'documentation' folder.
|
||||||
|
|
||||||
|
#NodeJS
|
||||||
|
|
||||||
|
Support of NodeJS is in alpha state!
|
||||||
|
And not published in npm.
|
||||||
|
|
||||||
|
We are using (node-canvas)[https://github.com/LearnBoost/node-canvas] to create canvas element.
|
||||||
|
|
||||||
|
* You have to install node-canvas depependencies (https://github.com/LearnBoost/node-canvas/wiki/_pages)[https://github.com/LearnBoost/node-canvas/wiki/_pages]
|
||||||
|
* Run `npm install KineticJS`
|
||||||
|
|
||||||
|
###Example
|
||||||
|
```javascript
|
||||||
|
var fs = require('fs'),
|
||||||
|
Kinetic = require('KineticJS');
|
||||||
|
|
||||||
|
var layer = new Kinetic.Layer({
|
||||||
|
width : 200,
|
||||||
|
height : 200
|
||||||
|
});
|
||||||
|
|
||||||
|
var rect = new Kinetic.Rect({
|
||||||
|
width : 100,
|
||||||
|
height : 100,
|
||||||
|
x : 50,
|
||||||
|
y : 50,
|
||||||
|
fill : 'green'
|
||||||
|
});
|
||||||
|
var text = new Kinetic.Text({
|
||||||
|
text : 'Generated inside node js',
|
||||||
|
x : 20,
|
||||||
|
y : 20,
|
||||||
|
fill : 'black'
|
||||||
|
});
|
||||||
|
layer.add(rect).add(text);
|
||||||
|
layer.draw();
|
||||||
|
|
||||||
|
var stream = layer.createPNGStream();
|
||||||
|
var file = fs.createWriteStream(__dirname + '/helloworld.png');
|
||||||
|
stream.on('data', function(chunk) {
|
||||||
|
file.write(chunk);
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
#Pull Requests
|
#Pull Requests
|
||||||
I'd be happy to review any pull requests that may better the KineticJS project, in particular if you have a bug fix, enhancement, or a new shape (see `src/shapes` for examples). Before doing so, please first make sure that all of the tests pass (`grunt test`).
|
I'd be happy to review any pull requests that may better the KineticJS project, in particular if you have a bug fix, enhancement, or a new shape (see `src/shapes` for examples). Before doing so, please first make sure that all of the tests pass (`grunt test`).
|
||||||
|
913
kinetic.js
913
kinetic.js
File diff suppressed because it is too large
Load Diff
10
kinetic.min.js
vendored
10
kinetic.min.js
vendored
File diff suppressed because one or more lines are too long
29
nodejs-demo.js
Normal file
29
nodejs-demo.js
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
var fs = require('fs'),
|
||||||
|
Kinetic = require('./kinetic');
|
||||||
|
|
||||||
|
var layer = new Kinetic.Layer({
|
||||||
|
width : 200,
|
||||||
|
height : 200
|
||||||
|
});
|
||||||
|
|
||||||
|
var rect = new Kinetic.Rect({
|
||||||
|
width : 100,
|
||||||
|
height : 100,
|
||||||
|
x : 50,
|
||||||
|
y : 50,
|
||||||
|
fill : 'green'
|
||||||
|
});
|
||||||
|
var text = new Kinetic.Text({
|
||||||
|
text : 'Generated inside node js',
|
||||||
|
x : 20,
|
||||||
|
y : 20,
|
||||||
|
fill : 'black'
|
||||||
|
});
|
||||||
|
layer.add(rect).add(text);
|
||||||
|
layer.draw();
|
||||||
|
|
||||||
|
var stream = layer.createPNGStream();
|
||||||
|
var file = fs.createWriteStream(__dirname + '/helloworld.png');
|
||||||
|
stream.on('data', function(chunk) {
|
||||||
|
file.write(chunk);
|
||||||
|
});
|
@ -22,11 +22,14 @@
|
|||||||
"grunt-contrib-watch": "^0.5.3"
|
"grunt-contrib-watch": "^0.5.3"
|
||||||
},
|
},
|
||||||
"readmeFilename": "README.md",
|
"readmeFilename": "README.md",
|
||||||
"main": "Gruntfile.js",
|
"main": "kinetic.js",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git://github.com/ericdrowell/KineticJS.git"
|
"url": "git://github.com/ericdrowell/KineticJS.git"
|
||||||
},
|
},
|
||||||
"author": "Eric Rowell",
|
"author": "Eric Rowell",
|
||||||
"license": "MIT"
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"canvas": "^1.1.3"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
(function() {
|
(function(root) {
|
||||||
var BATCH_DRAW_STOP_TIME_DIFF = 500;
|
var BATCH_DRAW_STOP_TIME_DIFF = 500;
|
||||||
|
|
||||||
var now =(function() {
|
var now =(function() {
|
||||||
if (window.performance && window.performance.now) {
|
if (root.performance && root.performance.now) {
|
||||||
return function() {
|
return function() {
|
||||||
return window.performance.now();
|
return root.performance.now();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -15,20 +15,20 @@
|
|||||||
})();
|
})();
|
||||||
|
|
||||||
var RAF = (function() {
|
var RAF = (function() {
|
||||||
return window.requestAnimationFrame
|
return root.requestAnimationFrame
|
||||||
|| window.webkitRequestAnimationFrame
|
|| root.webkitRequestAnimationFrame
|
||||||
|| window.mozRequestAnimationFrame
|
|| root.mozRequestAnimationFrame
|
||||||
|| window.oRequestAnimationFrame
|
|| root.oRequestAnimationFrame
|
||||||
|| window.msRequestAnimationFrame
|
|| root.msRequestAnimationFrame
|
||||||
|| FRAF;
|
|| FRAF;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
function FRAF(callback) {
|
function FRAF(callback) {
|
||||||
window.setTimeout(callback, 1000 / 60);
|
root.setTimeout(callback, 1000 / 60);
|
||||||
}
|
}
|
||||||
|
|
||||||
function requestAnimFrame() {
|
function requestAnimFrame() {
|
||||||
return RAF.apply(window, arguments);
|
return RAF.apply(root, arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -294,4 +294,4 @@
|
|||||||
layer.batchDraw();
|
layer.batchDraw();
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
})();
|
})(this);
|
@ -1,6 +1,6 @@
|
|||||||
(function() {
|
(function() {
|
||||||
// calculate pixel ratio
|
// calculate pixel ratio
|
||||||
var canvas = document.createElement('canvas'),
|
var canvas = Kinetic.Util.createCanvasElement(),
|
||||||
context = canvas.getContext('2d'),
|
context = canvas.getContext('2d'),
|
||||||
// if using a mobile device, calculate the pixel ratio. Otherwise, just use
|
// if using a mobile device, calculate the pixel ratio. Otherwise, just use
|
||||||
// 1. For desktop browsers, if the user has zoom enabled, it affects the pixel ratio
|
// 1. For desktop browsers, if the user has zoom enabled, it affects the pixel ratio
|
||||||
@ -44,7 +44,7 @@
|
|||||||
var pixelRatio = config.pixelRatio || Kinetic.pixelRatio || _pixelRatio;
|
var pixelRatio = config.pixelRatio || Kinetic.pixelRatio || _pixelRatio;
|
||||||
|
|
||||||
this.pixelRatio = pixelRatio;
|
this.pixelRatio = pixelRatio;
|
||||||
this._canvas = document.createElement('canvas');
|
this._canvas = Kinetic.Util.createCanvasElement();
|
||||||
|
|
||||||
// set inline styles
|
// set inline styles
|
||||||
this._canvas.style.padding = 0;
|
this._canvas.style.padding = 0;
|
||||||
|
@ -251,6 +251,10 @@
|
|||||||
* node.draggable(false);
|
* node.draggable(false);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
if (!Kinetic.Util.isBrowser()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
var html = document.documentElement;
|
var html = document.documentElement;
|
||||||
html.addEventListener('mouseup', Kinetic.DD._endDragBefore, true);
|
html.addEventListener('mouseup', Kinetic.DD._endDragBefore, true);
|
||||||
html.addEventListener('touchend', Kinetic.DD._endDragBefore, true);
|
html.addEventListener('touchend', Kinetic.DD._endDragBefore, true);
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
*/
|
*/
|
||||||
/*jshint -W079, -W020*/
|
/*jshint -W079, -W020*/
|
||||||
var Kinetic = {};
|
var Kinetic = {};
|
||||||
(function() {
|
(function(root) {
|
||||||
Kinetic = {
|
Kinetic = {
|
||||||
// public
|
// public
|
||||||
version: '@@version',
|
version: '@@version',
|
||||||
@ -54,7 +54,8 @@ var Kinetic = {};
|
|||||||
|
|
||||||
// user agent
|
// user agent
|
||||||
UA: (function() {
|
UA: (function() {
|
||||||
var ua = navigator.userAgent.toLowerCase(),
|
var userAgent = (root.navigator && root.navigator.userAgent) || '';
|
||||||
|
var ua = userAgent.toLowerCase(),
|
||||||
// jQuery UA regex
|
// jQuery UA regex
|
||||||
match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
|
match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
|
||||||
/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
|
/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
|
||||||
@ -64,7 +65,7 @@ var Kinetic = {};
|
|||||||
[],
|
[],
|
||||||
|
|
||||||
// adding mobile flag as well
|
// adding mobile flag as well
|
||||||
mobile = !!(navigator.userAgent.match(/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile/i));
|
mobile = !!(userAgent.match(/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile/i));
|
||||||
|
|
||||||
return {
|
return {
|
||||||
browser: match[ 1 ] || '',
|
browser: match[ 1 ] || '',
|
||||||
@ -262,7 +263,7 @@ var Kinetic = {};
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
})();
|
})(this);
|
||||||
|
|
||||||
// Uses Node, AMD or browser globals to create a module.
|
// Uses Node, AMD or browser globals to create a module.
|
||||||
|
|
||||||
@ -286,16 +287,15 @@ var Kinetic = {};
|
|||||||
// Node. Does not work with strict CommonJS, but
|
// Node. Does not work with strict CommonJS, but
|
||||||
// only CommonJS-like enviroments that support module.exports,
|
// only CommonJS-like enviroments that support module.exports,
|
||||||
// like Node.
|
// like Node.
|
||||||
module.exports = factory();
|
var Canvas = require('canvas');
|
||||||
|
var KineticJS = factory();
|
||||||
|
Kinetic._nodeCanvas = Canvas;
|
||||||
|
module.exports = KineticJS;
|
||||||
}
|
}
|
||||||
else if( typeof define === 'function' && define.amd) {
|
else if( typeof define === 'function' && define.amd) {
|
||||||
// AMD. Register as an anonymous module.
|
// AMD. Register as an anonymous module.
|
||||||
define(factory);
|
define(factory);
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
// Browser globals (root is window)
|
|
||||||
root.returnExports = factory();
|
|
||||||
}
|
|
||||||
}(this, function() {
|
}(this, function() {
|
||||||
|
|
||||||
// Just return a value to define the module export.
|
// Just return a value to define the module export.
|
||||||
|
@ -32,6 +32,9 @@
|
|||||||
this.hitCanvas = new Kinetic.HitCanvas();
|
this.hitCanvas = new Kinetic.HitCanvas();
|
||||||
// call super constructor
|
// call super constructor
|
||||||
Kinetic.Container.call(this, config);
|
Kinetic.Container.call(this, config);
|
||||||
|
if (!Kinetic.Util.isBrowser()) {
|
||||||
|
this.canvas.setSize(this.attrs.width, this.attrs.height);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
_validateAdd: function(child) {
|
_validateAdd: function(child) {
|
||||||
var type = child.getType();
|
var type = child.getType();
|
||||||
@ -39,6 +42,9 @@
|
|||||||
Kinetic.Util.error('You may only add groups and shapes to a layer.');
|
Kinetic.Util.error('You may only add groups and shapes to a layer.');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
createPNGStream : function() {
|
||||||
|
return this.canvas._canvas.createPNGStream();
|
||||||
|
},
|
||||||
/**
|
/**
|
||||||
* get visible intersection shape. This is the preferred
|
* get visible intersection shape. This is the preferred
|
||||||
* method for determining if a point intersects a shape or not
|
* method for determining if a point intersects a shape or not
|
||||||
|
14
src/Util.js
14
src/Util.js
@ -367,6 +367,20 @@
|
|||||||
}
|
}
|
||||||
return names.length > 0;
|
return names.length > 0;
|
||||||
},
|
},
|
||||||
|
createCanvasElement: function() {
|
||||||
|
var canvas;
|
||||||
|
if (Kinetic.Util.isBrowser()) {
|
||||||
|
canvas = document.createElement('canvas');
|
||||||
|
} else {
|
||||||
|
// nodejs way
|
||||||
|
canvas = new Kinetic._nodeCanvas(200,200);
|
||||||
|
}
|
||||||
|
canvas.style = canvas.style || {};
|
||||||
|
return canvas;
|
||||||
|
},
|
||||||
|
isBrowser: function() {
|
||||||
|
return (typeof exports !== 'object');
|
||||||
|
},
|
||||||
_isInDocument: function(el) {
|
_isInDocument: function(el) {
|
||||||
while(el = el.parentNode) {
|
while(el = el.parentNode) {
|
||||||
if(el == document) {
|
if(el == document) {
|
||||||
|
@ -147,7 +147,7 @@
|
|||||||
//Kinetic.Filters.FromPolar = Kinetic.Util._FilterWrapDoubleBuffer(FromPolar);
|
//Kinetic.Filters.FromPolar = Kinetic.Util._FilterWrapDoubleBuffer(FromPolar);
|
||||||
|
|
||||||
// create a temporary canvas for working - shared between multiple calls
|
// create a temporary canvas for working - shared between multiple calls
|
||||||
var tempCanvas = document.createElement('canvas');
|
var tempCanvas = Kinetic.Util.createCanvasElement();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Kaleidoscope Filter.
|
* Kaleidoscope Filter.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
(function() {
|
(function() {
|
||||||
// constants
|
// constants
|
||||||
var AUTO = 'auto',
|
var AUTO = 'auto',
|
||||||
CANVAS = 'canvas',
|
//CANVAS = 'canvas',
|
||||||
CENTER = 'center',
|
CENTER = 'center',
|
||||||
CHANGE_KINETIC = 'Change.kinetic',
|
CHANGE_KINETIC = 'Change.kinetic',
|
||||||
CONTEXT_2D = '2d',
|
CONTEXT_2D = '2d',
|
||||||
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
// cached variables
|
// cached variables
|
||||||
attrChangeListLen = ATTR_CHANGE_LIST.length,
|
attrChangeListLen = ATTR_CHANGE_LIST.length,
|
||||||
dummyContext = document.createElement(CANVAS).getContext(CONTEXT_2D);
|
dummyContext = Kinetic.Util.createCanvasElement().getContext(CONTEXT_2D);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Text constructor
|
* Text constructor
|
||||||
|
Loading…
Reference in New Issue
Block a user