1 #include "SurgeBitmaps.h"
2 #include "UserInteractions.h"
3 
4 #include "UIInstrumentation.h"
5 #include "CScalableBitmap.h"
6 #include <iostream>
7 #include <cassert>
8 
9 using namespace VSTGUI;
10 
11 std::atomic<int> SurgeBitmaps::instances(0);
SurgeBitmaps()12 SurgeBitmaps::SurgeBitmaps()
13 {
14     instances++;
15 #ifdef INSTRUMENT_UI
16     Surge::Debug::record("SurgeBitmaps::SurgeBitmaps");
17 #endif
18 
19     // std::cout << "Constructing a SurgeBitmaps; Instances is " << instances << std::endl;
20 }
21 
~SurgeBitmaps()22 SurgeBitmaps::~SurgeBitmaps()
23 {
24 #ifdef INSTRUMENT_UI
25     Surge::Debug::record("SurgeBitmaps::~SurgeBitmaps");
26 #endif
27     clearAllLoadedBitmaps();
28     instances--;
29     // std::cout << "Destroying a SurgeBitmaps; Instances is " << instances << std::endl;
30 }
31 
clearAllLoadedBitmaps()32 void SurgeBitmaps::clearAllLoadedBitmaps()
33 {
34     for (auto pair : bitmap_registry)
35     {
36         pair.second->forget();
37     }
38     for (auto pair : bitmap_file_registry)
39     {
40         pair.second->forget();
41     }
42     for (auto pair : bitmap_stringid_registry)
43     {
44         pair.second->forget();
45     }
46     bitmap_registry.clear();
47     bitmap_file_registry.clear();
48     bitmap_stringid_registry.clear();
49 }
50 
clearAllBitmapOffscreenCaches()51 void SurgeBitmaps::clearAllBitmapOffscreenCaches()
52 {
53     for (auto pair : bitmap_registry)
54     {
55         pair.second->clearOffscreenCaches();
56     }
57     for (auto pair : bitmap_file_registry)
58     {
59         pair.second->clearOffscreenCaches();
60     }
61     for (auto pair : bitmap_stringid_registry)
62     {
63         pair.second->clearOffscreenCaches();
64     }
65 }
66 
setupBitmapsForFrame(VSTGUI::CFrame * f)67 void SurgeBitmaps::setupBitmapsForFrame(VSTGUI::CFrame *f)
68 {
69     frame = f;
70     addEntry(IDB_MAIN_BG, f);
71     addEntry(IDB_FILTER_SUBTYPE, f);
72     addEntry(IDB_FILTER2_OFFSET, f);
73     addEntry(IDB_OSC_SELECT, f);
74     addEntry(IDB_FILTER_CONFIG, f);
75     addEntry(IDB_SCENE_SELECT, f);
76     addEntry(IDB_SCENE_MODE, f);
77     addEntry(IDB_OSC_OCTAVE, f);
78     addEntry(IDB_SCENE_OCTAVE, f);
79     addEntry(IDB_WAVESHAPER_MODE, f);
80     addEntry(IDB_PLAY_MODE, f);
81     addEntry(IDB_OSC_RETRIGGER, f);
82     addEntry(IDB_OSC_KEYTRACK, f);
83     addEntry(IDB_MIXER_MUTE, f);
84     addEntry(IDB_MIXER_SOLO, f);
85     addEntry(IDB_OSC_FM_ROUTING, f);
86     addEntry(IDB_FILTER2_RESONANCE_LINK, f);
87     addEntry(IDB_MIXER_OSC_ROUTING, f);
88     addEntry(IDB_ENV_SHAPE, f);
89     addEntry(IDB_FX_GLOBAL_BYPASS, f);
90     addEntry(IDB_LFO_TRIGGER_MODE, f);
91     addEntry(IDB_PREVNEXT_JOG, f);
92     addEntry(IDB_LFO_UNIPOLAR, f);
93     addEntry(IDB_OSC_CHARACTER, f);
94     addEntry(IDB_STORE_PATCH, f);
95     addEntry(IDB_MODSOURCE_BG, f);
96     addEntry(IDB_FX_GRID, f);
97     addEntry(IDB_FX_TYPE_ICONS, f);
98     addEntry(IDB_OSC_MENU, f);
99     addEntry(IDB_SLIDER_HORIZ_BG, f);
100     addEntry(IDB_SLIDER_VERT_BG, f);
101     addEntry(IDB_SLIDER_HORIZ_HANDLE, f);
102     addEntry(IDB_SLIDER_VERT_HANDLE, f);
103     addEntry(IDB_ENV_MODE, f);
104     addEntry(IDB_MAIN_MENU, f);
105     addEntry(IDB_LFO_TYPE, f);
106     addEntry(IDB_MENU_AS_SLIDER, f);
107     addEntry(IDB_FILTER_MENU, f);
108     addEntry(IDB_FILTER_ICONS, f);
109     addEntry(IDB_MIDI_LEARN, f);
110 
111     // == SVG == Do not remove this comment - it indicates the start of the automated SVG adding
112     // block
113     addEntry(IDB_MSEG_NODES, f);
114     addEntry(IDB_MSEG_MOVEMENT_MODE, f);
115     addEntry(IDB_SURGE_ICON, f);
116     addEntry(IDB_MSEG_VERTICAL_SNAP, f);
117     addEntry(IDB_MSEG_HORIZONTAL_SNAP, f);
118     addEntry(IDB_MPE_BUTTON, f);
119     addEntry(IDB_ZOOM_BUTTON, f);
120     addEntry(IDB_TUNE_BUTTON, f);
121     addEntry(IDB_NUMFIELD_POLY_SPLIT, f);
122     addEntry(IDB_NUMFIELD_PITCHBEND, f);
123     addEntry(IDB_NUMFIELD_KEYTRACK_ROOT, f);
124     addEntry(IDB_MSEG_LOOP_MODE, f);
125     addEntry(IDB_LFO_MSEG_EDIT, f);
126     addEntry(IDB_LFO_PRESET_MENU, f);
127     addEntry(IDB_MSEG_SNAPVALUE_NUMFIELD, f);
128     addEntry(IDB_MODSOURCE_SHOW_LFO, f);
129     addEntry(IDB_MSEG_EDIT_MODE, f);
130     addEntry(IDB_ABOUT_LOGOS, f);
131     addEntry(IDB_ABOUT_BG, f);
132     addEntry(IDB_VUMETER_BARS, f);
133     // == /SVG == Do not remove this comment
134 }
135 
addEntry(int id,VSTGUI::CFrame * f)136 void SurgeBitmaps::addEntry(int id, VSTGUI::CFrame *f)
137 {
138     assert(bitmap_registry.find(id) == bitmap_registry.end());
139 
140     CScalableBitmap *bitmap = new CScalableBitmap(VSTGUI::CResourceDescription(id), f);
141 
142     bitmap_registry[id] = bitmap;
143 }
144 
getBitmap(int id)145 CScalableBitmap *SurgeBitmaps::getBitmap(int id) { return bitmap_registry.at(id); }
146 
getBitmapByPath(std::string path)147 CScalableBitmap *SurgeBitmaps::getBitmapByPath(std::string path)
148 {
149     if (bitmap_file_registry.find(path) == bitmap_file_registry.end())
150         return nullptr;
151     return bitmap_file_registry.at(path);
152 }
153 
getBitmapByStringID(std::string id)154 CScalableBitmap *SurgeBitmaps::getBitmapByStringID(std::string id)
155 {
156     if (bitmap_stringid_registry.find(id) == bitmap_stringid_registry.end())
157         return nullptr;
158     return bitmap_stringid_registry[id];
159 }
160 
loadBitmapByPath(std::string path)161 CScalableBitmap *SurgeBitmaps::loadBitmapByPath(std::string path)
162 {
163     if (bitmap_file_registry.find(path) != bitmap_file_registry.end())
164     {
165         bitmap_file_registry[path]->forget();
166     }
167     bitmap_file_registry[path] = new CScalableBitmap(path, frame);
168     return bitmap_file_registry[path];
169 }
170 
loadBitmapByPathForID(std::string path,int id)171 CScalableBitmap *SurgeBitmaps::loadBitmapByPathForID(std::string path, int id)
172 {
173     if (bitmap_registry.find(id) != bitmap_registry.end())
174     {
175         bitmap_registry[id]->forget();
176     }
177     bitmap_registry[id] = new CScalableBitmap(path, frame);
178     return bitmap_registry[id];
179 }
180 
loadBitmapByPathForStringID(std::string path,std::string id)181 CScalableBitmap *SurgeBitmaps::loadBitmapByPathForStringID(std::string path, std::string id)
182 {
183     if (bitmap_stringid_registry.find(id) != bitmap_stringid_registry.end())
184     {
185         bitmap_stringid_registry[id]->forget();
186     }
187     bitmap_stringid_registry[id] = new CScalableBitmap(path, frame);
188     return bitmap_stringid_registry[id];
189 }
190 
setPhysicalZoomFactor(int pzf)191 void SurgeBitmaps::setPhysicalZoomFactor(int pzf)
192 {
193     for (auto pair : bitmap_registry)
194         pair.second->setPhysicalZoomFactor(pzf);
195     for (auto pair : bitmap_file_registry)
196         pair.second->setPhysicalZoomFactor(pzf);
197     for (auto pair : bitmap_stringid_registry)
198         pair.second->setPhysicalZoomFactor(pzf);
199 }
200