There are many ways to implement a buffered image. I couldn't tell what's
the best way or why your code is not working. I don't know what type of
canvas is  _CANVAS_PTR cd, for instance.

We can start by why "part of a drawn canvas"? Because by this code:

if (note->render != NULL) {
        cdCanvasPutImageRect(cd, note->render, x, y, 0, 0, 0, 0);
        return;
    }

 It seems that if render exists all your canvas will be used.

 If you explain to me the logic of what you are trying to achieve, maybe we
can find a solution, because CD already interesting support for double
buffer drawing.

Best,
Scuri


Em seg., 30 de ago. de 2021 às 22:51, Isaac Raway <is...@mm.st> escreveu:

> I am trying to capture part of a drawn canvas to an image so I can save
> some expensive drawing operations.
>
> I try to do this with:
>
> void draw_note(_CANVAS_PTR cd, int viewMode, int active, tNOTE *note, int
> x, int y, int offsetX, int offsetY, tWIN *win, RECT clip_wh)
> {
>     if (note->render != NULL) {
>         cdCanvasPutImageRect(cd, note->render, x, y, 0, 0, 0, 0);
>         return;
>     }
>
>     //  --- drawing code removed ---
>
>     note->render = cdCanvasCreateImage(cd, note->graphW, note->graphH);
>     cdCanvasGetImage(cd, note->render, note->graphW, note->graphH);
> }
>
> The problem is that cdCanvasCreateImage always returns NULL, so the
> drawing results are not cached.
>
> My canvas is mapped like so:
>
> int graph_mapcb(Ihandle* self)
> {
>     tWIN *win = (tWIN *)IupGetAttribute(self, "WIND");
>
>     cdInitGdiPlus();
>     cdUseContextPlus(1);
>     if (self == win->notes_graph) {
>         win->notes_cdReal = cdCreateCanvas(CD_NATIVEWINDOW,
> win->notes_graph);
>         win->notes_cdGraph = win->notes_cdReal;//
> cdCreateCanvas(CD_DBUFFER, win->notes_cdReal); // was originally this
>     } else if (self == win->daily_graph) {
>         win->daily_cdReal = cdCreateCanvas(CD_NATIVEWINDOW,
> win->daily_graph);
>         win->daily_cdGraph = win->daily_cdReal;//
> cdCreateCanvas(CD_DBUFFER, win->daily_cdReal); // was originally this
>     }
> return (IUP_DEFAULT);
> }
>
> Any ideas why this isn't working?
> _______________________________________________
> Iup-users mailing list
> Iup-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/iup-users
>
_______________________________________________
Iup-users mailing list
Iup-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iup-users

Reply via email to