@@ -23,6 +23,8 @@ export default function litecanvas(settings = {}) {
2323 elem . addEventListener ( evt , callback , false )
2424 _browserEventListeners . push ( ( ) => elem . removeEventListener ( evt , callback , false ) )
2525 } ,
26+ /** @type {(str: string) => string } */
27+ lowerCase = ( str ) => str . toLowerCase ( ) ,
2628 /** @type {(ev: Event) => void } */
2729 preventDefault = ( ev ) => ev . preventDefault ( ) ,
2830 /** @type {(c: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) => void } */
@@ -34,13 +36,11 @@ export default function litecanvas(settings = {}) {
3436 width : null ,
3537 height : null ,
3638 autoscale : true ,
37- pixelart : true ,
3839 canvas : null ,
3940 global : true ,
4041 loop : null ,
4142 tapEvents : true ,
4243 keyboardEvents : true ,
43- animate : true ,
4444 }
4545
4646 // setup the settings default values
@@ -75,7 +75,9 @@ export default function litecanvas(settings = {}) {
7575 /** @type {number } */
7676 _rngSeed = Date . now ( ) ,
7777 /** @type {string[] } */
78- _colors = defaultPalette ,
78+ _currentPalette ,
79+ /** @type {string[] } */
80+ _colors ,
7981 /** @type {number[] } */
8082 _defaultSound = [ 0.5 , 0 , 1750 , , , 0.3 , 1 , , , , 600 , 0.1 ] ,
8183 /** @type {string } */
@@ -1040,7 +1042,7 @@ export default function litecanvas(settings = {}) {
10401042 '[litecanvas] listen() 2nd param must be a function'
10411043 )
10421044
1043- eventName = eventName . toLowerCase ( )
1045+ eventName = lowerCase ( eventName )
10441046
10451047 _eventListeners [ eventName ] = _eventListeners [ eventName ] || new Set ( )
10461048 _eventListeners [ eventName ] . add ( callback )
@@ -1064,7 +1066,7 @@ export default function litecanvas(settings = {}) {
10641066 '[litecanvas] emit() 1st param must be a string'
10651067 )
10661068 if ( _initialized ) {
1067- eventName = eventName . toLowerCase ( )
1069+ eventName = lowerCase ( eventName )
10681070
10691071 triggerEvent ( 'before:' + eventName , arg1 , arg2 , arg3 , arg4 )
10701072 triggerEvent ( eventName , arg1 , arg2 , arg3 , arg4 )
@@ -1073,7 +1075,7 @@ export default function litecanvas(settings = {}) {
10731075 } ,
10741076
10751077 /**
1076- * Set or reset the color palette
1078+ * Set or reset the color palette.
10771079 *
10781080 * @param {string[] } [colors]
10791081 */
@@ -1083,6 +1085,31 @@ export default function litecanvas(settings = {}) {
10831085 '[litecanvas] pal() 1st param must be a array of strings'
10841086 )
10851087 _colors = colors
1088+ _currentPalette = [ ...colors ]
1089+ } ,
1090+
1091+ /**
1092+ * Swap two colors of the current palette.
1093+ *
1094+ * If called without arguments, reset the current palette.
1095+ *
1096+ * @param {number? } a
1097+ * @param {number? } b
1098+ */
1099+ palc ( a , b ) {
1100+ DEV: assert (
1101+ null == a || ( isNumber ( a ) && a >= 0 ) ,
1102+ '[litecanvas] palc() 1st param must be a positive number'
1103+ )
1104+ DEV: assert (
1105+ isNumber ( a ) ? isNumber ( b ) && b >= 0 : null == b ,
1106+ '[litecanvas] palc() 2nd param must be a positive number'
1107+ )
1108+ if ( a == null ) {
1109+ _colors = [ ..._currentPalette ]
1110+ } else {
1111+ ; [ _colors [ a ] , _colors [ b ] ] = [ _colors [ b ] , _colors [ a ] ]
1112+ }
10861113 } ,
10871114
10881115 /**
@@ -1460,15 +1487,15 @@ export default function litecanvas(settings = {}) {
14601487 * @returns {boolean }
14611488 */
14621489 const keyCheck = ( keySet , key = '' ) => {
1463- key = key . toLowerCase ( )
1490+ key = lowerCase ( key )
14641491 return ! key ? keySet . size > 0 : keySet . has ( 'space' === key ? ' ' : key )
14651492 }
14661493
14671494 /** @type {string } */
14681495 let _lastKey = ''
14691496
14701497 on ( root , 'keydown' , ( /** @type {KeyboardEvent } */ event ) => {
1471- const key = event . key . toLowerCase ( )
1498+ const key = lowerCase ( event . key )
14721499 if ( ! _keysDown . has ( key ) ) {
14731500 _keysDown . add ( key )
14741501 _keysPress . add ( key )
@@ -1477,7 +1504,7 @@ export default function litecanvas(settings = {}) {
14771504 } )
14781505
14791506 on ( root , 'keyup' , ( /** @type {KeyboardEvent } */ event ) => {
1480- _keysDown . delete ( event . key . toLowerCase ( ) )
1507+ _keysDown . delete ( lowerCase ( event . key ) )
14811508 } )
14821509
14831510 on ( root , 'blur' , ( ) => _keysDown . clear ( ) )
@@ -1529,9 +1556,8 @@ export default function litecanvas(settings = {}) {
15291556 }
15301557
15311558 function drawFrame ( ) {
1532- if ( ! settings . animate ) {
1533- return instance . emit ( 'draw' , _ctx )
1534- }
1559+ // request the next frame
1560+ _rafid = raf ( drawFrame )
15351561
15361562 let now = Date . now ( )
15371563 let updated = 0
@@ -1561,9 +1587,6 @@ export default function litecanvas(settings = {}) {
15611587 )
15621588 }
15631589 }
1564-
1565- // request the next frame
1566- _rafid = raf ( drawFrame )
15671590 }
15681591
15691592 function setupCanvas ( ) {
@@ -1638,22 +1661,15 @@ export default function litecanvas(settings = {}) {
16381661 }
16391662
16401663 // set canvas image rendering properties
1641- if ( settings . pixelart ) {
1642- _ctx . imageSmoothingEnabled = false
1643- _canvas . style . imageRendering = 'pixelated'
1644- }
1664+ _ctx . imageSmoothingEnabled = false
1665+ _canvas . style . imageRendering = 'pixelated'
16451666
16461667 // set the default text align and baseline
16471668 instance . textalign ( 'start' , 'top' )
16481669
16491670 // trigger "resized" event
16501671 // note: not triggered before the "init" event
16511672 instance . emit ( 'resized' , _scale )
1652-
1653- // force redraw when the canvas is not animated
1654- if ( ! settings . animate ) {
1655- raf ( drawFrame )
1656- }
16571673 }
16581674
16591675 /**
@@ -1700,6 +1716,9 @@ export default function litecanvas(settings = {}) {
17001716
17011717 setupCanvas ( )
17021718
1719+ // init the color palette
1720+ instance . pal ( )
1721+
17031722 if ( 'loading' === document . readyState ) {
17041723 on ( root , 'DOMContentLoaded' , ( ) => raf ( init ) )
17051724 } else {
0 commit comments