summaryrefslogtreecommitdiff
path: root/vcl/source
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/source')
-rw-r--r--vcl/source/gdi/sallayout.cxx12
-rw-r--r--vcl/source/glyphs/graphite_layout.cxx4
-rw-r--r--vcl/source/outdev/map.cxx25
-rw-r--r--vcl/source/outdev/text.cxx117
4 files changed, 27 insertions, 131 deletions
diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx
index a3124c443e37..c30a99af01fb 100644
--- a/vcl/source/gdi/sallayout.cxx
+++ b/vcl/source/gdi/sallayout.cxx
@@ -1247,7 +1247,7 @@ void GenericSalLayout::KashidaJustify( long nKashidaIndex, int nKashidaWidth )
}
}
-void GenericSalLayout::GetCaretPositions( int nMaxIndex, DeviceCoordinate* pCaretXArray ) const
+void GenericSalLayout::GetCaretPositions( int nMaxIndex, long* pCaretXArray ) const
{
// initialize result array
long nXPos = -1;
@@ -1990,28 +1990,26 @@ DeviceCoordinate MultiSalLayout::FillDXArray( DeviceCoordinate* pCharWidths ) co
return nMaxWidth;
}
-void MultiSalLayout::GetCaretPositions( int nMaxIndex, DeviceCoordinate* pCaretXArray ) const
+void MultiSalLayout::GetCaretPositions( int nMaxIndex, long* pCaretXArray ) const
{
SalLayout& rLayout = *mpLayouts[ 0 ];
rLayout.GetCaretPositions( nMaxIndex, pCaretXArray );
if( mnLevel > 1 )
{
- DeviceCoordinate* pTempPos = (DeviceCoordinate*)alloca( nMaxIndex * sizeof(DeviceCoordinate) );
+ long* pTempPos = (long*)alloca( nMaxIndex * sizeof(long) );
for( int n = 1; n < mnLevel; ++n )
{
mpLayouts[ n ]->GetCaretPositions( nMaxIndex, pTempPos );
double fUnitMul = mnUnitsPerPixel;
fUnitMul /= mpLayouts[n]->GetUnitsPerPixel();
for( int i = 0; i < nMaxIndex; ++i )
- {
if( pTempPos[i] >= 0 )
{
- DeviceCoordinate w = pTempPos[i];
- w = (DeviceCoordinate)(w * fUnitMul + 0.5);
+ long w = pTempPos[i];
+ w = static_cast<long>(w*fUnitMul + 0.5);
pCaretXArray[i] = w;
}
- }
}
}
}
diff --git a/vcl/source/glyphs/graphite_layout.cxx b/vcl/source/glyphs/graphite_layout.cxx
index 508a0db1d733..6f7cbb252ab0 100644
--- a/vcl/source/glyphs/graphite_layout.cxx
+++ b/vcl/source/glyphs/graphite_layout.cxx
@@ -1090,14 +1090,14 @@ void GraphiteLayout::kashidaJustify(std::vector<int>& rDeltaWidths, sal_GlyphId
}
-void GraphiteLayout::GetCaretPositions( int nArraySize, DeviceCoordinate* pCaretXArray ) const
+void GraphiteLayout::GetCaretPositions( int nArraySize, long* pCaretXArray ) const
{
// For each character except the last discover the caret positions
// immediately before and after that character.
// This is used for underlines in the GUI amongst other things.
// It may be used from MultiSalLayout, in which case it must take into account
// glyphs that have been moved.
- std::fill(pCaretXArray, pCaretXArray + nArraySize, (DeviceCoordinate)-1);
+ std::fill(pCaretXArray, pCaretXArray + nArraySize, -1);
// the layout method doesn't modify the layout even though it isn't
// const in the interface
bool bRtl = (mnLayoutFlags & SAL_LAYOUT_BIDI_RTL);//const_cast<GraphiteLayout*>(this)->maLayout.rightToLeft();
diff --git a/vcl/source/outdev/map.cxx b/vcl/source/outdev/map.cxx
index 2cea0d3886fa..396a2c471014 100644
--- a/vcl/source/outdev/map.cxx
+++ b/vcl/source/outdev/map.cxx
@@ -2142,31 +2142,6 @@ long Window::ImplLogicUnitToPixelY( long nY, MapUnit eUnit )
return nY;
}
-long OutputDevice::DeviceCoordinateToLogicWidth(DeviceCoordinate width) const
-{
- if ( !mbMap )
- {
- return (long)width;
- }
-#if VCL_FLOAT_DEVICE_PIXEL
- return (long)(width / (maMapRes.mfScaleX * mnDPIX));
-#else
- return ImplDevicePixelToLogicWidth(width);
-#endif
-}
-
-long OutputDevice::DeviceCoordinateToLogicHeight(DeviceCoordinate height) const
-{
- if ( !mbMap )
- {
- return (long)height;
- }
-#if VCL_FLOAT_DEVICE_PIXEL
- return (long)(height / (maMapRes.mfScaleY * mnDPIY));
-#else
- return ImplDevicePixelToLogicHeight(height);
-#endif
-}
DeviceCoordinate OutputDevice::LogicWidthToDeviceCoordinate( long nWidth ) const
{
diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx
index 1dff2db44141..51117fe1c172 100644
--- a/vcl/source/outdev/text.cxx
+++ b/vcl/source/outdev/text.cxx
@@ -1014,7 +1014,6 @@ 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();
@@ -1027,41 +1026,36 @@ long OutputDevice::GetTextArray( const OUString& rStr, long* pDXAry,
pDXPixelArray[ i ] += pDXPixelArray[ i-1 ];
}
}
- if( nWidthFactor > 1 )
+ if( mbMap )
{
if( pDXPixelArray )
{
for( int i = 0; i < nLen; ++i )
{
- pDXPixelArray[i] /= nWidthFactor;
+ pDXPixelArray[i] = ImplDevicePixelToLogicWidth( pDXPixelArray[i] );
}
}
- nWidth /= nWidthFactor;
+ nWidth = ImplDevicePixelToLogicWidth( nWidth );
}
- if( mbMap )
+ if( nWidthFactor > 1 )
{
if( pDXPixelArray )
{
for( int i = 0; i < nLen; ++i )
{
- pDXAry[i] = DeviceCoordinateToLogicWidth( pDXPixelArray[i] );
+ pDXPixelArray[i] /= nWidthFactor;
}
}
- nWidthRes = DeviceCoordinateToLogicWidth( nWidth );
+ nWidth /= nWidthFactor;
}
- else
+ if(pDXAry)
{
- if( pDXPixelArray )
+ for( int i = 0; i < nLen; ++i )
{
- for( int i = 0; i < nLen; ++i )
- {
- pDXAry[i] = (long)pDXPixelArray[i];
- }
+ pDXAry[i] = basegfx::fround(pDXPixelArray[i]);
}
- nWidthRes = (long) nWidth;
}
-
- return nWidth;
+ return basegfx::fround(nWidth);
#else /* ! VCL_FLOAT_DEVICE_PIXEL */
@@ -1097,7 +1091,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() )
@@ -1111,121 +1105,50 @@ 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 );
- DeviceCoordinate nWidth = pSalLayout->GetTextWidth();
+ long nWidth = pSalLayout->GetTextWidth();
pSalLayout->Release();
// fixup unknown caret positions
int i;
for( i = 0; i < 2 * nLen; ++i )
- {
if( pCaretXArray[ i ] >= 0 )
- {
break;
- }
- }
- DeviceCoordinate nXPos = pCaretXArray[ i ];
+ long 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;
- }
}
-#endif
+
+ // if requested move caret position to cell limits
+ if( bCellBreaking )
+ {
+ ; // FIXME
+ }
return true;
}