File 0001-pstoricohddst-gdi-Implement-dot-counts.patch of Package RicohAficioSP1xx-2xx-PPD

From 7945b671315369023adec25ed8cffa18e8a4671c Mon Sep 17 00:00:00 2001
From: James Bottomley <JBottomley@Parallels.com>
Date: Thu, 24 Jul 2014 16:38:20 -0700
Subject: [PATCH] pstoricohddst-gdi: Implement dot counts

The printers need the dotcounts per page to estimate toner use, so implement
this using the ImageMagick identify command.  One of the fx variables is the
mean, which is the average colour of the image.  For b/w images, this
represents the number of white pixels divided by size.  Thus the black dot
count is width*height*(1-mean).

Tidy up some of the repeated elements in the script so this calculation is
only in one place for ease of maintenance.

Signed-off-by: James Bottomley <JBottomley@Parallels.com>
---
 pstoricohddst-gdi | 159 +++++++++++++++++++++++-------------------------------
 1 file changed, 67 insertions(+), 92 deletions(-)

diff --git a/pstoricohddst-gdi b/pstoricohddst-gdi
index f86f9b6..9db3b13 100755
--- a/pstoricohddst-gdi
+++ b/pstoricohddst-gdi
@@ -23,6 +23,66 @@ function stop() {
     echo "stop" > $uid/999999999-page.pbm
 }
 
+function output_page() {
+    # Converting page to JBIG format (parameters are very special for this printer!)
+    pbmtojbg -p 72 -o 3 -m 0 -q < $page > $uid/raster.jbig
+
+    # Taking image size
+    jsize=`wc -c < $uid/raster.jbig`
+
+    # Taking image dimensions
+    x=($(identify -format "%w %h %[fx:mean] " $page))
+    ##
+    # The %[fx:mean] gives the average colour in the image which for
+    # monochrome is the number of white pixels divided by the size
+    #
+    # So the formula gives the number of black pixels.  The final
+    # /1 causes bc to round to the nearest integer because scale=0
+    ##
+    dots=$(echo "(${x[0]}*${x[1]}*(1-${x[2]}))/1"|bc)
+
+    # Flushing page header
+    cat <<EOF
+@PJL SET PAGESTATUS=START$e
+@PJL SET COPIES=1$e
+@PJL SET MEDIASOURCE=$mediasource$e
+@PJL SET MEDIATYPE=PLAINRECYCLE$e
+@PJL SET PAPER=$pagesize$e
+@PJL SET PAPERWIDTH=${x[0]}$e
+@PJL SET PAPERLENGTH=${x[1]}$e
+@PJL SET RESOLUTION=${resolution%x600}$e
+@PJL SET IMAGELEN=$jsize$e
+EOF
+
+    cat $uid/raster.jbig
+
+    # Flushing page footer
+    # TODO: pixelcount for toner estimate
+    cat <<EOF
+@PJL SET DOTCOUNT=$dots$e
+@PJL SET PAGESTATUS=END$e
+EOF
+}
+
+function output_header() {
+    cat <<EOF
+%-12345X@PJL$e
+@PJL SET TIMESTAMP=$ddate$e
+@PJL SET FILENAME=Document$e
+@PJL SET COMPRESS=JBIG$e
+@PJL SET USERNAME=$user$e
+@PJL SET COVER=OFF$e
+@PJL SET HOLD=OFF$e
+EOF
+}
+
+function output_footer() {
+    cat <<EOF
+@PJL EOJ$e
+%-12345X
+EOF
+}
+
 log "Called with cmdline: $0 $*"
 
 trap "stop; trapINT" SIGINT SIGTERM SIGQUIT
