From c315587c21ed44e54fbb3c1b36f0f70f78314081 Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Wed, 7 Oct 2009 05:53:19 +0000 Subject: [PATCH] fixing gdiplus implementation, see #11282 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62321 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/msw/graphics.cpp | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/src/msw/graphics.cpp b/src/msw/graphics.cpp index 71ef3d4a34..751be8e5b1 100644 --- a/src/msw/graphics.cpp +++ b/src/msw/graphics.cpp @@ -1454,23 +1454,37 @@ void wxGDIPlusContext::GetPartialTextExtents(const wxString& text, wxArrayDouble RectF layoutRect(0,0, 100000.0f, 100000.0f); StringFormat strFormat( StringFormat::GenericTypographic() ); - CharacterRange* ranges = new CharacterRange[len] ; - Region* regions = new Region[len]; - for( size_t i = 0 ; i < len ; ++i) - { - ranges[i].First = i ; - ranges[i].Length = 1 ; - } - strFormat.SetMeasurableCharacterRanges(len,ranges); - strFormat.SetFormatFlags( StringFormatFlagsMeasureTrailingSpaces | strFormat.GetFormatFlags() ); - m_context->MeasureCharacterRanges(ws, -1 , f,layoutRect, &strFormat,1,regions) ; + size_t startPosition = 0; + size_t reminder = len; + const size_t maxSpan = 32; + CharacterRange* ranges = new CharacterRange[maxSpan] ; + Region* regions = new Region[maxSpan]; - RectF bbox ; - for ( size_t i = 0 ; i < len ; ++i) + while( reminder > 0 ) { - regions[i].GetBounds(&bbox,m_context); - widths[i] = bbox.GetRight()-bbox.GetLeft(); + size_t span = wxMin( maxSpan, reminder ); + + for( size_t i = 0 ; i < span ; ++i) + { + ranges[i].First = 0 ; + ranges[i].Length = startPosition+i+1 ; + } + strFormat.SetMeasurableCharacterRanges(span,ranges); + strFormat.SetFormatFlags( StringFormatFlagsMeasureTrailingSpaces | strFormat.GetFormatFlags() ); + m_context->MeasureCharacterRanges(ws, -1 , f,layoutRect, &strFormat,span,regions) ; + + RectF bbox ; + for ( size_t i = 0 ; i < span ; ++i) + { + regions[i].GetBounds(&bbox,m_context); + widths[startPosition+i] = bbox.Width; + } + reminder -= span; + startPosition += span; } + + delete[] ranges; + delete[] regions; } bool wxGDIPlusContext::ShouldOffset() const -- 2.47.2