npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

flipdigit

v0.0.1

Published

A canvas-like drawing library for flipdigit displays

Downloads

59

Readme

Flip digit

A basic library that implements many canvas-like functions for displaying graphics on a flip digit display e.g. AlfaZeta 7-segment display. For full build and installation guide check out: flipdisc.io

Features

  • Automatically splits drawing data into vertical/horizontal segments.
  • Support for lines, paths, shapes, images, and text
  • Built-in effects and animations.

Installation

Install the library via npm:

npm install flipdigit

Usage

Basic Setup

import { createCanvas } from '../index.js'
import { layout, devices, options } from './config.js'

const canvas = createCanvas(layout, devices, options)
// layout, devices, options are the same as flipdisc library

// Clear the canvas
canvas.clear();
canvas.clearRect(10, 10, 50, 30); // Clears rectangle area

// Draw a circle
canvas.drawCircle(0, 0, 5) 

// Render a frame
canvas.render() 

To configure the layout, devices, options check out the flipdisc README

Drawing Shapes

Use the built-in methods to draw shapes and manage paths:

canvas.drawRect(10, 10, 50, 30, true, 2); // Filled rectangle with line width of 2

canvas.drawCircle(100, 100, 30, false, 1); // Circle outline with radius 30

canvas.drawArc(150, 150, 40, 0, Math.PI, 2); // Semi-circle with line width of 2

canvas.drawEllipse(200, 200, 50, 30, true, 1); // Filled ellipse

canvas.drawStar(250, 250, 20, 40, 5, 1); // Star with 5 points

Drawing Paths

Support for creating complex paths using straight lines and curves:

Example: Drawing a Path

canvas.beginPath();
canvas.moveTo(0, 0);
canvas.lineTo(50, 50);
canvas.quadraticCurveTo(75, 25, 100, 50);
canvas.bezierCurveTo(125, 75, 150, 25, 175, 50);
canvas.closePath();
canvas.stroke(2); // Stroke with line width of 2

Drawing Lines

Draw lines with specified width:

canvas.drawLine(0, 0, 10, 10, 2); // Draws a line with a width of 2

Example: Drawing a Polygon

canvas.drawPolygon([
  { x: 10, y: 10 },
  { x: 20, y: 40 },
  { x: 40, y: 40 },
  { x: 50, y: 10 }
], 2); // Polygon outline with line width of 2

Working with 3D Graphics

Methods for rendering 3D graphics and projecting them onto a 2D canvas:

Example: Drawing a 3D Line

canvas.drawLine3D(0, 0, 0, 50, 50, 50, 30, 2); // Draws a 3D line with perspective
  • x0, y0, z0: Start coordinates in 3D space.
  • x1, y1, z1: End coordinates in 3D space.
  • d: Distance factor for perspective.
  • lineWidth: Optional width of the line.
  • applyRotation: Whether to apply the current rotation matrix.

Example: Applying a Rotation Matrix

canvas.setRotationMatrix({ x: Math.PI / 4, y: Math.PI / 4, z: 0 }); // Sets a 45-degree rotation on X and Y axes
  • x, y, z: Rotation angles in radians.

Example: Projecting 3D Coordinates to 2D

const projected = canvas.project3DTo2D(10, 20, 30, Math.PI / 3, 16 / 9);
console.log(projected); // Logs the projected 2D coordinates
  • x, y, z: 3D coordinates to project.
  • fov: Field of view in radians.
  • aspect: Aspect ratio of the canvas.
  • near, far: Near and far clipping planes (optional).

Working with Images

Provides support for rendering images and animations:

Draw a Static Image

canvas.drawImage('https://example.com/image.png', 'floyd-steinberg', 1);
canvas.drawImage('./local-image.png', 'bayer', 0.5);
  • resource: The source of the image (remote URL or local file path).
  • dither: Optional dithering method (floyd-steinberg or bayer).
  • scale: Optional scale factor.

Play an Animated GIF

canvas.playAnimatedGif('https://example.com/animation.gif', 'floyd-steinberg', 1);
  • resource: The source of the GIF (remote URL or local file path).
  • dither: Optional dithering method (floyd-steinberg or bayer).
  • scale: Optional scale factor.

Rendering and Animation

Provides methods for managing rendering and animations:

Example: Creating a Render Loop

let x = 0;
canvas.animate(() => {
  canvas.clear();
  canvas.drawCircle(x, x, x);
  x = (x + 1) % 40;
});
// Stop the animation
canvas.stopAnimation();

Using a Fixed Interval for Rendering

canvas.startRenderLoop(16); // Render every 16ms (~60 FPS)
canvas.stopRenderLoop();

Applying Transformations

Provides methods for applying and managing transformations:

Example: Applying Transformations

canvas.translate(10, 10); // Move the canvas by 10 units in x and y direction
canvas.rotate(Math.PI / 4); // Rotate the canvas by 45 degrees
canvas.scale(2, 2); // Scale the canvas by a factor of 2

