@@ -5,6 +5,7 @@ const importButton = document.getElementById('importBtn');
5
5
const baseCanvas = document . getElementById ( 'baseCanvas' ) ;
6
6
const drawCanvas = document . getElementById ( 'drawCanvas' ) ;
7
7
const drawModeButton = document . getElementById ( 'drawModeBtn' ) ;
8
+ const backgroundButton = document . getElementById ( 'backgroundBtn' ) ;
8
9
9
10
const queryString = window . location . search
10
11
const urlParams = new URLSearchParams ( queryString )
@@ -423,6 +424,7 @@ async function updateConnectButton()
423
424
else if ( img . image . src === "" )
424
425
{
425
426
drawModeButton . style . visibility = "hidden"
427
+ backgroundButton . style . visibility = "hidden"
426
428
connectButton . innerHTML = "Drop or import image"
427
429
connectButton . disabled = true
428
430
}
@@ -433,16 +435,20 @@ async function updateConnectButton()
433
435
befImport . children [ i ] . disabled = false
434
436
}
435
437
drawModeButton . style . visibility = "visible"
438
+ backgroundButton . style . visibility = "visible"
436
439
connectButton . className = 'mmBtn'
437
440
connectButton . innerHTML = 'draw!'
438
441
connectButton . disabled = false
442
+ backgroundButton . disabled = false
439
443
}
440
444
else
441
445
{
442
446
let befImport = document . getElementsByClassName ( "beforeImport" ) [ 0 ]
443
447
for ( let i = 0 ; i < befImport . children . length ; i ++ ) {
444
448
befImport . children [ i ] . disabled = true
445
449
}
450
+ // lock in decision
451
+ backgroundButton . disabled = true
446
452
connectButton . innerHTML = ''
447
453
connectButton . className = 'mmBtnDrawing'
448
454
}
@@ -558,7 +564,7 @@ async function getCurrentColor(x, y)
558
564
{
559
565
const imageData = baseCtx . getImageData ( x , y , 1 , 1 ) . data
560
566
if ( imageData [ 3 ] === 0 ) // transparent background => white
561
- return "FFFFFF "
567
+ return "not set "
562
568
563
569
return ( imageData [ 0 ] . toString ( 16 ) . padStart ( 2 , '0' ) +
564
570
imageData [ 1 ] . toString ( 16 ) . padStart ( 2 , '0' ) +
@@ -601,6 +607,7 @@ function approximateColor(r, g, b)
601
607
}
602
608
603
609
let drawMode = "random"
610
+ let background = false
604
611
let drawing = false
605
612
async function draw ( )
606
613
{
@@ -613,35 +620,52 @@ async function draw()
613
620
{
614
621
if ( ! drawing ) // shouldn't be set from outside...
615
622
break
623
+ let percent = 100 * ( total - idx_array . length ) / total
624
+ progressBar [ 1 ] . style . width = percent + '%'
625
+ progressBar [ 0 ] . innerHTML = percent . toFixed ( 2 ) + "% drawn (" + ( total - idx_array . length ) + "/" + total + " Pixel)"
616
626
if ( idx_array . length === 0 )
617
627
{
628
+ if ( background )
629
+ break
618
630
await delay ( 1000 )
619
631
continue
620
632
}
621
- let percent = 100 * ( total - idx_array . length ) / total
622
- progressBar [ 1 ] . style . width = percent + '%'
623
- progressBar [ 0 ] . innerHTML = percent . toFixed ( 2 ) + "% drawn (" + ( total - idx_array . length ) + "/" + total + " Pixel)"
633
+
624
634
let idx
625
635
if ( drawMode === "random" )
626
636
idx = getRandomInt ( idx_array . length )
627
637
else if ( drawMode === "rows" )
628
638
idx = 0
629
639
let i = idx_array [ idx ] * 4
640
+
641
+ // get current color
642
+ const x = img . x + ( i / 4 % img . w )
643
+ const y = img . y + Math . trunc ( ( ( i / 4 ) / img . w ) )
644
+ let cur_col = await getCurrentColor ( x , y )
645
+ if ( background && cur_col !== "not set" )
646
+ {
647
+ idx_array . splice ( idx , 1 )
648
+ continue
649
+ }
650
+ if ( cur_col === "not set" )
651
+ {
652
+ cur_col = "FFFFFF"
653
+ }
654
+
655
+ // get new color
630
656
const red = imgData [ i ] ;
631
657
const green = imgData [ i + 1 ] ;
632
658
const blue = imgData [ i + 2 ] ;
633
659
const alpha = imgData [ i + 3 ] ;
634
- if ( alpha <= 16 ) // almost transparent, we can probably hide it
635
- {
660
+ if ( alpha <= 16 )
661
+ { // almost transparent, we can probably hide it
636
662
idx_array . splice ( idx , 1 )
637
663
continue
638
664
}
639
-
640
665
let min_idx = approximateColor ( red , green , blue )
641
- const x = img . x + ( i / 4 % img . w )
642
- const y = img . y + Math . trunc ( ( ( i / 4 ) / img . w ) )
643
- const col = await getCurrentColor ( x , y ) ;
644
- if ( col !== palette [ min_idx ] )
666
+
667
+ // check if we need to update
668
+ if ( cur_col !== palette [ min_idx ] )
645
669
await paintPixel ( x , y , min_idx )
646
670
else
647
671
idx_array . splice ( idx , 1 )
@@ -771,7 +795,7 @@ drawCanvas.addEventListener("drop", function (evt) {
771
795
var files = evt . dataTransfer . files ;
772
796
if ( files . length > 0 ) {
773
797
var file = files [ 0 ] ;
774
- if ( typeof FileReader !== "undefined" && file . type . indexOf ( "image" ) != - 1 ) {
798
+ if ( typeof FileReader !== "undefined" && file . type . indexOf ( "image" ) !== - 1 ) {
775
799
var reader = new FileReader ( ) ;
776
800
// Note: addEventListener doesn't work in Google Chrome for this event
777
801
reader . onload = function ( evt2 ) {
@@ -808,3 +832,14 @@ drawModeButton.addEventListener("click", async function(event)
808
832
drawMode = "random"
809
833
drawModeButton . innerText = drawMode
810
834
} )
835
+
836
+ backgroundButton . addEventListener ( "click" , async function ( event )
837
+ {
838
+ let backgroundStr
839
+ background = ! background
840
+ if ( background )
841
+ backgroundStr = "Background only"
842
+ else
843
+ backgroundStr = "Normal"
844
+ backgroundButton . innerText = backgroundStr
845
+ } )
0 commit comments