31c5682bed25bb0ac30045da13e3767202693f2d
[WebKit-https.git] / Source / WebCore / platform / graphics / texmap / coordinated / UpdateAtlas.cpp
1 /*
2  Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies)
3  Copyright (C) 2012 Company 100, Inc.
4
5  This library is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Library General Public
7  License as published by the Free Software Foundation; either
8  version 2 of the License, or (at your option) any later version.
9
10  This library is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  Library General Public License for more details.
14
15  You should have received a copy of the GNU Library General Public License
16  along with this library; see the file COPYING.LIB.  If not, write to
17  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  Boston, MA 02110-1301, USA.
19  */
20
21 #include "config.h"
22 #include "UpdateAtlas.h"
23
24 #if USE(COORDINATED_GRAPHICS)
25
26 #include "CoordinatedGraphicsState.h"
27 #include "IntRect.h"
28
29 namespace WebCore {
30
31 UpdateAtlas::UpdateAtlas(Client& client, const IntSize& size, Nicosia::Buffer::Flags flags)
32     : m_client(client)
33     , m_buffer(Nicosia::Buffer::create(size, flags))
34 {
35     static ID s_nextID { 0 };
36     m_id = ++s_nextID;
37
38     m_client.createUpdateAtlas(m_id, m_buffer.copyRef());
39 }
40
41 UpdateAtlas::~UpdateAtlas()
42 {
43     m_client.removeUpdateAtlas(m_id);
44 }
45
46 void UpdateAtlas::buildLayoutIfNeeded()
47 {
48     if (m_areaAllocator)
49         return;
50     m_areaAllocator = std::make_unique<GeneralAreaAllocator>(size());
51     m_areaAllocator->setMinimumAllocation(IntSize(32, 32));
52 }
53
54 void UpdateAtlas::didSwapBuffers()
55 {
56     m_areaAllocator = nullptr;
57 }
58
59 RefPtr<Nicosia::Buffer> UpdateAtlas::getCoordinatedBuffer(const IntSize& size, uint32_t& atlasID, IntRect& allocatedRect)
60 {
61     m_inactivityInSeconds = 0;
62     buildLayoutIfNeeded();
63     allocatedRect = m_areaAllocator->allocate(size);
64
65     if (allocatedRect.isEmpty())
66         return nullptr;
67
68     atlasID = m_id;
69     return m_buffer.copyRef();
70 }
71
72 } // namespace WebCore
73
74 #endif // USE(COORDINATED_GRAPHICS)