summaryrefslogtreecommitdiff
path: root/vcl/opengl/win/winlayout.cxx
blob: c8ead510dac82ccfe8f57b32e6519169e3aebaf5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/* -*- 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/.
 */

#include <opengl/win/winlayout.hxx>

#include <opengl/win/gdiimpl.hxx>

bool OpenGLGlobalWinGlyphCache::AllocateTexture(WinGlyphDrawElement& rElement, CompatibleDC* dc)
{
    assert(!rElement.maTexture);
    assert(dynamic_cast<OpenGLCompatibleDC*>(dc));
    OpenGLCompatibleDC* odc = static_cast<OpenGLCompatibleDC*>(dc);
    OpenGLCompatibleDC::Texture* texture = new OpenGLCompatibleDC::Texture;
    rElement.maTexture.reset(texture);
    texture->texture = maPackedTextureAtlas.Reserve(dc->getBitmapWidth(), dc->getBitmapHeight());
    if (!texture->texture)
        return false;
    if (!odc->copyToTexture(*rElement.maTexture))
        return false;
    return true;
}

void OpenGLGlobalWinGlyphCache::Prune()
{
    std::vector<GLuint> aTextureIDs = maPackedTextureAtlas.ReduceTextureNumber(8);
    if (!aTextureIDs.empty())
    {
        for (auto& pWinGlyphCache : maWinGlyphCaches)
            static_cast<OpenGLWinGlyphCache*>(pWinGlyphCache)->RemoveTextures(aTextureIDs);
    }
}

void OpenGLWinGlyphCache::RemoveTextures(std::vector<GLuint>& rTextureIDs)
{
    auto it = maWinTextureCache.begin();

    while (it != maWinTextureCache.end())
    {
        assert(dynamic_cast<OpenGLCompatibleDC::Texture*>(it->second.maTexture.get()));
        GLuint nTextureID
            = static_cast<OpenGLCompatibleDC::Texture*>(it->second.maTexture.get())->texture.Id();

        if (std::find(rTextureIDs.begin(), rTextureIDs.end(), nTextureID) != rTextureIDs.end())
        {
            it = maWinTextureCache.erase(it);
        }
        else
        {
            ++it;
        }
    }
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */