summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThorsten Behrens <tbehrens@suse.com>2013-10-11 14:48:48 +0200
committerThorsten Behrens <thb@documentfoundation.org>2013-10-11 14:48:48 +0200
commit20f1564dc71ccf3780b879c218a97eb1e2300038 (patch)
treec154479e605a3c12927560dadac0a3eff00e62a9
parent6d8f77beefe95d0e6f3075f16aba3e0a14a0e9f3 (diff)
Fix some transformation bugs in canvasprocessor, add logging.
Change-Id: I74cbace8840205fa6b007fde0555416964c40ecb
-rw-r--r--drawinglayer/source/processor2d/canvasprocessor2d.cxx101
-rw-r--r--include/drawinglayer/processor2d/canvasprocessor2d.hxx2
-rw-r--r--include/sal/log-areas.dox5
3 files changed, 61 insertions, 47 deletions
diff --git a/drawinglayer/source/processor2d/canvasprocessor2d.cxx b/drawinglayer/source/processor2d/canvasprocessor2d.cxx
index a9559bef8866..fd3b2982c06c 100644
--- a/drawinglayer/source/processor2d/canvasprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/canvasprocessor2d.cxx
@@ -76,7 +76,7 @@ namespace drawinglayer
//////////////////////////////////////////////////////////////////////////////
// single primitive renderers
- void CanvasProcessor2D::impRenderTextSimpleOrDecoratedPortionPrimitive2D(const primitive2d::TextSimplePortionPrimitive2D& rTextCandidate)
+ void CanvasProcessor2D::impRenderTextSimplePortionPrimitive2D(const primitive2d::TextSimplePortionPrimitive2D& rTextCandidate)
{
if(rTextCandidate.getTextLength())
{
@@ -95,7 +95,7 @@ namespace drawinglayer
: rendering::PanoseProportion::ANYTHING;
aFontRequest.FontDescription.FontDescription.Letterform = rFontAttr.getItalic() ? 9 : 0;
- // init CellSize to 1.0, else a default font height will be used
+ // init CellSize to 1.0, actual height comes TextTransform
aFontRequest.CellSize = 1.0;
aFontRequest.Locale = rTextCandidate.getLocale();
@@ -103,8 +103,11 @@ namespace drawinglayer
css::geometry::Matrix2D aFontMatrix;
canvas::tools::setIdentityMatrix2D(aFontMatrix);
- uno::Reference<rendering::XCanvasFont> xFont(mxCanvas->createFont(
- aFontRequest, uno::Sequence< beans::PropertyValue >(), aFontMatrix));
+ uno::Reference<rendering::XCanvasFont> xFont(
+ mxCanvas->createFont(
+ aFontRequest,
+ uno::Sequence< beans::PropertyValue >(),
+ aFontMatrix));
if(xFont.is())
{
@@ -124,7 +127,8 @@ namespace drawinglayer
const ::std::vector< double >& rDXArray = rTextCandidate.getDXArray();
const sal_uInt32 nDXCount(rDXArray.size());
- if(nDXCount)
+ // TODO(F3): this needs proper scaling
+ if(false) //nDXCount)
{
// DXArray does not need to be adapted to getTextPosition/getTextLength,
// it is already provided correctly
@@ -133,13 +137,17 @@ namespace drawinglayer
}
// set text color
- const basegfx::BColor aRGBColor(maBColorModifierStack.getModifiedColor(rTextCandidate.getFontColor()));
+ const basegfx::BColor aRGBColor(
+ maBColorModifierStack.getModifiedColor(
+ rTextCandidate.getFontColor()));
maVolatileRenderState.DeviceColor =
aRGBColor.colorToDoubleSequence(mxCanvas->getDevice());
// set text transformation
- canvas::tools::setRenderStateTransform(maVolatileRenderState,
- getViewInformation2D().getObjectTransformation() * rTextCandidate.getTextTransform());
+ canvas::tools::setRenderStateTransform(
+ maVolatileRenderState,
+ getViewInformation2D().getObjectTransformation()
+ * rTextCandidate.getTextTransform());
// paint
mxCanvas->drawTextLayout(xLayout, maViewState, maVolatileRenderState);
@@ -495,15 +503,25 @@ namespace drawinglayer
//
// See also http://www.w3.org/TR/SVG/masking.html#Masking
- // how big is the resulting image?
- const basegfx::B2DRange aRange(primitive2d::getB2DRangeFromPrimitive2DSequence(
- rTransCandidate.getChildren(),
- getViewInformation2D()));
+ // how big is the resulting image, in device pixel?
+ basegfx::B2DRange aRange(primitive2d::getB2DRangeFromPrimitive2DSequence(
+ rTransCandidate.getChildren(),
+ getViewInformation2D()));
+ aRange.transform(getViewInformation2D().getViewTransformation()
+ * getViewInformation2D().getObjectTransformation());
+
+ // just in case clip against viewport, pointless to
+ // render outside visible area
+ aRange.intersect( getViewInformation2D().getDiscreteViewport() );
+
const basegfx::B2IRange aIntRange(
canvas::tools::spritePixelAreaFromB2DRange(aRange));
const css::geometry::IntegerSize2D aMaskSize(
aIntRange.getWidth(), aIntRange.getHeight());
+ SAL_INFO("drawinglayer.canvas", "TransparencePrimitive2D rendering into ("
+ << aMaskSize.Width << "," << aMaskSize.Height << ") bitmap");
+
// TODO(E1): in theory, could also get a float bitmap here...
uno::Reference< rendering::XIntegerBitmap > xContent(
mxCanvas->getDevice()->createCompatibleAlphaBitmap(aMaskSize),
@@ -546,17 +564,19 @@ namespace drawinglayer
0,0,
aMaskSize.Width,
aMaskSize.Height);
+ uno::Sequence< sal_Int8 > aRawMask =
+ xMask->getData(aMaskLayout,
+ aMaskArea);
uno::Sequence< rendering::ARGBColor > aARGBMask =
- aMaskLayout.ColorSpace->convertIntegerToARGB(
- xMask->getData(
- aMaskLayout,
- aMaskArea));
+ aMaskLayout.ColorSpace->convertIntegerToARGB(aRawMask);
+
rendering::IntegerBitmapLayout aContentLayout;
+ uno::Sequence< sal_Int8 > aRawContent =
+ xContent->getData(
+ aContentLayout,
+ aMaskArea);
uno::Sequence< rendering::ARGBColor > aARGBContent =
- aContentLayout.ColorSpace->convertIntegerToARGB(
- xContent->getData(
- aContentLayout,
- aMaskArea));
+ aContentLayout.ColorSpace->convertIntegerToARGB(aRawContent);
rendering::ARGBColor* pARGBContent( aARGBContent.getArray() );
const rendering::ARGBColor* const pARGBContentEnd(
@@ -604,7 +624,7 @@ namespace drawinglayer
// create new local ViewInformation2D with new transformation
const geometry::ViewInformation2D aViewInformation2D(
- getViewInformation2D().getObjectTransformation() * rTransformCandidate.getTransformation(),
+ getViewInformation2D().getObjectTransformation() * rTransformCandidate.getTransformation(),
getViewInformation2D().getViewTransformation(),
getViewInformation2D().getViewport(),
getViewInformation2D().getVisualizedPage(),
@@ -793,7 +813,7 @@ namespace drawinglayer
aStops[i] = rEntries[i].getOffset();
aColors[i] = rEntries[i].getColor().colorToDoubleSequence(
mxCanvas->getDevice());
- aColors[i][4] = rEntries[i].getOpacity();
+ aColors[i][3] = rEntries[i].getOpacity();
}
// fill service params
@@ -879,7 +899,7 @@ namespace drawinglayer
aStops[i] = rEntries[i].getOffset();
aColors[i] = rEntries[i].getColor().colorToDoubleSequence(
mxCanvas->getDevice());
- aColors[i][4] = rEntries[i].getOpacity();
+ aColors[i][3] = rEntries[i].getOpacity();
}
// fill service params
@@ -945,18 +965,19 @@ namespace drawinglayer
// relevant for edit mode currently, or stuff like
// e.g. hatches is currently not implemented in
// canvas):
- // case PRIMITIVE2D_ID_WRONGSPELLPRIMITIVE2D (fallback good)
- // case PRIMITIVE2D_ID_METAFILEPRIMITIVE2D (fallback excellent)
- // case PRIMITIVE2D_ID_MARKERARRAYPRIMITIVE2D (fallback good)
- // case PRIMITIVE2D_ID_POLYPOLYGONGRADIENTPRIMITIVE2D (fallback good)
- // case PRIMITIVE2D_ID_CONTROLPRIMITIVE2D (fallback needs vcl)
- // case PRIMITIVE2D_ID_FILLHATCHPRIMITIVE2D (NYI in canvas)
- // case PRIMITIVE2D_ID_INVERTPRIMITIVE2D (edit mode only)
- // case PRIMITIVE2D_ID_SVGLINEARATOMPRIMITIVE2D (should not happen, and if: fallback good)
- // case PRIMITIVE2D_ID_SVGRADIALATOMPRIMITIVE2D (should not happen, and if: fallback good)
+ // case PRIMITIVE2D_ID_WRONGSPELLPRIMITIVE2D (fallback good)
+ // case PRIMITIVE2D_ID_METAFILEPRIMITIVE2D (fallback excellent)
+ // case PRIMITIVE2D_ID_MARKERARRAYPRIMITIVE2D (fallback good)
+ // case PRIMITIVE2D_ID_POLYPOLYGONGRADIENTPRIMITIVE2D (fallback good)
+ // case PRIMITIVE2D_ID_CONTROLPRIMITIVE2D (fallback needs vcl)
+ // case PRIMITIVE2D_ID_TEXTDECORATEDPORTIONPRIMITIVE2D (fallback needs vcl)
+ // case PRIMITIVE2D_ID_FILLHATCHPRIMITIVE2D (NYI in canvas)
+ // case PRIMITIVE2D_ID_INVERTPRIMITIVE2D (edit mode only)
+ // case PRIMITIVE2D_ID_SVGLINEARATOMPRIMITIVE2D (should not happen, and if: fallback good)
+ // case PRIMITIVE2D_ID_SVGRADIALATOMPRIMITIVE2D (should not happen, and if: fallback good)
//
// TODO(F1):
- // case PRIMITIVE2D_ID_EPSPRIMITIVE2D (needs ghostscript/Xpost help)
+ // case PRIMITIVE2D_ID_EPSPRIMITIVE2D (needs ghostscript/Xpost help)
case PRIMITIVE2D_ID_PAGEPREVIEWPRIMITIVE2D :
@@ -968,19 +989,7 @@ namespace drawinglayer
// directdraw of text simple portion; added test possibility to check text decompose
if(getOptionsDrawinglayer().IsRenderSimpleTextDirect())
{
- impRenderTextSimpleOrDecoratedPortionPrimitive2D(static_cast< const primitive2d::TextSimplePortionPrimitive2D& >(rCandidate));
- }
- else
- {
- process(rCandidate.get2DDecomposition(getViewInformation2D()));
- }
- break;
-
- case PRIMITIVE2D_ID_TEXTDECORATEDPORTIONPRIMITIVE2D :
- // directdraw of text simple portion; added test possibility to check text decompose
- if(getOptionsDrawinglayer().IsRenderDecoratedTextDirect())
- {
- impRenderTextSimpleOrDecoratedPortionPrimitive2D(static_cast< const primitive2d::TextSimplePortionPrimitive2D& >(rCandidate));
+ impRenderTextSimplePortionPrimitive2D(static_cast< const primitive2d::TextSimplePortionPrimitive2D& >(rCandidate));
}
else
{
diff --git a/include/drawinglayer/processor2d/canvasprocessor2d.hxx b/include/drawinglayer/processor2d/canvasprocessor2d.hxx
index 482654d000c0..16e509704d64 100644
--- a/include/drawinglayer/processor2d/canvasprocessor2d.hxx
+++ b/include/drawinglayer/processor2d/canvasprocessor2d.hxx
@@ -102,7 +102,7 @@ namespace drawinglayer
virtual void processBasePrimitive2D(const primitive2d::BasePrimitive2D& rCandidate);
// direct primitive renderer support
- void impRenderTextSimpleOrDecoratedPortionPrimitive2D(const primitive2d::TextSimplePortionPrimitive2D& rTextCandidate);
+ void impRenderTextSimplePortionPrimitive2D(const primitive2d::TextSimplePortionPrimitive2D& rTextCandidate);
void impRenderPolygonHairlinePrimitive2D(const primitive2d::PolygonHairlinePrimitive2D& rPolygonCandidate);
void impRenderBitmapPrimitive2D(const primitive2d::BitmapPrimitive2D& rBitmapCandidate);
void impRenderFillGraphicPrimitive2D(const primitive2d::FillGraphicPrimitive2D& rFillBitmapCandidate);
diff --git a/include/sal/log-areas.dox b/include/sal/log-areas.dox
index fd159260fdb9..a6db6c9b8d1e 100644
--- a/include/sal/log-areas.dox
+++ b/include/sal/log-areas.dox
@@ -110,6 +110,11 @@ certain functionality.
@li @c sdremote.bluetooth
@li @c sdremote.wifi
+@section drawinlayer
+
+@li @c drawinglayer
+@li @c drawinglayer.canvas
+
@section editeng
@li @c editeng