diff --git a/gui-doc/mrlib/scribblings/image-core.scrbl b/gui-doc/mrlib/scribblings/image-core.scrbl index 90936124..767282e9 100644 --- a/gui-doc/mrlib/scribblings/image-core.scrbl +++ b/gui-doc/mrlib/scribblings/image-core.scrbl @@ -41,3 +41,13 @@ up an image. Ordinarily, the image's bitmap cache is computed the first time the image is actually rendered. } + +@defproc[(definitely-same-image? [i1 image?] [i2 image?]) boolean?]{ + Returns @racket[#t] if @racket[i1] and @racket[i2] draw identically + and @racket[#f] if they may draw the same or may draw differently. + + This test is intended to be cheaper than a full equality comparison. + It is also used by the implementation of @racket[equal?] on images + to short-circuit the full check. (The full check draws the two images + and then compares the resulting bitmaps.) +} diff --git a/gui-lib/mrlib/image-core.rkt b/gui-lib/mrlib/image-core.rkt index 1f0e10a6..4ba4a545 100644 --- a/gui-lib/mrlib/image-core.rkt +++ b/gui-lib/mrlib/image-core.rkt @@ -436,6 +436,22 @@ has been moved out). (inherit set-snipclass) (set-snipclass snip-class))) +(define (definitely-same-image? i1 i2) + (cond + [(and (is-a? i1 image<%>) (is-a? i2 image<%>)) + (equal? (send i1 get-normalized-shape) + (send i2 get-normalized-shape))] + [(or (is-a? i1 image<%>) (is-a? i2 image<%>)) + #f] + [else + (define bm1 (if (is-a? i1 image-snip%) + (send i1 get-image) + i2)) + (define bm2 (if (is-a? i2 image-snip%) + (send i2 get-image) + i2)) + (eq? bm1 bm2)])) + (define (same-bb? bb1 bb2) (and (same-width/height? bb1 bb2) (= (round (bb-baseline bb1)) (round (bb-baseline bb2))))) @@ -1383,7 +1399,9 @@ the mask bitmap and the original bitmap are all together in a single bytes! curve-segment->path mode-color->pen - snipclass-bytes->image) + snipclass-bytes->image + (contract-out + [definitely-same-image? (-> image? image? boolean?)])) ;; method names (provide get-shape get-bb get-pinhole get-normalized? get-normalized-shape)