All Projects → udevbe → react-canvaskit

udevbe / react-canvaskit

Licence: MIT License
Experiment in creating a custom react renderer using an offscreen webgl canvas on top of Skia CanvasKit

Programming Languages

typescript
32286 projects
javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to react-canvaskit

KRS
The Kria Robotics Stack (KRS) is a ROS 2 superset for industry, an integrated set of robot libraries and utilities to accelerate the development, maintenance and commercialization of industrial-grade robotic solutions while using adaptive computing.
Stars: ✭ 26 (-54.39%)
Mutual labels:  hardware-acceleration
fractals-js
Fractals in JavaScript using HTML5 Canvas
Stars: ✭ 24 (-57.89%)
Mutual labels:  html5-canvas
trimpng
trim whitespace and useless pixels for png
Stars: ✭ 19 (-66.67%)
Mutual labels:  html5-canvas
center.js
Center.js is a HTML5 Canvas based library that allows you to create simple text based icons, avatars, logos, and more.
Stars: ✭ 85 (+49.12%)
Mutual labels:  html5-canvas
gobang
五子棋小游戏canvas socket.io
Stars: ✭ 38 (-33.33%)
Mutual labels:  html5-canvas
multeor
Multeor is a multiplayer webgame developed by Arjen de Vries, Filidor Wiese and Arthur van 't Hoog in 2013. In the game you control a meteor crashing into earth. Score points by leaving the biggest trail of destruction.
Stars: ✭ 39 (-31.58%)
Mutual labels:  html5-canvas
SvgToXaml
Svg to xaml conveter.
Stars: ✭ 45 (-21.05%)
Mutual labels:  skia
vrcpu
Code, documentation, schematics, notes for my Ben Eater inspired breadboard computer and emulator
Stars: ✭ 98 (+71.93%)
Mutual labels:  html5-canvas
skeditor
Online sketch file editor.
Stars: ✭ 133 (+133.33%)
Mutual labels:  skia
Product-Site-101
Simple product site - demo for a talk
Stars: ✭ 33 (-42.11%)
Mutual labels:  html5-canvas
SkiaSharp.QrCode
Qr Code Generator with Skia. (no System.Drawing)
Stars: ✭ 72 (+26.32%)
Mutual labels:  skia
glif
A stand-alone glyph viewer and editor (UFO .glif). (ꞵ quality)
Stars: ✭ 143 (+150.88%)
Mutual labels:  skia
Xam.Forms.QRCode
A QRCode renderer based on SkiaSharp.
Stars: ✭ 16 (-71.93%)
Mutual labels:  skia
REDM
REDM是一套基于商业化标准的开源directui界面框架,不仅能提供完善的项目管理方案、详细的文档框架,也可轻松协助完成可视化界面设计,其核心库的稳定性已在内部多个大型商化项目中通过验证。
Stars: ✭ 41 (-28.07%)
Mutual labels:  skia
Microcharts
Create cross-platform (Xamarin, Windows, ...) simple charts.
Stars: ✭ 1,742 (+2956.14%)
Mutual labels:  skia
stonne
STONNE: A Simulation Tool for Neural Networks Engines
Stars: ✭ 57 (+0%)
Mutual labels:  hardware-acceleration
deno-canvas
Canvas API for Deno, ported from canvaskit-wasm (Skia).
Stars: ✭ 124 (+117.54%)
Mutual labels:  skia
image-process-tools
Image clipping / scaling, support local / same domain video file screenshot function (HTML5 + canvas). 图片裁剪/等比缩放,支持本地/同域视频文件截图功能 (html5 + canvas)
Stars: ✭ 65 (+14.04%)
Mutual labels:  html5-canvas
jsrobowar
👾 A port of RoboWar to the web browser using JavaScript and HTML5. (2010)
Stars: ✭ 31 (-45.61%)
Mutual labels:  html5-canvas
mpp
Rockchip MPP(Media Process Platfrom)
Stars: ✭ 86 (+50.88%)
Mutual labels:  hardware-acceleration

React-CanvasKit

npm

Experimental implementation of Skia CanvasKit using ReactJS.

This implementation allows you to use all familiar React concepts like hooks and contexts, in conjunction with JXS elements that closely match the existing Skia CanvasKit API. Everything is drawn to a hardware accelerated WebGL canvas.

