vcl/inc/graphite_layout.hxx | 2 vcl/inc/graphite_serverfont.hxx | 6 vcl/inc/sallayout.hxx | 12 - vcl/quartz/ctlayout.cxx | 282 +++++++++++++++++++--------------- vcl/source/gdi/sallayout.cxx | 21 +- vcl/source/glyphs/graphite_layout.cxx | 2 vcl/win/source/gdi/winlayout.cxx | 28 +-- 7 files changed, 194 insertions(+), 159 deletions(-)
New commits: commit 5ef4bdc7b15686e55fa19f2e98a828763a0cfae6 Author: Norbert Thiebaud <nthieb...@gmail.com> Date: Tue Sep 2 14:09:12 2014 +0200 fdo#82818 vcl macosx. fix asian vertical ctlayout Just revert ot regular CTRunDraw in that case and adjust 'ullet' displaying. Change-Id: I9ef80f5985b8c7610fcc8e9e8acd5b27542f8730 diff --git a/vcl/quartz/ctlayout.cxx b/vcl/quartz/ctlayout.cxx index cacd6b8..cd9771a 100644 --- a/vcl/quartz/ctlayout.cxx +++ b/vcl/quartz/ctlayout.cxx @@ -178,20 +178,42 @@ void CTLayout::ApplyDXArray(ImplLayoutArgs& rArgs) if(!(status & kCTRunStatusNonMonotonic)) { - /* simple 1 to 1 */ - for(int i = 0 ; i < iter->m_nGlyphs; i++) + if(mnLayoutFlags & SAL_LAYOUT_VERTICAL) { - if(iter->m_pStringIndices[i] == 0) + /* simple 1 to 1 */ + for(int i = 0 ; i < iter->m_nGlyphs; i++) { - iter->m_pAdjPositions[i].x = 0; - SAL_INFO( "vcl.ct", "Apply DXArray["<< i << "]: 0.0 pos: " << iter->m_pPositions[i].x); + if(iter->m_pStringIndices[i] == 0) + { + iter->m_pAdjPositions[i].x = 0; + SAL_INFO( "vcl.ct", "Apply DXArray["<< i << "]: 0.0 pos: " << iter->m_pPositions[i].x); + } + else + { + iter->m_pAdjPositions[i].x = rArgs.mpDXArray[iter->m_pStringIndices[i-1]]; + SAL_INFO( "vcl.ct", "Apply to i DXArray["<< iter->m_pStringIndices[i-1] << "]: " << + rArgs.mpDXArray[iter->m_pStringIndices[i-1]] << " pos:( " << iter->m_pPositions[i].x << ", " << iter->m_pPositions[i].y); + } + iter->m_pAdjPositions[i].y = iter->m_pPositions[i].y; } - else + } + else + { + /* simple 1 to 1 */ + for(int i = 0 ; i < iter->m_nGlyphs; i++) { - iter->m_pAdjPositions[i].x = rArgs.mpDXArray[iter->m_pStringIndices[i-1]]; - SAL_INFO( "vcl.ct", "Apply to i DXArray["<< iter->m_pStringIndices[i-1] << "]: " << rArgs.mpDXArray[iter->m_pStringIndices[i-1]] << " pos: " << iter->m_pPositions[i].x); + if(iter->m_pStringIndices[i] == 0) + { + iter->m_pAdjPositions[i].x = 0; + SAL_INFO( "vcl.ct", "Apply DXArray["<< i << "]: 0.0 pos: " << iter->m_pPositions[i].x); + } + else + { + iter->m_pAdjPositions[i].x = rArgs.mpDXArray[iter->m_pStringIndices[i-1]]; + SAL_INFO( "vcl.ct", "Apply to i DXArray["<< iter->m_pStringIndices[i-1] << "]: " << rArgs.mpDXArray[iter->m_pStringIndices[i-1]] << " pos: " << iter->m_pPositions[i].x); + } + iter->m_pAdjPositions[i].y = iter->m_pPositions[i].y; } - iter->m_pAdjPositions[i].y = iter->m_pPositions[i].y; } } else @@ -434,130 +456,152 @@ void CTLayout::drawCTLine(AquaSalGraphics& rAquaGraphics, CTLineRef ctline, cons * iow that we want to use DXArray to align glyphs * Otherwise we just use CoreText to display the whole line */ - boost::ptr_vector<CTRunData>::const_iterator iter = m_vRunData.begin(); - if(iter != m_vRunData.end()) + + if(!(mnLayoutFlags & SAL_LAYOUT_VERTICAL)) { - for(; iter != m_vRunData.end(); ++iter) + boost::ptr_vector<CTRunData>::const_iterator iter = m_vRunData.begin(); + if(iter != m_vRunData.end()) { - CTRunRef run = iter->m_pRun; - /* if we do not have Ajusted Poistions for a run, just use CoreText to draw it */ - if(iter->m_pAdjPositions) + for(; iter != m_vRunData.end(); ++iter) { - CTFontRef runFont = iter->m_pFont; - CGFloat baseSize = CTFontGetSize(runFont); - for (CFIndex runGlyphIndex = 0; - runGlyphIndex < CTRunGetGlyphCount(run); - runGlyphIndex++) + CTRunRef run = iter->m_pRun; + /* if we do not have Ajusted Poistions for a run, just use CoreText to draw it */ + if(iter->m_pAdjPositions) { - CGFontRef cgFont = CTFontCopyGraphicsFont(runFont, NULL); - CGContextSaveGState(context); + CTFontRef runFont = iter->m_pFont; + CGFloat baseSize = CTFontGetSize(runFont); + for (CFIndex runGlyphIndex = 0; + runGlyphIndex < CTRunGetGlyphCount(run); + runGlyphIndex++) + { + CGFontRef cgFont = CTFontCopyGraphicsFont(runFont, NULL); + CGContextSaveGState(context); - CGContextSetFont(context, cgFont); - CGContextSetFontSize(context, CTFontGetSize(runFont)); - CGContextSetFillColor( context, rAquaGraphics.maTextColor.AsArray() ); - CGContextSetTextPosition( context, aTextPos.x, aTextPos.y ); - CGContextShowGlyphsAtPositions(context, iter->m_pGlyphs + runGlyphIndex, - iter->m_pAdjPositions + runGlyphIndex, 1); - CGContextRestoreGState(context); - CFRelease(cgFont); - } - /* Do we want to show 'space' as 'bullet' */ - if(mnLayoutFlags & SAL_LAYOUT_DRAW_BULLET) - { - for(int i = 0 ; i < iter->m_nGlyphs; i++) + CGContextSetFont(context, cgFont); + CGContextSetFontSize(context, CTFontGetSize(runFont)); + CGContextSetFillColor( context, rAquaGraphics.maTextColor.AsArray() ); + if(mnLayoutFlags & SAL_LAYOUT_VERTICAL) + { + CGContextRotateCTM( context, -F_PI/2 ); + } + CGContextSetTextPosition( context, aTextPos.x, aTextPos.y ); + SAL_INFO( "vcl.ct", "CGContextSetTextPosition(" << aTextPos.x << ", " << aTextPos.y << ")"); + SAL_INFO( "vcl.ct", "CGContextShowGlyphAt(" << iter->m_pAdjPositions[runGlyphIndex].x << ", " << iter->m_pAdjPositions[runGlyphIndex].y << ")"); + + CGContextShowGlyphsAtPositions(context, iter->m_pGlyphs + runGlyphIndex, + iter->m_pAdjPositions + runGlyphIndex, 1); + CGContextRestoreGState(context); + CFRelease(cgFont); + } + /* Do we want to show 'space' as 'bullet' */ + if(mnLayoutFlags & SAL_LAYOUT_DRAW_BULLET) { - UniChar curChar = CFStringGetCharacterAtIndex (CFAttributedStringGetString(mpAttrString), - iter->m_pStringIndices[i]); - /* is the character associated with the current glyph a space ? */ - if(curChar == ' ') + for(int i = 0 ; i < iter->m_nGlyphs; i++) { - /* make a rect that will enclose the bullet we want to draw */ - CFRange glyphRange = CFRangeMake(i, 1); - CGFloat ascent; - CGFloat descent; - CGFloat leading; - CTRunGetTypographicBounds ( run, glyphRange, - &ascent, &descent, &leading); - CGRect bulletRect = CGRectMake(aTextPos.x + iter->m_pAdjPositions[i].x + iter->m_pAdvances[i].width / 4, - aTextPos.y + iter->m_pAdjPositions[i].y + ascent / 3 - baseSize / 5, baseSize / 5, baseSize / 5 ); - - /* Draw a bullet filled with the 'special' color for non-displayable characters */ - CGContextSaveGState(context); - RGBAColor bulletColor(MAKE_SALCOLOR(0x26, 0x8b, 0xd2 )); // NON_PRINTING_CHARACTER_COLOR - CGContextSetFillColor( context, bulletColor.AsArray() ); - CGContextSetStrokeColor(context, bulletColor.AsArray()); - CGContextBeginPath(context); - CGContextAddEllipseInRect(context, bulletRect); - CGContextDrawPath(context, kCGPathFillStroke); // Or kCGPathFill - CGContextRestoreGState(context); + UniChar curChar = CFStringGetCharacterAtIndex (CFAttributedStringGetString(mpAttrString), + iter->m_pStringIndices[i]); + /* is the character associated with the current glyph a space ? */ + if(curChar == ' ') + { + /* make a rect that will enclose the bullet we want to draw */ + CFRange glyphRange = CFRangeMake(i, 1); + CGFloat ascent; + CGFloat descent; + CGFloat leading; + CTRunGetTypographicBounds ( run, glyphRange, + &ascent, &descent, &leading); + CGRect bulletRect; + bulletRect = CGRectMake(aTextPos.x + iter->m_pAdjPositions[i].x + iter->m_pAdvances[i].width / 4, + aTextPos.y + iter->m_pAdjPositions[i].y + ascent / 3 - baseSize / 5, baseSize / 5, baseSize / 5 ); + + /* Draw a bullet filled with the 'special' color for non-displayable characters */ + CGContextSaveGState(context); + RGBAColor bulletColor(MAKE_SALCOLOR(0x26, 0x8b, 0xd2 )); // NON_PRINTING_CHARACTER_COLOR + CGContextSetFillColor( context, bulletColor.AsArray() ); + CGContextSetStrokeColor(context, bulletColor.AsArray()); + CGContextBeginPath(context); + CGContextAddEllipseInRect(context, bulletRect); + CGContextDrawPath(context, kCGPathFillStroke); // Or kCGPathFill + CGContextRestoreGState(context); + } } } } + else + { + CTRunDraw(run, context, CFRangeMake( 0, 0 )); + /* Fixme draw bullet */ + } } - else - { - CTRunDraw(run, context, CFRangeMake( 0, 0 )); - /* Fixme draw bullet */ - } + CGContextRestoreGState( context ); + return; } } - else + + SAL_INFO( "vcl.ct", "CTLineDraw(" << ctline << "," << context << ")" ); + // draw the text + CTLineDraw( ctline, context ); + + if(mnLayoutFlags & SAL_LAYOUT_DRAW_BULLET) { - SAL_INFO( "vcl.ct", "CTLineDraw(" << ctline << "," << context << ")" ); - // draw the text - CTLineDraw( ctline, context ); + CFArrayRef runArray = CTLineGetGlyphRuns(ctline); + CFIndex runCount = CFArrayGetCount(runArray); - if(mnLayoutFlags & SAL_LAYOUT_DRAW_BULLET) + for (CFIndex runIndex = 0; runIndex < runCount; runIndex++) { - CFArrayRef runArray = CTLineGetGlyphRuns(ctline); - CFIndex runCount = CFArrayGetCount(runArray); - - for (CFIndex runIndex = 0; runIndex < runCount; runIndex++) + CTRunRef run = (CTRunRef)CFArrayGetValueAtIndex(runArray, runIndex); + CFIndex runGlyphCount = CTRunGetGlyphCount(run); + CGPoint position; + CGSize advance; + CFIndex runGlyphIndex = 0; + CFIndex stringIndice = 0; + + for (; runGlyphIndex < runGlyphCount; runGlyphIndex++) { - - CTRunRef run = (CTRunRef)CFArrayGetValueAtIndex(runArray, runIndex); - CFIndex runGlyphCount = CTRunGetGlyphCount(run); - - CGPoint position; - CGSize advance; - 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 == ' ') { - CFRange glyphRange = CFRangeMake(runGlyphIndex, 1); - - CTRunGetStringIndices( run, glyphRange, &stringIndice ); - UniChar curChar = CFStringGetCharacterAtIndex (CFAttributedStringGetString(mpAttrString), stringIndice); - if(curChar == ' ') + CGFloat ascent; + CGFloat descent; + CGFloat leading; + CTFontRef runFont = (CTFontRef)CFDictionaryGetValue(CTRunGetAttributes(run), + kCTFontAttributeName); + CGFloat baseSize = CTFontGetSize(runFont); + CTRunGetTypographicBounds ( run, glyphRange, + &ascent, &descent, &leading); + CTRunGetPositions(run, glyphRange, &position); + CTRunGetAdvances(run, glyphRange, &advance); + CGRect bulletRect; + if(mnLayoutFlags & SAL_LAYOUT_VERTICAL) { - CGFloat ascent; - CGFloat descent; - CGFloat leading; - CTFontRef runFont = (CTFontRef)CFDictionaryGetValue(CTRunGetAttributes(run), - kCTFontAttributeName); - CGFloat baseSize = CTFontGetSize(runFont); - CTRunGetTypographicBounds ( run, glyphRange, - &ascent, &descent, &leading); - - CTRunGetPositions(run, glyphRange, &position); - CTRunGetAdvances(run, glyphRange, &advance); - CGRect bulletRect = CGRectMake(aTextPos.x + position.x + advance.width / 4, - aTextPos.y + position.y + ascent / 3 - baseSize / 5, baseSize / 5, baseSize / 5 ); - CGContextSaveGState(context); - RGBAColor bulletColor(MAKE_SALCOLOR(0x26, 0x8b, 0xd2 )); // NON_PRINTING_CHARACTER_COLOR - CGContextSetFillColor( context, bulletColor.AsArray() ); - CGContextSetStrokeColor(context, bulletColor.AsArray()); + bulletRect = CGRectMake(position.x - advance.width / 4, + -position.y, baseSize / 5, baseSize / 5 ); + } + else + { + bulletRect = CGRectMake(position.x + advance.width / 4, + position.y + ascent / 3 - baseSize / 5, baseSize / 5, baseSize / 5 ); + } - CGContextBeginPath(context); - CGContextAddEllipseInRect(context, bulletRect); - CGContextDrawPath(context, kCGPathFillStroke); // Or kCGPathFill - CGContextRestoreGState(context); + CGContextSaveGState(context); + CGContextTranslateCTM(context, aTextPos.x, aTextPos.y); + RGBAColor bulletColor(MAKE_SALCOLOR(0x26, 0x8b, 0xd2 )); // NON_PRINTING_CHARACTER_COLOR + CGContextSetFillColor( context, bulletColor.AsArray() ); + CGContextSetStrokeColor(context, bulletColor.AsArray()); + if(mnLayoutFlags & SAL_LAYOUT_VERTICAL) + { + CGContextRotateCTM( context, -F_PI/2 ); } + + CGContextBeginPath(context); + CGContextAddEllipseInRect(context, bulletRect); + CGContextDrawPath(context, kCGPathFillStroke); // Or kCGPathFill + CGContextRestoreGState(context); } } } - } // restore the original graphic context transformations SAL_INFO( "vcl.ct", "CGContextRestoreGState(" << context << ")" ); commit 1a9264c472cd0449641c5206cdf86c8c3412070f Author: Norbert Thiebaud <nthieb...@gmail.com> Date: Sat Aug 16 21:44:55 2014 +0200 extra witdh for GetTextBreak is of DeviceCoordinate Change-Id: Ic25eae1e9b8ae14022ee8d0373be0978ebc21267 diff --git a/vcl/inc/graphite_layout.hxx b/vcl/inc/graphite_layout.hxx index 24b668d..3295468 100644 --- a/vcl/inc/graphite_layout.hxx +++ b/vcl/inc/graphite_layout.hxx @@ -123,7 +123,7 @@ public: virtual void AdjustLayout( ImplLayoutArgs& ) SAL_OVERRIDE; // adjusting positions // methods using string indexing - virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, long nCharExtra=0, int nFactor=1) const SAL_OVERRIDE; + virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra=0, int nFactor=1) const SAL_OVERRIDE; virtual DeviceCoordinate FillDXArray( DeviceCoordinate* pDXArray ) const SAL_OVERRIDE; virtual void ApplyDXArray(ImplLayoutArgs &rArgs, std::vector<int> & rDeltaWidth); diff --git a/vcl/inc/graphite_serverfont.hxx b/vcl/inc/graphite_serverfont.hxx index 9529b1d..0d533e0 100644 --- a/vcl/inc/graphite_serverfont.hxx +++ b/vcl/inc/graphite_serverfont.hxx @@ -76,9 +76,9 @@ public: { return maImpl.FillDXArray(dxa); } - virtual sal_Int32 GetTextBreak(DeviceCoordinate mw, long ce, int f) const SAL_OVERRIDE + virtual sal_Int32 GetTextBreak(DeviceCoordinate max_width, DeviceCoordinate extra, int factor) const SAL_OVERRIDE { - return maImpl.GetTextBreak(mw, ce, f); + return maImpl.GetTextBreak(max_width, extra, factor); } virtual void GetCaretPositions( int as, long* cxa ) const SAL_OVERRIDE { diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx index 4d56bba7..3a2061b 100644 --- a/vcl/inc/sallayout.hxx +++ b/vcl/inc/sallayout.hxx @@ -171,7 +171,7 @@ public: int GetOrientation() const { return mnOrientation; } // methods using string indexing - virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, long nCharExtra=0, int nFactor=1) const = 0; + virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra=0, int nFactor=1) const = 0; virtual DeviceCoordinate FillDXArray( DeviceCoordinate* pDXArray ) const = 0; virtual DeviceCoordinate GetTextWidth() const { return FillDXArray( NULL ); } virtual void GetCaretPositions( int nArraySize, long* pCaretXArray ) const = 0; @@ -229,7 +229,7 @@ class VCL_PLUGIN_PUBLIC MultiSalLayout : public SalLayout { public: virtual void DrawText( SalGraphics& ) const SAL_OVERRIDE; - virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, long nCharExtra, int nFactor) const SAL_OVERRIDE; + virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor) const SAL_OVERRIDE; virtual DeviceCoordinate FillDXArray( DeviceCoordinate* pDXArray ) const SAL_OVERRIDE; virtual void GetCaretPositions( int nArraySize, long* pCaretXArray ) const SAL_OVERRIDE; virtual int GetNextGlyphs( int nLen, sal_GlyphId* pGlyphIdxAry, Point& rPos, @@ -331,7 +331,7 @@ public: // used by upper layers virtual DeviceCoordinate GetTextWidth() const SAL_OVERRIDE; virtual DeviceCoordinate FillDXArray( DeviceCoordinate* pDXArray ) const SAL_OVERRIDE; - virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, long nCharExtra, int nFactor) const SAL_OVERRIDE; + virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor) const SAL_OVERRIDE; virtual void GetCaretPositions( int nArraySize, long* pCaretXArray ) const SAL_OVERRIDE; // used by display layers diff --git a/vcl/quartz/ctlayout.cxx b/vcl/quartz/ctlayout.cxx index da844a7..cacd6b8 100644 --- a/vcl/quartz/ctlayout.cxx +++ b/vcl/quartz/ctlayout.cxx @@ -44,7 +44,7 @@ public: virtual DeviceCoordinate GetTextWidth() const SAL_OVERRIDE; virtual DeviceCoordinate FillDXArray( DeviceCoordinate* pDXArray ) const SAL_OVERRIDE; - virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, long nCharExtra, int nFactor) const SAL_OVERRIDE; + virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor) const SAL_OVERRIDE; virtual void GetCaretPositions( int nArraySize, long* pCaretXArray ) const SAL_OVERRIDE; virtual bool GetBoundRect( SalGraphics&, Rectangle& ) const SAL_OVERRIDE; @@ -756,7 +756,7 @@ DeviceCoordinate CTLayout::FillDXArray( DeviceCoordinate* pDXArray ) const return nPixWidth; } -sal_Int32 CTLayout::GetTextBreak( DeviceCoordinate nMaxWidth, long nCharExtra, int nFactor ) const +sal_Int32 CTLayout::GetTextBreak( DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor ) const { if( !mpCTLine ) { diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx index 471d298..c30a99a 100644 --- a/vcl/source/gdi/sallayout.cxx +++ b/vcl/source/gdi/sallayout.cxx @@ -1277,7 +1277,7 @@ void GenericSalLayout::GetCaretPositions( int nMaxIndex, long* pCaretXArray ) co } } -sal_Int32 GenericSalLayout::GetTextBreak( DeviceCoordinate nMaxWidth, long nCharExtra, int nFactor ) const +sal_Int32 GenericSalLayout::GetTextBreak( DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor ) const { int nCharCapacity = mnEndCharPos - mnMinCharPos; DeviceCoordinate* pCharWidths = (DeviceCoordinate*)alloca( nCharCapacity * sizeof(DeviceCoordinate) ); @@ -1907,7 +1907,7 @@ void MultiSalLayout::DrawText( SalGraphics& rGraphics ) const // NOTE: now the baselevel font is active again } -sal_Int32 MultiSalLayout::GetTextBreak( DeviceCoordinate nMaxWidth, long nCharExtra, int nFactor ) const +sal_Int32 MultiSalLayout::GetTextBreak( DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor ) const { if( mnLevel <= 0 ) return -1; diff --git a/vcl/source/glyphs/graphite_layout.cxx b/vcl/source/glyphs/graphite_layout.cxx index 12b5ea9..6f7cbb2 100644 --- a/vcl/source/glyphs/graphite_layout.cxx +++ b/vcl/source/glyphs/graphite_layout.cxx @@ -681,7 +681,7 @@ bool GraphiteLayout::LayoutGlyphs(ImplLayoutArgs& rArgs, gr_segment * pSegment) return true; } -sal_Int32 GraphiteLayout::GetTextBreak(DeviceCoordinate maxmnWidth, long char_extra, int factor) const +sal_Int32 GraphiteLayout::GetTextBreak(DeviceCoordinate maxmnWidth, DeviceCoordinate char_extra, int factor) const { #ifdef GRLAYOUT_DEBUG fprintf(grLog(),"Gr::GetTextBreak c[%d-%d) maxWidth %ld char extra %ld factor %d\n", diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx index 49da725..eff3f9c 100644 --- a/vcl/win/source/gdi/winlayout.cxx +++ b/vcl/win/source/gdi/winlayout.cxx @@ -146,7 +146,7 @@ public: const PhysicalFontFace** pFallbackFonts = NULL ) const; virtual DeviceCoordinate FillDXArray( DeviceCoordinate* pDXArray ) const; - virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, long nCharExtra, int nFactor) const SAL_OVERRIDE; + virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor) const SAL_OVERRIDE; virtual void GetCaretPositions( int nArraySize, long* pCaretXArray ) const; // for glyph+font+script fallback @@ -644,7 +644,7 @@ DeviceCoordinate SimpleWinLayout::FillDXArray( DeviceCoordinate* pDXArray ) cons return mnWidth; } -sal_Int32 SimpleWinLayout::GetTextBreak( DeviceCoordinate nMaxWidth, long nCharExtra, int nFactor ) const +sal_Int32 SimpleWinLayout::GetTextBreak( DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor ) const // NOTE: the nFactor is used to prevent rounding errors for small nCharExtra values { if( mnWidth ) @@ -967,7 +967,7 @@ public: const PhysicalFontFace** pFallbackFonts = NULL ) const; virtual DeviceCoordinate FillDXArray( DeviceCoordinate* pDXArray ) const; - virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, long nCharExtra, int nFactor) const SAL_OVERRIDE; + virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor) const SAL_OVERRIDE; virtual void GetCaretPositions( int nArraySize, long* pCaretXArray ) const; virtual bool IsKashidaPosValid ( int nCharPos ) const; @@ -2115,7 +2115,7 @@ DeviceCoordinate UniscribeLayout::FillDXArray( DeviceCoordinate* pDXArray ) cons return nWidth; } -sal_Int32 UniscribeLayout::GetTextBreak( DeviceCoordinate nMaxWidth, long nCharExtra, int nFactor ) const +sal_Int32 UniscribeLayout::GetTextBreak( DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor ) const { long nWidth = 0; for( int i = mnMinCharPos; i < mnEndCharPos; ++i ) @@ -2640,7 +2640,7 @@ public: virtual void DrawText( SalGraphics& ) const; // methods using string indexing - virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, long nCharExtra=0, int nFactor=1) const SAL_OVERRIDE; + virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra=0, int nFactor=1) const SAL_OVERRIDE; virtual DeviceCoordinate FillDXArray( DeviceCoordinate* pDXArray ) const; virtual void GetCaretPositions( int nArraySize, long* pCaretXArray ) const; @@ -2776,7 +2776,7 @@ void GraphiteWinLayout::DrawText(SalGraphics &sal_graphics) const DeleteFont( SelectFont( aHDC, hOrigFont ) ); } -sal_Int32 GraphiteWinLayout::GetTextBreak(DeviceCoordinate nMaxWidth, long nCharExtra, int nFactor) const +sal_Int32 GraphiteWinLayout::GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor) const { sal_Int32 nBreak = maImpl.GetTextBreak(nMaxWidth, nCharExtra, nFactor); return nBreak; commit 1632f2a42eaf4c6bdcea9616b3ebc324ecdc30a3 Author: Norbert Thiebaud <nthieb...@gmail.com> Date: Sat Aug 16 19:50:56 2014 +0200 SalLayout GetTextWidth return DeviceCoordinate Change-Id: I5b995e54992213e95845e60169238270863e9a7e diff --git a/vcl/inc/graphite_serverfont.hxx b/vcl/inc/graphite_serverfont.hxx index 50063e4..9529b1d 100644 --- a/vcl/inc/graphite_serverfont.hxx +++ b/vcl/inc/graphite_serverfont.hxx @@ -68,7 +68,7 @@ public: maImpl.DrawOffset() = maDrawOffset; maImpl.AdjustLayout(rArgs); }; - virtual long GetTextWidth() const SAL_OVERRIDE + virtual DeviceCoordinate GetTextWidth() const SAL_OVERRIDE { return maImpl.GetTextWidth(); } diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx index d68a364..4d56bba7 100644 --- a/vcl/inc/sallayout.hxx +++ b/vcl/inc/sallayout.hxx @@ -173,7 +173,7 @@ public: // methods using string indexing virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, long nCharExtra=0, int nFactor=1) const = 0; virtual DeviceCoordinate FillDXArray( DeviceCoordinate* pDXArray ) const = 0; - virtual long GetTextWidth() const { return FillDXArray( NULL ); } + virtual DeviceCoordinate GetTextWidth() const { return FillDXArray( NULL ); } virtual void GetCaretPositions( int nArraySize, long* pCaretXArray ) const = 0; virtual bool IsKashidaPosValid ( int /*nCharPos*/ ) const { return true; } // i60594 @@ -323,13 +323,13 @@ public: void Reserve(int size) { m_GlyphItems.reserve(size + 1); } virtual void AdjustLayout( ImplLayoutArgs& ) SAL_OVERRIDE; virtual void ApplyDXArray( ImplLayoutArgs& ); - virtual void Justify( long nNewWidth ); + virtual void Justify( DeviceCoordinate nNewWidth ); void KashidaJustify( long nIndex, int nWidth ); void ApplyAsianKerning( const sal_Unicode*, int nLength ); void SortGlyphItems(); // used by upper layers - virtual long GetTextWidth() const SAL_OVERRIDE; + virtual DeviceCoordinate GetTextWidth() const SAL_OVERRIDE; virtual DeviceCoordinate FillDXArray( DeviceCoordinate* pDXArray ) const SAL_OVERRIDE; virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, long nCharExtra, int nFactor) const SAL_OVERRIDE; virtual void GetCaretPositions( int nArraySize, long* pCaretXArray ) const SAL_OVERRIDE; diff --git a/vcl/quartz/ctlayout.cxx b/vcl/quartz/ctlayout.cxx index 659d89b..da844a7 100644 --- a/vcl/quartz/ctlayout.cxx +++ b/vcl/quartz/ctlayout.cxx @@ -42,7 +42,7 @@ public: DeviceCoordinate* pGlyphAdvances, int* pCharIndexes, const PhysicalFontFace** pFallbackFonts ) const SAL_OVERRIDE; - virtual long GetTextWidth() const SAL_OVERRIDE; + virtual DeviceCoordinate GetTextWidth() const SAL_OVERRIDE; virtual DeviceCoordinate FillDXArray( DeviceCoordinate* pDXArray ) const SAL_OVERRIDE; virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, long nCharExtra, int nFactor) const SAL_OVERRIDE; virtual void GetCaretPositions( int nArraySize, long* pCaretXArray ) const SAL_OVERRIDE; @@ -56,7 +56,6 @@ public: private: void drawCTLine(AquaSalGraphics& rAquaGraphics, CTLineRef ctline, const CoreTextStyle* const pStyle) const; CGPoint GetTextDrawPosition(void) const; - double GetWidth(void) const; bool CacheGlyphLayout(void) const; void ApplyDXArray( ImplLayoutArgs& rArgs); @@ -327,7 +326,7 @@ CGPoint CTLayout::GetTextDrawPosition(void) const { // text is always drawn at its leftmost point const Point aPos = DrawBase(); - fPosX = aPos.X() + mfBaseAdv - GetWidth(); + fPosX = aPos.X() + mfBaseAdv - GetTextWidth(); fPosY = aPos.Y(); } else @@ -695,7 +694,7 @@ int CTLayout::GetNextGlyphs( int nLen, sal_GlyphId* pOutGlyphIds, Point& rPos, i } -double CTLayout::GetWidth() const +DeviceCoordinate CTLayout::GetTextWidth() const { if( (mnCharCount <= 0) || !mpCTLine ) return 0; @@ -708,14 +707,9 @@ double CTLayout::GetWidth() const return mfCachedWidth; } -long CTLayout::GetTextWidth() const -{ - return lrint(GetWidth()); -} - DeviceCoordinate CTLayout::FillDXArray( DeviceCoordinate* pDXArray ) const { - DeviceCoordinate nPixWidth = GetWidth(); + DeviceCoordinate nPixWidth = GetTextWidth(); // short circuit requests which don't need full details if( !pDXArray ) return nPixWidth; @@ -771,7 +765,6 @@ sal_Int32 CTLayout::GetTextBreak( DeviceCoordinate nMaxWidth, long nCharExtra, i } CTTypesetterRef aCTTypeSetter = CTTypesetterCreateWithAttributedString( mpAttrString ); CFIndex nBestGuess = (nCharExtra >= 0) ? 0 : mnCharCount; - SAL_INFO("vcl.ct", "GetTextBreak nMaxWidth:" << nMaxWidth << " nBestGuess:" << nBestGuess << " nCharExtra:" << nCharExtra << " nFactor:" << nFactor); for( int i = 1; i <= mnCharCount; i *= 2 ) { // guess the target width considering char-extra expansion/condensation @@ -779,7 +772,6 @@ sal_Int32 CTLayout::GetTextBreak( DeviceCoordinate nMaxWidth, long nCharExtra, i const double fCTMaxWidth = nTargetWidth / nFactor; // calculate the breaking index for the guessed target width const CFIndex nNewIndex = CTTypesetterSuggestClusterBreak( aCTTypeSetter, 0, fCTMaxWidth ); - SAL_INFO("vcl.ct", "GetTextBreak nTargetWidth:" << nTargetWidth << " fCTMaxWidth:" << fCTMaxWidth << " nNewIndex:" << nNewIndex); if( nNewIndex >= mnCharCount ) { CFRelease( aCTTypeSetter ); diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx index de39d87..471d298 100644 --- a/vcl/source/gdi/sallayout.cxx +++ b/vcl/source/gdi/sallayout.cxx @@ -916,24 +916,23 @@ DeviceCoordinate GenericSalLayout::FillDXArray( DeviceCoordinate* pCharWidths ) if( !GetCharWidths( pCharWidths ) ) return 0; - long nWidth = GetTextWidth(); - return nWidth; + return GetTextWidth(); } // the text width is the maximum logical extent of all glyphs -long GenericSalLayout::GetTextWidth() const +DeviceCoordinate GenericSalLayout::GetTextWidth() const { if( m_GlyphItems.empty() ) return 0; // initialize the extent - long nMinPos = 0; - long nMaxPos = 0; + DeviceCoordinate nMinPos = 0; + DeviceCoordinate nMaxPos = 0; for( GlyphVector::const_iterator pG = m_GlyphItems.begin(), end = m_GlyphItems.end(); pG != end ; ++pG ) { // update the text extent with the glyph extent - long nXPos = pG->maLinearPos.X(); + DeviceCoordinate nXPos = pG->maLinearPos.X(); if( nMinPos > nXPos ) nMinPos = nXPos; nXPos += pG->mnNewWidth - pG->mnXOffset; @@ -941,7 +940,7 @@ long GenericSalLayout::GetTextWidth() const nMaxPos = nXPos; } - long nWidth = nMaxPos - nMinPos; + DeviceCoordinate nWidth = nMaxPos - nMinPos; return nWidth; } @@ -1081,10 +1080,10 @@ void GenericSalLayout::ApplyDXArray( ImplLayoutArgs& rArgs ) } } -void GenericSalLayout::Justify( long nNewWidth ) +void GenericSalLayout::Justify( DeviceCoordinate nNewWidth ) { nNewWidth *= mnUnitsPerPixel; - int nOldWidth = GetTextWidth(); + DeviceCoordinate nOldWidth = GetTextWidth(); if( !nOldWidth || nNewWidth==nOldWidth ) return; diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx index a0a0602..49da725 100644 --- a/vcl/win/source/gdi/winlayout.cxx +++ b/vcl/win/source/gdi/winlayout.cxx @@ -155,7 +155,7 @@ public: virtual void Simplify( bool bIsBase ); protected: - void Justify( long nNewWidth ); + void Justify( DeviceCoordinate nNewWidth ); void ApplyDXArray( const ImplLayoutArgs& ); private: @@ -709,9 +709,9 @@ void SimpleWinLayout::GetCaretPositions( int nMaxIdx, long* pCaretXArray ) const } } -void SimpleWinLayout::Justify( long nNewWidth ) +void SimpleWinLayout::Justify( DeviceCoordinate nNewWidth ) { - long nOldWidth = mnWidth; + DeviceCoordinate nOldWidth = mnWidth; mnWidth = nNewWidth; if( mnGlyphCount <= 0 ) @@ -732,12 +732,12 @@ void SimpleWinLayout::Justify( long nNewWidth ) ++nStretchable; // stretch these glyphs - int nDiffWidth = nNewWidth - nOldWidth; + DeviceCoordinate nDiffWidth = nNewWidth - nOldWidth; for( i = 0; (i < nRight) && (nStretchable > 0); ++i ) { if( mpGlyphAdvances[i] <= 0 ) continue; - int nDeltaWidth = nDiffWidth / nStretchable; + DeviceCoordinate nDeltaWidth = nDiffWidth / nStretchable; mpGlyphAdvances[i] += nDeltaWidth; --nStretchable; nDiffWidth -= nDeltaWidth; @@ -980,7 +980,7 @@ public: protected: virtual ~UniscribeLayout(); - void Justify( long nNewWidth ); + void Justify( DeviceCoordinate nNewWidth ); void ApplyDXArray( const ImplLayoutArgs& ); bool GetItemSubrange( const VisualItem&, @@ -2515,9 +2515,9 @@ bool UniscribeLayout::KashidaWordFix ( int nMinGlyphPos, int nEndGlyphPos, int* return true; } -void UniscribeLayout::Justify( long nNewWidth ) +void UniscribeLayout::Justify( DeviceCoordinate nNewWidth ) { - long nOldWidth = 0; + DeviceCoordinate nOldWidth = 0; int i; for( i = mnMinCharPos; i < mnEndCharPos; ++i ) nOldWidth += mpCharWidths[ i ]; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits