![]() |
![]() |
![]() |
![]() |
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
![]() |
![]() |
![]() |
![]() |