Show
Ignore:
Timestamp:
02/18/10 13:55:47 (7 months ago)
Author:
gpenin
Message:

merge with webkit revision 54942

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/BAL/ImageDecoder/WebCore/ICO/WK/BCICOImageDecoderWK.cpp

    r1126 r1380  
    4646 
    4747ICOImageDecoder::ICOImageDecoder() 
    48     : ImageDecoder() 
    49     , m_allDataReceived(false) 
    50     , m_decodedOffset(0) 
     48    : m_decodedOffset(0) 
     49
     50
     51 
     52ICOImageDecoder::~ICOImageDecoder() 
    5153{ 
    5254} 
     
    5860 
    5961    ImageDecoder::setData(data, allDataReceived); 
    60     m_allDataReceived = allDataReceived; 
    61  
    62     for (BMPReaders::iterator i(m_bmpReaders.begin()); 
    63          i != m_bmpReaders.end(); ++i) { 
     62 
     63    for (BMPReaders::iterator i(m_bmpReaders.begin()); i != m_bmpReaders.end(); ++i) { 
    6464        if (*i) 
    6565            (*i)->setData(data); 
     
    7272{ 
    7373    if (!ImageDecoder::isSizeAvailable()) 
    74         decodeWithCheckForDataEnded(0, true); 
     74        decode(0, true); 
    7575 
    7676    return ImageDecoder::isSizeAvailable(); 
     
    8484IntSize ICOImageDecoder::frameSizeAtIndex(size_t index) const 
    8585{ 
    86     return (index && (index < m_dirEntries.size())) ? 
    87         m_dirEntries[index].m_size : size(); 
     86    return (index && (index < m_dirEntries.size())) ? m_dirEntries[index].m_size : size(); 
    8887} 
    8988 
     
    102101size_t ICOImageDecoder::frameCount() 
    103102{ 
    104     decodeWithCheckForDataEnded(0, true); 
     103    decode(0, true); 
    105104    if (m_frameBufferCache.isEmpty()) 
    106105        m_frameBufferCache.resize(m_dirEntries.size()); 
     
    118117 
    119118    // Determine the image type, and if this is a BMP, decode. 
    120     decodeWithCheckForDataEnded(index, false); 
     119    decode(index, false); 
    121120 
    122121    // PNGs decode into their own framebuffers, so only use our internal cache 
     
    140139 
    141140// static 
    142 bool ICOImageDecoder::compareEntries(const IconDirectoryEntry& a, 
    143                                      const IconDirectoryEntry& b) 
    144 
    145     // Larger icons are better. 
     141bool ICOImageDecoder::compareEntries(const IconDirectoryEntry& a, const IconDirectoryEntry& b) 
     142
     143    // Larger icons are better.  After that, higher bit-depth icons are better. 
    146144    const int aEntryArea = a.m_size.width() * a.m_size.height(); 
    147145    const int bEntryArea = b.m_size.width() * b.m_size.height(); 
    148     if (aEntryArea != bEntryArea) 
    149         return (aEntryArea > bEntryArea); 
    150  
    151     // Higher bit-depth icons are better. 
    152     return (a.m_bitCount > b.m_bitCount); 
     146    return (aEntryArea == bEntryArea) ? (a.m_bitCount > b.m_bitCount) : (aEntryArea > bEntryArea); 
    153147} 
    154148 
     
    162156    // FIXME: Save this copy by making the PNG decoder able to take an 
    163157    // optional offset. 
    164     RefPtr<SharedBuffer> pngData( 
    165         SharedBuffer::create(&m_data->data()[dirEntry.m_imageOffset], 
    166                              m_data->size() - dirEntry.m_imageOffset)); 
    167     m_pngDecoders[index]->setData(pngData.get(), m_allDataReceived); 
    168 
    169  
    170 void ICOImageDecoder::decodeWithCheckForDataEnded(size_t index, bool onlySize) 
     158    RefPtr<SharedBuffer> pngData(SharedBuffer::create(&m_data->data()[dirEntry.m_imageOffset], m_data->size() - dirEntry.m_imageOffset)); 
     159    m_pngDecoders[index]->setData(pngData.get(), isAllDataReceived()); 
     160
     161 
     162void ICOImageDecoder::decode(size_t index, bool onlySize) 
    171163{ 
    172164    if (failed()) 
     
    175167    // If we couldn't decode the image but we've received all the data, decoding 
    176168    // has failed. 
    177     if ((!decodeDirectory() || (!onlySize && !decodeAtIndex(index))) 
    178         && m_allDataReceived) 
     169    if ((!decodeDirectory() || (!onlySize && !decodeAtIndex(index))) && isAllDataReceived()) 
    179170        setFailed(); 
    180171} 
     
    187178 
    188179    // Read and process directory entries. 
    189     return (m_decodedOffset >= 
    190             (sizeOfDirectory + (m_dirEntries.size() * sizeOfDirEntry))) 
    191         || processDirectoryEntries(); 
     180    return (m_decodedOffset >= (sizeOfDirectory + (m_dirEntries.size() * sizeOfDirEntry))) || processDirectoryEntries(); 
    192181} 
    193182 
     
    203192            // we must not resize it again later (see caution in frameCount()). 
    204193            ASSERT(m_frameBufferCache.size() == m_dirEntries.size()); 
    205             m_bmpReaders[index].set( 
    206                 new BMPImageReader(this, dirEntry.m_imageOffset, 0, true)); 
     194            m_bmpReaders[index].set(new BMPImageReader(this, dirEntry.m_imageOffset, 0, true)); 
    207195            m_bmpReaders[index]->setData(m_data.get()); 
    208196            m_bmpReaders[index]->setBuffer(&m_frameBufferCache[index]); 
     
    260248    // Read directory entries. 
    261249    ASSERT(m_decodedOffset == sizeOfDirectory); 
    262     if ((m_decodedOffset > m_data->size()) 
    263         || ((m_data->size() - m_decodedOffset) < 
    264             (m_dirEntries.size() * sizeOfDirEntry))) 
     250    if ((m_decodedOffset > m_data->size()) || ((m_data->size() - m_decodedOffset) < (m_dirEntries.size() * sizeOfDirEntry))) 
    265251        return false; 
    266     for (IconDirectoryEntries::iterator i(m_dirEntries.begin()); 
    267          i != m_dirEntries.end(); ++i) 
     252    for (IconDirectoryEntries::iterator i(m_dirEntries.begin()); i != m_dirEntries.end(); ++i) 
    268253        *i = readDirectoryEntry();  // Updates m_decodedOffset. 
    269254 
    270255    // Make sure the specified image offsets are past the end of the directory 
    271256    // entries. 
    272     for (IconDirectoryEntries::iterator i(m_dirEntries.begin()); 
    273          i != m_dirEntries.end(); ++i) { 
     257    for (IconDirectoryEntries::iterator i(m_dirEntries.begin()); i != m_dirEntries.end(); ++i) { 
    274258        if (i->m_imageOffset < m_decodedOffset) { 
    275259            setFailed(); 
     
    310294    // this value to determine which icon entry is best. 
    311295    if (!entry.m_bitCount) { 
    312         int colorCount = 
    313             static_cast<uint8_t>(m_data->data()[m_decodedOffset + 2]); 
     296        int colorCount = static_cast<uint8_t>(m_data->data()[m_decodedOffset + 2]); 
    314297        if (!colorCount) 
    315298            colorCount = 256;  // Vague in the spec, needed by real-world icons.