Welcome to the CHICKEN Scheme pasting service
pixelfluter added by wasamasa on Thu Dec 29 15:50:40 2016
#!/usr/bin/env chicken-scheme ;; -*- mode: scheme; -*- (use tcp extras data-structures imlib2 ;giflib giflib-imlib2 srfi-18) ;; (define host "151.217.20.67") (define host "127.0.0.1") (define port 8080) (define-values (in out) (tcp-connect host port)) (define (request payload read?) (write-line payload out) (when read? (let loop ((i 0) (lines '())) (if (< i read?) (loop (add1 i) (cons (read-line in) lines)) lines)))) (define (size) (map string->number (cdr (string-split (car (request "SIZE" 1)))))) (define (put x y c) (request (format "PX ~a ~a ~a" x y c) #f)) (define (get x y) (request (format "PX ~a ~a" x y) 1)) (define batch-size 50) (define (->messages template data) (map (lambda (batch) (let ((lines (map (lambda (args) (apply format template args)) batch))) (string-intersperse lines "\n"))) (chop data batch-size))) (define (put* messages) (for-each (lambda (message) (request message #f)) messages)) (define (get* proc messages) (for-each (lambda (message) (for-each proc (request message batch-size))) messages)) #;(define (pixels x y w h) (get* (let ((size (* w h))) (let loop ((i 0) (messages '())) (if (< i size) (let* ((row (quotient i w)) (col (remainder i w)) (message (list (+ x col) (+ y row)))) (loop (add1 i) (cons message messages))) (->messages "PX ~a ~a" messages)))))) (define width #;1920 640) (define height #;1080 480) (define (hex a r g b) (string-append (if (< a 16) (format "0~x" a) (format "~x" a)) (if (< r 16) (format "0~x" r) (format "~x" r)) (if (< g 16) (format "0~x" g) (format "~x" g)) (if (< b 16) (format "0~x" b) (format "~x" b)))) (define (image-data img x y) (let* ((w (image-width img)) (h (image-height img)) (size (* w h))) (let loop ((i 0) (messages '())) (if (< i size) (let ((row (quotient i w)) (col (remainder i w))) (receive (r g b a) (image-pixel/rgba img col row) (let* ((c (hex a r g b)) (message (list (+ x col) (+ y row) c))) (loop (add1 i) (cons message messages))))) (->messages "PX ~a ~a ~a" messages))))) (define (gif-data path x y) (let ((gif (open-gif path))) (slurp-gif gif) (map (lambda (img) (image-data img 300 700)) (gif->imlib2-images gif)))) (define (box-data x y w h c) (let ((size (* w h))) (let loop ((i 0) (messages '())) (if (< i size) (let* ((row (quotient i w)) (col (remainder i w)) (message (list (+ x col) (+ y row) c))) (loop (add1 i) (cons message messages))) (->messages "PX ~a ~a ~a" messages))))) (define (censorship) (let* ((dog (image-data (image-load "/home/wasa/fallkiste/skype_avatar.png") 1300 800)) (putin (image-data (image-load "/home/wasa/fallkiste/putin.png") 1310 520)) (box (box-data 725 650 100 30 "000000")) (box1 (box-data 800 870 100 30 "000000")) (box2 (box-data 1300 720 100 30 "000000")) (box3 (box-data 1350 830 100 30 "000000"))) (let loop () (put* dog) ;; (put* putin) ;; (put* box1) ;; (put* box2) ;; (put* box3) (loop)))) (define (cool-dog) (let loop () ;(for-each put* (gif-data "/home/wasa/fallkiste/skype_avatar.gif" 300 300)) (put* (image-data (image-load "/home/wasa/fallkiste/skype_avatar.png") 300 300)) (loop))) (define (bouncy-box) (let ((xr 20) (yr 40)) (let loop ((x 0) (y 0)) (when (or (< x 0) (> x width)) (set! xr (- xr))) (when (or (< y 0) (> y height)) (set! yr (- yr))) (let ((x* (+ x xr)) (y* (+ y yr))) (put* (box-data x y 80 80 "000000")) (put* (box-data x* y* 80 80 "ff00ff")) (loop x* y*))))) (define bg "ffffff") (define (clear) (put* (box-data 0 0 width height bg))) (define (coords x y w h) (let ((size (* w h))) (let loop ((i 0) (coords '())) (if (< i size) (let ((row (quotient i h)) (col (remainder i h))) (loop (add1 i) (cons (list row col) coords))) (->messages "PX ~a ~a" coords))))) (define (scrot path) (let ((img (image-create width height))) (get* (lambda (pixel) (let* ((data (cdr (string-split pixel))) (x (string->number (car data))) (y (string->number (cadr data))) (c (list-ref data 2)) (len (string-length c)) (r (string->number (if (= len 6) (substring c 0 2) (substring c 2 4)) 16)) (g (string->number (if (= len 6) (substring c 2 4) (substring c 4 6)) 16)) (b (string->number (if (= len 6) (substring c 4 6) (substring c 6 8)) 16)) (a (string->number (if (= len 6) "ff" (substring c 0 2)) 16))) (image-draw-pixel img (color/rgba r g b a) x y))) (coords 0 0 width height)) (image-save img path))) ;(scrot "scrot.png") (bouncy-box) (pp (size)) (close-input-port in) (close-output-port out)