Example: Saving and Restoring Transforms

canvas.saveTransform();
canvas.translate(20, 20);
canvas.restoreTransform(); // Reverts back to the previous state
  • saveTransform(): Saves the current transformation matrix.
  • restoreTransform(): Restores the last saved transformation matrix.

Example: Clearing Transformations

canvas.clearTransform(); // Resets all transformations

Adding Effects

Special effects can be applied:

canvas.addEffect(Effects.rainEffect);
canvas.addEffect(Effects.glowEffect);

Built-in effects include:

  • Effects.decayEffect
  • Effects.rainEffect
  • Effects.wavesEffect
  • Effects.explodeEffect
  • Effects.twinkleEffect
  • Effects.scrollEffect
  • Effects.rippleEffect
  • Effects.spiralEffect
  • Effects.fireEffect
  • Effects.noiseEffect
  • Effects.zoomEffect
  • Effects.glowEffect

Each effect can be applied to an effectLayer for dynamic rendering.

Example: Adding a Twinkle Effect

canvas.addEffect(Effects.twinkleEffect);
canvas.updateDisplay(canvas.verticalFrameData, canvas.horizontalFrameData);

Handling Text

Provides methods for rendering text:

Example: Drawing Text

canvas.drawText('Hello', 10, 10, 2); // Draws scaled text
  • text: The string to render.
  • x, y: Coordinates for the text's starting position.
  • scale: Optional scaling factor for the text (default is 1).

Methods

clear()

Clears the canvas and resets transformations.

updateDisplay(verticalFrameData, horizontalFrameData)

Compares the frame data with the previous state and updates the display if changes are detected.

applyEffect(effectName, options)

Applies a specified effect to the canvas.

addEffect(effectFn)

Adds a custom effect to the canvas.

clearEffects()

Removes all effects and clears the effect layer.

beginPath()

Starts a new path.

moveTo(x, y)

Moves the current path to the specified coordinates.

lineTo(x, y)

Draws a line to the specified coordinates.

quadraticCurveTo(cpx, cpy, x, y)

Draws a quadratic curve to the specified point using a control point.

bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)

Draws a bezier curve to the specified point using two control points.

closePath()

Closes the current path by connecting the last point to the first.

stroke(lineWidth)

Strokes the current path with the specified line width.

drawRect(x, y, width, height, fill, lineWidth)

Draws a rectangle at the specified position with optional fill and line width.

drawCircle(cx, cy, radius, fill, lineWidth)

Draws a circle with the specified radius, fill, and line width.

drawArc(cx, cy, radius, startAngle, endAngle, lineWidth)

Draws an arc with the specified radius and angles.

drawEllipse(cx, cy, rx, ry, fill, lineWidth)

Draws an ellipse with the specified radii, fill, and line width.

drawPolygon(vertices, lineWidth)

Draws a polygon using an array of vertices.

drawStar(centerX, centerY, innerRadius, outerRadius, points, lineWidth)

Draws a star with the specified parameters.

clearRect(x, y, width, height)

Clears a rectangular area on the canvas.

drawLine3D(x0, y0, z0, x1, y1, z1, d, lineWidth, applyRotation)

Draws a 3D line with perspective projection.

setRotationMatrix({ x, y, z })

Sets the rotation matrix for 3D transformations.

project3DTo2D(x, y, z, fov, aspect, near, far)

Projects 3D coordinates to 2D screen space.

drawImage(resource, dither, scale)

Draws a static image from a URL or local file path.

playAnimatedGif(resource, dither, scale)

Plays an animated GIF from a URL or local file path.

startGifAnimation(interval, shouldLoop)

Starts a GIF animation with a specified interval and looping behavior.

stopGifAnimation()

Stops the current GIF animation.

drawText(text, x, y, scale)

Renders text at the specified coordinates with an optional scaling factor.

drawLine(x0, y0, x1, y1, lineWidth = 1)

Draws a line between two points with an optional line width.

rect(x, y, width, height)

Creates a rectangle at the specified position.

fill()

Fills the current path or shape.

stroke()

Strokes the current path.

translate(x, y)

Translates the canvas by the given offsets.

rotate(angle)

Rotates the canvas by the specified angle (in radians).

scale(x, y)

Scales the canvas by the specified factors.

saveTransform()

Saves the current transformation state.

restoreTransform()

Restores the last saved transformation state.

clearTransform()

Clears all transformations and resets to the identity matrix.

animate(callback)

Creates a render loop calling the callback on each frame.

stopAnimation()

Stops the current animation loop.

render(verticalData, horizontalData)

Applies effects and updates the display with the given frame data.

startRenderLoop(interval)

Starts a rendering loop at the specified interval.

stopRenderLoop()

Stops the current rendering loop.

License

This library is licensed under the BSD-3-Clause-Attribution License. See the LICENSE file for details.