⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pixeldumpsupportcg.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
字号:
/* * Copyright (C) 2005, 2006, 2007 Apple Inc. All rights reserved. *           (C) 2007 Graham Dennis (graham.dennis@gmail.com) *           (C) 2007 Eric Seidel <eric@webkit.org> * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1.  Redistributions of source code must retain the above copyright *     notice, this list of conditions and the following disclaimer. * 2.  Redistributions in binary form must reproduce the above copyright *     notice, this list of conditions and the following disclaimer in the *     documentation and/or other materials provided with the distribution. * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of *     its contributors may be used to endorse or promote products derived *     from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */#include "config.h"#include "PixelDumpSupportCG.h"#include "DumpRenderTree.h"#include "LayoutTestController.h"#include <ImageIO/CGImageDestination.h>#include <algorithm>#include <ctype.h>#include <wtf/Assertions.h>#include <wtf/RefPtr.h>#include <wtf/RetainPtr.h>#include <wtf/StringExtras.h>#if PLATFORM(WIN)#include "MD5.h"#elif PLATFORM(MAC)#include <LaunchServices/UTCoreTypes.h>#define COMMON_DIGEST_FOR_OPENSSL#include <CommonCrypto/CommonDigest.h>#endifusing namespace std;#if PLATFORM(WIN)static const CFStringRef kUTTypePNG = CFSTR("public.png");#endifstatic void printPNG(CGImageRef image){    RetainPtr<CFMutableDataRef> imageData(AdoptCF, CFDataCreateMutable(0, 0));    RetainPtr<CGImageDestinationRef> imageDest(AdoptCF, CGImageDestinationCreateWithData(imageData.get(), kUTTypePNG, 1, 0));    CGImageDestinationAddImage(imageDest.get(), image, 0);    CGImageDestinationFinalize(imageDest.get());    const UInt8* data = CFDataGetBytePtr(imageData.get());    CFIndex dataLength = CFDataGetLength(imageData.get());    printf("Content-Type: %s\n", "image/png");    printf("Content-Length: %lu\n", static_cast<unsigned long>(dataLength));    const size_t bytesToWriteInOneChunk = 1 << 15;    size_t dataRemainingToWrite = dataLength;    while (dataRemainingToWrite) {        size_t bytesToWriteInThisChunk = min(dataRemainingToWrite, bytesToWriteInOneChunk);        size_t bytesWritten = fwrite(data, 1, bytesToWriteInThisChunk, stdout);        if (bytesWritten != bytesToWriteInThisChunk)            break;        dataRemainingToWrite -= bytesWritten;        data += bytesWritten;    }}static void computeMD5HashStringForBitmapContext(CGContextRef bitmapContext, char hashString[33]){    ASSERT(CGBitmapContextGetBitsPerPixel(bitmapContext) == 32); // ImageDiff assumes 32 bit RGBA, we must as well.    size_t pixelsHigh = CGBitmapContextGetHeight(bitmapContext);    size_t pixelsWide = CGBitmapContextGetWidth(bitmapContext);    size_t bytesPerRow = CGBitmapContextGetBytesPerRow(bitmapContext);    // We need to swap the bytes to ensure consistent hashes independently of endianness    MD5_CTX md5Context;    MD5_Init(&md5Context);    unsigned char* bitmapData = static_cast<unsigned char*>(CGBitmapContextGetData(bitmapContext));#if PLATFORM(MAC)    if ((CGBitmapContextGetBitmapInfo(bitmapContext) & kCGBitmapByteOrderMask) == kCGBitmapByteOrder32Big) {        for (unsigned row = 0; row < pixelsHigh; row++) {            uint32_t buffer[pixelsWide];            for (unsigned column = 0; column < pixelsWide; column++)                buffer[column] = OSReadLittleInt32(bitmapData, 4 * column);            MD5_Update(&md5Context, buffer, 4 * pixelsWide);            bitmapData += bytesPerRow;        }    } else#endif    {        for (unsigned row = 0; row < pixelsHigh; row++) {            MD5_Update(&md5Context, bitmapData, 4 * pixelsWide);            bitmapData += bytesPerRow;        }    }    unsigned char hash[16];    MD5_Final(hash, &md5Context);    hashString[0] = '\0';    for (int i = 0; i < 16; i++)        snprintf(hashString, 33, "%s%02x", hashString, hash[i]);}void dumpWebViewAsPixelsAndCompareWithExpected(const std::string& expectedHash){    RefPtr<BitmapContext> context;        context = createBitmapContextFromWebView(gLayoutTestController->testOnscreen(), gLayoutTestController->testRepaint(), gLayoutTestController->testRepaintSweepHorizontally(), gLayoutTestController->dumpSelectionRect());    ASSERT(context);        // Compute the hash of the bitmap context pixels    char actualHash[33];    computeMD5HashStringForBitmapContext(context->cgContext(), actualHash);    printf("\nActualHash: %s\n", actualHash);        // Check the computed hash against the expected one and dump image on mismatch    bool dumpImage = true;    if (expectedHash.length() > 0) {        ASSERT(expectedHash.length() == 32);                printf("\nExpectedHash: %s\n", expectedHash.c_str());                if (expectedHash == actualHash)     // FIXME: do case insensitive compare            dumpImage = false;    }        if (dumpImage) {        RetainPtr<CGImageRef> image(AdoptCF, CGBitmapContextCreateImage(context->cgContext()));        printPNG(image.get());    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -