@@ -2,79 +2,45 @@ import React, { useEffect, useRef } from 'react';
22import { environment } from '#store/environment' ;
33import { observer } from 'mobx-react' ;
44import { exportSprite } from '#formats/image' ;
5- import rotSprite , {
6- Pixels ,
7- addMarginToImageData ,
8- getRotateDiagonal ,
9- } from '#util/rotsprite' ;
5+ import { rotateImageData } from '#util/rotsprite' ;
106import { Input , Slider , Item , Button , Modal } from '#ui' ;
117import { mappingState } from './state' ;
128
13- export const Rotate = observer ( ( ) => {
14- const canvasRef = useRef ( ) ;
15-
16- useEffect ( ( ) => {
17- if ( ! canvasRef . current ) return ;
18- const spriteCanv = exportSprite ( environment . currentSprite ) ;
19- const spriteCtx = spriteCanv . getContext ( '2d' ) ;
20-
21- const { width, height } = spriteCanv ;
22-
23- const imageData = spriteCtx . getImageData ( 0 , 0 , width , height ) ;
24-
25- const { diagonal, xMargin, yMargin } = getRotateDiagonal ( width , height ) ;
26-
27- const spriteData = addMarginToImageData (
28- spriteCtx ,
29- imageData ,
30- xMargin ,
31- yMargin ,
32- ) ;
33-
34- const data = new Uint32Array ( diagonal ** 2 ) ;
35-
36- for ( let i = 0 ; i < spriteData . data . length ; i += 4 ) {
37- const r = spriteData . data [ i ] ;
38- const g = spriteData . data [ i + 1 ] ;
39- const b = spriteData . data [ i + 2 ] ;
40- const a = spriteData . data [ i + 3 ] ;
41- data [ i / 4 ] = ( a << 24 ) + ( r << 16 ) + ( g << 8 ) + b ;
42- }
9+ function rotateCurrentSprite ( canvas , angle ) {
10+ const spriteCanv = exportSprite ( environment . currentSprite ) ;
11+ const spriteCtx = spriteCanv . getContext ( '2d' ) ;
12+ const { width, height } = spriteCanv ;
13+ const imageData = spriteCtx . getImageData ( 0 , 0 , width , height ) ;
14+ const rotatedData = rotateImageData ( imageData , angle , width , height ) ;
4315
44- const rotated = rotSprite (
45- new Pixels ( diagonal , diagonal , data ) ,
46- ( mappingState . rotate . angle * Math . PI ) / 180 ,
47- ) . pixels ;
16+ const ctx = canvas . getContext ( '2d' ) ;
17+ canvas . width = rotatedData . width ;
18+ canvas . height = rotatedData . height ;
19+ ctx . putImageData ( rotatedData , 0 , 0 ) ;
20+ }
4821
49- const pixelData = new Uint8ClampedArray ( data . length * 4 ) ;
22+ export const Rotate = observer ( ( ) => {
23+ const canvasRef = useRef ( ) ;
5024
51- for ( let i = 0 ; i < data . length ; i ++ ) {
52- const value = rotated [ i ] ;
25+ const { active, angle } = mappingState . rotate ;
5326
54- pixelData [ i * 4 ] = ( value >> 16 ) & 0xff ;
55- pixelData [ i * 4 + 1 ] = ( value >> 8 ) & 0xff ;
56- pixelData [ i * 4 + 2 ] = value & 0xff ;
57- pixelData [ i * 4 + 3 ] = ( value >> 24 ) & 0xff ;
27+ useEffect ( ( ) => {
28+ if ( ! canvasRef . current ) {
29+ requestAnimationFrame ( ( ) => {
30+ canvasRef . current &&
31+ rotateCurrentSprite ( canvasRef . current , angle ) ;
32+ } ) ;
33+ return ;
5834 }
59-
60- const rotatedData = new ImageData ( pixelData , diagonal , diagonal ) ;
61-
62- const canvas = canvasRef . current ;
63- const ctx = canvas . getContext ( '2d' ) ;
64-
65- canvas . width = diagonal ;
66- canvas . height = diagonal ;
67- ctx . putImageData ( rotatedData , 0 , 0 ) ;
68- } , [ environment . currentSprite , mappingState . rotate . angle ] ) ;
35+ rotateCurrentSprite ( canvasRef . current , angle ) ;
36+ } , [ environment . currentSprite , angle , active ] ) ;
6937
7038 const assertInput = ( num ) => {
7139 const value = Math . max ( 0 , Math . min ( 360 , num ) ) ;
7240 if ( Number . isNaN ( value ) ) return 0 ;
7341 return value ;
7442 } ;
7543
76- const { active } = mappingState . rotate ;
77-
7844 return (
7945 < Modal
8046 className = "rotsprite"
@@ -108,13 +74,13 @@ export const Rotate = observer(() => {
10874 />
10975 </ div >
11076
111- < Slider
112- min = "0"
113- step = "1"
114- max = "360"
115- store = { mappingState . rotate }
116- accessor = "angle"
117- />
77+ < Slider
78+ min = "0"
79+ step = "1"
80+ max = "360"
81+ store = { mappingState . rotate }
82+ accessor = "angle"
83+ />
11884 </ div >
11985 < div className = "actions" >
12086 < Button color = "magenta" onClick = { mappingState . toggleRotate } >
0 commit comments