Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"name": "p5",
"repository": "processing/p5.js",
"type": "module",
"scripts": {
"build": "rollup -c",
"dev": "vite preview/",
Expand All @@ -21,7 +22,7 @@
},
"version": "2.2.0-rc.3",
"dependencies": {
"@davepagurek/bezier-path": "^0.0.2",
"@davepagurek/bezier-path": "^0.0.7",
"@japont/unicode-range": "^1.0.0",
"acorn": "^8.12.1",
"acorn-walk": "^8.3.4",
Expand Down
2 changes: 1 addition & 1 deletion rollup.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ export default [
format: 'es',
dir: 'dist'
},
external: /node_modules/,
external: /node_modules\/(?!gifenc)/,
plugins
},
...generateModuleBuild()
Expand Down
44 changes: 18 additions & 26 deletions src/core/environment.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,24 +11,27 @@ import * as C from './constants';

function environment(p5, fn, lifecycles){
const standardCursors = [C.ARROW, C.CROSS, C.HAND, C.MOVE, C.TEXT, C.WAIT];
const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';

fn._frameRate = 0;
fn._lastFrameTime = window.performance.now();
fn._lastFrameTime = globalThis.performance.now();
fn._targetFrameRate = 60;

const _windowPrint = window.print;
const windowPrint = isBrowser ? window.print : null;
let windowPrintDisabled = false;

lifecycles.presetup = function(){
const events = [
'resize'
];

for(const event of events){
window.addEventListener(event, this[`_on${event}`].bind(this), {
passive: false,
signal: this._removeSignal
});
if(isBrowser){
for(const event of events){
window.addEventListener(event, this[`_on${event}`].bind(this), {
passive: false,
signal: this._removeSignal
});
}
}
};

Expand Down Expand Up @@ -64,9 +67,9 @@ function environment(p5, fn, lifecycles){
* </div>
*/
fn.print = function(...args) {
if (!args.length) {
if (!args.length && windowPrint !== null) {
if (!windowPrintDisabled) {
_windowPrint();
windowPrint();
if (
window.confirm(
'You just tried to print the webpage. Do you want to prevent this from running again?'
Expand Down Expand Up @@ -218,7 +221,7 @@ function environment(p5, fn, lifecycles){
* </code>
* </div>
*/
fn.focused = document.hasFocus();
fn.focused = isBrowser ? document.hasFocus() : true;

/**
* Changes the cursor's appearance.
Expand Down Expand Up @@ -628,7 +631,7 @@ function environment(p5, fn, lifecycles){
* @alt
* This example does not render anything.
*/
fn.displayWidth = screen.width;
fn.displayWidth = isBrowser ? window.screen.width : 0;

/**
* A `Number` variable that stores the height of the screen display.
Expand Down Expand Up @@ -659,7 +662,7 @@ function environment(p5, fn, lifecycles){
* @alt
* This example does not render anything.
*/
fn.displayHeight = screen.height;
fn.displayHeight = isBrowser ? window.screen.height : 0;

/**
* A `Number` variable that stores the width of the browser's viewport.
Expand Down Expand Up @@ -794,21 +797,11 @@ function environment(p5, fn, lifecycles){
};

function getWindowWidth() {
return (
window.innerWidth ||
(document.documentElement && document.documentElement.clientWidth) ||
(document.body && document.body.clientWidth) ||
0
);
return isBrowser ? document.documentElement.clientWidth : 0;
}

function getWindowHeight() {
return (
window.innerHeight ||
(document.documentElement && document.documentElement.clientHeight) ||
(document.body && document.body.clientHeight) ||
0
);
return isBrowser ? document.documentElement.clientHeight : 0;
}

/**
Expand Down Expand Up @@ -868,7 +861,6 @@ function environment(p5, fn, lifecycles){
* </div>
*/
fn.fullscreen = function(val) {
// p5._validateParameters('fullscreen', arguments);
// no arguments, return fullscreen or not
if (typeof val === 'undefined') {
return (
Expand Down Expand Up @@ -946,7 +938,6 @@ function environment(p5, fn, lifecycles){
* @returns {Number} current pixel density of the sketch.
*/
fn.pixelDensity = function(val) {
// p5._validateParameters('pixelDensity', arguments);
let returnValue;
if (typeof val === 'number') {
if (val !== this._renderer._pixelDensity) {
Expand Down Expand Up @@ -1271,6 +1262,7 @@ function environment(p5, fn, lifecycles){
const screenPosition = matrix.multiplyAndNormalizePoint(worldPosition);
return screenPosition;
};

/**
* Converts 2D screen coordinates to 3D world coordinates.
*
Expand Down
26 changes: 15 additions & 11 deletions src/core/init.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { initialize as initTranslator } from './internationalization';
* @return {Undefined}
*/
export const _globalInit = () => {
if(typeof window === 'undefined') return;
// Could have been any property defined within the p5 constructor.
// If that property is already a part of the global object,
// this code has already run before, likely due to a duplicate import
Expand Down Expand Up @@ -40,17 +41,20 @@ export const _globalInit = () => {
};

// make a promise that resolves when the document is ready
export const waitForDocumentReady = () =>
new Promise((resolve, reject) => {
// if the page is ready, initialize p5 immediately
if (document.readyState === 'complete') {
resolve();
// if the page is still loading, add an event listener
// and initialize p5 as soon as it finishes loading
} else {
window.addEventListener('load', resolve, false);
}
});
export const waitForDocumentReady = () =>{
if(typeof document !== 'undefined'){
return new Promise((resolve, reject) => {
// if the page is ready, initialize p5 immediately
if (document.readyState === 'complete') {
resolve();
// if the page is still loading, add an event listener
// and initialize p5 as soon as it finishes loading
} else {
window.addEventListener('load', resolve, false);
}
});
}
};

// only load translations if we're using the full, un-minified library
export const waitingForTranslator =
Expand Down
80 changes: 45 additions & 35 deletions src/core/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -148,19 +148,24 @@ class p5 {
const blurHandler = () => {
this.focused = false;
};
window.addEventListener('focus', focusHandler);
window.addEventListener('blur', blurHandler);
p5.lifecycleHooks.remove.push(function() {
window.removeEventListener('focus', focusHandler);
window.removeEventListener('blur', blurHandler);
});

// Initialization complete, start runtime
if (document.readyState === 'complete') {

if(typeof window !== 'undefined'){
window.addEventListener('focus', focusHandler);
window.addEventListener('blur', blurHandler);
p5.lifecycleHooks.remove.push(function() {
window.removeEventListener('focus', focusHandler);
window.removeEventListener('blur', blurHandler);
});

// Initialization complete, start runtime
if (document.readyState === 'complete') {
this.#_start();
} else {
this._startListener = this.#_start.bind(this);
window.addEventListener('load', this._startListener, false);
}
}else{
this.#_start();
} else {
this._startListener = this.#_start.bind(this);
window.addEventListener('load', this._startListener, false);
}
}

Expand Down Expand Up @@ -237,37 +242,41 @@ class p5 {
// Always create a default canvas.
// Later on if the user calls createCanvas, this default one
// will be replaced
this.createCanvas(
100,
100,
constants.P2D
);
if(typeof window !== 'undefined'){
this.createCanvas(
100,
100,
constants.P2D
);
}

// Record the time when setup starts. millis() will start at 0 within
// setup, but this isn't documented, locked-in behavior yet.
this._millisStart = window.performance.now();
this._millisStart = globalThis.performance.now();

const context = this._isGlobal ? window : this;
if (typeof context.setup === 'function') {
await context.setup();
}
if (this.hitCriticalError) return;

const canvases = document.getElementsByTagName('canvas');
for (const k of canvases) {
// Apply touchAction = 'none' to canvases to prevent scrolling
// when dragging on canvas elements
k.style.touchAction = 'none';

// unhide any hidden canvases that were created
if (k.dataset.hidden === 'true') {
k.style.visibility = '';
delete k.dataset.hidden;
if(typeof document !== 'undefined'){
const canvases = document.getElementsByTagName('canvas');
for (const k of canvases) {
// Apply touchAction = 'none' to canvases to prevent scrolling
// when dragging on canvas elements
k.style.touchAction = 'none';

// unhide any hidden canvases that were created
if (k.dataset.hidden === 'true') {
k.style.visibility = '';
delete k.dataset.hidden;
}
}
}

this._lastTargetFrameTime = window.performance.now();
this._lastRealFrameTime = window.performance.now();
this._lastTargetFrameTime = globalThis.performance.now();
this._lastRealFrameTime = globalThis.performance.now();
this._setupDone = true;
if (this._accessibleOutputs.grid || this._accessibleOutputs.text) {
this._updateAccsOutput();
Expand All @@ -278,7 +287,7 @@ class p5 {

// Record the time when the draw loop starts so that millis() starts at 0
// when the draw loop begins.
this._millisStart = window.performance.now();
this._millisStart = globalThis.performance.now();
}

// While '#_draw' here is async, it is not awaited as 'requestAnimationFrame'
Expand All @@ -288,7 +297,7 @@ class p5 {
// and 'postdraw'.
async _draw(requestAnimationFrameTimestamp) {
if (this.hitCriticalError) return;
const now = requestAnimationFrameTimestamp || window.performance.now();
const now = requestAnimationFrameTimestamp || globalThis.performance.now();
const timeSinceLastFrame = now - this._lastTargetFrameTime;
const targetTimeBetweenFrames = 1000 / this._targetFrameRate;

Expand Down Expand Up @@ -330,9 +339,10 @@ class p5 {
// get notified the next time the browser gives us
// an opportunity to draw.
if (this._loop) {
this._requestAnimId = window.requestAnimationFrame(
this._draw.bind(this)
);
const boundDraw = this._draw.bind(this);
this._requestAnimId = typeof window !== 'undefined' ?
window.requestAnimationFrame(boundDraw) :
setImmediate(boundDraw);
}
}

Expand Down
4 changes: 3 additions & 1 deletion src/core/p5.Renderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,9 @@ class Renderer {
this._pInst = pInst;
this._isMainCanvas = isMainCanvas;
this.pixels = [];
this._pixelDensity = Math.ceil(window.devicePixelRatio) || 1;
this._pixelDensity = typeof window !== 'undefined' ?
Math.ceil(window.devicePixelRatio) :
1;

this.width = w;
this.height = h;
Expand Down
1 change: 0 additions & 1 deletion src/shape/2d_primitives.js
Original file line number Diff line number Diff line change
Expand Up @@ -1214,7 +1214,6 @@ function primitives(p5, fn){
* </code>
* </div>
*/

/**
* @method rect
* @param {Number} x
Expand Down
2 changes: 1 addition & 1 deletion src/type/lib/Typr.js
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ Typr["B"] = {
}
return s;
},
_tdec: window["TextDecoder"] ? new window["TextDecoder"]() : null,
_tdec: globalThis["TextDecoder"] ? new globalThis["TextDecoder"]() : null,
readUTF8: function (buff, p, l) {
var tdec = Typr["B"]._tdec;
if (tdec && p == 0 && l == buff.length) return tdec["decode"](buff);
Expand Down
Loading