Mercurial > love-experiments
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 |
