From: Dom Lachowicz (domlachowicz_at_yahoo.com)
Date: Sat Dec 13 2003 - 15:12:48 EST
I'll take this.
Dom
--- Johan_Björk <phearbear_at_home.se> wrote:
> Hi guys
> 
> This is the work I did. It uses offscreen buffers on
> QNX, and blits once 
> all beginDraws() is complete.
> I would like to put the beginDraw() on more places,
> "higher" in the 
> hierarchy, to reduce flicker even more.  But I
> really havn't had time to 
> work on this for a while.
> 
> I won't have time to work more on this patch in the
> nearest weeks, so if 
> anyone want to use this, please go ahead!
> 
> /Johan
> 
> > ? patch
> ? flepp
> ? todo
> ? flepp_beforehugecommit
> ? src/flepp
> ? src/BillOfRights.abw
> ? src/af/gr/st732079
> ? src/af/gr/cocoa/gr_CocoaImage.c
> ? src/af/xap/qnx/st100131
> ? src/text/fmt/xp/draw
> ? src/wp/ap/qnx/st574129
> Index: src/af/gr/qnx/gr_QNXGraphics.cpp
>
===================================================================
> RCS file:
> /cvsroot/abi/src/af/gr/qnx/gr_QNXGraphics.cpp,v
> retrieving revision 1.116
> diff -u -r1.116 gr_QNXGraphics.cpp
> --- src/af/gr/qnx/gr_QNXGraphics.cpp	12 Nov 2003
> 21:49:13 -0000	1.116
> +++ src/af/gr/qnx/gr_QNXGraphics.cpp	13 Dec 2003
> 19:20:58 -0000
> @@ -56,6 +56,26 @@
>  {
>  	return pszFontFamily;
>  }
> +
> +bool GR_QNXGraphics::OSCIsValid() {
> +if(m_pOSC == NULL) 
> +	return false;
> +
> +if(m_pDraw->area.size.w != m_pOSC->dim.w ||
> m_pDraw->area.size.h != m_pOSC->dim.h)
> +{
> +PhDCSetCurrent(0);
> +PhDCRelease(m_pOSC);
> +m_pOSC =
>
PdCreateOffscreenContext(0,m_pDraw->area.size.w,m_pDraw->area.size.h,0);
> +PtDamageWidget(m_pDraw);
> +}
> +/*if(PdIsOffscreenValid(m_pOSC) == -1) {
> +	PhDCRelease((PhDrawContext_t *)m_pOSC);
> +	m_pOSC = NULL;
> +	return false;
> +}*/
> +
> +return true;
> +}
>  /***
>   Initialization/Teardown for drawing on a widget
> outside of the normal
>   stream of "damage" events
> @@ -69,11 +89,21 @@
>  	//sometimes abi is stupid and calls a raw draw
> function without making sure we want to draw it (ie,
> Left ruler in normal view mode), therefor we do a
> simple check if our widget is realized or not...
>  	if(PtWidgetIsRealized(m_pDraw) == 0) return -1;
>  
> -	m_pGC_old=PgSetGC(m_pGC);
>  
> +	if(OSCIsValid()) {
> +		PtFlush();
> +		if(PhDCSetCurrent(m_pOSC) == NULL)
> +			UT_ASSERT(0); //we don't need a seperate GC as a
> DC already have one. 
> +	} else {
> +		UT_ASSERT(0);
> +		//TODO: try to create  a new one!
> +	}
>  	//Set the region and the draw offset
>  	PgSetRegion(PtWidgetRid(PtFindDisjoint(m_pDraw)));
>  
> +//	m_pGC_old=PgSetGC(m_pGC); //m_pOSC has it's own
> GC??
> +
> +#if 0 
>  	PtWidgetOffset(m_pDraw, &m_OffsetPoint);
>  	m_OffsetPoint.y+=m_pDraw->area.pos.y;
>  	m_OffsetPoint.x+=m_pDraw->area.pos.x;
> @@ -83,7 +113,7 @@
>  	trans.x = -m_OffsetPoint.x;
>  	trans.y = -m_OffsetPoint.y;
>  	PdSetOffscreenTranslation(m_pOSC,&trans);*/
> -
> +#endif
>  	//Always clip to the canvas
>  	PhRect_t _rdraw;
>  	PtCalcCanvas(m_pDraw, &_rdraw);
> @@ -106,7 +136,6 @@
>  	PhDeTranslateRect(&_rdraw,&abs);*/
>  	PgSetUserClip(&_rdraw);
>  
> -
>  	return 0;
>  
>  }
> @@ -140,31 +169,38 @@
>  
>  	PgContextBlit(m_pOSC,&rect,NULL,&rect2); */
>  
> +#if 0
>  	PgSetUserClip(NULL);
>  	PgClearTranslation();
> -
> -	PgSetGC(m_pGC_old);
> -//	PhDCSetCurrent(m_pOldDC);
> +#endif
> +	PhDCSetCurrent(0);
> +	PgFlush();
> +//	PgSetGC(m_pGC_old);
>  
>  	return 0;
>  }
>  
>  
>  GR_QNXGraphics::GR_QNXGraphics(PtWidget_t * win,
> PtWidget_t * draw, XAP_App *app)
> +:
> +	m_pWin(win),
> +	m_pDraw(draw),
> +	m_pFont(NULL),
> +	m_pFontGUI(NULL),
> +	m_pClipList(NULL),
> +	m_iLineWidth(1),
> +	m_currentColor(Pg_BLACK),
> +	m_pPrintContext(NULL),
> +	m_iAscentCache(-1),
> +	m_iDescentCache(-1),
> +	m_iHeightCache(-1)	
>  {
>  	m_pApp = app;
> -	m_pWin = win;
> -	m_pDraw = draw;
> -	m_pGC = PgCreateGC(0);
> -	m_pFont = NULL;
> -	m_pFontGUI = NULL;
> -	m_pClipList = NULL;
> -	m_iLineWidth = 1;
> -	m_currentColor = Pg_BLACK;
> -	m_pPrintContext = NULL;
> -	m_iAscentCache = m_iDescentCache = m_iHeightCache
> -1;
> +//	m_pGC = PgCreateGC(0);
> +	memset(&m_DamagedArea,0,sizeof(m_DamagedArea));
> +
> +	m_pOSC =
>
PdCreateOffscreenContext(0,draw->area.size.w,draw->area.size.h,NULL);
>  
> -//	m_pOSC =
>
PdCreateOffscreenContext(0,draw->area.size.w,draw->area.size.h,NULL);
>  	m_pFontCx = PfAttachCx("/dev/phfont",240000);
>  	
>  	m_cs = GR_Graphics::GR_COLORSPACE_COLOR;
> @@ -183,8 +219,10 @@
>  	  PhImage_t * pImg = (PhImage_t
> *)m_vSaveRectBuf.getNthItem (i);
>  	  PgShmemDestroy(pImg);
>  	}
> -	PgDestroyGC(m_pGC);
> -//	PhDCRelease(m_pOSC);
> +//	PgDestroyGC(m_pGC);
> +	PtFlush();
> +	PhDCSetCurrent(0); //JIC
> +	PhDCRelease(m_pOSC);
>  	PfDetach(m_pFontCx);
>  }
>  
> @@ -290,6 +328,7 @@
>  							   int * pCharWidths)
>  {
>  if(pCharWidths == NULL && iLength > 1) {
> +	GR_CaretDisabler caretDisabler(getCaret());
>  	static int alloclen;
>  	static UT_UCS2Char *ucs2buffer;
>  
> @@ -303,11 +342,11 @@
>  
>  	PhPoint_t pos = {_tduX(xoff),tdu(getFontAscent())
> + _tduY(yoff)};
>  	DRAW_START
> -	GR_CaretDisabler caretDisabler(getCaret());
>  //	PgSetTextColor(m_currentColor);	
>  //	PgSetFont(m_pFont->getDisplayFont());
>  	PgDrawText((const char
>
*)ucs2buffer,iLength*2,&pos,Pg_TEXT_WIDECHAR|Pg_TEXT_LEFT);
>  	DRAW_END
> +
>
setDamage(pos.x,pos.y,tdu(getFontHeight()),m_pDraw->area.size.w);
>  }
>  else
>  	for(int i=0;i<iLength;i++) {
> @@ -329,6 +368,7 @@
>  //PgSetFont(m_pFont->getDisplayFont());
>  PgDrawText((const char
> *)&ucs2buffer,2,&pos,Pg_TEXT_WIDECHAR|Pg_TEXT_LEFT);
>  DRAW_END
>
+setDamage(pos.x,pos.y,tdu(getFontHeight()),m_pDraw->area.size.w);
>  }
>  
>  UT_uint32
> GR_QNXGraphics::measureUnRemappedChar(const
> UT_UCSChar 
=== message truncated ===
__________________________________
Do you Yahoo!?
Protect your identity with Yahoo! Mail AddressGuard
http://antispam.yahoo.com/whatsnewfree
This archive was generated by hypermail 2.1.4 : Sat Dec 13 2003 - 15:12:18 EST