/* * Copyright 2024 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "include/core/SkAlphaType.h" #include "include/core/SkCanvas.h" #include "include/core/SkColor.h" #include "include/core/SkFontMgr.h" #include "include/core/SkFontStyle.h" #include "include/core/SkImageInfo.h" #include "include/core/SkPixmap.h" #include "include/core/SkRefCnt.h" #include "include/core/SkStream.h" #include "include/core/SkSurface.h" #include "include/encode/SkPngEncoder.h" #include "modules/svg/include/SkSVGDOM.h" #include "modules/skshaper/utils/FactoryHelpers.h" #if defined(SK_FONTMGR_FONTCONFIG_AVAILABLE) && defined(SK_TYPEFACE_FACTORY_FREETYPE) #include "include/ports/SkFontMgr_fontconfig.h" #include "include/ports/SkFontScanner_FreeType.h" #endif #if defined(SK_FONTMGR_CORETEXT_AVAILABLE) #include "include/ports/SkFontMgr_mac_ct.h" #endif #include constexpr size_t kWidth = 450; constexpr size_t kHeight = 120; // The text in this SVG should be properly shaped if the V and A characters overlap slightly. const char* svg = "" "" "VAVAVAVA" ""; int main(int argc, char** argv) { if (argc != 2) { printf("Usage: %s ", argv[0]); return 1; } SkFILEWStream output(argv[1]); if (!output.isValid()) { printf("Cannot open output file %s\n", argv[1]); return 1; } // If necessary, clients should use a font manager that would load fonts from the system. sk_sp fontMgr; #if defined(SK_FONTMGR_FONTCONFIG_AVAILABLE) && defined(SK_TYPEFACE_FACTORY_FREETYPE) fontMgr = SkFontMgr_New_FontConfig(nullptr, SkFontScanner_Make_FreeType()); #elif defined(SK_FONTMGR_CORETEXT_AVAILABLE) fontMgr = SkFontMgr_New_CoreText(nullptr); #endif if (!fontMgr) { printf("No Font Manager configured\n"); return 1; } SkMemoryStream svgStream(svg, std::strlen(svg)); auto svg_dom = SkSVGDOM::Builder() .setFontManager(fontMgr) .setTextShapingFactory(SkShapers::BestAvailable()) .make(svgStream); if (!svg_dom) { printf("Could not parse compiled-in svg\n"); return 1; } auto surface = SkSurfaces::Raster(SkImageInfo::MakeN32Premul(kWidth, kHeight)); svg_dom->setContainerSize(SkSize::Make(kWidth, kHeight)); svg_dom->render(surface->getCanvas()); SkPixmap pixmap; surface->peekPixels(&pixmap); if (!SkPngEncoder::Encode(&output, pixmap, {})) { printf("PNG encoding failed.\n"); return 1; } printf("Success!\n"); return 0; }