| /* |
| * Copyright 2017 Google, Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "txt_test_utils.h" |
| |
| #include <sstream> |
| |
| #include "third_party/skia/include/core/SkTypeface.h" |
| #include "txt/asset_font_manager.h" |
| #include "txt/typeface_font_asset_provider.h" |
| #include "utils/MacUtils.h" |
| #include "utils/WindowsUtils.h" |
| |
| #if !defined(_WIN32) |
| #include <dirent.h> |
| #endif |
| |
| namespace txt { |
| |
| static std::string gFontDir; |
| static fml::CommandLine gCommandLine; |
| |
| const std::string& GetFontDir() { |
| return gFontDir; |
| } |
| |
| void SetFontDir(const std::string& dir) { |
| gFontDir = dir; |
| } |
| |
| const fml::CommandLine& GetCommandLineForProcess() { |
| return gCommandLine; |
| } |
| |
| void SetCommandLine(fml::CommandLine cmd) { |
| gCommandLine = std::move(cmd); |
| } |
| |
| void RegisterFontsFromPath(TypefaceFontAssetProvider& font_provider, |
| std::string directory_path) { |
| #if defined(_WIN32) |
| std::string path = directory_path + "\\*"; |
| WIN32_FIND_DATAA ffd; |
| HANDLE directory = FindFirstFileA(path.c_str(), &ffd); |
| if (directory == INVALID_HANDLE_VALUE) { |
| return; |
| } |
| |
| do { |
| if ((ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) { |
| continue; |
| } |
| |
| std::string file_name(ffd.cFileName); |
| |
| std::stringstream file_path; |
| file_path << directory_path << "/" << file_name; |
| |
| font_provider.RegisterTypeface( |
| SkTypeface::MakeFromFile(file_path.str().c_str())); |
| } while (FindNextFileA(directory, &ffd) != 0); |
| |
| // TODO(bkonyi): check for error here? |
| FindClose(directory); |
| #else |
| auto directory_closer = [](DIR* directory) { |
| if (directory != nullptr) { |
| ::closedir(directory); |
| } |
| }; |
| |
| std::unique_ptr<DIR, decltype(directory_closer)> directory( |
| ::opendir(directory_path.c_str()), directory_closer); |
| |
| if (directory == nullptr) { |
| return; |
| } |
| |
| for (struct dirent* entry = ::readdir(directory.get()); entry != nullptr; |
| entry = ::readdir(directory.get())) { |
| if (entry->d_type != DT_REG) { |
| continue; |
| } |
| |
| std::string file_name(entry->d_name); |
| |
| std::stringstream file_path; |
| file_path << directory_path << "/" << file_name; |
| |
| font_provider.RegisterTypeface( |
| SkTypeface::MakeFromFile(file_path.str().c_str())); |
| } |
| #endif |
| } |
| |
| std::shared_ptr<FontCollection> GetTestFontCollection() { |
| std::unique_ptr<TypefaceFontAssetProvider> font_provider = |
| std::make_unique<TypefaceFontAssetProvider>(); |
| RegisterFontsFromPath(*font_provider, GetFontDir()); |
| |
| std::shared_ptr<FontCollection> collection = |
| std::make_shared<FontCollection>(); |
| collection->SetAssetFontManager( |
| sk_make_sp<AssetFontManager>(std::move(font_provider))); |
| |
| return collection; |
| } |
| |
| // Build a paragraph and return it as a ParagraphTxt usable by tests that need |
| // access to ParagraphTxt internals. |
| std::unique_ptr<ParagraphTxt> BuildParagraph( |
| txt::ParagraphBuilderTxt& builder) { |
| return std::unique_ptr<txt::ParagraphTxt>( |
| static_cast<txt::ParagraphTxt*>(builder.Build().release())); |
| } |
| |
| } // namespace txt |