comparison src/modules/image/devil/ImageData.cpp @ 1414:09e4aec8f429

Fixed some memory leaks in love.graphics.newImageData and ImageData:encode.
author Alex Szpakowski <slime73@gmail.com>
date Sat, 30 Mar 2013 16:39:50 -0300
parents d46820870f0a
children 357697c2e2a8
comparison
equal deleted inserted replaced
1413:f6ff61fc266f 1414:09e4aec8f429
106 { 106 {
107 if (!devilMutex) 107 if (!devilMutex)
108 devilMutex = thread::newMutex(); 108 devilMutex = thread::newMutex();
109 109
110 Lock lock(devilMutex); 110 Lock lock(devilMutex);
111 ILuint image; 111 ILuint image = ilGenImage();
112 ilGenImages(1, &image);
113 ilBindImage(image); 112 ilBindImage(image);
114 113
115 try 114 try
116 { 115 {
117 bool success = IL_TRUE == ilLoadL(IL_TYPE_UNKNOWN, (void *)data->getData(), data->getSize()); 116 bool success = IL_TRUE == ilLoadL(IL_TYPE_UNKNOWN, (void *)data->getData(), data->getSize());
130 if (bpp != sizeof(pixel)) 129 if (bpp != sizeof(pixel))
131 throw love::Exception("Could not convert image!"); 130 throw love::Exception("Could not convert image!");
132 131
133 create(width, height, ilGetData()); 132 create(width, height, ilGetData());
134 } 133 }
135 catch(std::exception &e) 134 catch (love::Exception &)
136 { 135 {
137 ilDeleteImages(1, &image); 136 ilDeleteImage(image);
137 throw;
138 }
139 catch (std::exception &e)
140 {
141 ilDeleteImage(image);
138 throw love::Exception("%s", e.what()); 142 throw love::Exception("%s", e.what());
139 } 143 }
140 144
141 ilDeleteImages(1, &image); 145 ilDeleteImage(image);
142 } 146 }
143 147
144 void ImageData::encode(love::filesystem::File *f, ImageData::Format format) 148 void ImageData::encode(love::filesystem::File *f, ImageData::Format format)
145 { 149 {
146 if (!devilMutex) 150 if (!devilMutex)
147 devilMutex = thread::newMutex(); 151 devilMutex = thread::newMutex();
148 152
149 Lock lock1(devilMutex); 153 Lock lock1(devilMutex);
150 Lock lock2(mutex); 154 Lock lock2(mutex);
151 155
152 ILuint tempimage; 156 ILuint tempimage = ilGenImage();
153 ilGenImages(1, &tempimage);
154 ilBindImage(tempimage); 157 ilBindImage(tempimage);
155 ilxClearErrors(); 158 ilxClearErrors();
156 159
157 ILubyte *encoded_data = NULL; 160 ILubyte *encoded_data = NULL;
158 161
220 223
221 f->open(love::filesystem::File::WRITE); 224 f->open(love::filesystem::File::WRITE);
222 f->write(encoded_data, size); 225 f->write(encoded_data, size);
223 f->close(); 226 f->close();
224 } 227 }
225 catch(std::exception &) 228 catch (love::Exception &)
226 { 229 {
227 ilDeleteImages(1, &tempimage); 230 ilDeleteImage(tempimage);
228 delete[] encoded_data; 231 delete[] encoded_data;
229 throw; 232 throw;
230 } 233 }
231 234 catch (std::exception &e)
232 ilDeleteImages(1, &tempimage); 235 {
236 ilDeleteImage(tempimage);
237 delete[] encoded_data;
238 throw love::Exception("%s", e.what());
239 }
240
241 ilDeleteImage(tempimage);
233 delete[] encoded_data; 242 delete[] encoded_data;
234 } 243 }
235 244
236 } // devil 245 } // devil
237 } // image 246 } // image