summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorNorbert Thiebaud <nthiebaud@gmail.com>2014-07-15 21:45:11 +0200
committerNorbert Thiebaud <nthiebaud@gmail.com>2014-07-15 21:45:11 +0200
commit7a8fcfca98ee10666c58011ebe0a5f96e008d22d (patch)
tree9b309898f40cde3f9945c170ec46e628d10d66cf /vcl
parent6c8de2b107964cd3d26dba8fcf80c6da77b1d97a (diff)
fdo#79673 quartz: draw 'bullet' for 'space' directly in one pass
the current implementation of CoreText simply dropped the proper implementation of DrawTextArray, by ignoring DXArray this very visibly borked the show-non-displayable character feature of writer.. the bullet representing the 'spaces' was quite misplaced. This solve specifically this problem. More work is needed to bring proper support of DXArray back to CoreText Conflicts: vcl/inc/sallayout.hxx vcl/source/outdev/text.cxx Change-Id: Idb2cc90d5ffaa8b83f79241cee2d512112d1c3be
Diffstat (limited to 'vcl')
-rw-r--r--vcl/inc/sallayout.hxx16
-rw-r--r--vcl/quartz/ctlayout.cxx54
-rw-r--r--vcl/source/outdev/text.cxx26
3 files changed, 69 insertions, 27 deletions
diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx
index 03f314fe1c87..d191a38417cf 100644
--- a/vcl/inc/sallayout.hxx
+++ b/vcl/inc/sallayout.hxx
@@ -40,19 +40,6 @@ typedef unsigned short LanguageType;
class SalGraphics;
class PhysicalFontFace;
-// Layout options
-#define SAL_LAYOUT_BIDI_RTL 0x0001
-#define SAL_LAYOUT_BIDI_STRONG 0x0002
-#define SAL_LAYOUT_RIGHT_ALIGN 0x0004
-#define SAL_LAYOUT_KERNING_PAIRS 0x0010
-#define SAL_LAYOUT_KERNING_ASIAN 0x0020
-#define SAL_LAYOUT_VERTICAL 0x0040
-#define SAL_LAYOUT_COMPLEX_DISABLED 0x0100
-#define SAL_LAYOUT_ENABLE_LIGATURES 0x0200
-#define SAL_LAYOUT_SUBSTITUTE_DIGITS 0x0400
-#define SAL_LAYOUT_KASHIDA_JUSTIFICATON 0x0800
-#define SAL_LAYOUT_DISABLE_GLYPH_PROCESSING 0x1000
-#define SAL_LAYOUT_FOR_FALLBACK 0x2000
// used for managing runs e.g. for BiDi, glyph and script fallback
class VCL_PLUGIN_PUBLIC ImplLayoutRuns
@@ -99,7 +86,8 @@ public:
public:
ImplLayoutArgs( const sal_Unicode* pStr, int nLength,
- int nMinCharPos, int nEndCharPos, int nFlags, const LanguageTag& rLanguageTag );
+ int nMinCharPos, int nEndCharPos, int nFlags,
+ const LanguageTag& rLanguageTag );
void SetLayoutWidth( long nWidth ) { mnLayoutWidth = nWidth; }
void SetDXArray( const sal_Int32* pDXArray ) { mpDXArray = pDXArray; }
diff --git a/vcl/quartz/ctlayout.cxx b/vcl/quartz/ctlayout.cxx
index cf440990f3e4..ea6d406bddef 100644
--- a/vcl/quartz/ctlayout.cxx
+++ b/vcl/quartz/ctlayout.cxx
@@ -380,6 +380,60 @@ void CTLayout::drawCTLine(AquaSalGraphics& rAquaGraphics, CTLineRef ctline, cons
// draw the text
CTLineDraw( ctline, rAquaGraphics.mrContext );
+ if(mnLayoutFlags & SAL_LAYOUT_DRAW_BULLET)
+ {
+ CFArrayRef runArray = CTLineGetGlyphRuns(ctline);
+ CFIndex runCount = CFArrayGetCount(runArray);
+
+ CFIndex runIndex = 0;
+ CTLineRef ctlinebullet = 0;
+ OUString sBullet((sal_Unicode)0xb7); // centered bullet
+
+ for (; runIndex < runCount; runIndex++)
+ {
+
+ CTRunRef run = (CTRunRef)CFArrayGetValueAtIndex(runArray, runIndex);
+ CFIndex runGlyphCount = CTRunGetGlyphCount(run);
+
+ CGPoint position;
+ CFIndex runGlyphIndex = 0;
+ CFIndex stringIndice = 0;
+
+ for (; runGlyphIndex < runGlyphCount; runGlyphIndex++)
+ {
+ CFRange glyphRange = CFRangeMake(runGlyphIndex, 1);
+
+ CTRunGetStringIndices( run, glyphRange, &stringIndice );
+ UniChar curChar = CFStringGetCharacterAtIndex (CFAttributedStringGetString(mpAttrString), stringIndice);
+ if(curChar == ' ')
+ {
+ CTRunGetPositions(run, glyphRange, &position);
+ // print a dot
+ if(!ctlinebullet)
+ {
+ CFStringRef aCFText = CFStringCreateWithCharactersNoCopy( NULL,
+ sBullet.getStr(),
+ 1,
+ kCFAllocatorNull );
+ // CFAttributedStringCreate copies the attribues parameter
+ CFAttributedStringRef bulletAttrString = CFAttributedStringCreate( NULL, aCFText, mpTextStyle->GetStyleDict() );
+ ctlinebullet = CTLineCreateWithAttributedString( bulletAttrString );
+ CFRelease( aCFText);
+ CFRelease( bulletAttrString);
+ RGBAColor bulletColor(MAKE_SALCOLOR(0x26, 0x8b, 0xd2 )); // NON_PRINTING_CHARACTER_COLOR
+ CGContextSetFillColor( rAquaGraphics.mrContext, bulletColor.AsArray() );
+ }
+ CGContextSetTextPosition( rAquaGraphics.mrContext, aTextPos.x + position.x, position.y + aTextPos.y );
+ CTLineDraw(ctlinebullet, rAquaGraphics.mrContext);
+ }
+ }
+ }
+ if(ctlinebullet)
+ {
+ CFRelease(ctlinebullet);
+ }
+ }
+
// restore the original graphic context transformations
SAL_INFO( "vcl.ct", "CGContextRestoreGState(" << rAquaGraphics.mrContext << ")" );
CGContextRestoreGState( rAquaGraphics.mrContext );
diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx
index 1c20f7f08050..93a0e919d2a2 100644
--- a/vcl/source/outdev/text.cxx
+++ b/vcl/source/outdev/text.cxx
@@ -281,8 +281,8 @@ bool OutputDevice::ImplDrawRotateText( SalLayout& rSalLayout )
}
bool OutputDevice::ImplDrawTextDirect( SalLayout& rSalLayout,
- bool bTextLines,
- sal_uInt32 flags )
+ bool bTextLines,
+ sal_uInt32 flags )
{
if( mpFontEntry->mnOwnOrientation )
if( ImplDrawRotateText( rSalLayout ) )
@@ -950,7 +950,7 @@ float OutputDevice::approximate_char_width() const
void OutputDevice::DrawTextArray( const Point& rStartPt, const OUString& rStr,
const sal_Int32* pDXAry,
- sal_Int32 nIndex, sal_Int32 nLen )
+ sal_Int32 nIndex, sal_Int32 nLen, int flags )
{
if(nLen == 0x0FFFF)
{
@@ -973,7 +973,7 @@ void OutputDevice::DrawTextArray( const Point& rStartPt, const OUString& rStr,
if( mbOutputClipped )
return;
- SalLayout* pSalLayout = ImplLayout(rStr, nIndex, nLen, rStartPt, 0, pDXAry);
+ SalLayout* pSalLayout = ImplLayout(rStr, nIndex, nLen, rStartPt, 0, pDXAry, flags);
if( pSalLayout )
{
ImplDrawText( *pSalLayout );
@@ -981,7 +981,7 @@ void OutputDevice::DrawTextArray( const Point& rStartPt, const OUString& rStr,
}
if( mpAlphaVDev )
- mpAlphaVDev->DrawTextArray( rStartPt, rStr, pDXAry, nIndex, nLen );
+ mpAlphaVDev->DrawTextArray( rStartPt, rStr, pDXAry, nIndex, nLen, flags );
}
long OutputDevice::GetTextArray( const OUString& rStr, sal_Int32* pDXAry,
@@ -1101,7 +1101,7 @@ bool OutputDevice::GetCaretPositions( const OUString& rStr, sal_Int32* pCaretXAr
void OutputDevice::DrawStretchText( const Point& rStartPt, sal_uLong nWidth,
const OUString& rStr,
- sal_Int32 nIndex, sal_Int32 nLen )
+ sal_Int32 nIndex, sal_Int32 nLen)
{
if(nIndex < 0 || nIndex == 0x0FFFF || nLen == 0x0FFFF)
{
@@ -1131,8 +1131,9 @@ void OutputDevice::DrawStretchText( const Point& rStartPt, sal_uLong nWidth,
}
ImplLayoutArgs OutputDevice::ImplPrepareLayoutArgs( OUString& rStr,
- const sal_Int32 nMinIndex, const sal_Int32 nLen,
- long nPixelWidth, const sal_Int32* pDXArray ) const
+ const sal_Int32 nMinIndex, const sal_Int32 nLen,
+ long nPixelWidth, const sal_Int32* pDXArray,
+ int nLayoutFlags ) const
{
assert(nMinIndex >= 0);
assert(nLen >= 0);
@@ -1146,7 +1147,6 @@ ImplLayoutArgs OutputDevice::ImplPrepareLayoutArgs( OUString& rStr,
if( nEndIndex < nMinIndex )
nEndIndex = nMinIndex;
- int nLayoutFlags = 0;
if( mnTextLayoutMode & TEXT_LAYOUT_BIDI_RTL )
nLayoutFlags |= SAL_LAYOUT_BIDI_RTL;
if( mnTextLayoutMode & TEXT_LAYOUT_BIDI_STRONG )
@@ -1244,9 +1244,9 @@ ImplLayoutArgs OutputDevice::ImplPrepareLayoutArgs( OUString& rStr,
}
SalLayout* OutputDevice::ImplLayout(const OUString& rOrigStr,
- sal_Int32 nMinIndex, sal_Int32 nLen,
- const Point& rLogicalPos, long nLogicalWidth,
- const sal_Int32* pDXArray) const
+ sal_Int32 nMinIndex, sal_Int32 nLen,
+ const Point& rLogicalPos, long nLogicalWidth,
+ const sal_Int32* pDXArray, int flags) const
{
// we need a graphics
if( !mpGraphics )
@@ -1292,7 +1292,7 @@ SalLayout* OutputDevice::ImplLayout(const OUString& rOrigStr,
pDXArray = pTempDXAry;
}
- ImplLayoutArgs aLayoutArgs = ImplPrepareLayoutArgs( aStr, nMinIndex, nLen, nPixelWidth, pDXArray );
+ ImplLayoutArgs aLayoutArgs = ImplPrepareLayoutArgs( aStr, nMinIndex, nLen, nPixelWidth, pDXArray, flags);
// get matching layout object for base font
SalLayout* pSalLayout = mpGraphics->GetTextLayout( aLayoutArgs, 0 );