void updateLayout (const int width) { TextLayout text; text.appendText (getText(), getFont()); text.layout (width - 8, Justification::topLeft, true); setSize (width, jmin (width, text.getHeight() + (int) getFont().getHeight())); }
void updateLayout (const int width) { AttributedString s; s.setJustification (Justification::topLeft); s.append (getText(), getFont()); TextLayout text; text.createLayoutWithBalancedLineLengths (s, width - 8.0f); setSize (width, jmin (width, (int) (text.getHeight() + getFont().getHeight()))); }
void createLayout (TextLayout& layout, const AttributedString& text, IDWriteFactory& directWriteFactory, ID2D1Factory& direct2dFactory, IDWriteFontCollection& fontCollection) { // To add color to text, we need to create a D2D render target // Since we are not actually rendering to a D2D context we create a temporary GDI render target D2D1_RENDER_TARGET_PROPERTIES d2dRTProp = D2D1::RenderTargetProperties (D2D1_RENDER_TARGET_TYPE_SOFTWARE, D2D1::PixelFormat (DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE), 0, 0, D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE, D2D1_FEATURE_LEVEL_DEFAULT); ComSmartPtr<ID2D1DCRenderTarget> renderTarget; HRESULT hr = direct2dFactory.CreateDCRenderTarget (&d2dRTProp, renderTarget.resetAndGetPointerAddress()); ComSmartPtr<IDWriteTextLayout> dwTextLayout; if (! setupLayout (text, layout.getWidth(), layout.getHeight(), *renderTarget, directWriteFactory, fontCollection, dwTextLayout)) return; UINT32 actualLineCount = 0; hr = dwTextLayout->GetLineMetrics (nullptr, 0, &actualLineCount); layout.ensureStorageAllocated (actualLineCount); { ComSmartPtr<CustomDirectWriteTextRenderer> textRenderer (new CustomDirectWriteTextRenderer (fontCollection, text)); hr = dwTextLayout->Draw (&layout, textRenderer, 0, 0); } HeapBlock<DWRITE_LINE_METRICS> dwLineMetrics (actualLineCount); hr = dwTextLayout->GetLineMetrics (dwLineMetrics, actualLineCount, &actualLineCount); int lastLocation = 0; const int numLines = jmin ((int) actualLineCount, layout.getNumLines()); float yAdjustment = 0; const float extraLineSpacing = text.getLineSpacing(); for (int i = 0; i < numLines; ++i) { TextLayout::Line& line = layout.getLine (i); line.stringRange = Range<int> (lastLocation, (int) lastLocation + dwLineMetrics[i].length); line.lineOrigin.y += yAdjustment; yAdjustment += extraLineSpacing; lastLocation += dwLineMetrics[i].length; } }
void createLayout (TextLayout& layout, const AttributedString& text, IDWriteFactory& directWriteFactory, IDWriteFontCollection& fontCollection, ID2D1DCRenderTarget& renderTarget) { ComSmartPtr<IDWriteTextLayout> dwTextLayout; if (! setupLayout (text, layout.getWidth(), layout.getHeight(), renderTarget, directWriteFactory, fontCollection, dwTextLayout)) return; UINT32 actualLineCount = 0; HRESULT hr = dwTextLayout->GetLineMetrics (nullptr, 0, &actualLineCount); layout.ensureStorageAllocated (actualLineCount); { ComSmartPtr<CustomDirectWriteTextRenderer> textRenderer (new CustomDirectWriteTextRenderer (fontCollection, text)); hr = dwTextLayout->Draw (&layout, textRenderer, 0, 0); } HeapBlock<DWRITE_LINE_METRICS> dwLineMetrics (actualLineCount); hr = dwTextLayout->GetLineMetrics (dwLineMetrics, actualLineCount, &actualLineCount); int lastLocation = 0; const int numLines = jmin ((int) actualLineCount, layout.getNumLines()); float yAdjustment = 0; const float extraLineSpacing = text.getLineSpacing(); for (int i = 0; i < numLines; ++i) { TextLayout::Line& line = layout.getLine (i); line.stringRange = Range<int> (lastLocation, (int) lastLocation + dwLineMetrics[i].length); line.lineOrigin.y += yAdjustment; yAdjustment += extraLineSpacing; lastLocation += dwLineMetrics[i].length; } }