Examples

Paragraph with dynamic font loading

Alt text

import type { FunctionComponent } from 'react'
import React from 'react'
import { FontManagerProvider } from 'react-canvaskit'
import ParagraphDemo from './ParagraphDemo'

const robotoPromise = fetch('https://storage.googleapis.com/skia-cdn/google-web-fonts/Roboto-Regular.ttf')
  .then((resp) => resp.arrayBuffer())
const notoColorEmojiPromise = fetch('https://storage.googleapis.com/skia-cdn/misc/NotoColorEmoji.ttf')
  .then((resp) => resp.arrayBuffer())

const fontsPromise = Promise.all([robotoPromise, notoColorEmojiPromise])

export const App: FunctionComponent = () => {
  const [fonts, setFonts] = React.useState<ArrayBuffer[] | undefined>(undefined)
  fontsPromise.then(fetchedFonts => setFonts(fetchedFonts))

  return (
    <FontManagerProvider fontData={fonts}>
      <ParagraphDemo/>
    </FontManagerProvider>
  )
}
import type { SkParagraph } from 'canvaskit-oc'
import React from 'react'
import type { SkObjectRef } from 'react-canvaskit'
import { PaintStyle, TextAlignEnum, useFontManager } from 'react-canvaskit'
import useAnimationFrame from './useAnimationFrame'

const fontPaint = { style: PaintStyle.Fill, antiAlias: true }

const X = 250
const Y = 250
const paragraphText = 'The quick brown fox 🦊 ate a zesty hamburgerfonts 🍔.\nThe 👩‍👩‍👧‍👧 laughed.'

export default () => {
  const skParagraphRef = React.useRef<SkObjectRef<SkParagraph>>(null)
  const fontManager = useFontManager()

  const calcWrapTo = (time: number): number => 350 + 150 * Math.sin(time / 2000)
  const [wrapTo, setWrapTo] = React.useState(calcWrapTo(performance.now()))

  useAnimationFrame(time => setWrapTo(calcWrapTo(time)))

  return (
    <ck-canvas clear='#FFFFFF'>
      <ck-paragraph
        fontManager={fontManager}
        ref={skParagraphRef}
        textStyle={{
          color: '#000000',
          // Noto Mono is the default canvaskit font, we use it as a fallback
          fontFamilies: ['Noto Mono', 'Roboto', 'Noto Color Emoji'],
          fontSize: 50
        }}
        textAlign={TextAlignEnum.Left}
        maxLines={7}
        ellipsis='...'
        layout={wrapTo}
      >
        {paragraphText}
      </ck-paragraph>
      <ck-line x1={wrapTo} y1={0} x2={wrapTo} y2={400} paint={fontPaint}/>
      <ck-text x={5} y={450}
               paint={fontPaint}>{`At (${X.toFixed(2)}, ${Y.toFixed(2)}) glyph is '${glyph}'`}</ck-text>
    </ck-canvas>
  )
}

Simple Paint

Alt text

const App: FunctionComponent = () => {
  return (
    <ck-canvas clear={{ red: 255, green: 165, blue: 0 }}>
      <ck-text x={5} y={50} paint={{ color: '#00FFFF', antiAlias: true }} font={{ size: 24 }}>
        Hello React-CanvasKit!
      </ck-text>
      <ck-surface width={100} height={100} dx={100} dy={100}>
        <ck-canvas clear='#FF00FF' rotate={{ degree: 45 }}>
          <ck-text> React-CanvasKit.</ck-text>
          <ck-line x1={0} y1={10} x2={142} y2={10} 
            paint={{ antiAlias: true, color: '#FFFFFF', strokeWidth: 10 }}/>
        </ck-canvas>
      </ck-surface>
    </ck-canvas>
  )
}

const htmlCanvasElement = document.createElement('canvas')
const rootElement = document.getElementById('root')
if (rootElement === null) {
  throw new Error('No root element defined.')
}
rootElement.appendChild(htmlCanvasElement)
document.body.appendChild(htmlCanvasElement)
htmlCanvasElement.width = 400
htmlCanvasElement.height = 300

init().then(() => render(<App/>, htmlCanvasElement))
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].