blob: 0bb4a0c27b006eadb77716cc2d888db335421e3a [file] [log] [blame]
/*
* Copyright (C) 2011 Research In Motion Limited. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "config.h"
#include "PixelDumpSupportBlackBerry.h"
#include "DumpRenderTreeBlackBerry.h"
#include "PNGImageEncoder.h"
#include "PixelDumpSupport.h"
#include "WebPage.h"
#include "WebPageClient.h"
#include <BlackBerryPlatformWindow.h>
#include <skia/SkDevice.h>
#include <wtf/MD5.h>
#include <wtf/Vector.h>
using namespace BlackBerry::WebKit;
using namespace BlackBerry;
using namespace WTF;
PassRefPtr<BitmapContext> createBitmapContextFromWebView(bool /*onscreen*/, bool /*incrementalRepaint*/, bool /*sweepHorizontally*/, bool /*drawSelectionRect*/)
{
Platform::Graphics::Window* window = DumpRenderTree::currentInstance()->page()->client()->window();
ASSERT(window);
const Platform::IntRect& windowRect = window->viewportRect();
SkBitmap* bitmap = new SkBitmap;
bitmap->setConfig(SkBitmap::kARGB_8888_Config, windowRect.width(), windowRect.height()); // We use 32-bit RGBA since that is the pixel format that ImageDiff expects.
bitmap->allocPixels();
SkCanvas* canvas = new SkCanvas;
canvas->setBitmapDevice(*bitmap);
// We need to force a synchronous update to the window or we may get an empty bitmap.
// For example, running DRT with one test case that finishes before the screen is updated.
window->post(windowRect);
const SkBitmap* windowBitmap = static_cast<const SkBitmap*>(lockBufferBackingImage(window->buffer(), Platform::Graphics::ReadAccess));
canvas->drawBitmap(*windowBitmap, 0, 0); // Draw the bitmap at (0, 0).
Platform::Graphics::releaseBufferBackingImage(window->buffer());
return BitmapContext::createByAdoptingBitmapAndContext(bitmap, canvas);
}
void computeMD5HashStringForBitmapContext(BitmapContext* context, char hashString[33])
{
const SkBitmap& bitmap = context->canvas()->getDevice()->accessBitmap(false);
ASSERT(bitmap.bytesPerPixel() == 4); // 32-bit RGBA
int pixelsWide = bitmap.width();
int pixelsHigh = bitmap.height();
int bytesPerRow = bitmap.rowBytes();
unsigned char* pixelData = (unsigned char*)bitmap.getPixels();
MD5 md5;
for (int i = 0; i < pixelsHigh; ++i) {
md5.addBytes(pixelData, 4 * pixelsWide);
pixelData += bytesPerRow;
}
Vector<uint8_t, 16> hash;
md5.checksum(hash);
hashString[0] = '\0';
for (int i = 0; i < 16; ++i)
snprintf(hashString, 33, "%s%02x", hashString, hash[i]);
}
static void printPNG(SkCanvas* canvas, const char* checksum)
{
Vector<unsigned char> pngData;
encodeSkBitmapToPNG(canvas->getDevice()->accessBitmap(false), &pngData);
printPNG(pngData.data(), pngData.size(), checksum);
}
void dumpBitmap(BitmapContext* context, const char* checksum)
{
printPNG(context->canvas(), checksum);
}