<div dir="ltr">I'm not sure I can give you more than just hints (and certainly not a specification) but probably the difference is that pict->bitmap is drawing the pict at (0,0) in the DC and scribble is drawing it at some random place. But yeah, I'm sorry, that's still just a guess.<div>
<br></div><div>And the examples at that link are really fantastic!</div><div><br></div><div><div>Robby</div><div><br></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Feb 11, 2014 at 1:03 PM, Jens Axel Søgaard <span dir="ltr"><<a href="mailto:jensaxel@soegaard.net" target="_blank">jensaxel@soegaard.net</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">2014-02-11 19:39 GMT+01:00 Robby Findler <<a href="mailto:robby@eecs.northwestern.edu">robby@eecs.northwestern.edu</a>>:<br>

<div class="">> Is the problem that you need to use (more) absolute coordinates in the<br>
> coordinate arguments to linear-gradient% (either that or set the origin of<br>
> the dc, in the case that you wanted to create the brush only once)?<br>
<br>
</div>The problem is that it is unspecified (as far as I know) whether brushes<br>
used in picts are specified using absolute or relative coordinates. For solid<br>
brushes this makes no difference. For non-solid brushes (gradients and<br>
textures) there is a choice to be made. I got surprised by the<br>
behavior and thought<br>
of it as a bug (I was looking for one - I have an example where a pict<br>
shows up perfectly in DrRacket but renders differently in Scribble).<br>
<br>
If I in shady make a new gradient each time the pict is to be drawn, I get the<br>
behavior I want:<br>
<br>
                           (new linear-gradient%<br>
                                [x0 x] [y0 y] [x1 (+ x (* 2 r))] [y1<br>
y] ; horizontal gradient<br>
<div class="">                                [stops (list (list 0   red)   ; (0,0)<br>
to ( r,0) red->green<br>
                                             (list 1/2 green) ; (r,0)<br>
to (2r,0) green->blue<br>
                                             (list 1   blue))])<br>
