LMMS
Loading...
Searching...
No Matches
juce_ImageCache.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce
27{
28
29struct ImageCache::Pimpl : private Timer,
30 private DeletedAtShutdown
31{
32 Pimpl() = default;
33 ~Pimpl() override { clearSingletonInstance(); }
34
36
38 {
39 const ScopedLock sl (lock);
40
41 for (auto& item : images)
42 {
43 if (item.hashCode == hashCode)
44 {
45 item.lastUseTime = Time::getApproximateMillisecondCounter();
46 return item.image;
47 }
48 }
49
50 return {};
51 }
52
53 void addImageToCache (const Image& image, const int64 hashCode)
54 {
55 if (image.isValid())
56 {
57 if (! isTimerRunning())
58 startTimer (2000);
59
60 const ScopedLock sl (lock);
62 }
63 }
64
65 void timerCallback() override
66 {
68
69 const ScopedLock sl (lock);
70
71 for (int i = images.size(); --i >= 0;)
72 {
73 auto& item = images.getReference(i);
74
75 if (item.image.getReferenceCount() <= 1)
76 {
77 if (now > item.lastUseTime + cacheTimeout || now < item.lastUseTime - 1000)
78 images.remove (i);
79 }
80 else
81 {
82 item.lastUseTime = now; // multiply-referenced, so this image is still in use.
83 }
84 }
85
86 if (images.isEmpty())
87 stopTimer();
88 }
89
91 {
92 const ScopedLock sl (lock);
93
94 for (int i = images.size(); --i >= 0;)
95 if (images.getReference(i).image.getReferenceCount() <= 1)
96 images.remove (i);
97 }
98
105
108 unsigned int cacheTimeout = 5000;
109
111};
112
114
115
116//==============================================================================
118{
119 if (Pimpl::getInstanceWithoutCreating() != nullptr)
120 return Pimpl::getInstanceWithoutCreating()->getFromHashCode (hashCode);
121
122 return {};
123}
124
125void ImageCache::addImageToCache (const Image& image, const int64 hashCode)
126{
127 Pimpl::getInstance()->addImageToCache (image, hashCode);
128}
129
131{
132 auto hashCode = file.hashCode64();
133 auto image = getFromHashCode (hashCode);
134
135 if (image.isNull())
136 {
138 addImageToCache (image, hashCode);
139 }
140
141 return image;
142}
143
144Image ImageCache::getFromMemory (const void* imageData, const int dataSize)
145{
146 auto hashCode = (int64) (pointer_sized_int) imageData;
147 auto image = getFromHashCode (hashCode);
148
149 if (image.isNull())
150 {
151 image = ImageFileFormat::loadFrom (imageData, (size_t) dataSize);
152 addImageToCache (image, hashCode);
153 }
154
155 return image;
156}
157
158void ImageCache::setCacheTimeout (const int millisecs)
159{
160 jassert (millisecs >= 0);
161 Pimpl::getInstance()->cacheTimeout = (unsigned int) millisecs;
162}
163
165{
166 Pimpl::getInstance()->releaseUnusedImages();
167}
168
169} // namespace juce
#define noexcept
Definition DistrhoDefines.h:72
Definition juce_Array.h:56
Definition juce_CriticalSection.h:43
DeletedAtShutdown()
Definition juce_DeletedAtShutdown.cpp:34
Definition juce_File.h:45
static Image getFromMemory(const void *imageData, int dataSize)
Definition juce_ImageCache.cpp:144
static void setCacheTimeout(int millisecs)
Definition juce_ImageCache.cpp:158
static void addImageToCache(const Image &image, int64 hashCode)
Definition juce_ImageCache.cpp:125
static void releaseUnusedImages()
Definition juce_ImageCache.cpp:164
static Image getFromFile(const File &file)
Definition juce_ImageCache.cpp:130
static Image getFromHashCode(int64 hashCode)
Definition juce_ImageCache.cpp:117
static Image loadFrom(InputStream &input)
Definition juce_ImageFileFormat.cpp:79
Definition juce_Image.h:58
static uint32 getApproximateMillisecondCounter() noexcept
Definition juce_Time.cpp:261
void stopTimer() noexcept
Definition juce_Timer.cpp:357
Timer() noexcept
Definition juce_Timer.cpp:316
bool isTimerRunning() const noexcept
Definition juce_Timer.h:111
void startTimer(int intervalInMilliseconds) noexcept
Definition juce_Timer.cpp:332
register unsigned i
Definition inflate.c:1575
#define jassert(expression)
#define JUCE_DECLARE_NON_COPYABLE(className)
#define JUCE_IMPLEMENT_SINGLETON(Classname)
Definition juce_Singleton.h:201
#define JUCE_DECLARE_SINGLETON(Classname, doNotRecreateAfterDeletion)
Definition juce_Singleton.h:184
Definition carla_juce.cpp:31
CriticalSection::ScopedLockType ScopedLock
Definition juce_CriticalSection.h:186
unsigned int uint32
Definition juce_MathsFunctions.h:45
long long int64
Definition juce_MathsFunctions.h:54
int pointer_sized_int
Definition juce_MathsFunctions.h:80
@ image
Definition juce_AccessibilityRole.h:42
Definition juce_ImageCache.cpp:100
int64 hashCode
Definition juce_ImageCache.cpp:102
Image image
Definition juce_ImageCache.cpp:101
uint32 lastUseTime
Definition juce_ImageCache.cpp:103
Definition juce_ImageCache.cpp:31
Array< Item > images
Definition juce_ImageCache.cpp:106
Image getFromHashCode(const int64 hashCode) noexcept
Definition juce_ImageCache.cpp:37
void timerCallback() override
Definition juce_ImageCache.cpp:65
~Pimpl() override
Definition juce_ImageCache.cpp:33
void addImageToCache(const Image &image, const int64 hashCode)
Definition juce_ImageCache.cpp:53
void releaseUnusedImages()
Definition juce_ImageCache.cpp:90
CriticalSection lock
Definition juce_ImageCache.cpp:107
unsigned int cacheTimeout
Definition juce_ImageCache.cpp:108
typedef int(UZ_EXP MsgFn)()
struct zdirent * file
Definition win32.c:1500
#define const
Definition zconf.h:137