void ICOImageDecoder::decode(size_t index, bool onlySize) { if (failed()) return; // If we couldn't decode the image but we've received all the data, decoding // has failed. if ((!decodeDirectory() || (!onlySize && !decodeAtIndex(index))) && isAllDataReceived()) setFailed(); // If we're done decoding this frame, we don't need the BMPImageReader or // PNGImageDecoder anymore. (If we failed, these have already been // cleared.) else if ((m_frameBufferCache.size() > index) && (m_frameBufferCache[index].status() == ImageFrame::FrameComplete)) { m_bmpReaders[index] = nullptr; m_pngDecoders[index] = nullptr; } }
void ICOImageDecoder::decode(size_t index, bool onlySize) { if (failed()) return; // If we couldn't decode the image but we've received all the data, decoding // has failed. if ((!decodeDirectory() || (!onlySize && !decodeAtIndex(index))) && isAllDataReceived()) setFailed(); // If we're done decoding this frame, we don't need the BMPImageReader or // PNGImageDecoder anymore. (If we failed, these have already been // cleared.) else if ((m_frameBufferCache.size() > index) && m_frameBufferCache[index].isComplete()) { m_bmpReaders[index] = nullptr; m_pngDecoders[index] = nullptr; } if (m_frameBufferCache.isEmpty()) m_frameBufferCache.resize(m_dirEntries.size()); // CAUTION: We must not resize m_frameBufferCache again after this, as // decodeAtIndex() may give a BMPImageReader a pointer to one of the // entries. }
void ICOImageDecoder::decode(size_t index, bool onlySize) { if (failed()) return; // Defensively clear the FastSharedBufferReader's cache, as another caller // may have called SharedBuffer::mergeSegmentsIntoBuffer(). m_fastReader.clearCache(); // If we couldn't decode the image but we've received all the data, decoding // has failed. if ((!decodeDirectory() || (!onlySize && !decodeAtIndex(index))) && isAllDataReceived()) { setFailed(); // If we're done decoding this frame, we don't need the BMPImageReader or // PNGImageDecoder anymore. (If we failed, these have already been // cleared.) } else if ((m_frameBufferCache.size() > index) && (m_frameBufferCache[index].getStatus() == ImageFrame::FrameComplete)) { m_bmpReaders[index].reset(); m_pngDecoders[index].reset(); } }