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(VCONF_ENABLED)
27 #include <dali/devel-api/common/singleton-service.h>
28 #include <dali/internal/text/text-abstraction/plugin/font-client-plugin-impl.h>
29 #include <dali/internal/window-system/common/window-system.h>
31 #include <dali/devel-api/text-abstraction/glyph-info.h>
35 namespace TextAbstraction
39 Dali::TextAbstraction::FontClient FontClient::gPreInitializedFontClient(NULL);
41 FontClient::FontClient()
48 FontClient::~FontClient()
53 Dali::TextAbstraction::FontClient FontClient::Get()
55 Dali::TextAbstraction::FontClient fontClientHandle;
57 Dali::SingletonService service(SingletonService::Get());
60 // Check whether the singleton is already created
61 Dali::BaseHandle handle = service.GetSingleton(typeid(Dali::TextAbstraction::FontClient));
64 // If so, downcast the handle
65 FontClient* impl = dynamic_cast<Dali::TextAbstraction::Internal::FontClient*>(handle.GetObjectPtr());
66 fontClientHandle = Dali::TextAbstraction::FontClient(impl);
68 else // create and register the object
70 if(gPreInitializedFontClient)
72 fontClientHandle = gPreInitializedFontClient;
73 gPreInitializedFontClient.Reset(); // No longer needed
77 fontClientHandle = Dali::TextAbstraction::FontClient(new FontClient);
80 uint32_t horizontalDpi, verticalDpi;
81 fontClientHandle.GetDpi(horizontalDpi, verticalDpi);
82 if(horizontalDpi == 0u || verticalDpi == 0u)
84 horizontalDpi = verticalDpi = 0u;
85 Dali::Internal::Adaptor::WindowSystem::GetDpi(horizontalDpi, verticalDpi);
86 fontClientHandle.SetDpi(horizontalDpi, verticalDpi);
89 service.Register(typeid(fontClientHandle), fontClientHandle);
93 return fontClientHandle;
96 Dali::TextAbstraction::FontClient FontClient::PreInitialize()
98 gPreInitializedFontClient = Dali::TextAbstraction::FontClient(new FontClient);
100 // Make DefaultFontDescription cached
101 Dali::TextAbstraction::FontDescription defaultFontDescription;
102 gPreInitializedFontClient.GetDefaultPlatformFontDescription(defaultFontDescription);
104 return gPreInitializedFontClient;
107 void FontClient::ClearCache()
111 mPlugin->ClearCache();
115 void FontClient::SetDpi(unsigned int horizontalDpi, unsigned int verticalDpi)
117 mDpiHorizontal = horizontalDpi;
118 mDpiVertical = verticalDpi;
120 // Allow DPI to be set without loading plugin
123 mPlugin->SetDpi(horizontalDpi, verticalDpi);
127 void FontClient::GetDpi(unsigned int& horizontalDpi, unsigned int& verticalDpi)
129 horizontalDpi = mDpiHorizontal;
130 verticalDpi = mDpiVertical;
133 int FontClient::GetDefaultFontSize()
137 #if defined(VCONF_ENABLED)
138 vconf_get_int(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, &fontSize);
144 void FontClient::ResetSystemDefaults()
148 mPlugin->ResetSystemDefaults();
151 void FontClient::GetDefaultFonts(FontList& defaultFonts)
155 mPlugin->GetDefaultFonts(defaultFonts);
158 void FontClient::GetDefaultPlatformFontDescription(FontDescription& fontDescription)
162 mPlugin->GetDefaultPlatformFontDescription(fontDescription);
165 void FontClient::GetDescription(FontId fontId, FontDescription& fontDescription)
169 mPlugin->GetDescription(fontId, fontDescription);
172 PointSize26Dot6 FontClient::GetPointSize(FontId fontId)
176 return mPlugin->GetPointSize(fontId);
179 bool FontClient::IsCharacterSupportedByFont(FontId fontId, Character character)
183 return mPlugin->IsCharacterSupportedByFont(fontId, character);
186 void FontClient::GetSystemFonts(FontList& systemFonts)
190 mPlugin->GetSystemFonts(systemFonts);
193 FontId FontClient::FindDefaultFont(Character charcode,
194 PointSize26Dot6 requestedPointSize,
199 return mPlugin->FindDefaultFont(charcode,
204 FontId FontClient::FindFallbackFont(Character charcode,
205 const FontDescription& preferredFontDescription,
206 PointSize26Dot6 requestedPointSize,
211 return mPlugin->FindFallbackFont(charcode,
212 preferredFontDescription,
217 bool FontClient::IsScalable(const FontPath& path)
221 return mPlugin->IsScalable(path);
224 bool FontClient::IsScalable(const FontDescription& fontDescription)
228 return mPlugin->IsScalable(fontDescription);
231 void FontClient::GetFixedSizes(const FontPath& path, Dali::Vector<PointSize26Dot6>& sizes)
235 mPlugin->GetFixedSizes(path, sizes);
238 void FontClient::GetFixedSizes(const FontDescription& fontDescription,
239 Dali::Vector<PointSize26Dot6>& sizes)
243 mPlugin->GetFixedSizes(fontDescription, sizes);
246 bool FontClient::HasItalicStyle(FontId fontId) const
252 return mPlugin->HasItalicStyle(fontId);
255 FontId FontClient::GetFontId(const FontPath& path, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex)
259 return mPlugin->GetFontIdByPath(path,
265 FontId FontClient::GetFontId(const FontDescription& fontDescription,
266 PointSize26Dot6 requestedPointSize,
271 return mPlugin->GetFontId(fontDescription,
276 FontId FontClient::GetFontId(const BitmapFont& bitmapFont)
280 return mPlugin->GetFontId(bitmapFont);
283 void FontClient::GetFontMetrics(FontId fontId, FontMetrics& metrics)
287 mPlugin->GetFontMetrics(fontId, metrics);
290 GlyphIndex FontClient::GetGlyphIndex(FontId fontId, Character charcode)
294 return mPlugin->GetGlyphIndex(fontId, charcode);
297 GlyphIndex FontClient::GetGlyphIndex(FontId fontId, Character charcode, Character variantSelector)
301 return mPlugin->GetGlyphIndex(fontId, charcode, variantSelector);
304 bool FontClient::GetGlyphMetrics(GlyphInfo* array, uint32_t size, GlyphType type, bool horizontal)
308 return mPlugin->GetGlyphMetrics(array, size, type, horizontal);
311 void FontClient::CreateBitmap(FontId fontId, GlyphIndex glyphIndex, bool isItalicRequired, bool isBoldRequired, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth)
315 mPlugin->CreateBitmap(fontId, glyphIndex, isItalicRequired, isBoldRequired, data, outlineWidth);
318 PixelData FontClient::CreateBitmap(FontId fontId, GlyphIndex glyphIndex, int outlineWidth)
322 return mPlugin->CreateBitmap(fontId, glyphIndex, outlineWidth);
325 void FontClient::CreateVectorBlob(FontId fontId, GlyphIndex glyphIndex, VectorBlob*& blob, unsigned int& blobLength, unsigned int& nominalWidth, unsigned int& nominalHeight)
329 mPlugin->CreateVectorBlob(fontId, glyphIndex, blob, blobLength, nominalWidth, nominalHeight);
332 const GlyphInfo& FontClient::GetEllipsisGlyph(PointSize26Dot6 requestedPointSize)
336 return mPlugin->GetEllipsisGlyph(requestedPointSize);
339 bool FontClient::IsColorGlyph(FontId fontId, GlyphIndex glyphIndex)
343 return mPlugin->IsColorGlyph(fontId, glyphIndex);
346 GlyphIndex FontClient::CreateEmbeddedItem(const TextAbstraction::FontClient::EmbeddedItemDescription& description, Pixel::Format& pixelFormat)
350 return mPlugin->CreateEmbeddedItem(description, pixelFormat);
353 void FontClient::EnableAtlasLimitation(bool enabled)
356 return mPlugin->EnableAtlasLimitation(enabled);
359 bool FontClient::IsAtlasLimitationEnabled() const
363 return mPlugin->IsAtlasLimitationEnabled();
365 return TextAbstraction::FontClient::DEFAULT_ATLAS_LIMITATION_ENABLED;
368 Size FontClient::GetMaximumTextAtlasSize() const
372 return mPlugin->GetMaximumTextAtlasSize();
374 return TextAbstraction::FontClient::MAX_TEXT_ATLAS_SIZE;
377 Size FontClient::GetDefaultTextAtlasSize() const
381 return mPlugin->GetDefaultTextAtlasSize();
383 return TextAbstraction::FontClient::DEFAULT_TEXT_ATLAS_SIZE;
386 Size FontClient::GetCurrentMaximumBlockSizeFitInAtlas() const
390 return mPlugin->GetCurrentMaximumBlockSizeFitInAtlas();
392 return TextAbstraction::FontClient::DEFAULT_TEXT_ATLAS_SIZE;
395 bool FontClient::SetCurrentMaximumBlockSizeFitInAtlas(const Size& currentMaximumBlockSizeFitInAtlas)
398 return mPlugin->SetCurrentMaximumBlockSizeFitInAtlas(currentMaximumBlockSizeFitInAtlas);
401 uint32_t FontClient::GetNumberOfPointsPerOneUnitOfPointSize() const
405 return mPlugin->GetNumberOfPointsPerOneUnitOfPointSize();
407 return TextAbstraction::FontClient::NUMBER_OF_POINTS_PER_ONE_UNIT_OF_POINT_SIZE;
411 FT_FaceRec_* FontClient::GetFreetypeFace(FontId fontId)
415 return mPlugin->GetFreetypeFace(fontId);
418 FontDescription::Type FontClient::GetFontType(FontId fontId)
422 return mPlugin->GetFontType(fontId);
425 bool FontClient::AddCustomFontDirectory(const FontPath& path)
429 return mPlugin->AddCustomFontDirectory(path);
432 HarfBuzzFontHandle FontClient::GetHarfBuzzFont(FontId fontId)
436 return mPlugin->GetHarfBuzzFont(fontId);
439 void FontClient::CreatePlugin()
443 mPlugin = new Plugin(mDpiHorizontal, mDpiVertical);
447 } // namespace Internal
449 } // namespace TextAbstraction