speed up quantization
svn: r6066
This commit is contained in:
parent
ea91e1a8c5
commit
1f3e14da07
|
@ -440,7 +440,16 @@
|
||||||
|
|
||||||
(define (quantize argb)
|
(define (quantize argb)
|
||||||
(let* ([len (quotient (bytes-length argb) 4)]
|
(let* ([len (quotient (bytes-length argb) 4)]
|
||||||
[result (make-bytes len)])
|
[result (make-bytes len)]
|
||||||
|
[rgb-key (lambda (r g b)
|
||||||
|
(bitwise-ior (bitwise-ior
|
||||||
|
(arithmetic-shift r 16)
|
||||||
|
(arithmetic-shift g 8))
|
||||||
|
b))]
|
||||||
|
[key->rgb (lambda (k)
|
||||||
|
(vector (arithmetic-shift k -16)
|
||||||
|
(bitwise-and #xFF (arithmetic-shift k -8))
|
||||||
|
(bitwise-and #xFF k)))])
|
||||||
(let loop ([masks (list
|
(let loop ([masks (list
|
||||||
;; 8 bits per color
|
;; 8 bits per color
|
||||||
(lambda (v) v)
|
(lambda (v) v)
|
||||||
|
@ -458,7 +467,7 @@
|
||||||
0)))])
|
0)))])
|
||||||
(let ([mask (car masks)]
|
(let ([mask (car masks)]
|
||||||
[transparent #f]
|
[transparent #f]
|
||||||
[table (make-hash-table 'equal)]
|
[table (make-hash-table)] ; relying on fixnums
|
||||||
[idx 0])
|
[idx 0])
|
||||||
;; Iterate over image to count colors
|
;; Iterate over image to count colors
|
||||||
;; (as reduced by mask)
|
;; (as reduced by mask)
|
||||||
|
@ -471,7 +480,7 @@
|
||||||
(set! transparent idx)
|
(set! transparent idx)
|
||||||
(set! idx (add1 idx)))
|
(set! idx (add1 idx)))
|
||||||
transparent)
|
transparent)
|
||||||
(let ([vec (vector
|
(let ([vec (rgb-key
|
||||||
(mask (bytes-ref argb (+ 1 pos)))
|
(mask (bytes-ref argb (+ 1 pos)))
|
||||||
(mask (bytes-ref argb (+ 2 pos)))
|
(mask (bytes-ref argb (+ 2 pos)))
|
||||||
(mask (bytes-ref argb (+ 3 pos))))])
|
(mask (bytes-ref argb (+ 3 pos))))])
|
||||||
|
@ -481,8 +490,9 @@
|
||||||
(hash-table-put! table vec idx)
|
(hash-table-put! table vec idx)
|
||||||
(set! idx (add1 idx))
|
(set! idx (add1 idx))
|
||||||
(sub1 idx))))))])
|
(sub1 idx))))))])
|
||||||
(bytes-set! result i (min 255 this-idx)))
|
(unless (= this-idx 256)
|
||||||
(loop (add1 i) (+ pos 4))))
|
(bytes-set! result i this-idx)
|
||||||
|
(loop (add1 i) (+ pos 4))))))
|
||||||
(if ((hash-table-count table) . > . (if transparent
|
(if ((hash-table-count table) . > . (if transparent
|
||||||
255
|
255
|
||||||
256))
|
256))
|
||||||
|
@ -505,6 +515,6 @@
|
||||||
(hash-table-for-each
|
(hash-table-for-each
|
||||||
table
|
table
|
||||||
(lambda (k v)
|
(lambda (k v)
|
||||||
(vector-set! t v k)))
|
(vector-set! t v (key->rgb k))))
|
||||||
(vector->list t))
|
(vector->list t))
|
||||||
transparent)))))))
|
transparent)))))))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user