![]()  | 
![]()  | 
![]()  | 
![]()  | 
Create a memory context
#include <photon/PhRender.h>
PmMemoryContext_t * PmMemCreateMC(
                        PhImage_t *mc_image,
                        PhDim_t *dim,
                        PhPoint_t *translation );
ph
This function creates a memory context. A memory context is used to draw into a local memory image buffer. You must create a memory context before calling any other Photon Memory (Pm) functions. The memory context provides definition, control, and access to the memory image.
The parameters for this function are:
If the image member of the PhImage_t structure pointed to by mc_image (i.e. mc_image->image) is NULL, PmMemCreateMC() uses calloc() to allocate its own buffer. In this case, PmMemReleaseMC() frees the allocated image buffer.
If mc_image->image isn't NULL, PmMemCreateMC() uses it instead of allocating its own buffer. The size of the buffer depends on the type and dimensions specified for mc_image. In this case, PmMemReleaseMC() doesn't free the buffer.
![]()  | 
If you want the image to be in shared memory, allocate the shared space for the image data, instead of letting PmMemCreateMC() do it. | 
The mc_image->type member indicates the type of image that's generated. The type must be one of:
If the type member is Pg_IMAGE_PALETTE_BYTE or Pg_IMAGE_PALETTE_NIBBLE, the palette member is used to define the palette. If the palette member is NULL, the default palette is used.
The image member of the PhImage_t structure filled in by PmMemFlush() is a pointer to the mc_image->image buffer.
A pointer to the new memory context, or NULL if there isn't enough memory to allocate one.
/* pmmemtobutton.c
This demonstrates how to draw into an image.  This example
uses the PmMem*() functions to draw into a memory context.
When finished drawing, the memory context is then dumped
into an image. The image is then used as the image
displayed on a button.
To compile, you must link with the phrender library.
For example:
qcc -w3 -opmmemtobutton -lphrender -lph pmmemtobutton.c
*/
#include <stdlib.h>
#include <mem.h>
#include <photon/PhRender.h>
#include <Pt.h>
void
create_image( PhImage_t *image, PhDim_t *dim )
{
    PhPoint_t           translation = { 0, 0 }, center, radii;
    PmMemoryContext_t   *mc;
    mc = PmMemCreateMC( image, dim, &translation );
    PmMemStart( mc );
    // now all drawing goes into the memory context
    // draw whatever we want to appear in the image
    center.x = dim->w / 2;
    center.y = dim->h / 2;
    radii = center;
    PgSetFillColor( Pg_WHITE );
    PgSetStrokeColor( Pg_RED );
    PgDrawEllipse( ¢er, &radii, Pg_DRAW_FILL_STROKE );
    PgSetStrokeColor( Pg_GREEN );
    PgDrawILine( 0, 0, dim->w-1, dim->h-1 );
    PmMemFlush( mc, image ); // get the image
    PmMemStop( mc );
    // now all drawing goes to the default drawing context
    PmMemReleaseMC( mc );
}
int main( int argc, char *argv[] )
{
    PhArea_t    area = { {80, 20}, {80, 40} };
    PhDim_t     dim = { 240, 80 };
    PhImage_t   image;
    PtArg_t     args[3];
    PtWidget_t  *button, *window;
    short       bytes_per_pixel = 3;
    if (PtInit(NULL) == -1)
      exit(EXIT_FAILURE);
    PtSetArg( &args[0], Pt_ARG_WINDOW_TITLE,
              "Memory Context Sample", 0 );
    PtSetArg( &args[1], Pt_ARG_DIM, &dim, 0 );
    if ((window = PtCreateWidget(PtWindow, Pt_NO_PARENT,
                                 2, args)) == NULL)
      PtExit(EXIT_FAILURE);
  memset( &image, 0, sizeof(PhImage_t) );
  image.type = Pg_IMAGE_DIRECT_888; // 3 bytes per pixel
                                          // with this type
    // If we want the image to be in shared memory, we must
    // allocate the shared space for the image data, instead
    // of letting PmMemCreateMC() do it.
  image.size = dim;
  image.image = PgShmemCreate(
                      dim.w * dim.h * bytes_per_pixel,
                      NULL );
    create_image( &image, &area.size );
    PtSetArg( &args[0], Pt_ARG_LABEL_TYPE, Pt_IMAGE, 0 );
    PtSetArg( &args[1], Pt_ARG_AREA, &area, 0 );
    PtSetArg( &args[2], Pt_ARG_LABEL_IMAGE, &image, 0 );
    button = PtCreateWidget( PtButton, Pt_DEFAULT_PARENT,
                             3, args );
    PtRealizeWidget( window );
    PtMainLoop();
    // Shared memory for the image is cleaned up by an
    // internal function that's called when the program
    // exits.
    return (EXIT_SUCCESS);
}
Photon
| Safety: | |
|---|---|
| Interrupt handler | No | 
| Signal handler | No | 
| Thread | No | 
PgShmemCreate(), PgShmemDestroy(), PhDim_t, PhImage_t, PhPoint_t, PmMemFlush(), PmMemReleaseMC()
“Flickerless animation” in the Raw Drawing and Animation chapter of the Photon Programmer's Guide
![]()  | 
![]()  | 
![]()  | 
![]()  |