| /* | |
| * 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 <cstdio> | |
| 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 = "<svg viewBox=\"0 0 150 40\" xmlns=\"http://www.w3.org/2000/svg\">" | |
| "<style>" | |
| "text {" | |
| "font: 13px sans-serif;" | |
| "}" | |
| "</style>" | |
| "<text x=\"10\" y=\"30\">VAVAVAVA</text>" | |
| "</svg>"; | |
| int main(int argc, char** argv) { | |
| if (argc != 2) { | |
| printf("Usage: %s <name.png>", 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<SkFontMgr> 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; | |
| } |