]> git.saurik.com Git - wxWidgets.git/commitdiff
fixing gdiplus implementation, see #11282
authorStefan Csomor <csomor@advancedconcepts.ch>
Wed, 7 Oct 2009 05:53:19 +0000 (05:53 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Wed, 7 Oct 2009 05:53:19 +0000 (05:53 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62321 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/msw/graphics.cpp

index 71ef3d4a34be44cfbbb5e3cab7f350c5ec7695d6..751be8e5b154fc5d44c11a3ea26ca8c59da37ff3 100644 (file)
@@ -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