最近在學習W8App的Direct2D與DirectWrite時發生了一個例外的錯誤,當呼叫D2D的EndDraw來更新繪圖結果是產生了0x88990012 (D2DERR_WRONG_FACTORY)的例外錯誤。
這個錯誤發生的原因是我的DirectWrite Render物件預先儲存了D2D factory,而透過SurfaceImageSource來連結W8App與Direct2D時,D2DContext所使用的D2D factory似乎有自已獨立的產生方式。
目前的解決方式是透過GetFactory直接從D2DContext物件中取得D2DFactory,至於是否有更好的作法,就需要再研究。
1: IFACEMETHODIMP CustomTextRenderer::DrawGlyphRun(2: _In_opt_ void* clientDrawingContext,
3: FLOAT baselineOriginX, 4: FLOAT baselineOriginY, 5: DWRITE_MEASURING_MODE measuringMode,6: _In_ DWRITE_GLYPH_RUN const* glyphRun,
7: _In_ DWRITE_GLYPH_RUN_DESCRIPTION const* glyphRunDescription,
8: IUnknown* clientDrawingEffect 9: ) 10: { 11: HRESULT hr = S_OK; 12: 13: Microsoft::WRL::ComPtr<ID2D1Factory> d2dFactory; 14: m_d2dContext->GetFactory(&d2dFactory); 15: 16: // Create the path geometry.
17: Microsoft::WRL::ComPtr<ID2D1PathGeometry> pathGeometry; 18: hr = d2dFactory->CreatePathGeometry(&pathGeometry); 19: 20: // Write to the path geometry using the geometry sink.
21: 22: Microsoft::WRL::ComPtr<ID2D1GeometrySink> sink;23: if (SUCCEEDED(hr))
24: { 25: hr = pathGeometry->Open(&sink); 26: } 27: 28: // Get the glyph run outline geometries back from DirectWrite and place them within the
29: // geometry sink.
30: if (SUCCEEDED(hr))
31: { 32: hr = glyphRun->fontFace->GetGlyphRunOutline( 33: glyphRun->fontEmSize, 34: glyphRun->glyphIndices, 35: glyphRun->glyphAdvances, 36: glyphRun->glyphOffsets, 37: glyphRun->glyphCount, 38: glyphRun->isSideways, 39: glyphRun->bidiLevel %2, 40: sink.Get() 41: ); 42: } 43: 44: // Close the geometry sink
45: if (SUCCEEDED(hr))
46: { 47: hr = sink.Get()->Close(); 48: } 49: 50: // Initialize a matrix to translate the origin of the glyph run.
51: D2D1::Matrix3x2F const matrix = D2D1::Matrix3x2F(
52: 1.0f, 0.0f, 53: 0.0f, 1.0f, 54: baselineOriginX, baselineOriginY 55: ); 56: 57: // Create the transformed geometry
58: Microsoft::WRL::ComPtr<ID2D1TransformedGeometry> transformedGeometry;59: if (SUCCEEDED(hr))
60: { 61: hr = d2dFactory->CreateTransformedGeometry( 62: pathGeometry.Get(), 63: &matrix, 64: &transformedGeometry 65: ); 66: } 67: 68: // Draw the outline of the glyph run
69: if(SUCCEEDED(hr))
70: { 71: m_d2dContext->DrawGeometry(transformedGeometry.Get(),m_brushOutline.Get()); 72: m_d2dContext->FillGeometry(transformedGeometry.Get(),m_brushFill.Get()); 73: } 74: 75: return hr;
76: }13-14 透過目前的D2DContext來取得D2DFactory
沒有留言:
張貼留言