Hi, I have submitted a patch for review:
https://gerrit.libreoffice.org/2959 To pull it, you can do: git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/59/2959/1 Use OUString and sal_Int32 in ImplPrepareLayoutArgs() and GetTextIsRTL() Change-Id: Ib1b659aa56a38efdfc2dddb5e362ac1eb54972f1 --- M vcl/inc/vcl/outdev.hxx M vcl/source/gdi/outdev3.cxx 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/vcl/inc/vcl/outdev.hxx b/vcl/inc/vcl/outdev.hxx index e51ec2b..5f00757 100644 --- a/vcl/inc/vcl/outdev.hxx +++ b/vcl/inc/vcl/outdev.hxx @@ -382,10 +382,8 @@ xub_StrLen nLen, const Point& rLogicPos = Point(0,0), long nLogicWidth=0, const sal_Int32* pLogicDXArray=NULL, bool bFilter = false ) const; - SAL_DLLPRIVATE ImplLayoutArgs ImplPrepareLayoutArgs( String&, - xub_StrLen nIndex, xub_StrLen nLen, - long nPixelWidth, - const sal_Int32* pPixelDXArray ) const; + SAL_DLLPRIVATE ImplLayoutArgs ImplPrepareLayoutArgs( OUString&, const sal_Int32 nIndex, const sal_Int32 nLen, + long nPixelWidth, const sal_Int32* pPixelDXArray ) const; SAL_DLLPRIVATE SalLayout* ImplGlyphFallbackLayout( SalLayout*, ImplLayoutArgs& ) const; static @@ -1060,8 +1058,7 @@ sal_uInt16 GetBitCount() const; - sal_Bool GetTextIsRTL( const String&, xub_StrLen nIndex, - xub_StrLen nLen ) const; + sal_Bool GetTextIsRTL( const OUString&, sal_Int32 nIndex, sal_Int32 nLen ) const; /** Query the existence and depth of the alpha channel diff --git a/vcl/source/gdi/outdev3.cxx b/vcl/source/gdi/outdev3.cxx index a2e2e1b..1fedcbd 100644 --- a/vcl/source/gdi/outdev3.cxx +++ b/vcl/source/gdi/outdev3.cxx @@ -5665,13 +5665,13 @@ mpAlphaVDev->DrawStretchText( rStartPt, nWidth, rStr, nIndex, nLen ); } -ImplLayoutArgs OutputDevice::ImplPrepareLayoutArgs( String& rStr, - xub_StrLen nMinIndex, xub_StrLen nLen, +ImplLayoutArgs OutputDevice::ImplPrepareLayoutArgs( OUString& rStr, + const sal_Int32 nMinIndex, const sal_Int32 nLen, long nPixelWidth, const sal_Int32* pDXArray ) const { // get string length for calculating extents - xub_StrLen nEndIndex = rStr.Len(); - if( (sal_uLong)nMinIndex + nLen < nEndIndex ) + sal_Int32 nEndIndex = rStr.getLength(); + if( nMinIndex + nLen < nEndIndex ) nEndIndex = nMinIndex + nLen; // don't bother if there is nothing to do @@ -5686,8 +5686,8 @@ else if( 0 == (mnTextLayoutMode & TEXT_LAYOUT_BIDI_RTL) ) { // disable Bidi if no RTL hint and no RTL codes used - const sal_Unicode* pStr = rStr.GetBuffer() + nMinIndex; - const sal_Unicode* pEnd = rStr.GetBuffer() + nEndIndex; + const sal_Unicode* pStr = rStr.getStr() + nMinIndex; + const sal_Unicode* pEnd = rStr.getStr() + nEndIndex; for( ; pStr < pEnd; ++pStr ) if( ((*pStr >= 0x0580) && (*pStr < 0x0800)) // middle eastern scripts || ((*pStr >= 0xFB18) && (*pStr < 0xFE00)) // hebrew + arabic A presentation forms @@ -5711,8 +5711,8 @@ else { // disable CTL for non-CTL text - const sal_Unicode* pStr = rStr.GetBuffer() + nMinIndex; - const sal_Unicode* pEnd = rStr.GetBuffer() + nEndIndex; + const sal_Unicode* pStr = rStr.getStr() + nMinIndex; + const sal_Unicode* pEnd = rStr.getStr() + nEndIndex; for( ; pStr < pEnd; ++pStr ) if( ((*pStr >= 0x0300) && (*pStr < 0x0370)) // diacritical marks || ((*pStr >= 0x0590) && (*pStr < 0x10A0)) // many CTL scripts @@ -5731,9 +5731,10 @@ if( meTextLanguage ) //TODO: (mnTextLayoutMode & TEXT_LAYOUT_SUBSTITUTE_DIGITS) { // disable character localization when no digits used - const sal_Unicode* pBase = rStr.GetBuffer(); + const sal_Unicode* pBase = rStr.getStr(); const sal_Unicode* pStr = pBase + nMinIndex; const sal_Unicode* pEnd = pBase + nEndIndex; + OUStringBuffer sTmpStr(rStr); for( ; pStr < pEnd; ++pStr ) { // TODO: are there non-digit localizations? @@ -5743,10 +5744,10 @@ sal_UCS4 cChar = GetLocalizedChar( *pStr, meTextLanguage ); if( cChar != *pStr ) // TODO: are the localized digit surrogates? - rStr.SetChar( static_cast<sal_uInt16>(pStr - pBase), - static_cast<sal_Unicode>(cChar) ); + sTmpStr[pStr - pBase] = cChar; } } + rStr = sTmpStr.makeStringAndClear(); } // right align for RTL text, DRAWPOS_REVERSED, RTL window style @@ -5764,7 +5765,7 @@ nLayoutFlags |= SAL_LAYOUT_RIGHT_ALIGN; // set layout options - ImplLayoutArgs aLayoutArgs( rStr.GetBuffer(), rStr.Len(), nMinIndex, nEndIndex, nLayoutFlags, maFont.GetLanguage() ); + ImplLayoutArgs aLayoutArgs( rStr.getStr(), rStr.getLength(), nMinIndex, nEndIndex, nLayoutFlags, maFont.GetLanguage() ); int nOrientation = mpFontEntry ? mpFontEntry->mnOrientation : 0; aLayoutArgs.SetOrientation( nOrientation ); @@ -5862,7 +5863,13 @@ pDXArray = pTempDXAry; } - ImplLayoutArgs aLayoutArgs = ImplPrepareLayoutArgs( aStr, nMinIndex, nLen, nPixelWidth, pDXArray ); + OUString aTmpStr(aStr); // only needed until aStr is OUString as well + sal_Int32 nMinIndex2=nMinIndex; // ditto + sal_Int32 nLen2=nLen; // ditto + ImplLayoutArgs aLayoutArgs = ImplPrepareLayoutArgs( aTmpStr, nMinIndex, nLen, nPixelWidth, pDXArray ); + aStr = String(aTmpStr); // ditto + nLen = nLen2; // ditto + nMinIndex = nMinIndex2; // ditto // get matching layout object for base font SalLayout* pSalLayout = NULL; @@ -6077,11 +6084,9 @@ return pSalLayout; } -sal_Bool OutputDevice::GetTextIsRTL( - const String& rString, - xub_StrLen nIndex, xub_StrLen nLen ) const +sal_Bool OutputDevice::GetTextIsRTL( const OUString& rString, sal_Int32 nIndex, sal_Int32 nLen ) const { - String aStr( rString ); + OUString aStr( rString ); ImplLayoutArgs aArgs = ImplPrepareLayoutArgs( aStr, nIndex, nLen, 0, NULL ); bool bRTL = false; int nCharPos = -1; @@ -7620,8 +7625,10 @@ bRet = true; bool bRTL = false; - String aStr( rStr ); // prepare for e.g. localized digits - ImplLayoutArgs aLayoutArgs = ImplPrepareLayoutArgs( aStr, nIndex, nLen, 0, NULL ); + OUString aStr( rStr ); // prepare for e.g. localized digits + sal_Int32 nIndex2 = nIndex; // only needed until nIndex is sal_Int32 + sal_Int32 nLen2 = nLen; // only needed until nLen is sal_Int32 + ImplLayoutArgs aLayoutArgs = ImplPrepareLayoutArgs( aStr, nIndex2, nLen2, 0, NULL ); for( int nCharPos = -1; aLayoutArgs.GetNextPos( &nCharPos, &bRTL);) { bool bSuccess = false; -- To view, visit https://gerrit.libreoffice.org/2959 To unsubscribe, visit https://gerrit.libreoffice.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ib1b659aa56a38efdfc2dddb5e362ac1eb54972f1 Gerrit-PatchSet: 1 Gerrit-Project: core Gerrit-Branch: master Gerrit-Owner: Christina Roßmanith <chrrossman...@web.de> _______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice