summaryrefslogtreecommitdiff
path: root/drawinglayer
diff options
context:
space:
mode:
authorBartosz Kosiorek <gang65@poczta.onet.pl>2021-07-03 21:55:33 +0200
committerBartosz Kosiorek <gang65@poczta.onet.pl>2021-07-13 21:03:49 +0200
commit3adfb2d35bb34157ce0d1344f2a28b40360728a5 (patch)
tree74aef6d94d99500da4f20fe70b6285aea501306d /drawinglayer
parentf89de18f48724887eef6603b41a963fc222843da (diff)
EMF+ tdf#142941 Fixes SrcRect implementation in DrawImage record
Change-Id: Ice82518d50c50fa6eff8bbcc111fcf287d34d77c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118363 Tested-by: Jenkins Reviewed-by: Bartosz Kosiorek <gang65@poczta.onet.pl>
Diffstat (limited to 'drawinglayer')
-rw-r--r--drawinglayer/source/tools/emfphelperdata.cxx171
1 files changed, 91 insertions, 80 deletions
diff --git a/drawinglayer/source/tools/emfphelperdata.cxx b/drawinglayer/source/tools/emfphelperdata.cxx
index 2568cedb453a..d00284509979 100644
--- a/drawinglayer/source/tools/emfphelperdata.cxx
+++ b/drawinglayer/source/tools/emfphelperdata.cxx
@@ -1432,21 +1432,30 @@ namespace emfplushelper
sal_uInt32 imageAttributesId;
sal_Int32 sourceUnit;
rMS.ReadUInt32(imageAttributesId).ReadInt32(sourceUnit);
- SAL_INFO("drawinglayer.emf", "EMF+\t " << (type == EmfPlusRecordTypeDrawImagePoints ? "DrawImagePoints" : "DrawImage") << " image attributes Id: " << imageAttributesId << " source unit: " << sourceUnit);
+ SAL_INFO("drawinglayer.emf",
+ "EMF+\t " << (type == EmfPlusRecordTypeDrawImage ? "DrawImage"
+ : "DrawImagePoints")
+ << " image attributes Id: " << imageAttributesId
+ << " source unit: " << sourceUnit);
SAL_INFO("drawinglayer.emf", "EMF+\t TODO: use image attributes");
- // For DrawImage and DrawImagePoints, source unit of measurement type must be 1 pixel
+ // Source unit of measurement type must be 1 pixel
if (sourceUnit == UnitTypePixel && maEMFPObjects[flags & 0xff])
{
- EMFPImage& image = *static_cast<EMFPImage *>(maEMFPObjects[flags & 0xff].get());
+ EMFPImage& image
+ = *static_cast<EMFPImage*>(maEMFPObjects[flags & 0xff].get());
float sx, sy, sw, sh;
ReadRectangle(rMS, sx, sy, sw, sh);
::tools::Rectangle aSource(Point(sx, sy), Size(sw + 1, sh + 1));
- SAL_INFO("drawinglayer.emf", "EMF+\t " << (type == EmfPlusRecordTypeDrawImagePoints ? "DrawImagePoints" : "DrawImage") << " source rectangle: " << sx << "," << sy << " " << sw << "x" << sh);
- ::basegfx::B2DPoint aDstPoint;
- ::basegfx::B2DSize aDstSize;
-
+ SAL_INFO("drawinglayer.emf",
+ "EMF+\t "
+ << (type == EmfPlusRecordTypeDrawImage ? "DrawImage"
+ : "DrawImagePoints")
+ << " source rectangle: " << sx << "," << sy << " " << sw << "x"
+ << sh);
+
+ float dx(0.), dy(0.), dw(0.), dh(0.);
double fShearX = 0.0;
double fShearY = 0.0;
if (type == EmfPlusRecordTypeDrawImagePoints)
@@ -1455,108 +1464,110 @@ namespace emfplushelper
rMS.ReadUInt32(aCount);
// Number of points used by DrawImagePoints. Exactly 3 points must be specified.
- if(aCount == 3)
- {
- float x1, y1, x2, y2, x3, y3;
-
- ReadPoint(rMS, x1, y1, flags); // upper-left point
- ReadPoint(rMS, x2, y2, flags); // upper-right
- ReadPoint(rMS, x3, y3, flags); // lower-left
-
- SAL_INFO("drawinglayer.emf",
- "EMF+\t destination points: " << x1 << "," << y1 << " "
- << x2 << "," << y2 << " "
- << x3 << "," << y3);
- float xDstShift = x1;
- float yDstShift = y2;
- float xDstSize = x2 - x1;
- float yDstSize = y3 - y1;
- if (image.type == ImageDataTypeBitmap)
- {
- const Size aSize(image.graphic.GetBitmapEx().GetSizePixel());
- if (sx < 0)
- {
- // If src position is negative then we need shift image to right
- xDstShift = xDstShift + ((-sx) / sw) * (x2 - x1);
- if (sx + sw <= aSize.Width())
- xDstSize = ((sw + sx) / sw) * xDstSize;
- else
- xDstSize = (aSize.Width() / sw) * xDstSize;
- }
- else if (sx + sw > aSize.Width())
- // If the src image is smaller that what we want to cut, then we need to scale down
- xDstSize = ((aSize.Width() - sx) / sw) * xDstSize;
-
- if (sy < 0)
- {
- yDstShift = yDstShift + ((-sy) / sh) * (y3 - y1);
- if (sy + sh <= aSize.Height())
- yDstSize = ((sh + sy) / sh) * yDstSize;
- else
- yDstSize = (aSize.Height() / sh) * yDstSize;
- }
- else if (sy + sh > aSize.Height())
- yDstSize = ((aSize.Height() - sy) / sh) * yDstSize;
- }
- aDstPoint = ::basegfx::B2DPoint(xDstShift, yDstShift);
- aDstSize = ::basegfx::B2DSize(xDstSize, yDstSize);
- fShearX = x3 - x1;
- fShearY = y2 - y1;
- }
- else
+ if (aCount != 3)
{
- SAL_WARN("drawinglayer.emf", "EMF+\t DrawImagePoints Wrong EMF+ file. Expected 3 points, received: "<< aCount);
+ SAL_WARN("drawinglayer.emf", "EMF+\t Wrong EMF+ file. Expected "
+ "3 points, received: "
+ << aCount);
break;
}
+ float x1, y1, x2, y2, x3, y3;
+
+ ReadPoint(rMS, x1, y1, flags); // upper-left point
+ ReadPoint(rMS, x2, y2, flags); // upper-right
+ ReadPoint(rMS, x3, y3, flags); // lower-left
+
+ SAL_INFO("drawinglayer.emf", "EMF+\t destination points: "
+ << x1 << "," << y1 << " " << x2 << ","
+ << y2 << " " << x3 << "," << y3);
+ dx = x1;
+ dy = y2;
+ dw = x2 - x1;
+ dh = y3 - y1;
+ fShearX = x3 - x1;
+ fShearY = y2 - y1;
}
else if (type == EmfPlusRecordTypeDrawImage)
- {
- float dx, dy, dw, dh;
ReadRectangle(rMS, dx, dy, dw, dh, bool(flags & 0x4000));
- SAL_INFO("drawinglayer.emf", "EMF+\t destination rectangle: " << dx << "," << dy << " " << dw << "x" << dh);
- aDstPoint = ::basegfx::B2DPoint(dx, dy);
- aDstSize = ::basegfx::B2DSize(dw, dh);
- }
- const basegfx::B2DHomMatrix aTransformMatrix = maMapTransform *
- basegfx::B2DHomMatrix(
- /* Row 0, Column 0 */ aDstSize.getX(),
- /* Row 0, Column 1 */ fShearX,
- /* Row 0, Column 2 */ aDstPoint.getX(),
- /* Row 1, Column 0 */ fShearY,
- /* Row 1, Column 1 */ aDstSize.getY(),
- /* Row 1, Column 2 */ aDstPoint.getY());
+ SAL_INFO("drawinglayer.emf",
+ "EMF+\t Rectangle: " << dx << "," << dy << " " << dw << "x" << dh);
+ Size aSize;
+ if (image.type == ImageDataTypeBitmap)
+ {
+ aSize = image.graphic.GetBitmapEx().GetSizePixel();
+ SAL_INFO("drawinglayer.emf", "EMF+\t Bitmap size: " << aSize.Width()
+ << "x"
+ << aSize.Height());
+ if (sx < 0)
+ {
+ // If src position is negative then we need shift image to right
+ dx = dx + ((-sx) / sw) * dw;
+ if (sx + sw <= aSize.Width())
+ dw = ((sw + sx) / sw) * dw;
+ else
+ dw = (aSize.Width() / sw) * dw;
+ }
+ else if (sx + sw > aSize.Width())
+ // If the src image is smaller that what we want to cut, then we need to scale down
+ dw = ((aSize.Width() - sx) / sw) * dw;
+
+ if (sy < 0)
+ {
+ dy = dy + ((-sy) / sh) * dh;
+ if (sy + sh <= aSize.Height())
+ dh = ((sh + sy) / sh) * dh;
+ else
+ dh = (aSize.Height() / sh) * dh;
+ }
+ else if (sy + sh > aSize.Height())
+ dh = ((aSize.Height() - sy) / sh) * dh;
+ }
+ else
+ SAL_INFO(
+ "drawinglayer.emf",
+ "EMF+\t TODO: Add support for SrcRect to ImageDataTypeMetafile");
+ ::basegfx::B2DPoint aDstPoint(dx, dy);
+ ::basegfx::B2DSize aDstSize(dw, dh);
+
+ const basegfx::B2DHomMatrix aTransformMatrix
+ = maMapTransform
+ * basegfx::B2DHomMatrix(
+ /* Row 0, Column 0 */ aDstSize.getX(),
+ /* Row 0, Column 1 */ fShearX,
+ /* Row 0, Column 2 */ aDstPoint.getX(),
+ /* Row 1, Column 0 */ fShearY,
+ /* Row 1, Column 1 */ aDstSize.getY(),
+ /* Row 1, Column 2 */ aDstPoint.getY());
if (image.type == ImageDataTypeBitmap)
{
BitmapEx aBmp(image.graphic.GetBitmapEx());
aBmp.Crop(aSource);
- Size aSize(aBmp.GetSizePixel());
- SAL_INFO("drawinglayer.emf", "EMF+\t Bitmap size: " << aSize.Width() << "x" << aSize.Height());
+ aSize = aBmp.GetSizePixel();
if (aSize.Width() > 0 && aSize.Height() > 0)
{
mrTargetHolders.Current().append(
new drawinglayer::primitive2d::BitmapPrimitive2D(
- VCLUnoHelper::CreateVCLXBitmap(aBmp),
- aTransformMatrix));
+ VCLUnoHelper::CreateVCLXBitmap(aBmp), aTransformMatrix));
}
else
- {
SAL_WARN("drawinglayer.emf", "EMF+\t warning: empty bitmap");
- break;
- }
}
else if (image.type == ImageDataTypeMetafile)
{
GDIMetaFile aGDI(image.graphic.GetGDIMetaFile());
aGDI.Clip(aSource);
mrTargetHolders.Current().append(
- new drawinglayer::primitive2d::MetafilePrimitive2D(aTransformMatrix, aGDI));
+ new drawinglayer::primitive2d::MetafilePrimitive2D(aTransformMatrix,
+ aGDI));
}
}
else
{
- SAL_WARN("drawinglayer.emf", "EMF+\tDrawImage(Points) Wrong EMF+ file. Only Unit Type Pixel is support by EMF+ specification for DrawImage(Points)");
+ SAL_WARN("drawinglayer.emf",
+ "EMF+\tDrawImage(Points) Wrong EMF+ file. Only Unit Type Pixel is "
+ "support by EMF+ specification for DrawImage(Points)");
}
break;
}