You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
typesetting/pitfall/pitfall/reference.rkt

47 lines
1.4 KiB
Racket

5 years ago
#lang debug racket/base
5 years ago
(require "core.rkt"
"object.rkt"
5 years ago
fontland/zlib)
(provide (all-defined-out))
7 years ago
(define ref-listeners null)
(define (register-ref-listener proc)
(set! ref-listeners (cons proc ref-listeners)))
5 years ago
(define current-id 0)
(define (set-current-ref-id! val)
5 years ago
(set! current-id val))
(define (make-ref [payload (make-hasheq)])
5 years ago
(define new-ref ($ref current-id payload #f (open-output-bytes)))
5 years ago
(for-each (λ (listener-proc) (listener-proc new-ref)) ref-listeners)
5 years ago
(begin0
5 years ago
new-ref
5 years ago
(set! current-id (add1 current-id))))
5 years ago
(define (ref-write ref chunk)
(write-bytes (to-bytes chunk) ($ref-port ref)))
5 years ago
5 years ago
(define (ref-end ref)
(set-$ref-offset! ref (file-position (current-output-port)))
7 years ago
5 years ago
(write-bytes-out (format "~a 0 obj" ($ref-id ref)))
5 years ago
(define bstr
(let ([bstr (get-output-bytes ($ref-port ref))])
(cond
[(zero? (bytes-length bstr)) #false]
[(and (current-compress-streams) (not (hash-ref ($ref-payload ref) 'Filter #f)))
5 years ago
(hash-set! ($ref-payload ref) 'Filter 'FlateDecode)
(deflate bstr)]
[else bstr])))
5 years ago
(when bstr
(hash-set! ($ref-payload ref) 'Length (bytes-length bstr)))
(write-bytes-out (convert ($ref-payload ref)))
5 years ago
(when bstr
(write-bytes-out (bytes-append #"stream\n" bstr #"\nendstream")))
5 years ago
(write-bytes-out "\nendobj"))