void ScaledFontBase::CopyGlyphsToBuilder(const GlyphBuffer &aBuffer, PathBuilder *aBuilder, const Matrix *aTransformHint) { #ifdef USE_CAIRO PathBuilderCairo* builder = static_cast<PathBuilderCairo*>(aBuilder); cairo_t *ctx = cairo_create(DrawTargetCairo::GetDummySurface()); if (aTransformHint) { cairo_matrix_t mat; GfxMatrixToCairoMatrix(*aTransformHint, mat); cairo_set_matrix(ctx, &mat); } // Convert our GlyphBuffer into an array of Cairo glyphs. std::vector<cairo_glyph_t> glyphs(aBuffer.mNumGlyphs); for (uint32_t i = 0; i < aBuffer.mNumGlyphs; ++i) { glyphs[i].index = aBuffer.mGlyphs[i].mIndex; glyphs[i].x = aBuffer.mGlyphs[i].mPosition.x; glyphs[i].y = aBuffer.mGlyphs[i].mPosition.y; } cairo_set_scaled_font(ctx, mScaledFont); cairo_glyph_path(ctx, &glyphs[0], aBuffer.mNumGlyphs); RefPtr<PathCairo> cairoPath = new PathCairo(ctx); cairo_destroy(ctx); cairoPath->AppendPathToBuilder(builder); #endif }
void ScaledFontBase::CopyGlyphsToBuilder(const GlyphBuffer &aBuffer, PathBuilder *aBuilder, const Matrix *aTransformHint) { BackendType backendType = aBuilder->GetBackendType(); #ifdef USE_SKIA if (backendType == BackendType::SKIA) { PathBuilderSkia *builder = static_cast<PathBuilderSkia*>(aBuilder); builder->AppendPath(GetSkiaPathForGlyphs(aBuffer)); return; } #endif #ifdef USE_CAIRO if (backendType == BackendType::CAIRO) { MOZ_ASSERT(mScaledFont); PathBuilderCairo* builder = static_cast<PathBuilderCairo*>(aBuilder); cairo_t *ctx = cairo_create(DrawTargetCairo::GetDummySurface()); if (aTransformHint) { cairo_matrix_t mat; GfxMatrixToCairoMatrix(*aTransformHint, mat); cairo_set_matrix(ctx, &mat); } // Convert our GlyphBuffer into an array of Cairo glyphs. std::vector<cairo_glyph_t> glyphs(aBuffer.mNumGlyphs); for (uint32_t i = 0; i < aBuffer.mNumGlyphs; ++i) { glyphs[i].index = aBuffer.mGlyphs[i].mIndex; glyphs[i].x = aBuffer.mGlyphs[i].mPosition.x; glyphs[i].y = aBuffer.mGlyphs[i].mPosition.y; } cairo_set_scaled_font(ctx, mScaledFont); cairo_glyph_path(ctx, &glyphs[0], aBuffer.mNumGlyphs); RefPtr<PathCairo> cairoPath = new PathCairo(ctx); cairo_destroy(ctx); cairoPath->AppendPathToBuilder(builder); return; } if (backendType == BackendType::RECORDING) { SkPath skPath = GetSkiaPathForGlyphs(aBuffer); RefPtr<Path> path = MakeAndAddRef<PathSkia>(skPath, FillRule::FILL_WINDING); path->StreamToSink(aBuilder); return; } MOZ_ASSERT(false, "Path not being copied"); #endif }
void ScaledFontBase::CopyGlyphsToBuilder(const GlyphBuffer &aBuffer, PathBuilder *aBuilder, BackendType aBackendType, const Matrix *aTransformHint) { #ifdef USE_SKIA if (aBackendType == BackendType::SKIA) { PathBuilderSkia *builder = static_cast<PathBuilderSkia*>(aBuilder); builder->AppendPath(GetSkiaPathForGlyphs(aBuffer)); return; } #endif #ifdef USE_CAIRO if (aBackendType == BackendType::CAIRO) { MOZ_ASSERT(mScaledFont); PathBuilderCairo* builder = static_cast<PathBuilderCairo*>(aBuilder); cairo_t *ctx = cairo_create(DrawTargetCairo::GetDummySurface()); if (aTransformHint) { cairo_matrix_t mat; GfxMatrixToCairoMatrix(*aTransformHint, mat); cairo_set_matrix(ctx, &mat); } // Convert our GlyphBuffer into an array of Cairo glyphs. std::vector<cairo_glyph_t> glyphs(aBuffer.mNumGlyphs); for (uint32_t i = 0; i < aBuffer.mNumGlyphs; ++i) { glyphs[i].index = aBuffer.mGlyphs[i].mIndex; glyphs[i].x = aBuffer.mGlyphs[i].mPosition.x; glyphs[i].y = aBuffer.mGlyphs[i].mPosition.y; } cairo_set_scaled_font(ctx, mScaledFont); cairo_glyph_path(ctx, &glyphs[0], aBuffer.mNumGlyphs); RefPtr<PathCairo> cairoPath = new PathCairo(ctx); cairo_destroy(ctx); cairoPath->AppendPathToBuilder(builder); return; } #endif MOZ_CRASH("The specified backend type is not supported by CopyGlyphsToBuilder"); }