Friedhelm Schuetz wrote:
are you able to share those hints?
Maybe QSSL Germany can feed the knowledge base?
Sure, though I hadn’t been very successful yet!
Here’s my actual approach:
PhRid_t open_region( PhRect_t* extent )
{
PhRegion_t region;
PhRect_t rect;
PhRid_t rid;
memset(®ion, 0, sizeof(region));
/*
** This is a printer-like region
*/
region.flags = Ph_PRINT_REGION | Ph_FORCE_FRONT;
/* Wish to have draw events
- events enqueued to us.
*/
region.events_sense = Ph_EV_DRAW;
/*
*
*/
region.events_opaque = 0;
/* Origin taken from extent */
region.origin.x = extent->ul.x;
region.origin.y = extent->ul.y;
region.parent = Ph_DEV_RID;
/* Region taken from extent */
rect.ul.x = extent->ul.x;
rect.ul.y = extent->ul.y;
rect.lr.x = extent->lr.x;
rect.lr.y = extent->lr.y;
rid = PhRegionOpen( Ph_REGION_PARENT |
Ph_REGION_FLAGS |
Ph_REGION_EV_SENSE |
Ph_REGION_EV_OPAQUE |
Ph_REGION_ORIGIN |
Ph_REGION_RECT,
®ion, &rect, NULL );
return( rid );
}
int StartSnapshot( char filename )
{
PhRect_t tExtent;
PhRect_t event_rect;
PpPrintContext_t pc;
short orientation = 1; // For landscape
int err;
PhEvent_t event;
PhRid_t rid;
if ( PhWindowQueryVisible( 0, 0, 1, &tExtent ) != 0 )
{
printf(“Cannot query visible extent: %s\n”,strerror(errno));
return -1;
}
/*
** Create a Region covering the visible Area and beeing sensitive
** to draw events …
/
rid = open_region(&tExtent);
PgSetRegion(rid);
/
** Create a print context
*/
pc = PpPrintCreatePC();
if(NULL == pc)
{
// check errno
printf(“Cannot create printer context: %s!\n”,strerror(errno));
return -3;
}
PpPrintSetPC( pc, INITIAL_PC, 0, Pp_PC_NAME, “PHS_FILE” );
PpPrintSetPC( pc, INITIAL_PC, 0, Pp_PC_ORIENTATION, &orientation );
PpPrintSetPC( pc, INITIAL_PC, 0, Pp_PC_DEVICE, filename );
err = PpPrintOpen( pc );
if (err == -1)
{
// check errno
printf(“Cannot open printer context: %s!\n”,strerror(errno));
return -4;
}
// succeeded
PpPrintStart(pc);
// Start redrawing everything
memset(&event,0,sizeof(event));
event.type = Ph_EV_EXPOSE;
event.subtype = Ph_PRINTER_EXPOSE;
event.emitter.rid = Ph_DEV_RID;
event.flags = 0;
event.num_rects = 1;
event.data_len = 0;
event_rect.ul.x = event_rect.ul.y = SHRT_MIN;
event_rect.lr.x = event_rect.lr.y = SHRT_MAX;
if(0 != PhEventEmit(&event,&event_rect,NULL))
{
printf(“Cannot emit capture expose event: %s\n”,strerror(errno));
}
// Just a few tests …
{
int i;
PhRect_t rect = {100,100,50,20};
PgSetStrokeColor( Pg_GREEN );
PgSetFillColor( Pg_RED );
PgDrawRect( &rect, Pg_DRAW_FILL_STROKE );
PgFlush();
for(i=0; i<1000; i++)
PtBkgdHandlerProcess();
}
// Close the pc.
PpPrintStop(pc);
PpPrintClose(pc);
PpPrintReleasePC(pc);
PhRegionClose(rid);
return 0;
}
When I call this in my application, I get a PHS file containing
the coloured rectangle from the testing section and a gray square
in the upper left corner.
I’m not sure, how to emit the expose event correctly (there are
differences
between the docs and the Photon header files). Also I wonder, how to
wait for
the completion of the re-drawing process – I tried to call
PtBkgdHandlerProcess() some times, witch revealed the gray square, that
I
mentioned above.
Any ideas, what’s wrong with this piece of code?
(Source files of ‘snapshot’ would be best, of course! ) )
TIA,
Karsten.
–
| / | __ ) | Karsten.Hoffmann@mbs-software.de MBS-GmbH
| |/| | _ _ \ Phone : +49-2151-7294-38 Karsten Hoffmann
| | | | |) |__) | Fax : +49-2151-7294-50 Roemerstrasse 15
|| ||// Mobile: +49-172-3812373 D-47809 Krefeld