diff options
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/sallayout.hxx | 16 | ||||
-rw-r--r-- | vcl/quartz/ctlayout.cxx | 54 | ||||
-rw-r--r-- | vcl/source/outdev/text.cxx | 26 |
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 ); |