Please can I use sgl to draw to a bitmap

I am currently using sgl to draw to a window, and using the screenshot progrm to convert the picture to a .png file.
Unfortunately, this seems to limut the png to screen size, and I need more pixels than that for my application.

So my guess is that I need to create an sgl-compatible opengl environment that draws to bitmap instead of a window, and then use the tools available to write that bitmap out as a .png file.

Trouble is, I don't know how to get a bitmap out of sgl.

Here's the function I use to create the window and call a function called drawer to draw into it.

(define (environ drawer)
  #;(printf "in environ\n")
  (define my-canvas%
    (class* canvas% ()
      (inherit with-gl-context swap-gl-buffers)
      
      (define/override (on-paint) ; When is on-paint caled?
        (printf "on-paint ~s~n" (count))
        (with-gl-context
            (lambda ()
              #;(printf "call drawer~n")
              (drawer)
              #;(printf "returned from drawer~n")
              (swap-gl-buffers)
              )
          )
        )

      (define/override (on-size width height) ; Is this what is called when resizing the window with a mouse?
        (with-gl-context
            (lambda ()
              (resize width height)
              )
          )
        )
      
      (super-instantiate () (style '(gl))) ; What is this?
      )
    )
  #;(printf "before win~n")
  (define win (new frame% (label "OpenGl Test")
                               (min-width 600)
                               (min-height 600)))
  #;(printf "before my-canvas~n")
  (define gl (new my-canvas% (parent win)))
  #;(printf "before show~n")
  (send win show #t)  ;  presumably this runs the on-paint method.
  ;     But why does it get called three times?
  #;(printf "out-environ~n")
  )

Presumably I need to set up a canvas% or a drawing context differently.
And, of course make a bitmap of the right size. Documentation suggests there are different kinds of bitmaps, and I'm not sure either which to use.

-- hendrik

2 Likes

Based on the docs, I would expected something like the following to work:

(require racket/class racket/draw racket/gui)
(define b (make-gl-bitmap 400 400 (new gl-config%)))
(define dc (send b make-dc))
(define glc (send dc get-gl-context))
(send glc call-as-current drawer)
(send b save-file "out.png" 'png)

Does that work for you?

3 Likes

It works beautifully. Thank you.

And it's a lot simpler than I expected from my trail through the documentation.

I get the general drift; now it's time to look all this up in the documentation and understand exactly how these classes are related.

Thank you again.

-- hendrik

1 Like