#lang debug racket (require "struct.rkt" "attrs.rkt" "param.rkt" "debug.rkt" quad/position pitfall quad/quad) (provide (all-defined-out)) (define (convert-image-quad q) (define path-string (quad-ref q :image-file)) (unless (file-exists? path-string) (raise-argument-error 'create-image-quad "image path that exists" path-string)) (define img-obj (open-image (current-pdf) path-string)) (define img-width ($img-width img-obj)) (define img-height ($img-height img-obj)) (match-define (list layout-width layout-height) (match (list (quad-ref q :image-width) (quad-ref q :image-height)) [(list (? number? w) (? number? h)) (list w h)] [(list #false (? number? h)) (define ratio (/ h img-height)) (list (* ratio img-width) h)] [(list (? number? w) #false) (define ratio (/ w img-width)) (list w (* ratio img-height))] [(list #false #false) (list img-width img-height)])) (quad-copy image-quad q:image [attrs (let ([h (hash-copy (quad-attrs q))]) ;; defeat 'bi 'bo positioning by removing font reference (hash-set! h font-path-key #false) ;; save the img-obj for later (hash-set! h :image-object img-obj) h)] [size (pt layout-width layout-height)])) (define (q:image-draw q doc) (define img (quad-ref q :image-object)) (match-define (list x y) (quad-origin q)) (match-define (list w h) (size q)) (image doc img x y #:width w #:height h)) (define (q:image-draw-end q doc) (when (draw-debug-image?) (draw-debug q doc "orange" "orange"))) (define q:image (q #:type image-quad #:from 'bo #:to 'bi #:tag 'image #:printable #true #:draw q:image-draw #:draw-end q:image-draw-end))