From f074fc2e15f8259df0db3caca6fa9e2b8bc1ad90 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Fri, 23 Oct 2009 22:49:54 +0000 Subject: [PATCH] do not ask spectre to rotate pages as it seems not to work at all fixes rendering of bug210499.ps svn path=/trunk/KDE/kdegraphics/okular/; revision=1039609 --- generators/spectre/generator_ghostview.cpp | 2 +- generators/spectre/rendererthread.cpp | 37 ++++++++++++++++++++-- generators/spectre/rendererthread.h | 4 +-- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/generators/spectre/generator_ghostview.cpp b/generators/spectre/generator_ghostview.cpp index 9439fe9a8..e75bfb07d 100644 --- a/generators/spectre/generator_ghostview.cpp +++ b/generators/spectre/generator_ghostview.cpp @@ -240,7 +240,7 @@ void GSGenerator::generatePixmap( Okular::PixmapRequest * req ) gsreq.textAAbits = textAA; gsreq.graphicsAAbits = graphicsAA; - gsreq.rotation = req->page()->orientation() * 90; + gsreq.orientation = req->page()->orientation(); if (req->page()->rotation() == Okular::Rotation90 || req->page()->rotation() == Okular::Rotation270) { diff --git a/generators/spectre/rendererthread.cpp b/generators/spectre/rendererthread.cpp index 90aada500..f185d2277 100644 --- a/generators/spectre/rendererthread.cpp +++ b/generators/spectre/rendererthread.cpp @@ -56,13 +56,18 @@ void GSRendererThread::run() 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); + // Do not use spectre_render_context_set_rotation makes some files not render correctly, e.g. bug210499.ps + // so we basically do the rendering without any rotation and then rotate to the orientation as needed + // spectre_render_context_set_rotation(m_renderContext, req.orientation); unsigned char *data = NULL; int row_length = 0; int wantedWidth = req.request->width(); int wantedHeight = req.request->height(); + if ( req.orientation % 2 ) + qSwap( wantedWidth, wantedHeight ); + spectre_page_render(req.spectrePage, m_renderContext, &data, &row_length); QImage img; @@ -76,10 +81,36 @@ void GSRendererThread::run() QImage aux(data, row_length / 4, wantedHeight, QImage::Format_RGB32); img = QImage(aux.copy(0, 0, wantedWidth, wantedHeight)); } + + switch (req.orientation) + { + case Okular::Rotation90: + { + QMatrix m; + m.rotate(90); + img = img.transformed( m ); + break; + } + + case Okular::Rotation180: + { + QMatrix m; + m.rotate(180); + img = img.transformed( m ); + break; + } + case Okular::Rotation270: + { + QMatrix m; + m.rotate(270); + img = img.transformed( m ); + } + } + QImage *image = new QImage(img.copy()); free(data); - if (image->width() != wantedWidth || image->height() != wantedHeight) + if (image->width() != req.request->width() || image->height() != req.request->height()) { kWarning(4711).nospace() << "Generated image does not match wanted size: " << "[" << image->width() << "x" << image->height() << "] vs requested " @@ -96,3 +127,5 @@ void GSRendererThread::run() } #include "rendererthread.moc" + +/* kate: replace-tabs on; indent-width 4; */ diff --git a/generators/spectre/rendererthread.h b/generators/spectre/rendererthread.h index 878cca8df..bc680d3ee 100644 --- a/generators/spectre/rendererthread.h +++ b/generators/spectre/rendererthread.h @@ -35,7 +35,7 @@ struct GSRendererThreadRequest , textAAbits(1) , graphicsAAbits(1) , magnify(1.0) - , rotation(0) + , orientation(0) , platformFonts(true) {} @@ -45,7 +45,7 @@ struct GSRendererThreadRequest int textAAbits; int graphicsAAbits; double magnify; - int rotation; + int orientation; bool platformFonts; }; Q_DECLARE_TYPEINFO(GSRendererThreadRequest, Q_MOVABLE_TYPE);