summaryrefslogtreecommitdiff
path: root/vcl/ios
diff options
context:
space:
mode:
authorTor Lillqvist <tml@iki.fi>2013-03-31 21:54:33 +0300
committerTor Lillqvist <tml@iki.fi>2013-03-31 21:56:40 +0300
commitd054a817be89c2827f53cd17c2df42ef01e4f4e1 (patch)
tree37c94703b4b36c2ac6dc8275ffe1f2dfd3a31e9e /vcl/ios
parent41a70cc2d32dde3e2c76a6f1d4f3dd1b32bb1c02 (diff)
Revert "Try redrawing in multiple phases to avoid blocking the UI thread too long"
Diffstat (limited to 'vcl/ios')
-rw-r--r--vcl/ios/iosinst.cxx48
1 files changed, 12 insertions, 36 deletions
diff --git a/vcl/ios/iosinst.cxx b/vcl/ios/iosinst.cxx
index 444d1acea47c..4767c46e3e12 100644
--- a/vcl/ios/iosinst.cxx
+++ b/vcl/ios/iosinst.cxx
@@ -107,8 +107,6 @@ IosSalInstance::IosSalInstance( SalYieldMutex *pMutex )
rc = pthread_mutex_init( &m_aRenderMutex, NULL );
SAL_WARN_IF( rc != 0, "vcl.ios", "pthread_mutex_init failed: " << strerror( rc ) );
#endif
-
- m_aRenderWindowsState.state = IDLE;
}
IosSalInstance::~IosSalInstance()
@@ -281,7 +279,7 @@ void lo_set_view_size(int width, int height)
viewHeight = height;
}
-IMPL_LINK_NOARG( IosSalInstance, RenderWindows )
+IMPL_LINK( IosSalInstance, RenderWindows, RenderWindowsArg*, arg )
{
int rc;
@@ -292,19 +290,6 @@ IMPL_LINK_NOARG( IosSalInstance, RenderWindows )
NSLog(@"RenderWindows: mutex locked");
- m_aRenderWindowsState.state = WAITING;
-
- /* We need to poke the UI thread to do drawRect() which calls
- * lo_render_windows() which signals the condition so we can
- * continue.
- */
- lo_damaged( m_aRenderWindowsState.rect );
-
- while (m_aRenderWindowsState.state != GOAHEAD) {
- rc = pthread_cond_wait( &m_aRenderCond, &m_aRenderMutex );
- SAL_WARN_IF( rc != 0, "vcl.ios", "pthread_cond_wait failed: " << strerror( rc ) );
- }
-
NSDate *a = [NSDate date];
for( std::list< SalFrame* >::const_iterator it = getFrames().begin();
@@ -314,7 +299,7 @@ IMPL_LINK_NOARG( IosSalInstance, RenderWindows )
SalFrameGeometry aGeom = pFrame->GetGeometry();
CGRect bbox = CGRectMake( aGeom.nX, aGeom.nY, aGeom.nWidth, aGeom.nHeight );
if ( pFrame->IsVisible() &&
- CGRectIntersectsRect( m_aRenderWindowsState.rect, bbox ) ) {
+ CGRectIntersectsRect( arg->rect, bbox ) ) {
const basebmp::BitmapDeviceSharedPtr aDevice = pFrame->getDevice();
CGDataProviderRef provider =
@@ -331,11 +316,11 @@ IMPL_LINK_NOARG( IosSalInstance, RenderWindows )
NULL,
false,
kCGRenderingIntentDefault );
- CGContextDrawImage( m_aRenderWindowsState.context, bbox, image );
+ CGContextDrawImage( arg->context, bbox, image );
}
}
- m_aRenderWindowsState.state = IDLE;
+ arg->done = true;
rc = pthread_cond_signal( &m_aRenderCond );
SAL_WARN_IF( rc != 0, "vcl.ios", "pthread_cond_signal failed:" << strerror( rc ) );
@@ -369,25 +354,16 @@ void lo_render_windows( CGContextRef context, CGRect rect )
NSLog(@"lo_render_windows: mutex locked");
- if (pInstance->m_aRenderWindowsState.state == IosSalInstance::IDLE) {
- pInstance->m_aRenderWindowsState.state = IosSalInstance::PENDING;
- pInstance->m_aRenderWindowsState.context = context;
- pInstance->m_aRenderWindowsState.rect = rect;
- Application::PostUserEvent( LINK( pInstance, IosSalInstance, RenderWindows ) );
- } else {
- pInstance->m_aRenderWindowsState.context = context;
- pInstance->m_aRenderWindowsState.rect = CGRectUnion( pInstance->m_aRenderWindowsState.rect, rect );
- if (pInstance->m_aRenderWindowsState.state == IosSalInstance::WAITING) {
- pInstance->m_aRenderWindowsState.state = IosSalInstance::GOAHEAD;
- pthread_cond_signal( &pInstance->m_aRenderCond );
- while (pInstance->m_aRenderWindowsState.state != IosSalInstance::IDLE) {
- rc = pthread_cond_wait( &pInstance->m_aRenderCond, &pInstance->m_aRenderMutex );
- SAL_WARN_IF( rc != 0, "vcl.ios", "pthread_cond_wait failed: " << strerror( rc ) );
- }
- }
+ IosSalInstance::RenderWindowsArg arg = { false, context, rect };
+ Application::PostUserEvent( LINK( pInstance, IosSalInstance, RenderWindows), &arg );
+
+ while (!arg.done) {
+ rc = pthread_cond_wait( &pInstance->m_aRenderCond, &pInstance->m_aRenderMutex );
+ SAL_WARN_IF( rc != 0, "vcl.ios", "pthread_cond_wait failed: " << strerror( rc ) );
}
- NSLog(@"lo_render_windows: unlocking mutex");
+ NSLog(@"lo_render_windows: mutex unlocked");
+
rc = pthread_mutex_unlock( &pInstance->m_aRenderMutex );
SAL_WARN_IF( rc != 0, "vcl.ios", "pthread_mutex_unlock failed: " << strerror( rc ) );