summaryrefslogtreecommitdiff
path: root/vcl/source/outdev/text.cxx
diff options
context:
space:
mode:
authorNorbert Thiebaud <nthiebaud@gmail.com>2014-09-06 16:13:09 +0200
committerNorbert Thiebaud <nthiebaud@gmail.com>2014-09-12 01:45:27 +0200
commit1b42acdaeae134f94580d6e1eba89da16741d596 (patch)
tree882710be2c142cdef62823c9600925ee22f8dab7 /vcl/source/outdev/text.cxx
parent43638d8428abb8358a703247651fbfc72e47ff72 (diff)
vcl: use DeviceCoordinate for GetCaretPositions in sallayout
Change-Id: I5a959e1c3806da713e106c1b0fc8690a6578987b
Diffstat (limited to 'vcl/source/outdev/text.cxx')
-rw-r--r--vcl/source/outdev/text.cxx117
1 files changed, 97 insertions, 20 deletions
diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx
index 51117fe1c172..1dff2db44141 100644
--- a/vcl/source/outdev/text.cxx
+++ b/vcl/source/outdev/text.cxx
@@ -1014,6 +1014,7 @@ long OutputDevice::GetTextArray( const OUString& rStr, long* pDXAry,
{
pDXPixelArray = (DeviceCoordinate*)alloca(nLen * sizeof(DeviceCoordinate));
}
+ long nWidthRes;
DeviceCoordinate nWidth = pSalLayout->FillDXArray( pDXPixelArray );
int nWidthFactor = pSalLayout->GetUnitsPerPixel();
pSalLayout->Release();
@@ -1026,36 +1027,41 @@ long OutputDevice::GetTextArray( const OUString& rStr, long* pDXAry,
pDXPixelArray[ i ] += pDXPixelArray[ i-1 ];
}
}
- if( mbMap )
+ if( nWidthFactor > 1 )
{
if( pDXPixelArray )
{
for( int i = 0; i < nLen; ++i )
{
- pDXPixelArray[i] = ImplDevicePixelToLogicWidth( pDXPixelArray[i] );
+ pDXPixelArray[i] /= nWidthFactor;
}
}
- nWidth = ImplDevicePixelToLogicWidth( nWidth );
+ nWidth /= nWidthFactor;
}
- if( nWidthFactor > 1 )
+ if( mbMap )
{
if( pDXPixelArray )
{
for( int i = 0; i < nLen; ++i )
{
- pDXPixelArray[i] /= nWidthFactor;
+ pDXAry[i] = DeviceCoordinateToLogicWidth( pDXPixelArray[i] );
}
}
- nWidth /= nWidthFactor;
+ nWidthRes = DeviceCoordinateToLogicWidth( nWidth );
}
- if(pDXAry)
+ else
{
- for( int i = 0; i < nLen; ++i )
+ if( pDXPixelArray )
{
- pDXAry[i] = basegfx::fround(pDXPixelArray[i]);
+ for( int i = 0; i < nLen; ++i )
+ {
+ pDXAry[i] = (long)pDXPixelArray[i];
+ }
}
+ nWidthRes = (long) nWidth;
}
- return basegfx::fround(nWidth);
+
+ return nWidth;
#else /* ! VCL_FLOAT_DEVICE_PIXEL */
@@ -1091,7 +1097,7 @@ long OutputDevice::GetTextArray( const OUString& rStr, long* pDXAry,
bool OutputDevice::GetCaretPositions( const OUString& rStr, long* pCaretXArray,
sal_Int32 nIndex, sal_Int32 nLen,
long* pDXAry, long nLayoutWidth,
- bool bCellBreaking ) const
+ bool /* bCellBreaking */ ) const
{
if( nIndex >= rStr.getLength() )
@@ -1105,50 +1111,121 @@ bool OutputDevice::GetCaretPositions( const OUString& rStr, long* pCaretXArray,
if( !pSalLayout )
return false;
+#if VCL_FLOAT_DEVICE_PIXEL
+ int nWidthFactor = pSalLayout->GetUnitsPerPixel();
+ DeviceCoordinate* pDevCaretXArray = (DeviceCoordinate*)alloca(2 * nLen * sizeof(DeviceCoordinate));
+
+ pSalLayout->GetCaretPositions( 2*nLen, pDevCaretXArray );
+ DeviceCoordinate nWidth = pSalLayout->GetTextWidth();
+ pSalLayout->Release();
+
+ // fixup unknown caret positions
+ int i;
+ for( i = 0; i < 2 * nLen; ++i )
+ {
+ if( pDevCaretXArray[ i ] >= 0 )
+ {
+ break;
+ }
+ }
+ DeviceCoordinate nXPos = pCaretXArray[ i ];
+ for( i = 0; i < 2 * nLen; ++i )
+ {
+ if( pCaretXArray[ i ] >= 0 )
+ {
+ nXPos = pCaretXArray[ i ];
+ }
+ else
+ {
+ pCaretXArray[ i ] = nXPos;
+ }
+ }
+ if( nWidthFactor != 1 )
+ {
+ for( i = 0; i < 2*nLen; ++i )
+ {
+ pDevCaretXArray[i] /= nWidthFactor;
+ }
+ }
+
+ // handle window mirroring
+ if( IsRTLEnabled() )
+ {
+ for( i = 0; i < 2 * nLen; ++i )
+ {
+ pDevCaretXArray[i] = nWidth - pDevCaretXArray[i] - 1;
+ }
+ }
+
+ // convert from font units to logical units
+ if( mbMap )
+ {
+ for( i = 0; i < 2*nLen; ++i )
+ {
+ pCaretXArray[i] = DeviceCoordinateToLogicWidth( pDevCaretXArray[i] );
+ }
+ }
+ else
+ {
+ for( i = 0; i < 2*nLen; ++i )
+ {
+ pCaretXArray[i] = (long)pDevCaretXArray[i];
+ }
+ }
+#else
int nWidthFactor = pSalLayout->GetUnitsPerPixel();
+
pSalLayout->GetCaretPositions( 2*nLen, pCaretXArray );
- long nWidth = pSalLayout->GetTextWidth();
+ DeviceCoordinate nWidth = pSalLayout->GetTextWidth();
pSalLayout->Release();
// fixup unknown caret positions
int i;
for( i = 0; i < 2 * nLen; ++i )
+ {
if( pCaretXArray[ i ] >= 0 )
+ {
break;
- long nXPos = pCaretXArray[ i ];
+ }
+ }
+ DeviceCoordinate nXPos = pCaretXArray[ i ];
for( i = 0; i < 2 * nLen; ++i )
{
if( pCaretXArray[ i ] >= 0 )
+ {
nXPos = pCaretXArray[ i ];
+ }
else
+ {
pCaretXArray[ i ] = nXPos;
+ }
}
// handle window mirroring
if( IsRTLEnabled() )
{
for( i = 0; i < 2 * nLen; ++i )
+ {
pCaretXArray[i] = nWidth - pCaretXArray[i] - 1;
+ }
}
// convert from font units to logical units
if( mbMap )
{
for( i = 0; i < 2*nLen; ++i )
+ {
pCaretXArray[i] = ImplDevicePixelToLogicWidth( pCaretXArray[i] );
+ }
}
-
if( nWidthFactor != 1 )
{
for( i = 0; i < 2*nLen; ++i )
+ {
pCaretXArray[i] /= nWidthFactor;
+ }
}
-
- // if requested move caret position to cell limits
- if( bCellBreaking )
- {
- ; // FIXME
- }
+#endif
return true;
}