| ![[Previous]](../image-lib/prev.gif) | ![[Contents]](../image-lib/contents.gif) | ![[Index]](../image-lib/keyword_index.gif) | ![[Next]](../image-lib/next.gif) | 
Create a memory context
PmMemoryContext_t * PmMemCreateMC( 
                        PhImage_t *mc_image, 
                        PhDim_t *dim, 
                        PhPoint_t *translation );
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 phrender_s.lib.  For example:   
                                                                  
cc -w3 -opmmemtobutton -lphrender_s -lphoton_s pmmemtobutton.c
*/
#include <mem.h>
#include <photon/PhRender.h>
#include <Pt.h>
main( int argc, char *argv[] )
{
    PhArea_t    area = { 80, 20, 80, 40 };
    PhDim_t     dim = { 240, 80 };
    PhImage_t   image;
    PtArg_t     arg[3];
    PtWidget_t  *button, *window;
    short       bytes_per_pixel = 3;
    
    PtSetArg( &arg[0], Pt_ARG_WINDOW_TITLE, 
              "Memory Context Sample", 0 );
    PtSetArg( &arg[1], Pt_ARG_DIM, &dim, 0 );
    window = PtAppInit( NULL, &argc, argv, 2, arg );
    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( &arg[0], Pt_ARG_LABEL_TYPE, Pt_IMAGE, 0 );
    PtSetArg( &arg[1], Pt_ARG_AREA, &area, 0 );
    PtSetArg( &arg[2], Pt_ARG_LABEL_IMAGE, &image, 0 );
    button = PtCreateWidget( PtButton, NULL, 3, arg );
    
    PtRealizeWidget( window );
    PtMainLoop();
    // Shared memory for the image is cleaned up by an 
    // internal function that's called when the program
    // exits.
}
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 );
}
Photon
| Safety: | |
|---|---|
| Interrupt handler | No | 
| Signal handler | No | 
| Thread | No | 
PgShmemCreate(), PgShmemDestroy(), PhImage_t, PmMemFlush(), PmMemReleaseMC()
"Flickerless animation" in the Raw Drawing and Animation chapter of the Photon Programmer's Guide
| ![[Previous]](../image-lib/prev.gif) | ![[Contents]](../image-lib/contents.gif) | ![[Index]](../image-lib/keyword_index.gif) | ![[Next]](../image-lib/next.gif) |