-
Notifications
You must be signed in to change notification settings - Fork 11
/
TileLoader.cpp
68 lines (56 loc) · 1.73 KB
/
TileLoader.cpp
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
61
62
63
64
65
66
67
68
/*
* TileLoader.cpp
* modestmaps-ci
*
* Created by Tom Carden on 8/27/10.
* Copyright 2010 Stamen Design. All rights reserved.
*
*/
#include "TileLoader.h"
#if defined( CINDER_COCOA )
#include <objc/objc-auto.h>
#endif
namespace cinder { namespace modestmaps {
void TileLoader::doThreadedPaint( const Coordinate &coord )
{
#if defined( CINDER_COCOA )
// borrowed from https://llvm.org/svn/llvm-project/lldb/trunk/source/Host/macosx/Host.mm
#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_5
// On Leopard and earlier there is no way objc_registerThreadWithCollector
// function, so we do it manually.
auto_zone_register_thread(auto_zone());
#else
// On SnowLoepard and later we just call the thread registration function.
objc_registerThreadWithCollector();
#endif
#endif
Surface image = provider->createSurface( coord );
pendingCompleteMutex.lock();
completed[coord] = image;
pending.erase(coord);
pendingCompleteMutex.unlock();
}
void TileLoader::processQueue(std::vector<Coordinate> &queue )
{
while (pending.size() < MAX_PENDING && queue.size() > 0) {
Coordinate key = *(queue.begin());
pendingCompleteMutex.lock();
pending.insert(key);
pendingCompleteMutex.unlock();
std::thread loaderThread( &TileLoader::doThreadedPaint, this, key );
queue.erase(queue.begin());
}
}
void TileLoader::transferTextures(std::map<Coordinate, gl::Texture> &images)
{
pendingCompleteMutex.lock();
while (!completed.empty()) {
std::map<Coordinate, Surface>::iterator iter = completed.begin();
if (iter->second) {
images[iter->first] = gl::Texture(iter->second);
}
completed.erase(iter);
}
pendingCompleteMutex.unlock();
}
} } // namespace