@@ -73,60 +133,19 @@ mkdir -p $uid
 	    log "Page submitted"
 	    [ "$stage" = "empty" ] && {
 		log "1st stage. Flushing PJL header"
-		cat <<EOF
-%-12345X@PJL$e
-@PJL SET TIMESTAMP=$ddate$e
-@PJL SET FILENAME=Document$e
-@PJL SET COMPRESS=JBIG$e
-@PJL SET USERNAME=$user$e
-@PJL SET COVER=OFF$e
-@PJL SET HOLD=OFF$e
-EOF
-
+		output_header
 		stage="printing"
 	    }
 	    [ "$page" = "999999999-page.pbm" ] && { 
 		log "Last stage. Flushing PJL footer"
-		cat <<EOF
-@PJL EOJ$e
-%-12345X
-EOF
+		output_footer
 		pid=`ps ax | grep $uid | grep -v grep | awk ' { print $1 } '`
 		[ ! "x$pid" = "x" ] && kill $pid
 		break
 	    }
 	    [ "$stage" = "printing" ] && {
-		# Converting page to JBIG format (parameters are very special for this printer!)
-		pbmtojbg -p 72 -o 3 -m 0 -q < $uid/$page > $uid/raster.jbig
-
-		# Taking image size
-		jsize=`wc -c < $uid/raster.jbig`
-
-		# Taking image dimensions
-		read fn ft xs ys garb < <(identify $uid/$page | tr "x" " ")
-
-		# Flushing page header
-		cat <<EOF
-@PJL SET PAGESTATUS=START$e
-@PJL SET COPIES=1$e
-@PJL SET MEDIASOURCE=$mediasource$e
-@PJL SET MEDIATYPE=PLAINRECYCLE$e
-@PJL SET PAPER=$pagesize$e
-@PJL SET PAPERWIDTH=$xs$e
-@PJL SET PAPERLENGTH=$ys$e
-@PJL SET RESOLUTION=${resolution%x600}$e
-@PJL SET IMAGELEN=$jsize$e
-EOF
-
-		log "Flushing image $page"
-		cat $uid/raster.jbig
-
-		# Flushing page footer
-		# TODO: pixelcount for toner estimate
-		cat <<EOF
-@PJL SET DOTCOUNT=1132782$e
-@PJL SET PAGESTATUS=END$e
-EOF
+		page=$uid/$page
+		output_page
 	    }
 	done
 	) &
@@ -147,58 +166,14 @@ EOF
 	gs -sDEVICE=ps2write -sOutputFile=- -r$resolution -dQUIET -dBATCH -dNOPAUSE - | gs -sDEVICE=pbmraw -sOutputFile=${uid}/%03d-page.pbm -r$resolution -dQUIET -dBATCH -dNOPAUSE -
 	log "Conversion complete"
 
-	cat <<EOF
-%-12345X@PJL$e
-@PJL SET TIMESTAMP=$ddate$e
-@PJL SET FILENAME=Document$e
-@PJL SET COMPRESS=JBIG$e
-@PJL SET USERNAME=$user$e
-@PJL SET COVER=OFF$e
-@PJL SET HOLD=OFF$e
-EOF
+	output_header
 
 	for page in ${uid}/*-page.pbm; do
-
-		log "Page $page"
-		# Converting page to JBIG format (parameters are very special for this printer!)
-		pbmtojbg -p 72 -o 3 -m 0 -q < $page > $uid/raster.jbig
-
-		# Taking image size
-		jsize=`wc -c < $uid/raster.jbig`
-
-		# Taking image dimensions
-		read fn ft xs ys garb < <(identify $page | tr "x" " ")
-		log "Identified as ${xs}x${ys}"
-
-		# Flushing page header
-		cat <<EOF
-@PJL SET PAGESTATUS=START$e
-@PJL SET COPIES=1$e
-@PJL SET MEDIASOURCE=$mediasource$e
-@PJL SET MEDIATYPE=PLAINRECYCLE$e
-@PJL SET PAPER=$pagesize$e
-@PJL SET PAPERWIDTH=$xs$e
-@PJL SET PAPERLENGTH=$ys$e
-@PJL SET RESOLUTION=${resolution%x600}$e
-@PJL SET IMAGELEN=$jsize$e
-EOF
-
-		# Flushing image
-		cat $uid/raster.jbig
-
-		# Flushing page footer
-		# TODO: pixelcount for toner estimate
-		cat <<EOF
-@PJL SET DOTCOUNT=1132782$e
-@PJL SET PAGESTATUS=END$e
-EOF
+	    output_page
 	done
 
 	# Flushing PJL footer
-	cat <<EOF
-@PJL EOJ$e
-%-12345X
-EOF
+	output_footer
 
 }
 
-- 
2.0.1