@ -35,30 +35,11 @@ GSRendererThread::~GSRendererThread()
spectre_render_context_free ( m_renderContext ) ;
}
void GSRendererThread : : setMagnify ( double magnify )
void GSRendererThread : : addRequest ( const GSRendererThreadRequest & req )
{
spectre_render_context_set_scale ( m_renderContext , magnify , magnify ) ;
}
void GSRendererThread : : setPlatformFonts ( bool pfonts )
{
spectre_render_context_set_use_platform_fonts ( m_renderContext , pfonts ) ;
}
void GSRendererThread : : setAABits ( int text , int graphics )
{
spectre_render_context_set_antialias_bits ( m_renderContext , graphics , text ) ;
}
void GSRendererThread : : setRotation ( int rotation )
{
spectre_render_context_set_rotation ( m_renderContext , rotation ) ;
}
void GSRendererThread : : startRequest ( Okular : : PixmapRequest * request , SpectrePage * page )
{
m_nextRequest = request ;
m_nextPage = page ;
m_queueMutex . lock ( ) ;
m_queue . enqueue ( req ) ;
m_queueMutex . unlock ( ) ;
m_semaphore . release ( ) ;
}
@ -67,41 +48,54 @@ void GSRendererThread::run()
while ( 1 )
{
m_semaphore . acquire ( ) ;
m_currentRequest = m_nextRequest ;
m_currentPage = m_nextPage ;
unsigned char * data = NULL ;
int row_length ;
int wantedWidth = m_currentRequest - > width ( ) ;
int wantedHeight = m_currentRequest - > height ( ) ;
spectre_page_render ( m_currentPage , m_renderContext , & data , & row_length ) ;
QImage img ;
if ( row_length = = wantedWidth * 4 )
{
img = QImage ( data , wantedWidth , wantedHeight , QImage : : Format_RGB32 ) ;
}
else
{
// In case this ends up beign very slow we can try with some memmove
QImage aux ( data , row_length / 4 , wantedHeight , QImage : : Format_RGB32 ) ;
img = QImage ( aux . copy ( 0 , 0 , wantedWidth , wantedHeight ) ) ;
}
QImage * image = new QImage ( img . copy ( ) ) ;
free ( data ) ;
if ( image - > width ( ) ! = wantedWidth | | image - > height ( ) ! = wantedHeight )
bool goAhead = true ;
do
{
kWarning ( 4711 ) < < " Generated image does not match wanted size " < < image - > width ( ) < < " " < < m_currentRequest - > width ( ) < < " " < < image - > height ( ) < < " " < < m_currentRequest - > height ( ) ;
QImage aux = image - > scaled ( wantedWidth , wantedHeight ) ;
delete image ;
image = new QImage ( aux ) ;
}
emit imageDone ( image , m_currentRequest ) ;
spectre_page_free ( m_currentPage ) ;
m_queueMutex . lock ( ) ;
GSRendererThreadRequest req = m_queue . dequeue ( ) ;
goAhead = ! m_queue . isEmpty ( ) ;
m_queueMutex . unlock ( ) ;
spectre_render_context_set_scale ( m_renderContext , req . magnify , req . magnify ) ;
spectre_render_context_set_use_platform_fonts ( m_renderContext , req . platformFonts ) ;
spectre_render_context_set_antialias_bits ( m_renderContext , req . graphicsAAbits , req . textAAbits ) ;
spectre_render_context_set_rotation ( m_renderContext , req . rotation ) ;
unsigned char * data = NULL ;
int row_length = 0 ;
int wantedWidth = req . request - > width ( ) ;
int wantedHeight = req . request - > height ( ) ;
spectre_page_render ( req . spectrePage , m_renderContext , & data , & row_length ) ;
QImage img ;
if ( row_length = = wantedWidth * 4 )
{
img = QImage ( data , wantedWidth , wantedHeight , QImage : : Format_RGB32 ) ;
}
else
{
// In case this ends up beign very slow we can try with some memmove
QImage aux ( data , row_length / 4 , wantedHeight , QImage : : Format_RGB32 ) ;
img = QImage ( aux . copy ( 0 , 0 , wantedWidth , wantedHeight ) ) ;
}
QImage * image = new QImage ( img . copy ( ) ) ;
free ( data ) ;
if ( image - > width ( ) ! = wantedWidth | | image - > height ( ) ! = wantedHeight )
{
kWarning ( 4711 ) . nospace ( ) < < " Generated image does not match wanted size: "
< < " [ " < < image - > width ( ) < < " x " < < image - > height ( ) < < " ] vs requested "
< < " [ " < < req . request - > width ( ) < < " x " < < req . request - > height ( ) < < " ] " ;
QImage aux = image - > scaled ( wantedWidth , wantedHeight ) ;
delete image ;
image = new QImage ( aux ) ;
}
emit imageDone ( image , req . request ) ;
spectre_page_free ( req . spectrePage ) ;
} while ( goAhead ) ;
}
}