You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by hd...@apache.org on 2013/03/12 13:08:08 UTC

svn commit: r1455505 - in /openoffice/trunk/main/canvas/source/directx: dx_textlayout.cxx dx_textlayout_drawhelper.cxx dx_textlayout_drawhelper.hxx

Author: hdu
Date: Tue Mar 12 12:08:07 2013
New Revision: 1455505

URL: http://svn.apache.org/r1455505
Log:
#i99414# add bidi support to the DirextX canvas

Patch By: Henner Drewes <he...@freenet.de>
Review By: Herbert Duerr

Modified:
    openoffice/trunk/main/canvas/source/directx/dx_textlayout.cxx
    openoffice/trunk/main/canvas/source/directx/dx_textlayout_drawhelper.cxx
    openoffice/trunk/main/canvas/source/directx/dx_textlayout_drawhelper.hxx

Modified: openoffice/trunk/main/canvas/source/directx/dx_textlayout.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/canvas/source/directx/dx_textlayout.cxx?rev=1455505&r1=1455504&r2=1455505&view=diff
==============================================================================
--- openoffice/trunk/main/canvas/source/directx/dx_textlayout.cxx (original)
+++ openoffice/trunk/main/canvas/source/directx/dx_textlayout.cxx Tue Mar 12 12:08:07 2013
@@ -119,7 +119,8 @@ namespace dxcanvas
                 maText,
                 maLogicalAdvancements,
                 mpFont.getRef(),
-                mpFont->getFontMatrix()));
+                mpFont->getFontMatrix(),
+                mnTextDirection ));
 
         return aBounds;
     }
@@ -247,7 +248,8 @@ namespace dxcanvas
 			maLogicalAdvancements,
 			mpFont.getRef(),
 			mpFont->getFontMatrix(),
-            bAlphaSurface);
+            bAlphaSurface,
+            mnTextDirection );
 
 		return true;
     }

Modified: openoffice/trunk/main/canvas/source/directx/dx_textlayout_drawhelper.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/canvas/source/directx/dx_textlayout_drawhelper.cxx?rev=1455505&r1=1455504&r2=1455505&view=diff
==============================================================================
--- openoffice/trunk/main/canvas/source/directx/dx_textlayout_drawhelper.cxx (original)
+++ openoffice/trunk/main/canvas/source/directx/dx_textlayout_drawhelper.cxx Tue Mar 12 12:08:07 2013
@@ -37,6 +37,7 @@
 #include <com/sun/star/rendering/FontRequest.hpp>
 #include <com/sun/star/rendering/PanoseProportion.hpp>
 #include <com/sun/star/rendering/XCanvasFont.hpp>
+#include <com/sun/star/rendering/TextDirection.hpp>
 #include <comphelper/sequence.hxx>
 #include <comphelper/scopeguard.hxx>
 #include <tools/color.hxx>
@@ -71,6 +72,35 @@ namespace dxcanvas
 	{
 	}
 
