Author: hhubner
Date: 2007-10-05 02:04:47 -0400 (Fri, 05 Oct 2007)
New Revision: 2220
Added:
branches/trunk-reorg/thirdparty/salza-png-1.0.1/
branches/trunk-reorg/thirdparty/salza-png-1.0.1/README
branches/trunk-reorg/thirdparty/salza-png-1.0.1/png.lisp
branches/trunk-reorg/thirdparty/salza-png-1.0.1/salza-png.asd
Removed:
branches/trunk-reorg/thirdparty/salza-png-1.0/
Log:
update salza-png
Added: branches/trunk-reorg/thirdparty/salza-png-1.0.1/README
===================================================================
--- branches/trunk-reorg/thirdparty/salza-png-1.0.1/README 2007-10-05 06:02:33 UTC (rev 2219)
+++ branches/trunk-reorg/thirdparty/salza-png-1.0.1/README 2007-10-05 06:04:47 UTC (rev 2220)
@@ -0,0 +1,35 @@
+The salza-png software is a standalone version of the PNG writer from
+the salza examples directory. Documentation, such as it is, is at the
+start of png.lisp.
+
+For questions or comments, please contact me, Zach Beane, at
+xach(a)xach.com.
+
+salza-png is offered under the following license:
+
+;;;
+;;; Copyright (c) 2007 Zachary Beane, All Rights Reserved
+;;;
+;;; Redistribution and use in source and binary forms, with or without
+;;; modification, are permitted provided that the following conditions
+;;; are met:
+;;;
+;;; * Redistributions of source code must retain the above copyright
+;;; notice, this list of conditions and the following disclaimer.
+;;;
+;;; * Redistributions in binary form must reproduce the above
+;;; copyright notice, this list of conditions and the following
+;;; disclaimer in the documentation and/or other materials
+;;; provided with the distribution.
+;;;
+;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Added: branches/trunk-reorg/thirdparty/salza-png-1.0.1/png.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/salza-png-1.0.1/png.lisp 2007-10-05 06:02:33 UTC (rev 2219)
+++ branches/trunk-reorg/thirdparty/salza-png-1.0.1/png.lisp 2007-10-05 06:04:47 UTC (rev 2220)
@@ -0,0 +1,203 @@
+;;;
+;;; png.lisp
+;;;
+;;; Created: 2005-03-14 by Zach Beane <xach(a)xach.com>
+;;;
+;;; An example use of the salza ZLIB interface functions.
+;;;
+;;; (setq png (make-instance 'png
+;;; :color-type :truecolor
+;;; :height 10
+;;; :width 10
+;;; :image-data <300 bytes of image data>))
+;;;
+;;; (write-png png "example.png")
+;;;
+;;;
+;;; Copyright (c) 2007 Zachary Beane, All Rights Reserved
+;;;
+;;; Redistribution and use in source and binary forms, with or without
+;;; modification, are permitted provided that the following conditions
+;;; are met:
+;;;
+;;; * Redistributions of source code must retain the above copyright
+;;; notice, this list of conditions and the following disclaimer.
+;;;
+;;; * Redistributions in binary form must reproduce the above
+;;; copyright notice, this list of conditions and the following
+;;; disclaimer in the documentation and/or other materials
+;;; provided with the distribution.
+;;;
+;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+;;;
+;;; $Id: png.lisp,v 1.2 2007/10/01 13:37:47 xach Exp $
+
+(defpackage #:png
+ (:use #:cl #:salza #:salza-deflate)
+ (:export #:png
+ #:write-png
+ #:write-png-stream))
+
+(in-package :png)
+
+
+;;; Chunks
+
+(defclass chunk ()
+ ((buffer :initarg :buffer :reader buffer)
+ (pos :initform 4 :accessor pos)))
+
+(defun chunk-write-byte (byte chunk)
+ "Save one byte to CHUNK."
+ (setf (aref (buffer chunk) (pos chunk)) byte)
+ (incf (pos chunk)))
+
+(defun chunk-write-uint32 (integer chunk)
+ "Save INTEGER to CHUNK as four bytes."
+ (dotimes (i 4)
+ (setf (aref (buffer chunk) (pos chunk))
+ (logand #xFF (ash integer (+ -24 (* i 8)))))
+ (incf (pos chunk))))
+
+(defun make-chunk (a b c d size)
+ "Make a chunk that uses A, B, C, and D as the signature bytes, with
+data size SIZE."
+ (let ((buffer (make-array (+ size 4) :element-type '(unsigned-byte 8))))
+ (setf (aref buffer 0) a
+ (aref buffer 1) b
+ (aref buffer 2) c
+ (aref buffer 3) d)
+ (make-instance 'chunk
+ :buffer buffer)))
+
+(defun write-uint32 (integer stream)
+ (dotimes (i 4)
+ (write-byte (logand #xFF (ash integer (+ -24 (* i 8)))) stream)))
+
+(defun write-chunk (chunk stream)
+ (write-uint32 (- (pos chunk) 4) stream)
+ (write-sequence (buffer chunk) stream :end (pos chunk))
+ (write-sequence (crc32-sequence (buffer chunk) :end (pos chunk)) stream))
+
+
+;;; PNGs
+
+(defclass png ()
+ ((width :initarg :width :reader width)
+ (height :initarg :height :reader height)
+ (color-type :initform :truecolor :initarg :color-type :reader color-type)
+ (bpp :initform 8 :initarg :bpp :reader bpp)
+ (image-data :initarg :image-data :reader image-data)))
+
+(defmethod initialize-instance :after ((png png) &rest args)
+ (declare (ignore args))
+ (assert (= (length (image-data png))
+ (* (height png) (rowstride png)))))
+
+(defgeneric write-png (png pathname &key if-exists))
+(defgeneric write-ihdr (png stream))
+(defgeneric ihdr-color-type (png))
+(defgeneric write-idat (png stream))
+(defgeneric write-iend (png stream))
+(defgeneric write-png-header (png stream))
+(defgeneric scanline-offset (png scanline))
+(defgeneric rowstride (png))
+(defgeneric samples/pixel (png))
+
+(defmethod samples/pixel (png)
+ (ecase (color-type png)
+ (:grayscale 1)
+ (:truecolor 3)
+ (:indexed-color 1)
+ (:grayscale-alpha 2)
+ (:truecolor-alpha 4)))
+
+
+(defmethod rowstride (png)
+ (* (width png) (samples/pixel png)))
+
+(defmethod scanline-offset (png scanline)
+ (* scanline (rowstride png)))
+
+(defmethod write-png-header (png stream)
+ (let ((header (make-array 8
+ :element-type '(unsigned-byte 8)
+ :initial-contents '(137 80 78 71 13 10 26 10))))
+ (write-sequence header stream)))
+
+(defvar *color-types*
+ '((:grayscale . 0)
+ (:truecolor . 2)
+ (:indexed-color . 3)
+ (:grayscale-alpha . 4)
+ (:truecolor-alpha . 6)))
+
+(defmethod ihdr-color-type (png)
+ (cdr (assoc (color-type png) *color-types*)))
+
+(defmethod write-ihdr (png stream)
+ (let ((chunk (make-chunk 73 72 68 82 13)))
+ (chunk-write-uint32 (width png) chunk)
+ (chunk-write-uint32 (height png) chunk)
+ (chunk-write-byte (bpp png) chunk)
+ (chunk-write-byte (ihdr-color-type png) chunk)
+ ;; compression method
+ (chunk-write-byte 0 chunk)
+ ;; filtering
+ (chunk-write-byte 0 chunk)
+ ;; interlace
+ (chunk-write-byte 0 chunk)
+ (write-chunk chunk stream)))
+
+(defmethod write-idat (png stream)
+ (let* ((chunk (make-chunk 73 68 65 84 16384))
+ (filter-type (make-array 1
+ :element-type '(unsigned-byte 8)
+ :initial-element 0)))
+ (flet ((write-full-chunk (zlib-stream)
+ (setf (pos chunk) (zlib-stream-position zlib-stream))
+ (write-chunk chunk stream)
+ (fill (buffer chunk) 0 :start 4)
+ (setf (zlib-stream-position zlib-stream) 4)))
+ (let ((zlib-stream (make-zlib-stream (buffer chunk)
+ :start 4
+ :callback #'write-full-chunk)))
+ (dotimes (i (height png))
+ (let* ((start-offset (scanline-offset png i))
+ (end-offset (+ start-offset (rowstride png))))
+ (zlib-write-sequence filter-type zlib-stream)
+ (zlib-write-sequence (image-data png) zlib-stream
+ :start start-offset
+ :end end-offset)))
+ (finish-zlib-stream zlib-stream)))))
+
+
+
+(defmethod write-iend (png stream)
+ (let ((chunk (make-chunk 73 69 78 68 0)))
+ (write-chunk chunk stream)))
+
+(defmethod write-png-stream (png stream)
+ (write-png-header png stream)
+ (write-ihdr png stream)
+ (write-idat png stream)
+ (write-iend png stream))
+
+(defmethod write-png (png file &key (if-exists :supersede))
+ (with-open-file (stream file
+ :direction :output
+ :if-exists if-exists
+ :if-does-not-exist :create
+ :element-type '(unsigned-byte 8))
+ (write-png-stream png stream)
+ (truename file)))
Added: branches/trunk-reorg/thirdparty/salza-png-1.0.1/salza-png.asd
===================================================================
--- branches/trunk-reorg/thirdparty/salza-png-1.0.1/salza-png.asd 2007-10-05 06:02:33 UTC (rev 2219)
+++ branches/trunk-reorg/thirdparty/salza-png-1.0.1/salza-png.asd 2007-10-05 06:04:47 UTC (rev 2220)
@@ -0,0 +1,35 @@
+;;;
+;;; salza-png.asd
+;;;
+;;; Copyright (c) 2007 Zachary Beane, All Rights Reserved
+;;;
+;;; Redistribution and use in source and binary forms, with or without
+;;; modification, are permitted provided that the following conditions
+;;; are met:
+;;;
+;;; * Redistributions of source code must retain the above copyright
+;;; notice, this list of conditions and the following disclaimer.
+;;;
+;;; * Redistributions in binary form must reproduce the above
+;;; copyright notice, this list of conditions and the following
+;;; disclaimer in the documentation and/or other materials
+;;; provided with the distribution.
+;;;
+;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+;;;
+;;; $Id: salza-png.asd,v 1.2 2007/10/01 13:37:29 xach Exp $
+
+(asdf:defsystem #:salza-png
+ :depends-on (#:salza)
+ :version "1.0.1"
+ :components ((:file "png")))