please keep those gdk draw- functions

Chisheng Huang <[email protected]> Tue, 16 Oct 2007 15:39:30 -0700
Newsgroups gmane.lisp.clg.devel
Message-ID <[email protected]>
Hi,

The following comment is from gdk/gdk.lisp:

;;; Drawable -- all the draw- functions are deprecated and will be
;;; removed, use cairo for drawing instead.

I'd like to plea to keep the support of these draw- functions in
GDK as long as they are officially supported.  The index of deprecated
symbols of GDK Reference Manual only listed 4 drawing functions:
gdk_draw_pixmap, gdk_draw_string, gdk_draw_text, and gdk_draw_text_wc.

Cairo is nice but is just too slow for statistical graphics.
To draw 25,000 circles, GDK:DRAW-ARC takes 0.07 seconds and Cairo
takes 6.01 seconds.  Timing code is attached at the end.

Please keep the GDK draw- functions as long as they are officially
supported.

Thanks.

-cph


(defvar *da*)

(let* ((da (make-instance 'gtk:drawing-area
                         :width-request 300
                         :height-request 300))
       (w (make-instance 'gtk:window
                         :child da)))
  (setf *da* da)
  (gtk:widget-show-all w))

(defvar *centers*)

(null
 (setf *centers*
       (loop repeat 50000
          collect (+ 10 (random 280)))))


(gffi:defbinding gc-new () gdk:gc
  (drawable gdk:drawable))

(defun gdk-circles (centers)
  (let* ((drawable (gtk:widget-window *da*))
         (gc (gc-new drawable)))
    (loop for x in centers by #'cddr
       for y in (cdr centers) by #'cddr
       do (gdk:draw-arc drawable
                        gc nil x y 10 10 0 23040))))

(defun cairo-circles (centers)
  (gdk:with-cairo-context (cr (gtk:widget-window *da*))
    (setf (cairo:line-width cr) 1.0d0)
    (loop for x in centers by #'cddr
       for y in (cdr centers) by #'cddr
       with 2pi = (* 2 pi)
       do
         (cairo:arc cr x y 5 0 2pi)
         (cairo:stroke cr))))

;; make sure to compile GDK-CIRCLES before you do timing.
(time (gdk-circles *centers*))

; Evaluation took:
;   0.07 seconds of real time
;   0.020001 seconds of user run time
;   0.0 seconds of system run time
;   141,341,821 CPU cycles
;   0 page faults and
;   768 bytes consed.


;; make sure to compile CAIRO-CIRCLES before you do timing.
(time (cairo-circles *centers*))

; Evaluation took:
;   6.01 seconds of real time
;   4.172261 seconds of user run time
;   0.024002 seconds of system run time
;   12,596,945,906 CPU cycles
;   [Run times include 0.03 seconds GC run time]
;   0 page faults and
;   1,619,920 bytes consed.

I even wrote a C function that just received a Cairo contex and a
vector of circle centers from CMUCL and did the drawing all in C.
The C function and the necessary binding were about as slow as
CAIRO-CIRCLES.

Note, if we define CAIRO-CIRCLES as

(defun cairo-circles (centers)
  (gdk:with-cairo-context (cr (gtk:widget-window *da*))
    (setf (cairo:line-width cr) 1.0d0)
    (loop for x in centers by #'cddr
       for y in (cdr centers) by #'cddr
       with 2pi = (* 2 pi)
       do
         (cairo:arc cr x y 5 0 2pi)
         (cairo:new-sub-path cr))
    (cairo:stroke cr)))

this version of CAIRO-CIRCLES will kill CMUCL immediately when the length
of CENTERS is 3000 or bigger.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/