<br>
</div>Since the pict constructors such as filled-rectangle use the pen, there<br>
were no way to figure out what was intended.<br>
<br>
The last example here: shows that Scribble converts p and (pict->bitmap p)<br>
differently. I am still puzzled by this.<br>
<br>
<a href="http://soegaard.github.io/docs/metapict/metapict.html#%28part._example-rgb-triangle%29" target="_blank">http://soegaard.github.io/docs/metapict/metapict.html#%28part._example-rgb-triangle%29</a><br>
<br>
/Jens Axel<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
> On Tue, Feb 11, 2014 at 10:49 AM, Jens Axel Søgaard <<a href="mailto:jensaxel@soegaard.net">jensaxel@soegaard.net</a>><br>
> wrote:<br>
>><br>
>> The intent of hc-append is that (hc-append p1 p2) draws p1 and p2<br>
>> beside each other.<br>
>><br>
>> The question is whether (hc-append p p) should draw to identical picts?<br>
>><br>
>> When I use a non-solid brush I get the two ps are drawn differently.<br>
>> In (hc-append p1 p2) I was expecting a transformation (translation) on<br>
>> the brush.<br>
>><br>
>> As a demonstration I offer the following program (a bit long, but<br>
>> hopefully clear.<br>
>><br>
>> See a syntax-highligthed version here: <a href="http://pasterack.org/pastes/7953" target="_blank">http://pasterack.org/pastes/7953</a><br>
>> The DrRacket output is here: <a href="http://imgur.com/5BRiY0Z" target="_blank">http://imgur.com/5BRiY0Z</a><br>
>><br>
>> /Jens Axel<br>
>><br>
>><br>
>> #lang racket<br>
>> (require pict)<br>
>><br>
>> ; debug : value pict -> pict<br>
>> ;  return a pict, that when drawn prints the<br>
>> ;  brush and drawing context transformation<br>
>> (define (debug who pict)<br>
>>   (dc (lambda (dc x y)<br>
>>         (define b   (send dc get-brush))<br>
>>         (define bt  (send b  get-transformation))<br>
>>         (define dct (send dc get-transformation))<br>
>>         (displayln (list who 'x x 'y y 'brush: bt 'dc: dct))<br>
>>         (draw-pict pict dc x y))<br>
>>       (pict-width pict) (pict-height pict)))<br>
>><br>
>> (define r 20) ; use same box side for the entire example<br>
>><br>
>> ; a black filled rectangle<br>
>> (define (rect) (filled-rectangle r r))<br>
>><br>
>> ;;; Examine whether hc-append does any transformation.<br>
>> "Expected Image:          Two squares a black and a red"<br>
>> "Expected Transformation: Same for A and B. Some difference for C."<br>
>> (debug 'A<br>
>>        (hc-append (debug 'B (rect))<br>
>>                   (debug 'C (colorize (rect) "red" ))))<br>
>><br>
>> ;;; --------------------------------------------------------------<br>
>> (require racket/draw)<br>
>><br>
>> ; colors<br>
>> (define (color: name) (send the-color-database find-color name))<br>
>> (define red   (color: "red"))<br>
>> (define green (color: "green"))<br>
>> (define blue  (color: "blue"))<br>
>><br>
>> ; square-path : real real real real -> path%<br>
>> ;     make square with side r and upper left corner (x,y)<br>
>> (define (square-path x y w h)<br>
>>   (define p (new dc-path%))<br>
>>   (send p move-to    x      y)<br>
>>   (send p line-to    x   (+ y h))<br>
>>   (send p line-to (+ x w)(+ y h))<br>
>>   (send p line-to (+ x w)(+ y 0))<br>
>>   (send p line-to (+ x 0)(+ y 0))<br>
>>   p)<br>
>><br>
>> ; fill : pict -> pict<br>
>> ;   draw a path around pict using current pen and brush<br>
>> (define (fill pict)<br>
>>   (define w (pict-width pict))<br>
>>   (define h (pict-height pict))<br>
>>   (dc (lambda (dc x y)<br>
>>         (draw-pict pict dc x y)<br>
>>         (send dc draw-path (square-path x y w h)))<br>
>>       w h))<br>
>><br>
>> ; shady : pict -> pict<br>
>> ;   Draws pict with a brush given by a linear, horizontal<br>
>> ;   gradient from (0,0) to (0,2r). The colors are red->green->blue.<br>
>> (define (shady pict)<br>
>>   (dc (lambda (dc x y)<br>
>>         ; get old brush<br>
>>         (define b (send dc get-brush))<br>
>>         ; make new brush, only change gradient<br>
>>         (define new-brush<br>
>>           (new brush%<br>
>>                [color          (send b get-color)]<br>
>>                [style          (send b get-style)]<br>
>>                [stipple        (send b get-stipple)]<br>
>>                [gradient       (new linear-gradient%<br>
>>                                 [x0 0] [y0 0] [x1 (* 2 r)] [y1 0] ;<br>
>> horizontal gradient<br>
>>                                 [stops (list (list 0   red)   ; (0,0)<br>
>> to ( r,0) red->green<br>
>>                                              (list 1/2 green) ; (r,0)<br>
>> to (2r,0) green->blue<br>
>>                                              (list 1   blue))])]<br>
>>                [transformation (send b get-transformation)]))<br>
>>         ; use new brush to draw the pict<br>
>>         (send dc set-brush new-brush)<br>
>>         (draw-pict pict dc x y)<br>
>>         ; restore old brush<br>
>>         (send dc set-brush b))<br>
>>       (pict-width pict) (pict-height pict)))<br>
>><br>
>> (define-syntax (echo stx) (syntax-case stx () [(_ expr) #'(values 'expr<br>
>> expr)]))<br>
>><br>
>> (newline) (newline)<br>
>> "Expected: A (black) rectangle"<br>
>> (echo (rect))<br>
>> "Expected: A rectangle filled with nothing (default brush is empty)"<br>
>> (echo (fill (rect)))<br>
>> "Expected: A rectangle filled with linear gradient (red to green)"<br>
>> (echo (shady (fill (rect))))<br>
>> "Expected: Two red-to-green rectangles"<br>
>> (echo (hc-append (shady (fill (rect))) (shady (fill (rect)))))<br>
>> "Expected: Two red-to-green rectangles"<br>
>> (echo (let () (define p (shady (fill (rect)))) (hc-append p p)))<br>
>><br>
>><br>
>><br>
>> --<br>
>> Jens Axel Søgaard<br>
>><br>
>> ____________________<br>
>>   Racket Users list:<br>
>>   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
><br>
><br>
<br>
<br>
<br>
</div></div><span class="HOEnZb"><font color="#888888">--<br>
--<br>
Jens Axel Søgaard<br>
</font></span></blockquote></div><br></div>