亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? icohandler.cpp

?? linux下開源瀏覽器WebKit的源碼,市面上的很多商用瀏覽器都是移植自WebKit
?? CPP
字號:
/* * kimgio import filter for MS Windows .ico files * * Distributed under the terms of the LGPL * Copyright (c) 2000 Malte Starostik <malte@kde.org> * */#include "ICOHandler.h"#include <cstring>#include <cstdlib>#include <algorithm>#include <vector>#include <QtGui/QImage>#include <QtGui/QBitmap>#include <QtGui/QApplication>#include <QtCore/QVector>#include <QtGui/QDesktopWidget>namespace{    // Global header (see http://www.daubnet.com/formats/ICO.html)    struct IcoHeader    {        enum Type { Icon = 1, Cursor };        quint16 reserved;        quint16 type;        quint16 count;    };    inline QDataStream& operator >>( QDataStream& s, IcoHeader& h )    {        return s >> h.reserved >> h.type >> h.count;    }    // Based on qt_read_dib et al. from qimage.cpp    // (c) 1992-2002 Nokia Corporation and/or its subsidiary(-ies).    struct BMP_INFOHDR    {        static const quint32 Size = 40;        quint32  biSize;                // size of this struct        quint32  biWidth;               // pixmap width        quint32  biHeight;              // pixmap height        quint16  biPlanes;              // should be 1        quint16  biBitCount;            // number of bits per pixel        enum Compression { RGB = 0 };        quint32  biCompression;         // compression method        quint32  biSizeImage;           // size of image        quint32  biXPelsPerMeter;       // horizontal resolution        quint32  biYPelsPerMeter;       // vertical resolution        quint32  biClrUsed;             // number of colors used        quint32  biClrImportant;        // number of important colors    };    const quint32 BMP_INFOHDR::Size;    QDataStream& operator >>( QDataStream &s, BMP_INFOHDR &bi )    {        s >> bi.biSize;        if ( bi.biSize == BMP_INFOHDR::Size )        {            s >> bi.biWidth >> bi.biHeight >> bi.biPlanes >> bi.biBitCount;            s >> bi.biCompression >> bi.biSizeImage;            s >> bi.biXPelsPerMeter >> bi.biYPelsPerMeter;            s >> bi.biClrUsed >> bi.biClrImportant;        }        return s;    }#if 0    QDataStream &operator<<( QDataStream &s, const BMP_INFOHDR &bi )    {        s << bi.biSize;        s << bi.biWidth << bi.biHeight;        s << bi.biPlanes;        s << bi.biBitCount;        s << bi.biCompression;        s << bi.biSizeImage;        s << bi.biXPelsPerMeter << bi.biYPelsPerMeter;        s << bi.biClrUsed << bi.biClrImportant;        return s;    }#endif    // Header for every icon in the file    struct IconRec    {        unsigned char width;        unsigned char height;        quint16 colors;        quint16 hotspotX;        quint16 hotspotY;        quint32 size;        quint32 offset;    };    inline QDataStream& operator >>( QDataStream& s, IconRec& r )    {        return s >> r.width >> r.height >> r.colors                 >> r.hotspotX >> r.hotspotY >> r.size >> r.offset;    }    struct LessDifference    {        LessDifference( unsigned s, unsigned c )            : size( s ), colors( c ) {}        bool operator ()( const IconRec& lhs, const IconRec& rhs ) const        {            // closest size match precedes everything else            if ( std::abs( int( lhs.width - size ) ) <                 std::abs( int( rhs.width - size ) ) ) return true;            else if ( std::abs( int( lhs.width - size ) ) >                 std::abs( int( rhs.width - size ) ) ) return false;            else if ( colors == 0 )            {                // high/true color requested                if ( lhs.colors == 0 ) return true;                else if ( rhs.colors == 0 ) return false;                else return lhs.colors > rhs.colors;            }            else            {                // indexed icon requested                if ( lhs.colors == 0 && rhs.colors == 0 ) return false;                else if ( lhs.colors == 0 ) return false;                else return std::abs( int( lhs.colors - colors ) ) <                            std::abs( int( rhs.colors - colors ) );            }        }        unsigned size;        unsigned colors;    };    bool loadFromDIB( QDataStream& stream, const IconRec& rec, QImage& icon )    {        BMP_INFOHDR header;        stream >> header;        if ( stream.atEnd() || header.biSize != BMP_INFOHDR::Size ||             header.biSize > rec.size ||             header.biCompression != BMP_INFOHDR::RGB ||             ( header.biBitCount != 1 && header.biBitCount != 4 &&               header.biBitCount != 8 && header.biBitCount != 24 &&               header.biBitCount != 32 ) ) return false;        unsigned paletteSize, paletteEntries;        if (header.biBitCount > 8)        {            paletteEntries = 0;            paletteSize    = 0;        }        else        {            paletteSize    = (1 << header.biBitCount);            paletteEntries = paletteSize;            if (header.biClrUsed && header.biClrUsed < paletteSize)                paletteEntries = header.biClrUsed;        }        // Always create a 32-bit image to get the mask right        // Note: this is safe as rec.width, rec.height are bytes        icon = QImage( rec.width, rec.height, QImage::Format_ARGB32 );        if ( icon.isNull() ) return false;        QVector< QRgb > colorTable( paletteSize );        colorTable.fill( QRgb( 0 ) );        for ( unsigned i = 0; i < paletteEntries; ++i )        {            unsigned char rgb[ 4 ];            stream.readRawData( reinterpret_cast< char* >( &rgb ),                                 sizeof( rgb ) );            colorTable[ i ] = qRgb( rgb[ 2 ], rgb[ 1 ], rgb[ 0 ] );        }        unsigned bpl = ( rec.width * header.biBitCount + 31 ) / 32 * 4;        unsigned char* buf = new unsigned char[ bpl ];        for ( unsigned y = rec.height; !stream.atEnd() && y--; )        {            stream.readRawData( reinterpret_cast< char* >( buf ), bpl );            unsigned char* pixel = buf;            QRgb* p = reinterpret_cast< QRgb* >( icon.scanLine( y ) );            switch ( header.biBitCount )            {                case 1:                    for ( unsigned x = 0; x < rec.width; ++x )                        *p++ = colorTable[                            ( pixel[ x / 8 ] >> ( 7 - ( x & 0x07 ) ) ) & 1 ];                    break;                case 4:                    for ( unsigned x = 0; x < rec.width; ++x )                        if ( x & 1 ) *p++ = colorTable[ pixel[ x / 2 ] & 0x0f ];                        else *p++ = colorTable[ pixel[ x / 2 ] >> 4 ];                    break;                case 8:                    for ( unsigned x = 0; x < rec.width; ++x )                        *p++ = colorTable[ pixel[ x ] ];                    break;                case 24:                    for ( unsigned x = 0; x < rec.width; ++x )                        *p++ = qRgb( pixel[ 3 * x + 2 ],                                     pixel[ 3 * x + 1 ],                                     pixel[ 3 * x ] );                    break;                case 32:                    for ( unsigned x = 0; x < rec.width; ++x )                        *p++ = qRgba( pixel[ 4 * x + 2 ],                                      pixel[ 4 * x + 1 ],                                      pixel[ 4 * x ],                                      pixel[ 4 * x  + 3] );                    break;            }        }        delete[] buf;        if ( header.biBitCount < 32 )        {            // Traditional 1-bit mask            bpl = ( rec.width + 31 ) / 32 * 4;            buf = new unsigned char[ bpl ];            for ( unsigned y = rec.height; y--; )            {                stream.readRawData( reinterpret_cast< char* >( buf ), bpl );                QRgb* p = reinterpret_cast< QRgb* >( icon.scanLine( y ) );                for ( unsigned x = 0; x < rec.width; ++x, ++p )                    if ( ( ( buf[ x / 8 ] >> ( 7 - ( x & 0x07 ) ) ) & 1 ) )                        *p &= RGB_MASK;            }            delete[] buf;        }        return true;    }}ICOHandler::ICOHandler(){}bool ICOHandler::canRead() const{    return canRead(device());}bool ICOHandler::read(QImage *outImage){    qint64 offset = device()->pos();    QDataStream stream( device() );    stream.setByteOrder( QDataStream::LittleEndian );    IcoHeader header;    stream >> header;    if ( stream.atEnd() || !header.count ||         ( header.type != IcoHeader::Icon && header.type != IcoHeader::Cursor) )        return false;    unsigned requestedSize = 32;    unsigned requestedColors =  QApplication::desktop()->depth() > 8 ? 0 : QApplication::desktop()->depth();    int requestedIndex = -1;#if 0    if ( io->parameters() )    {        QStringList params = QString(io->parameters()).split( ';', QString::SkipEmptyParts );        QMap< QString, QString > options;        for ( QStringList::ConstIterator it = params.begin();              it != params.end(); ++it )        {            QStringList tmp = (*it).split( '=', QString::SkipEmptyParts );            if ( tmp.count() == 2 ) options[ tmp[ 0 ] ] = tmp[ 1 ];        }        if ( options[ "index" ].toUInt() )            requestedIndex = options[ "index" ].toUInt();        if ( options[ "size" ].toUInt() )            requestedSize = options[ "size" ].toUInt();        if ( options[ "colors" ].toUInt() )            requestedColors = options[ "colors" ].toUInt();    }#endif    typedef std::vector< IconRec > IconList;    IconList icons;    for ( unsigned i = 0; i < header.count; ++i )    {        if ( stream.atEnd() )            return false;        IconRec rec;        stream >> rec;        icons.push_back( rec );    }    IconList::const_iterator selected;    if (requestedIndex >= 0) {        selected = std::min( icons.begin() + requestedIndex, icons.end() );    } else {        selected = std::min_element( icons.begin(), icons.end(),                                     LessDifference( requestedSize, requestedColors ) );    }    if ( stream.atEnd() || selected == icons.end() ||         offset + selected->offset > device()->size() )        return false;    device()->seek( offset + selected->offset );    QImage icon;    if ( loadFromDIB( stream, *selected, icon ) )    {#ifndef QT_NO_IMAGE_TEXT        icon.setText( "X-Index", 0, QString::number( selected - icons.begin() ) );        if ( header.type == IcoHeader::Cursor )        {            icon.setText( "X-HotspotX", 0, QString::number( selected->hotspotX ) );            icon.setText( "X-HotspotY", 0, QString::number( selected->hotspotY ) );        }#endif        *outImage = icon;        return true;    }    return false;}bool ICOHandler::write(const QImage &/*image*/){#if 0    if (image.isNull())        return;    QByteArray dibData;    QDataStream dib(dibData, QIODevice::ReadWrite);    dib.setByteOrder(QDataStream::LittleEndian);    QImage pixels = image;    QImage mask;    if (io->image().hasAlphaBuffer())        mask = image.createAlphaMask();    else        mask = image.createHeuristicMask();    mask.invertPixels();    for ( int y = 0; y < pixels.height(); ++y )        for ( int x = 0; x < pixels.width(); ++x )            if ( mask.pixel( x, y ) == 0 ) pixels.setPixel( x, y, 0 );    if (!qt_write_dib(dib, pixels))        return;   uint hdrPos = dib.device()->at();    if (!qt_write_dib(dib, mask))        return;    memmove(dibData.data() + hdrPos, dibData.data() + hdrPos + BMP_WIN + 8, dibData.size() - hdrPos - BMP_WIN - 8);    dibData.resize(dibData.size() - BMP_WIN - 8);    QDataStream ico(device());    ico.setByteOrder(QDataStream::LittleEndian);    IcoHeader hdr;    hdr.reserved = 0;    hdr.type = Icon;    hdr.count = 1;    ico << hdr.reserved << hdr.type << hdr.count;    IconRec rec;    rec.width = image.width();    rec.height = image.height();    if (image.numColors() <= 16)        rec.colors = 16;    else if (image.depth() <= 8)        rec.colors = 256;    else        rec.colors = 0;    rec.hotspotX = 0;    rec.hotspotY = 0;    rec.dibSize = dibData.size();    ico << rec.width << rec.height << rec.colors        << rec.hotspotX << rec.hotspotY << rec.dibSize;    rec.dibOffset = ico.device()->at() + sizeof(rec.dibOffset);    ico << rec.dibOffset;    BMP_INFOHDR dibHeader;    dib.device()->at(0);    dib >> dibHeader;    dibHeader.biHeight = image.height() << 1;    dib.device()->at(0);    dib << dibHeader;    ico.writeRawBytes(dibData.data(), dibData.size());    return true;#endif    return false;}QByteArray ICOHandler::name() const{    return "ico";}bool ICOHandler::canRead(QIODevice *device){    if (!device) {        qWarning("ICOHandler::canRead() called with no device");        return false;    }    const qint64 oldPos = device->pos();    char head[8];    qint64 readBytes = device->read(head, sizeof(head));    const bool readOk = readBytes == sizeof(head);    if (device->isSequential()) {        while (readBytes > 0)            device->ungetChar(head[readBytes-- - 1]);    } else {        device->seek(oldPos);    }    if ( !readOk )        return false;    return head[2] == '\001' && head[3] == '\000' && // type should be 1        ( head[6] == 16 || head[6] == 32 || head[6] == 64 ) && // width can only be one of those        ( head[7] == 16 || head[7] == 32 || head[7] == 64 );   // same for height}class ICOPlugin : public QImageIOPlugin{public:    QStringList keys() const;    Capabilities capabilities(QIODevice *device, const QByteArray &format) const;    QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const;};QStringList ICOPlugin::keys() const{    return QStringList() << "ico" << "ICO";}QImageIOPlugin::Capabilities ICOPlugin::capabilities(QIODevice *device, const QByteArray &format) const{    if (format == "ico" || format == "ICO")        return Capabilities(CanRead);    if (!format.isEmpty())        return 0;    if (!device->isOpen())        return 0;    Capabilities cap;    if (device->isReadable() && ICOHandler::canRead(device))        cap |= CanRead;    return cap;}QImageIOHandler *ICOPlugin::create(QIODevice *device, const QByteArray &format) const{    QImageIOHandler *handler = new ICOHandler;    handler->setDevice(device);    handler->setFormat(format);    return handler;}Q_EXPORT_STATIC_PLUGIN(ICOPlugin)Q_EXPORT_PLUGIN2(qtwebico, ICOPlugin)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美性色综合网| 国产成人a级片| 精品国产91久久久久久久妲己 | 国产在线精品一区二区三区不卡| 国产视频911| 欧美系列日韩一区| 国产精品影视在线| 五月激情六月综合| 国产精品美女久久久久久久久久久| 91视频观看视频| 经典三级一区二区| 五月婷婷综合在线| 国产精品久久影院| 久久综合久久鬼色| 欧美伦理电影网| 91亚洲精品久久久蜜桃网站| 狂野欧美性猛交blacked| 亚洲免费av在线| 国产精品全国免费观看高清 | 国产中文一区二区三区| 亚洲福利视频导航| 国产精品久久久久一区二区三区共| 在线电影院国产精品| 91麻豆视频网站| 国产iv一区二区三区| 麻豆成人久久精品二区三区红| 亚洲素人一区二区| 欧美极品美女视频| 精品国产电影一区二区| 制服丝袜日韩国产| 欧美中文字幕一区| 99re热视频这里只精品| 国产成人综合自拍| 韩国精品一区二区| 免费欧美在线视频| 日韩av不卡在线观看| 亚洲美女一区二区三区| 中文字幕在线观看不卡| 国产精品女主播av| 国产精品入口麻豆九色| 国产色综合久久| 国产欧美日韩亚州综合| 久久精子c满五个校花| 久久在线观看免费| 亚洲国产岛国毛片在线| 久久精品日韩一区二区三区| 久久综合九色综合久久久精品综合| 91精品国产免费久久综合| 欧美日韩国产精品自在自线| 欧美丰满一区二区免费视频| 在线播放欧美女士性生活| 欧美精品久久天天躁| 在线不卡欧美精品一区二区三区| 欧美色偷偷大香| 在线播放91灌醉迷j高跟美女| 欧美色视频在线观看| 欧美亚洲综合在线| 在线播放中文字幕一区| 日韩欧美高清dvd碟片| 精品欧美黑人一区二区三区| 精品国产乱码久久久久久久 | 成人av电影在线网| 99久久精品免费看国产| 91搞黄在线观看| 欧美日韩一本到| 欧美一区二区私人影院日本| 欧美www视频| 久久精品人人做| 亚洲视频一二三| 亚洲国产视频一区| 日本亚洲欧美天堂免费| 激情久久五月天| 成人app在线| 欧美在线免费播放| 精品免费国产二区三区 | 亚洲欧洲日产国码二区| 一级精品视频在线观看宜春院| 亚洲午夜久久久| 激情图片小说一区| 99在线精品免费| 51久久夜色精品国产麻豆| 精品少妇一区二区三区日产乱码| 亚洲高清三级视频| 国产专区欧美精品| 一本色道久久综合亚洲aⅴ蜜桃| 欧美三级视频在线| 久久理论电影网| 亚洲理论在线观看| 九九国产精品视频| 91最新地址在线播放| 欧美精品久久久久久久久老牛影院 | 成人教育av在线| 欧美日韩精品电影| 国产精品国产自产拍在线| 亚洲一区二区三区激情| 国产一区在线精品| 在线观看日韩高清av| 国产日韩欧美一区二区三区综合| 亚洲精品视频在线观看网站| 蜜桃精品在线观看| 成人午夜视频在线观看| 3d动漫精品啪啪一区二区竹菊 | 亚洲美女少妇撒尿| 国产一区二区精品久久| 欧美天堂亚洲电影院在线播放| 久久久亚洲午夜电影| 亚洲国产精品综合小说图片区| 国产精品自拍三区| 日韩一级欧美一级| 亚洲在线成人精品| 粉嫩av一区二区三区| 欧美一级国产精品| 亚洲第一综合色| 91社区在线播放| 国产性天天综合网| 麻豆精品一区二区综合av| 在线一区二区三区| 国产精品美女久久久久久久久久久 | 中文字幕视频一区| 国产一区二区0| 欧美日韩综合不卡| 日韩美女久久久| 风间由美中文字幕在线看视频国产欧美 | 久久精品夜色噜噜亚洲a∨| 国产91精品精华液一区二区三区| 欧美色中文字幕| 91精品蜜臀在线一区尤物| 国产精品福利一区二区| 视频一区二区中文字幕| 蜜臀av亚洲一区中文字幕| 欧美日韩高清一区| 国产精品久久夜| 精品亚洲porn| 欧美日韩亚洲另类| 亚洲视频狠狠干| 国产成人亚洲综合a∨婷婷| 欧美色大人视频| 亚洲日本va午夜在线电影| 国产精品一区二区三区四区| 欧美日韩1234| 亚洲精品少妇30p| 成年人午夜久久久| 国产精品麻豆视频| 国产高清不卡二三区| 欧美刺激午夜性久久久久久久 | 欧美性色综合网| 国产精品护士白丝一区av| 国产成人精品一区二| 欧美成人在线直播| 国产电影一区二区三区| 精品欧美黑人一区二区三区| 三级久久三级久久| 欧美亚一区二区| 亚洲女同ⅹxx女同tv| 欧美日韩免费一区二区三区| 亚洲精品高清在线| 91在线播放网址| 18成人在线视频| 99精品欧美一区二区蜜桃免费| 一区二区三区精密机械公司| 一本大道久久a久久精品综合| 综合欧美亚洲日本| 91亚洲午夜精品久久久久久| 久久蜜桃一区二区| 波多野结衣视频一区| 国产精品美女视频| 91在线视频免费91| 亚洲美女视频在线| 欧美在线观看18| 亚洲综合久久久久| 欧美裸体一区二区三区| 日韩av一级电影| 欧美精品一区二区久久婷婷| 国产专区综合网| 国产日韩av一区| 波多野结衣在线aⅴ中文字幕不卡| 中文字幕不卡三区| 91小视频在线免费看| 五月天亚洲婷婷| 日韩欧美区一区二| 国产成人综合自拍| 亚洲欧美电影一区二区| 日韩视频永久免费| 国产成人综合自拍| 亚洲乱码中文字幕| 国产精品私人影院| 欧美亚洲一区二区在线| 蜜桃视频一区二区三区在线观看 | 成人午夜又粗又硬又大| 亚洲欧美偷拍卡通变态| 在线观看日韩高清av| 国产一区二区0| 亚洲日本乱码在线观看| 在线播放91灌醉迷j高跟美女 | 91丝袜国产在线播放| 亚洲成人精品影院| 久久女同精品一区二区| 欧美视频一区二| 国产一区二区三区在线观看免费视频| 国产精品网站在线观看|