Kaydet (Commit) 9ab611a6 authored tarafından Michael Meeks's avatar Michael Meeks

android: move DamageTracker concept into SvpSalFrame and try to use it

üst 7e454a3e
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <osl/detail/android-bootstrap.h> #include <osl/detail/android-bootstrap.h>
#include <osl/detail/android_native_app_glue.h> #include <osl/detail/android_native_app_glue.h>
#include <rtl/strbuf.hxx> #include <rtl/strbuf.hxx>
#include <basebmp/scanlineformats.hxx>
extern void VCL_DLLPUBLIC plasma_now(const char *msg); extern void VCL_DLLPUBLIC plasma_now(const char *msg);
...@@ -203,7 +204,7 @@ static void BlitFrameRegionToWindow(ANativeWindow_Buffer *pOutBuffer, ...@@ -203,7 +204,7 @@ static void BlitFrameRegionToWindow(ANativeWindow_Buffer *pOutBuffer,
const ARect &rSrcRect, const ARect &rSrcRect,
int nDestX, int nDestY) int nDestX, int nDestY)
{ {
fprintf (stderr, "Blit frame #2 src %d,%d->%d,%d to position %d, %d\n", fprintf (stderr, "Blit frame src %d,%d->%d,%d to position %d, %d\n",
rSrcRect.left, rSrcRect.top, rSrcRect.right, rSrcRect.bottom, rSrcRect.left, rSrcRect.top, rSrcRect.right, rSrcRect.bottom,
nDestX, nDestY); nDestX, nDestY);
...@@ -215,11 +216,10 @@ static void BlitFrameRegionToWindow(ANativeWindow_Buffer *pOutBuffer, ...@@ -215,11 +216,10 @@ static void BlitFrameRegionToWindow(ANativeWindow_Buffer *pOutBuffer,
// FIXME: do some cropping goodness on aSrcRect to ensure no overflows etc. // FIXME: do some cropping goodness on aSrcRect to ensure no overflows etc.
ARect aSrcRect = rSrcRect; ARect aSrcRect = rSrcRect;
// FIXME: we have WINDOW_FORMAT_RGB_565 = 4 ... // FIXME: by default we have WINDOW_FORMAT_RGB_565 = 4 ...
for (unsigned int y = 0; y < (unsigned int)(aSrcRect.bottom - aSrcRect.top); y++) for (unsigned int y = 0; y < (unsigned int)(aSrcRect.bottom - aSrcRect.top); y++)
{ {
unsigned char *sp = ( pSrc + nStride * (aSrcRect.bottom - aSrcRect.top - y - 1) + unsigned char *sp = ( pSrc + nStride * (aSrcRect.top + y) +
aSrcRect.left * 3 /* src pixel size */ ); aSrcRect.left * 3 /* src pixel size */ );
switch (pOutBuffer->format) { switch (pOutBuffer->format) {
...@@ -258,7 +258,6 @@ static void BlitFrameRegionToWindow(ANativeWindow_Buffer *pOutBuffer, ...@@ -258,7 +258,6 @@ static void BlitFrameRegionToWindow(ANativeWindow_Buffer *pOutBuffer,
break; break;
} }
} }
fprintf (stderr, "done blit!\n");
} }
void AndroidSalInstance::BlitFrameToWindow(ANativeWindow_Buffer *pOutBuffer, void AndroidSalInstance::BlitFrameToWindow(ANativeWindow_Buffer *pOutBuffer,
...@@ -288,7 +287,7 @@ void AndroidSalInstance::RedrawWindows(ANativeWindow *pWindow) ...@@ -288,7 +287,7 @@ void AndroidSalInstance::RedrawWindows(ANativeWindow *pWindow)
if (aOutBuffer.bits != NULL) if (aOutBuffer.bits != NULL)
{ {
#if 1 // pre-'clean' the buffer with cruft: #if 0 // pre-'clean' the buffer with cruft:
// hard-code / guess at a format ... // hard-code / guess at a format ...
int32_t *p = (int32_t *)aOutBuffer.bits; int32_t *p = (int32_t *)aOutBuffer.bits;
for (int32_t y = 0; y < aOutBuffer.height; y++) for (int32_t y = 0; y < aOutBuffer.height; y++)
...@@ -296,18 +295,42 @@ void AndroidSalInstance::RedrawWindows(ANativeWindow *pWindow) ...@@ -296,18 +295,42 @@ void AndroidSalInstance::RedrawWindows(ANativeWindow *pWindow)
for (int32_t x = 0; x < aOutBuffer.stride; x++) for (int32_t x = 0; x < aOutBuffer.stride; x++)
*p++ = (y << 24) + (x << 10) + 0xff ; *p++ = (y << 24) + (x << 10) + 0xff ;
} }
#endif
#endif
int i = 0;
std::list< SalFrame* >::const_iterator it; std::list< SalFrame* >::const_iterator it;
for ( it = getFrames().begin(); it != getFrames().end(); it++ ) for ( it = getFrames().begin(); it != getFrames().end(); i++, it++ )
{ {
SvpSalFrame *pFrame = static_cast<SvpSalFrame *>(*it); SvpSalFrame *pFrame = static_cast<SvpSalFrame *>(*it);
if (pFrame->IsVisible()) if (pFrame->IsVisible())
{ {
// FIXME: force a re-draw - this appears not to happen much otherwis fprintf( stderr, "render visible frame %d\n", i );
pFrame->PostPaint(true); #ifndef REGION_RE_RENDER
BlitFrameToWindow (&aOutBuffer, pFrame->getDevice()); BlitFrameToWindow (&aOutBuffer, pFrame->getDevice());
#else
// Sadly it seems that due to double buffering, we don't
// get back in our buffer what we had there last time - so we cannot
// do incremental rendering. Presumably this will require us to
// render to a bitmap, and keep that updated instead in future.
// Intersect re-rendering region with this frame
Region aClipped( maRedrawRegion );
basegfx::B2IVector aDevSize = pFrame->getDevice()->getSize();
aClipped.Intersect( Rectangle( 0, 0, aDevSize.getX(), aDevSize.getY() ) );
Rectangle aSubRect;
RegionHandle aHdl = aClipped.BeginEnumRects();
while( aClipped.GetNextEnumRect( aHdl, aSubRect ) )
{
ARect aASubRect = { aSubRect.Left(), aSubRect.Top(),
aSubRect.Right(), aSubRect.Bottom() };
BlitFrameRegionToWindow(&aOutBuffer, pFrame->getDevice(),
aASubRect,
aSubRect.Left(), aSubRect.Top());
}
aClipped.EndEnumRects( aHdl );
#endif
} }
} }
} }
...@@ -316,9 +339,17 @@ void AndroidSalInstance::RedrawWindows(ANativeWindow *pWindow) ...@@ -316,9 +339,17 @@ void AndroidSalInstance::RedrawWindows(ANativeWindow *pWindow)
ANativeWindow_unlockAndPost(pWindow); ANativeWindow_unlockAndPost(pWindow);
fprintf (stderr, "done render!\n"); fprintf (stderr, "done render!\n");
maRedrawRegion.SetEmpty();
mbQueueReDraw = false; mbQueueReDraw = false;
} }
void AndroidSalInstance::damaged(AndroidSalFrame */* frame */, const Rectangle &rRect)
{
// FIXME: translate rRect to the frame's offset ...
maRedrawRegion.Union( rRect );
mbQueueReDraw = true;
}
static const char *app_cmd_name(int cmd) static const char *app_cmd_name(int cmd)
{ {
switch (cmd) { switch (cmd) {
...@@ -374,6 +405,9 @@ void AndroidSalInstance::onAppCmd (struct android_app* app, int32_t cmd) ...@@ -374,6 +405,9 @@ void AndroidSalInstance::onAppCmd (struct android_app* app, int32_t cmd)
fprintf (stderr, "we have an app window ! %p %dx%x (%d) set %d\n", fprintf (stderr, "we have an app window ! %p %dx%x (%d) set %d\n",
pWindow, aRect.right, aRect.bottom, pWindow, aRect.right, aRect.bottom,
ANativeWindow_getFormat(pWindow), nRet); ANativeWindow_getFormat(pWindow), nRet);
maRedrawRegion = Region( Rectangle( 0, 0, ANativeWindow_getWidth(pWindow),
ANativeWindow_getHeight(pWindow) ) );
mbQueueReDraw = true;
break; break;
} }
case APP_CMD_WINDOW_RESIZED: case APP_CMD_WINDOW_RESIZED:
...@@ -390,6 +424,8 @@ void AndroidSalInstance::onAppCmd (struct android_app* app, int32_t cmd) ...@@ -390,6 +424,8 @@ void AndroidSalInstance::onAppCmd (struct android_app* app, int32_t cmd)
case APP_CMD_WINDOW_REDRAW_NEEDED: case APP_CMD_WINDOW_REDRAW_NEEDED:
{ {
fprintf (stderr, "redraw needed\n"); fprintf (stderr, "redraw needed\n");
maRedrawRegion = Region( Rectangle( 0, 0, ANativeWindow_getWidth(pWindow),
ANativeWindow_getHeight(pWindow) ) );
mbQueueReDraw = true; mbQueueReDraw = true;
break; break;
} }
...@@ -462,9 +498,6 @@ int32_t AndroidSalInstance::onInputEvent (struct android_app* app, AInputEvent* ...@@ -462,9 +498,6 @@ int32_t AndroidSalInstance::onInputEvent (struct android_app* app, AInputEvent*
fprintf (stderr, "no focused frame to emit event on\n"); fprintf (stderr, "no focused frame to emit event on\n");
fprintf( stderr, "bHandled == %s\n", bHandled? "true": "false" ); fprintf( stderr, "bHandled == %s\n", bHandled? "true": "false" );
// FIXME: queueing full re-draw on key events ...
mbQueueReDraw = true;
break; break;
} }
case AINPUT_EVENT_TYPE_MOTION: case AINPUT_EVENT_TYPE_MOTION:
...@@ -634,8 +667,11 @@ public: ...@@ -634,8 +667,11 @@ public:
SalFrame *pParent, SalFrame *pParent,
sal_uLong nSalFrameStyle, sal_uLong nSalFrameStyle,
SystemParentData *pSysParent ) SystemParentData *pSysParent )
: SvpSalFrame( pInstance, pParent, nSalFrameStyle, pSysParent ) : SvpSalFrame( pInstance, pParent, nSalFrameStyle,
true, basebmp::Format::TWENTYFOUR_BIT_TC_MASK,
pSysParent )
{ {
enableDamageTracker();
} }
virtual void GetWorkArea( Rectangle& rRect ) virtual void GetWorkArea( Rectangle& rRect )
...@@ -643,6 +679,31 @@ public: ...@@ -643,6 +679,31 @@ public:
AndroidSalInstance::getInstance()->GetWorkArea( rRect ); AndroidSalInstance::getInstance()->GetWorkArea( rRect );
} }
virtual void damaged( const basegfx::B2IBox& rDamageRect)
{
long long area = rDamageRect.getWidth() * rDamageRect.getHeight();
// if( area > 32 * 1024 )
fprintf( stderr, "bitmap damaged %d %d (%dx%d) area %lld\n",
(int) rDamageRect.getMinX(),
(int) rDamageRect.getMinY(),
(int) rDamageRect.getWidth(),
(int) rDamageRect.getHeight(),
area );
if (rDamageRect.getWidth() <= 0 ||
rDamageRect.getHeight() <= 0)
{
fprintf (stderr, "ERROR: damage region has tiny / negative size\n");
return;
}
Rectangle aRect( std::max((long) 0, (long) rDamageRect.getMinX() ),
std::max((long) 0, (long) rDamageRect.getMinY() ),
std::max((long) 0, (long) ( rDamageRect.getMinX() +
rDamageRect.getWidth() ) ),
std::max((long) 0, (long) ( rDamageRect.getMinY() +
rDamageRect.getHeight() ) ) );
AndroidSalInstance::getInstance()->damaged( this, aRect );
}
virtual void UpdateSettings( AllSettings &rSettings ) virtual void UpdateSettings( AllSettings &rSettings )
{ {
// Clobber the UI fonts // Clobber the UI fonts
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include "headless/svpinst.hxx" #include "headless/svpinst.hxx"
#include "headless/svpgdi.hxx" #include "headless/svpgdi.hxx"
#include <basebmp/bitmapdevice.hxx>
#include <basebmp/scanlineformats.hxx> #include <basebmp/scanlineformats.hxx>
#include <basegfx/vector/b2ivector.hxx> #include <basegfx/vector/b2ivector.hxx>
...@@ -39,14 +40,47 @@ using namespace basegfx; ...@@ -39,14 +40,47 @@ using namespace basegfx;
SvpSalFrame* SvpSalFrame::s_pFocusFrame = NULL; SvpSalFrame* SvpSalFrame::s_pFocusFrame = NULL;
namespace {
/// Decouple SalFrame lifetime from damagetracker lifetime
struct DamageTracker : public basebmp::IBitmapDeviceDamageTracker
{
DamageTracker( SvpSalFrame& rFrame ) : m_rFrame( rFrame ) {}
virtual void damaged( const basegfx::B2IBox& rDamageRect ) const
{
m_rFrame.damaged( rDamageRect );
}
SvpSalFrame& m_rFrame;
};
}
void SvpSalFrame::enableDamageTracker( bool bOn )
{
if( m_bDamageTracking == bOn )
return;
if( m_aFrame.get() )
{
if( m_bDamageTracking )
m_aFrame->setDamageTracker( basebmp::IBitmapDeviceDamageTrackerSharedPtr() );
else
m_aFrame->setDamageTracker(
basebmp::IBitmapDeviceDamageTrackerSharedPtr( new DamageTracker( *this ) ) );
}
m_bDamageTracking = bOn;
}
SvpSalFrame::SvpSalFrame( SvpSalInstance* pInstance, SvpSalFrame::SvpSalFrame( SvpSalInstance* pInstance,
SalFrame* pParent, SalFrame* pParent,
sal_uLong nSalFrameStyle, sal_uLong nSalFrameStyle,
bool bTopDown,
sal_Int32 nScanlineFormat,
SystemParentData* ) : SystemParentData* ) :
m_pInstance( pInstance ), m_pInstance( pInstance ),
m_pParent( static_cast<SvpSalFrame*>(pParent) ), m_pParent( static_cast<SvpSalFrame*>(pParent) ),
m_nStyle( nSalFrameStyle ), m_nStyle( nSalFrameStyle ),
m_bVisible( false ), m_bVisible( false ),
m_bDamageTracking( false ),
m_bTopDown( bTopDown ),
m_nScanlineFormat( nScanlineFormat ),
m_nMinWidth( 0 ), m_nMinWidth( 0 ),
m_nMinHeight( 0 ), m_nMinHeight( 0 ),
m_nMaxWidth( 0 ), m_nMaxWidth( 0 ),
...@@ -242,7 +276,10 @@ void SvpSalFrame::SetPosSize( long nX, long nY, long nWidth, long nHeight, sal_u ...@@ -242,7 +276,10 @@ void SvpSalFrame::SetPosSize( long nX, long nY, long nWidth, long nHeight, sal_u
aFrameSize.setX( 1 ); aFrameSize.setX( 1 );
if( aFrameSize.getY() == 0 ) if( aFrameSize.getY() == 0 )
aFrameSize.setY( 1 ); aFrameSize.setY( 1 );
m_aFrame = createBitmapDevice( aFrameSize, false, SVP_DEFAULT_BITMAP_FORMAT ); m_aFrame = createBitmapDevice( aFrameSize, m_bTopDown, m_nScanlineFormat );
if (m_bDamageTracking)
m_aFrame->setDamageTracker(
basebmp::IBitmapDeviceDamageTrackerSharedPtr( new DamageTracker( *this ) ) );
// update device in existing graphics // update device in existing graphics
for( std::list< SvpSalGraphics* >::iterator it = m_aGraphics.begin(); for( std::list< SvpSalGraphics* >::iterator it = m_aGraphics.begin();
it != m_aGraphics.end(); ++it ) it != m_aGraphics.end(); ++it )
......
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
#include <salframe.hxx> #include <salframe.hxx>
#include <svdata.hxx> #include <svdata.hxx>
#include <generic/gendata.hxx> #include <generic/gendata.hxx>
#include <basebmp/scanlineformats.hxx>
#include <vcl/solarmutex.hxx> #include <vcl/solarmutex.hxx>
// FIXME: remove when we re-work the svp mainloop // FIXME: remove when we re-work the svp mainloop
#include <unx/salunxtime.h> #include <unx/salunxtime.h>
...@@ -182,12 +183,12 @@ bool SvpSalInstance::CheckTimeout( bool bExecuteTimers ) ...@@ -182,12 +183,12 @@ bool SvpSalInstance::CheckTimeout( bool bExecuteTimers )
SalFrame* SvpSalInstance::CreateChildFrame( SystemParentData* pParent, sal_uLong nStyle ) SalFrame* SvpSalInstance::CreateChildFrame( SystemParentData* pParent, sal_uLong nStyle )
{ {
return new SvpSalFrame( this, NULL, nStyle, pParent ); return new SvpSalFrame( this, NULL, nStyle, false, SVP_DEFAULT_BITMAP_FORMAT, pParent );
} }
SalFrame* SvpSalInstance::CreateFrame( SalFrame* pParent, sal_uLong nStyle ) SalFrame* SvpSalInstance::CreateFrame( SalFrame* pParent, sal_uLong nStyle )
{ {
return new SvpSalFrame( this, pParent, nStyle ); return new SvpSalFrame( this, pParent, nStyle, false, SVP_DEFAULT_BITMAP_FORMAT );
} }
void SvpSalInstance::DestroyFrame( SalFrame* pFrame ) void SvpSalInstance::DestroyFrame( SalFrame* pFrame )
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include <headless/svpinst.hxx> #include <headless/svpinst.hxx>
#include <headless/svpframe.hxx> #include <headless/svpframe.hxx>
class AndroidSalFrame;
class AndroidSalInstance : public SvpSalInstance class AndroidSalInstance : public SvpSalInstance
{ {
void BlitFrameToWindow(ANativeWindow_Buffer *pOutBuffer, void BlitFrameToWindow(ANativeWindow_Buffer *pOutBuffer,
...@@ -64,10 +65,12 @@ public: ...@@ -64,10 +65,12 @@ public:
void RedrawWindows(ANativeWindow *pWindow); void RedrawWindows(ANativeWindow *pWindow);
SalFrame *getFocusFrame() const; SalFrame *getFocusFrame() const;
void damaged(AndroidSalFrame *frame, const Rectangle &rRect);
protected: protected:
virtual void DoReleaseYield( int nTimeoutMS ); virtual void DoReleaseYield( int nTimeoutMS );
struct android_app *mpApp; struct android_app *mpApp;
bool mbQueueReDraw; Region maRedrawRegion;
bool mbQueueReDraw;
private: private:
EGLDisplay mxDisplay; EGLDisplay mxDisplay;
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#ifndef _SVP_SVPFRAME_HXX #ifndef _SVP_SVPFRAME_HXX
#include <vcl/sysdata.hxx> #include <vcl/sysdata.hxx>
#include <basegfx/range/b2ibox.hxx>
#include <salframe.hxx> #include <salframe.hxx>
#include "svpelement.hxx" #include "svpelement.hxx"
...@@ -45,6 +46,9 @@ class SvpSalFrame : public SalFrame, public SvpElement ...@@ -45,6 +46,9 @@ class SvpSalFrame : public SalFrame, public SvpElement
std::list< SvpSalFrame* > m_aChildren; // List of child frames std::list< SvpSalFrame* > m_aChildren; // List of child frames
sal_uLong m_nStyle; sal_uLong m_nStyle;
bool m_bVisible; bool m_bVisible;
bool m_bDamageTracking;
bool m_bTopDown;
sal_Int32 m_nScanlineFormat;
long m_nMinWidth; long m_nMinWidth;
long m_nMinHeight; long m_nMinHeight;
long m_nMaxWidth; long m_nMaxWidth;
...@@ -60,12 +64,15 @@ public: ...@@ -60,12 +64,15 @@ public:
SvpSalFrame( SvpSalInstance* pInstance, SvpSalFrame( SvpSalInstance* pInstance,
SalFrame* pParent, SalFrame* pParent,
sal_uLong nSalFrameStyle, sal_uLong nSalFrameStyle,
bool bTopDown,
sal_Int32 nScanlineFormat,
SystemParentData* pSystemParent = NULL ); SystemParentData* pSystemParent = NULL );
virtual ~SvpSalFrame(); virtual ~SvpSalFrame();
void GetFocus(); void GetFocus();
void LoseFocus(); void LoseFocus();
void PostPaint(bool bImmediate) const; void PostPaint(bool bImmediate) const;
void AllocateFrame();
// SvpElement // SvpElement
virtual const basebmp::BitmapDeviceSharedPtr& getDevice() const { return m_aFrame; } virtual const basebmp::BitmapDeviceSharedPtr& getDevice() const { return m_aFrame; }
...@@ -121,6 +128,10 @@ public: ...@@ -121,6 +128,10 @@ public:
virtual void UnionClipRegion( long nX, long nY, long nWidth, long nHeight ); virtual void UnionClipRegion( long nX, long nY, long nWidth, long nHeight );
virtual void EndSetClipRegion(); virtual void EndSetClipRegion();
// If enabled we can get damage notifications for regions immediately rendered to ...
virtual void enableDamageTracker( bool bOn = true );
virtual void damaged( const basegfx::B2IBox& /* rDamageRect */) {}
/*TODO: functional implementation */ /*TODO: functional implementation */
virtual void SetScreenNumber( unsigned int nScreen ) { (void)nScreen; } virtual void SetScreenNumber( unsigned int nScreen ) { (void)nScreen; }
virtual void SetApplicationID(const rtl::OUString &rApplicationID) { (void) rApplicationID; } virtual void SetApplicationID(const rtl::OUString &rApplicationID) { (void) rApplicationID; }
......
...@@ -432,7 +432,7 @@ public: ...@@ -432,7 +432,7 @@ public:
static GtkSalFrame *getFromWindow( GtkWindow *pWindow ); static GtkSalFrame *getFromWindow( GtkWindow *pWindow );
virtual void damaged (const basegfx::B2IBox& rDamageRect); virtual void damaged (const basegfx::B2IBox& rDamageRect);
}; };
#define OOO_TYPE_FIXED ooo_fixed_get_type() #define OOO_TYPE_FIXED ooo_fixed_get_type()
......
...@@ -345,6 +345,7 @@ GetAlternateKeyCode( const sal_uInt16 nKeyCode ) ...@@ -345,6 +345,7 @@ GetAlternateKeyCode( const sal_uInt16 nKeyCode )
static int debugQueuePureRedraw = 0; static int debugQueuePureRedraw = 0;
static int debugRedboxRedraws = 0; static int debugRedboxRedraws = 0;
namespace {
/// Decouple SalFrame lifetime from damagetracker lifetime /// Decouple SalFrame lifetime from damagetracker lifetime
struct DamageTracker : public basebmp::IBitmapDeviceDamageTracker struct DamageTracker : public basebmp::IBitmapDeviceDamageTracker
{ {
...@@ -357,6 +358,7 @@ struct DamageTracker : public basebmp::IBitmapDeviceDamageTracker ...@@ -357,6 +358,7 @@ struct DamageTracker : public basebmp::IBitmapDeviceDamageTracker
GtkSalFrame& m_rFrame; GtkSalFrame& m_rFrame;
}; };
}
#endif #endif
void GtkSalFrame::doKeyCallback( guint state, void GtkSalFrame::doKeyCallback( guint state,
...@@ -1572,6 +1574,8 @@ void GtkSalFrame::SetMinClientSize( long nWidth, long nHeight ) ...@@ -1572,6 +1574,8 @@ void GtkSalFrame::SetMinClientSize( long nWidth, long nHeight )
} }
} }
// FIXME: we should really be an SvpSalFrame sub-class, and
// share their AllocateFrame !
void GtkSalFrame::AllocateFrame() void GtkSalFrame::AllocateFrame()
{ {
#if GTK_CHECK_VERSION(3,0,0) #if GTK_CHECK_VERSION(3,0,0)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment