From ed5640d8b587fbcfed7dd7967f3de04b37a76f26 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 11:06:44 +0200 Subject: Adding upstream version 4:7.4.7. Signed-off-by: Daniel Baumann --- include/vcl/glyphitemcache.hxx | 111 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 include/vcl/glyphitemcache.hxx (limited to 'include/vcl/glyphitemcache.hxx') diff --git a/include/vcl/glyphitemcache.hxx b/include/vcl/glyphitemcache.hxx new file mode 100644 index 000000000..ed48f8c34 --- /dev/null +++ b/include/vcl/glyphitemcache.hxx @@ -0,0 +1,111 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you 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 . + */ + +#ifndef INCLUDED_VCL_GLYPHITEMCACHE_HXX +#define INCLUDED_VCL_GLYPHITEMCACHE_HXX + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +/** +A cache for SalLayoutGlyphs objects. + +Allows caching for OutputDevice::DrawText() and similar calls. Pass the text and the output device +for the call to OutputDevice::ImplLayout(). Items are cached per output device and its font. +If something more changes, call clear(). +*/ +class VCL_DLLPUBLIC SalLayoutGlyphsCache final +{ +public: + // NOTE: The lifetime of the returned value is guaranteed only until the next call + // to any function in this class. + const SalLayoutGlyphs* GetLayoutGlyphs(VclPtr outputDevice, + const OUString& text, + const vcl::text::TextLayoutCache* layoutCache = nullptr) + { + return GetLayoutGlyphs(outputDevice, text, 0, text.getLength(), 0, layoutCache); + } + const SalLayoutGlyphs* GetLayoutGlyphs(VclPtr outputDevice, + const OUString& text, sal_Int32 nIndex, sal_Int32 nLen, + tools::Long nLogicWidth = 0, + const vcl::text::TextLayoutCache* layoutCache = nullptr); + void clear(); + + static SalLayoutGlyphsCache* self(); + SalLayoutGlyphsCache(int size) // needs to be public for vcl::DeleteOnDeinit + : mCachedGlyphs(size) + { + } + +private: + struct CachedGlyphsKey + { + OUString text; + sal_Int32 index; + sal_Int32 len; + tools::Long logicWidth; + FontMetric fontMetric; + double fontScaleX; + double fontScaleY; + MapMode mapMode; + bool rtl; + bool artificialItalic; + bool artificialBold; + vcl::text::ComplexTextLayoutFlags layoutMode; + LanguageType digitLanguage; + size_t hashValue; + CachedGlyphsKey(const VclPtr& dev, const OUString& t, sal_Int32 i, + sal_Int32 l, tools::Long w); + bool operator==(const CachedGlyphsKey& other) const; + }; + struct CachedGlyphsHash + { + size_t operator()(const CachedGlyphsKey& key) const { return key.hashValue; } + }; + struct GlyphsCost + { + size_t operator()(const SalLayoutGlyphs&) const; + }; + typedef o3tl::lru_map, GlyphsCost> + GlyphsCache; + GlyphsCache mCachedGlyphs; + // Last temporary glyphs returned (pointer is returned, so the object needs to be kept somewhere). + std::optional mLastTemporaryKey; + SalLayoutGlyphs mLastTemporaryGlyphs; + // If set, info about the last call which wanted a substring of the full text. + std::optional mLastSubstringKey; + + SalLayoutGlyphsCache(const SalLayoutGlyphsCache&) = delete; + SalLayoutGlyphsCache& operator=(const SalLayoutGlyphsCache&) = delete; +}; + +#endif // INCLUDED_VCL_GLYPHITEMCACHE_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v1.2.3