summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vcl/source/filter/GraphicNativeTransform.cxx65
1 files changed, 35 insertions, 30 deletions
diff --git a/vcl/source/filter/GraphicNativeTransform.cxx b/vcl/source/filter/GraphicNativeTransform.cxx
index 261ad90c3ce5..69a10bdc65c2 100644
--- a/vcl/source/filter/GraphicNativeTransform.cxx
+++ b/vcl/source/filter/GraphicNativeTransform.cxx
@@ -141,45 +141,50 @@ bool GraphicNativeTransform::rotateGeneric(sal_uInt16 aRotation, OUString aType)
bool GraphicNativeTransform::rotateJPEG(sal_uInt16 aRotation)
{
- GfxLink aLink = mrGraphic.GetLink();
-
- SvMemoryStream aSourceStream;
- aSourceStream.Write(aLink.GetData(), aLink.GetDataSize());
- aSourceStream.Seek( STREAM_SEEK_TO_BEGIN );
-
- Orientation aOrientation = TOP_LEFT;
+ BitmapEx aBitmap = mrGraphic.GetBitmapEx();
- Exif exif;
- if ( exif.read(aSourceStream) )
+ if (aBitmap.GetSizePixel().Width() % 16 != 0 ||
+ aBitmap.GetSizePixel().Height() % 16 != 0 )
{
- aOrientation = exif.getOrientation();
+ rotateGeneric(aRotation, OUString("png"));
}
+ else
+ {
+ GfxLink aLink = mrGraphic.GetLink();
- SvMemoryStream aTargetStream;
- JpegTransform tranform(aSourceStream, aTargetStream);
- tranform.setRotate(aRotation);
- tranform.perform();
+ SvMemoryStream aSourceStream;
+ aSourceStream.Write(aLink.GetData(), aLink.GetDataSize());
+ aSourceStream.Seek( STREAM_SEEK_TO_BEGIN );
- aTargetStream.Seek( STREAM_SEEK_TO_BEGIN );
+ Orientation aOrientation = TOP_LEFT;
- // Reset orientation in exif if needed
- if ( exif.hasExif() && aOrientation != TOP_LEFT)
- {
- exif.setOrientation(TOP_LEFT);
- exif.write(aTargetStream);
- }
+ Exif exif;
+ if ( exif.read(aSourceStream) )
+ {
+ aOrientation = exif.getOrientation();
+ }
- aTargetStream.Seek( STREAM_SEEK_TO_END );
- sal_uInt32 aBufferSize = aTargetStream.Tell();
- sal_uInt8* pBuffer = new sal_uInt8[ aBufferSize ];
+ SvMemoryStream aTargetStream;
+ JpegTransform tranform(aSourceStream, aTargetStream);
+ tranform.setRotate(aRotation);
+ tranform.perform();
- aTargetStream.Seek( STREAM_SEEK_TO_BEGIN );
- aTargetStream.Read( pBuffer, aBufferSize );
+ aTargetStream.Seek( STREAM_SEEK_TO_BEGIN );
- BitmapEx aBitmap = mrGraphic.GetBitmapEx();
- aBitmap.Rotate(aRotation, COL_BLACK);
- mrGraphic = aBitmap;
- mrGraphic.SetLink( GfxLink( pBuffer, aBufferSize, aLink.GetType(), sal_True ) );
+ // Reset orientation in exif if needed
+ if ( exif.hasExif() && aOrientation != TOP_LEFT)
+ {
+ exif.setOrientation(TOP_LEFT);
+ exif.write(aTargetStream);
+ }
+
+ aTargetStream.Seek( STREAM_SEEK_TO_BEGIN );
+
+ Graphic aGraphic;
+ GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
+ rFilter.ImportGraphic( aGraphic, OUString("import"), aTargetStream );
+ mrGraphic = aGraphic;
+ }
return true;
}