2 * Copyright (c) 2022 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali/internal/text/text-abstraction/font-client-impl.h>
22 #if !(defined(DALI_PROFILE_UBUNTU) || defined(ANDROID) || defined(WIN32) || defined(__APPLE__))
27 #include <dali/devel-api/common/singleton-service.h>
28 #include <dali/internal/text/text-abstraction/plugin/font-client-plugin-impl.h>
30 #include <dali/devel-api/text-abstraction/glyph-info.h>
34 namespace TextAbstraction
38 Dali::TextAbstraction::FontClient FontClient::gPreInitializedFontClient(NULL);
40 FontClient::FontClient()
47 FontClient::~FontClient()
52 Dali::TextAbstraction::FontClient FontClient::Get()
54 Dali::TextAbstraction::FontClient fontClientHandle;
56 Dali::SingletonService service(SingletonService::Get());
59 // Check whether the singleton is already created
60 Dali::BaseHandle handle = service.GetSingleton(typeid(Dali::TextAbstraction::FontClient));
63 // If so, downcast the handle
64 FontClient* impl = dynamic_cast<Dali::TextAbstraction::Internal::FontClient*>(handle.GetObjectPtr());
65 fontClientHandle = Dali::TextAbstraction::FontClient(impl);
67 else // create and register the object
69 if(gPreInitializedFontClient)
71 fontClientHandle = gPreInitializedFontClient;
72 gPreInitializedFontClient.Reset(); // No longer needed
76 fontClientHandle = Dali::TextAbstraction::FontClient(new FontClient);
79 service.Register(typeid(fontClientHandle), fontClientHandle);
83 return fontClientHandle;
86 Dali::TextAbstraction::FontClient FontClient::PreInitialize()
88 gPreInitializedFontClient = Dali::TextAbstraction::FontClient(new FontClient);
90 // Make DefaultFontDescription cached
91 Dali::TextAbstraction::FontDescription defaultFontDescription;
92 gPreInitializedFontClient.GetDefaultPlatformFontDescription(defaultFontDescription);
94 return gPreInitializedFontClient;
97 void FontClient::ClearCache()
101 mPlugin->ClearCache();
105 void FontClient::SetDpi(unsigned int horizontalDpi, unsigned int verticalDpi)
107 mDpiHorizontal = horizontalDpi;
108 mDpiVertical = verticalDpi;
110 // Allow DPI to be set without loading plugin
113 mPlugin->SetDpi(horizontalDpi, verticalDpi);
117 void FontClient::GetDpi(unsigned int& horizontalDpi, unsigned int& verticalDpi)
119 horizontalDpi = mDpiHorizontal;
120 verticalDpi = mDpiVertical;
123 int FontClient::GetDefaultFontSize()
127 #if !(defined(DALI_PROFILE_UBUNTU) || defined(ANDROID) || defined(WIN32) || defined(__APPLE__))
128 vconf_get_int(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, &fontSize);
134 void FontClient::ResetSystemDefaults()
138 mPlugin->ResetSystemDefaults();
141 void FontClient::GetDefaultFonts(FontList& defaultFonts)
145 mPlugin->GetDefaultFonts(defaultFonts);
148 void FontClient::GetDefaultPlatformFontDescription(FontDescription& fontDescription)
152 mPlugin->GetDefaultPlatformFontDescription(fontDescription);
155 void FontClient::GetDescription(FontId fontId, FontDescription& fontDescription)
159 mPlugin->GetDescription(fontId, fontDescription);
162 PointSize26Dot6 FontClient::GetPointSize(FontId fontId)
166 return mPlugin->GetPointSize(fontId);
169 bool FontClient::IsCharacterSupportedByFont(FontId fontId, Character character)
173 return mPlugin->IsCharacterSupportedByFont(fontId, character);
176 void FontClient::GetSystemFonts(FontList& systemFonts)
180 mPlugin->GetSystemFonts(systemFonts);
183 FontId FontClient::FindDefaultFont(Character charcode,
184 PointSize26Dot6 requestedPointSize,
189 return mPlugin->FindDefaultFont(charcode,
194 FontId FontClient::FindFallbackFont(Character charcode,
195 const FontDescription& preferredFontDescription,
196 PointSize26Dot6 requestedPointSize,
201 return mPlugin->FindFallbackFont(charcode,
202 preferredFontDescription,
207 bool FontClient::IsScalable(const FontPath& path)
211 return mPlugin->IsScalable(path);
214 bool FontClient::IsScalable(const FontDescription& fontDescription)
218 return mPlugin->IsScalable(fontDescription);
221 void FontClient::GetFixedSizes(const FontPath& path, Dali::Vector<PointSize26Dot6>& sizes)
225 mPlugin->GetFixedSizes(path, sizes);
228 void FontClient::GetFixedSizes(const FontDescription& fontDescription,
229 Dali::Vector<PointSize26Dot6>& sizes)
233 mPlugin->GetFixedSizes(fontDescription, sizes);
236 bool FontClient::HasItalicStyle(FontId fontId) const
242 return mPlugin->HasItalicStyle(fontId);
245 FontId FontClient::GetFontId(const FontPath& path, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex)
249 return mPlugin->GetFontIdByPath(path,
255 FontId FontClient::GetFontId(const FontDescription& fontDescription,
256 PointSize26Dot6 requestedPointSize,
261 return mPlugin->GetFontId(fontDescription,
266 FontId FontClient::GetFontId(const BitmapFont& bitmapFont)
270 return mPlugin->GetFontId(bitmapFont);
273 void FontClient::GetFontMetrics(FontId fontId, FontMetrics& metrics)
277 mPlugin->GetFontMetrics(fontId, metrics);
280 GlyphIndex FontClient::GetGlyphIndex(FontId fontId, Character charcode)
284 return mPlugin->GetGlyphIndex(fontId, charcode);
287 GlyphIndex FontClient::GetGlyphIndex(FontId fontId, Character charcode, Character variantSelector)
291 return mPlugin->GetGlyphIndex(fontId, charcode, variantSelector);
294 bool FontClient::GetGlyphMetrics(GlyphInfo* array, uint32_t size, GlyphType type, bool horizontal)
298 return mPlugin->GetGlyphMetrics(array, size, type, horizontal);
301 void FontClient::CreateBitmap(FontId fontId, GlyphIndex glyphIndex, bool isItalicRequired, bool isBoldRequired, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth)
305 mPlugin->CreateBitmap(fontId, glyphIndex, isItalicRequired, isBoldRequired, data, outlineWidth);
308 PixelData FontClient::CreateBitmap(FontId fontId, GlyphIndex glyphIndex, int outlineWidth)
312 return mPlugin->CreateBitmap(fontId, glyphIndex, outlineWidth);
315 void FontClient::CreateVectorBlob(FontId fontId, GlyphIndex glyphIndex, VectorBlob*& blob, unsigned int& blobLength, unsigned int& nominalWidth, unsigned int& nominalHeight)
319 mPlugin->CreateVectorBlob(fontId, glyphIndex, blob, blobLength, nominalWidth, nominalHeight);
322 const GlyphInfo& FontClient::GetEllipsisGlyph(PointSize26Dot6 requestedPointSize)
326 return mPlugin->GetEllipsisGlyph(requestedPointSize);
329 bool FontClient::IsColorGlyph(FontId fontId, GlyphIndex glyphIndex)
333 return mPlugin->IsColorGlyph(fontId, glyphIndex);
336 GlyphIndex FontClient::CreateEmbeddedItem(const TextAbstraction::FontClient::EmbeddedItemDescription& description, Pixel::Format& pixelFormat)
340 return mPlugin->CreateEmbeddedItem(description, pixelFormat);
343 void FontClient::EnableAtlasLimitation(bool enabled)
346 return mPlugin->EnableAtlasLimitation(enabled);
349 bool FontClient::IsAtlasLimitationEnabled() const
353 return mPlugin->IsAtlasLimitationEnabled();
355 return TextAbstraction::FontClient::DEFAULT_ATLAS_LIMITATION_ENABLED;
358 Size FontClient::GetMaximumTextAtlasSize() const
362 return mPlugin->GetMaximumTextAtlasSize();
364 return TextAbstraction::FontClient::MAX_TEXT_ATLAS_SIZE;
367 Size FontClient::GetDefaultTextAtlasSize() const
371 return mPlugin->GetDefaultTextAtlasSize();
373 return TextAbstraction::FontClient::DEFAULT_TEXT_ATLAS_SIZE;
376 Size FontClient::GetCurrentMaximumBlockSizeFitInAtlas() const
380 return mPlugin->GetCurrentMaximumBlockSizeFitInAtlas();
382 return TextAbstraction::FontClient::DEFAULT_TEXT_ATLAS_SIZE;
385 bool FontClient::SetCurrentMaximumBlockSizeFitInAtlas(const Size& currentMaximumBlockSizeFitInAtlas)
388 return mPlugin->SetCurrentMaximumBlockSizeFitInAtlas(currentMaximumBlockSizeFitInAtlas);
391 uint32_t FontClient::GetNumberOfPointsPerOneUnitOfPointSize() const
395 return mPlugin->GetNumberOfPointsPerOneUnitOfPointSize();
397 return TextAbstraction::FontClient::NUMBER_OF_POINTS_PER_ONE_UNIT_OF_POINT_SIZE;
401 FT_FaceRec_* FontClient::GetFreetypeFace(FontId fontId)
405 return mPlugin->GetFreetypeFace(fontId);
408 FontDescription::Type FontClient::GetFontType(FontId fontId)
412 return mPlugin->GetFontType(fontId);
415 bool FontClient::AddCustomFontDirectory(const FontPath& path)
419 return mPlugin->AddCustomFontDirectory(path);
422 HarfBuzzFontHandle FontClient::GetHarfBuzzFont(FontId fontId)
426 return mPlugin->GetHarfBuzzFont(fontId);
429 void FontClient::CreatePlugin()
433 mPlugin = new Plugin(mDpiHorizontal, mDpiVertical);
437 } // namespace Internal
439 } // namespace TextAbstraction