+    void setupLayoutMode( VirtualDevice& rVirDev,
+                              sal_Int8		nTextDirection )	
+    {
+            // TODO(P3): avoid if already correctly set
+            ULONG nLayoutMode;
+            switch( nTextDirection )
+            {
+                default:
+                    nLayoutMode = 0;
+                    break;
+                case rendering::TextDirection::WEAK_LEFT_TO_RIGHT:
+                    nLayoutMode = TEXT_LAYOUT_BIDI_LTR;
+                    break;
+                case rendering::TextDirection::STRONG_LEFT_TO_RIGHT:
+                    nLayoutMode = TEXT_LAYOUT_BIDI_LTR | TEXT_LAYOUT_BIDI_STRONG;
+                    break;
+                case rendering::TextDirection::WEAK_RIGHT_TO_LEFT:
+                    nLayoutMode = TEXT_LAYOUT_BIDI_RTL;
+                    break;
+                case rendering::TextDirection::STRONG_RIGHT_TO_LEFT:
+                    nLayoutMode = TEXT_LAYOUT_BIDI_RTL | TEXT_LAYOUT_BIDI_STRONG;
+                    break;
+            }
+
+            // set calculated layout mode. Origin is always the left edge,
+            // as required at the API spec
+            rVirDev.SetLayoutMode( nLayoutMode | TEXT_LAYOUT_TEXTORIGIN_LEFT );
+    }
+
 	void TextLayoutDrawHelper::drawText( 
         const GraphicsSharedPtr&                            rGraphics,
         const ::com::sun::star::rendering::ViewState& 		rViewState,
@@ -81,7 +111,8 @@ namespace dxcanvas
         const ::com::sun::star::uno::Reference<
             ::com::sun::star::rendering::XCanvasFont >& 	rCanvasFont,
         const ::com::sun::star::geometry::Matrix2D& 		rFontMatrix,
-        bool                                                bAlphaSurface )
+        bool                                                bAlphaSurface,
+        sal_Int8		                                    nTextDirection)
 	{
         HDC hdc = rGraphics->GetHDC();
 
@@ -157,6 +188,8 @@ namespace dxcanvas
             // set font
             aVirtualDevice.SetFont(aFont);
 
+            setupLayoutMode( aVirtualDevice, nTextDirection );
+
             // create world transformation matrix
             ::basegfx::B2DHomMatrix aWorldTransform;
             ::canvas::tools::mergeViewAndRenderTransform(aWorldTransform, rViewState, rRenderState);
@@ -240,7 +273,8 @@ namespace dxcanvas
 	geometry::RealRectangle2D TextLayoutDrawHelper::queryTextBounds( const rendering::StringContext& 					rText,
                                                                      const uno::Sequence< double >& 					rLogicalAdvancements,
                                                                      const uno::Reference< rendering::XCanvasFont >&	rCanvasFont,
-                                                                     const geometry::Matrix2D& 							rFontMatrix )
+                                                                     const geometry::Matrix2D& 							rFontMatrix,
+                                                                     sal_Int8		                                    nTextDirection )
 	{
 		if(!(rText.Length))
             return geometry::RealRectangle2D();
@@ -286,6 +320,8 @@ namespace dxcanvas
         // set font
         aVirtualDevice.SetFont(aFont);
 
+        setupLayoutMode( aVirtualDevice, nTextDirection );
+
         // need metrics for Y offset, the XCanvas always renders
         // relative to baseline
         const ::FontMetric& aMetric( aVirtualDevice.GetFontMetric() );

Modified: openoffice/trunk/main/canvas/source/directx/dx_textlayout_drawhelper.hxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/canvas/source/directx/dx_textlayout_drawhelper.hxx?rev=1455505&r1=1455504&r2=1455505&view=diff
==============================================================================
--- openoffice/trunk/main/canvas/source/directx/dx_textlayout_drawhelper.hxx (original)
+++ openoffice/trunk/main/canvas/source/directx/dx_textlayout_drawhelper.hxx Tue Mar 12 12:08:07 2013
@@ -59,14 +59,16 @@ namespace dxcanvas
                        const ::com::sun::star::uno::Reference<
                        		::com::sun::star::rendering::XCanvasFont >& 	rCanvasFont,
                        const ::com::sun::star::geometry::Matrix2D& 			rFontMatrix,
-                       bool                                                 bAlphaSurface );
+                       bool                                                 bAlphaSurface,
+                       sal_Int8		                                        nTextDirection);
 
         ::com::sun::star::geometry::RealRectangle2D queryTextBounds(
 			const ::com::sun::star::rendering::StringContext& 	rText,
             const ::com::sun::star::uno::Sequence< double >& 	rLogicalAdvancements,
             const ::com::sun::star::uno::Reference<
 	            ::com::sun::star::rendering::XCanvasFont >&		rCanvasFont,
-              const ::com::sun::star::geometry::Matrix2D& 		rFontMatrix );
+              const ::com::sun::star::geometry::Matrix2D& 		rFontMatrix,
+              sal_Int8		                                    nTextDirection );
 
 #ifdef DBG_UTIL
 		void test();