Create a shared memory object reference to an offscreen context
void *PdGetOffscreenContextPtr( PdOffscreenContext_t *osc );
ph
This function creates a shared memory reference to an offscreen context and return a pointer to the object.
PdGetOffscreenContextPtr() can fail on certain hardware. You can use this function on closed systems where you know that the graphics frame buffer is linear; don't use it in applications that target generic hardware configurations. |
If osc is NULL, this function returns a pointer to the currently displayed screen:
If osc isn't the visible screen, the pointer is read/write.
This call blocks until the operation is complete. |
A pointer to the shared memory object, or NULL on failure.
Draw a white vertical line in an offscreen context using software (not PgDrawRect()):
// For the purposes of this example, we'll accept only // 565, 555, or 8888 as possible targets. typedef union vidptr { uint8_t * volatile ptr8; uint16_t * volatile ptr16; uint32_t * volatile ptr32; } VidPtr_t; PdOffscreenContext_t *buff; VidPtr_t main_ptr,work_ptr; uint32_t color,bytespp; PhRect_t rect; int i; // Create the offscreen context buff=PdCreateOffscreenContext(0,100,100, Pg_OSC_MEM_PAGE_ALIGN); if (buff==NULL) { // Error code return; } // figure out which value color should be switch (buff->format) { case Pg_IMAGE_DIRECT_565 : color = 0x0000FFFF; bytespp=2; break; case Pg_IMAGE_DIRECT_8888 : color = 0x00FFFFFF; bytespp=4; break; default: //Error code return; } rect.ul.x=rect.ul.y=0; rect.lr.x=rect.lr.y=99; main_ptr.ptr8=(unsigned char *) PdGetOffscreenContextPtr(buff); if (main_ptr.ptr8 == NULL) { // Error code } // Clear the context to black PhDCSetCurrent(buff); PgSetFillColor(Pg_BLACK); PgDrawRect(&rect,Pg_DRAW_FILL); PgFlush(); // Ensure that all drawing operations are done before // writing using software to this context: PgWaitHWIdle(); // draw the line in the middle: work_ptr.ptr8=main_ptr.ptr8 + (49 * bytespp); for (i=0; i<100; i++, work_ptr.ptr8+=buff->pitch) { switch (bytespp) { case 2 : *work_ptr.ptr16 = color; break; case 4 : *work_ptr.ptr32 = color; break; } } PgContextBlit(buff,&rect,NULL,&rect); PgFlush(); // You should see a black rectangle with a vertical // white line in the middle
Photon
Safety: | |
---|---|
Interrupt handler | No |
Signal handler | No |
Thread | No |
PdCreateOffscreenContext(), PdDupOffscreenContext(), PdOffscreenContext_t, PgContextBlit(), PgContextBlitArea(), PgSwapDisplay()
“Video memory offscreen” in the Raw Drawing and Animation chapter of the Photon Programmer's Guide