| Index: skia/ext/vector_canvas_unittest.cc
|
| diff --git a/skia/ext/vector_canvas_unittest.cc b/skia/ext/vector_canvas_unittest.cc
|
| deleted file mode 100644
|
| index d3ad9a0c358db02757597feb83a9ec27ddce2865..0000000000000000000000000000000000000000
|
| --- a/skia/ext/vector_canvas_unittest.cc
|
| +++ /dev/null
|
| @@ -1,970 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "build/build_config.h"
|
| -
|
| -#if !defined(OS_WIN)
|
| -#include <unistd.h>
|
| -#endif
|
| -
|
| -#include "base/command_line.h"
|
| -#include "base/files/file_util.h"
|
| -#include "base/path_service.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "skia/ext/vector_canvas.h"
|
| -#include "skia/ext/vector_platform_device_emf_win.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include "third_party/skia/include/effects/SkDashPathEffect.h"
|
| -#include "ui/gfx/codec/png_codec.h"
|
| -#include "ui/gfx/geometry/size.h"
|
| -
|
| -namespace skia {
|
| -
|
| -namespace {
|
| -
|
| -const char kGenerateSwitch[] = "vector-canvas-generate";
|
| -
|
| -// Lightweight HDC management.
|
| -class Context {
|
| - public:
|
| - Context() : context_(CreateCompatibleDC(NULL)) {
|
| - EXPECT_TRUE(context_);
|
| - }
|
| - ~Context() {
|
| - DeleteDC(context_);
|
| - }
|
| -
|
| - HDC context() const { return context_; }
|
| -
|
| - private:
|
| - HDC context_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Context);
|
| -};
|
| -
|
| -// Lightweight HBITMAP management.
|
| -class Bitmap {
|
| - public:
|
| - Bitmap(const Context& context, int x, int y) {
|
| - BITMAPINFOHEADER hdr;
|
| - hdr.biSize = sizeof(BITMAPINFOHEADER);
|
| - hdr.biWidth = x;
|
| - hdr.biHeight = -y; // Minus means top-down bitmap.
|
| - hdr.biPlanes = 1;
|
| - hdr.biBitCount = 32;
|
| - hdr.biCompression = BI_RGB; // No compression.
|
| - hdr.biSizeImage = 0;
|
| - hdr.biXPelsPerMeter = 1;
|
| - hdr.biYPelsPerMeter = 1;
|
| - hdr.biClrUsed = 0;
|
| - hdr.biClrImportant = 0;
|
| - bitmap_ = CreateDIBSection(context.context(),
|
| - reinterpret_cast<BITMAPINFO*>(&hdr), 0,
|
| - &data_, NULL, 0);
|
| - EXPECT_TRUE(bitmap_);
|
| - EXPECT_TRUE(SelectObject(context.context(), bitmap_));
|
| - }
|
| - ~Bitmap() {
|
| - EXPECT_TRUE(DeleteObject(bitmap_));
|
| - }
|
| -
|
| - private:
|
| - HBITMAP bitmap_;
|
| -
|
| - void* data_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Bitmap);
|
| -};
|
| -
|
| -// Lightweight raw-bitmap management. The image, once initialized, is immuable.
|
| -// It is mainly used for comparison.
|
| -class Image {
|
| - public:
|
| - // Creates the image from the given filename on disk.
|
| - explicit Image(const base::FilePath& filename) : ignore_alpha_(true) {
|
| - std::string compressed;
|
| - base::ReadFileToString(filename, &compressed);
|
| - EXPECT_TRUE(compressed.size());
|
| -
|
| - SkBitmap bitmap;
|
| - EXPECT_TRUE(gfx::PNGCodec::Decode(
|
| - reinterpret_cast<const unsigned char*>(compressed.data()),
|
| - compressed.size(), &bitmap));
|
| - SetSkBitmap(bitmap);
|
| - }
|
| -
|
| - // Loads the image from a canvas.
|
| - Image(skia::PlatformCanvas& canvas) : ignore_alpha_(true) {
|
| - // Use a different way to access the bitmap. The normal way would be to
|
| - // query the SkBitmap.
|
| - skia::ScopedPlatformPaint scoped_platform_paint(&canvas);
|
| - HDC context = scoped_platform_paint.GetPlatformSurface();
|
| - HGDIOBJ bitmap = GetCurrentObject(context, OBJ_BITMAP);
|
| - EXPECT_TRUE(bitmap != NULL);
|
| - // Initialize the clip region to the entire bitmap.
|
| - BITMAP bitmap_data;
|
| - EXPECT_EQ(GetObject(bitmap, sizeof(BITMAP), &bitmap_data), sizeof(BITMAP));
|
| - width_ = bitmap_data.bmWidth;
|
| - height_ = bitmap_data.bmHeight;
|
| - row_length_ = bitmap_data.bmWidthBytes;
|
| - size_t size = row_length_ * height_;
|
| - data_.resize(size);
|
| - memcpy(&*data_.begin(), bitmap_data.bmBits, size);
|
| - }
|
| -
|
| - // Loads the image from a canvas.
|
| - Image(const SkBitmap& bitmap) : ignore_alpha_(true) {
|
| - SetSkBitmap(bitmap);
|
| - }
|
| -
|
| - int width() const { return width_; }
|
| - int height() const { return height_; }
|
| - int row_length() const { return row_length_; }
|
| -
|
| - // Save the image to a png file. Used to create the initial test files.
|
| - void SaveToFile(const base::FilePath& filename) {
|
| - std::vector<unsigned char> compressed;
|
| - ASSERT_TRUE(gfx::PNGCodec::Encode(&*data_.begin(),
|
| - gfx::PNGCodec::FORMAT_BGRA,
|
| - gfx::Size(width_, height_),
|
| - row_length_,
|
| - true,
|
| - std::vector<gfx::PNGCodec::Comment>(),
|
| - &compressed));
|
| - ASSERT_TRUE(compressed.size());
|
| - FILE* f = base::OpenFile(filename, "wb");
|
| - ASSERT_TRUE(f);
|
| - ASSERT_EQ(fwrite(&*compressed.begin(), 1, compressed.size(), f),
|
| - compressed.size());
|
| - base::CloseFile(f);
|
| - }
|
| -
|
| - // Returns the percentage of the image that is different from the other,
|
| - // between 0 and 100.
|
| - double PercentageDifferent(const Image& rhs) const {
|
| - if (width_ != rhs.width_ ||
|
| - height_ != rhs.height_ ||
|
| - row_length_ != rhs.row_length_ ||
|
| - width_ == 0 ||
|
| - height_ == 0) {
|
| - return 100.; // When of different size or empty, they are 100% different.
|
| - }
|
| - // Compute pixels different in the overlap
|
| - int pixels_different = 0;
|
| - for (int y = 0; y < height_; ++y) {
|
| - for (int x = 0; x < width_; ++x) {
|
| - uint32_t lhs_pixel = pixel_at(x, y);
|
| - uint32_t rhs_pixel = rhs.pixel_at(x, y);
|
| - if (lhs_pixel != rhs_pixel)
|
| - ++pixels_different;
|
| - }
|
| - }
|
| -
|
| - // Like the WebKit ImageDiff tool, we define percentage different in terms
|
| - // of the size of the 'actual' bitmap.
|
| - double total_pixels = static_cast<double>(width_) *
|
| - static_cast<double>(height_);
|
| - return static_cast<double>(pixels_different) / total_pixels * 100.;
|
| - }
|
| -
|
| - // Returns the 0x0RGB or 0xARGB value of the pixel at the given location,
|
| - // depending on ignore_alpha_.
|
| - uint32 pixel_at(int x, int y) const {
|
| - EXPECT_TRUE(x >= 0 && x < width_);
|
| - EXPECT_TRUE(y >= 0 && y < height_);
|
| - const uint32* data = reinterpret_cast<const uint32*>(&*data_.begin());
|
| - const uint32* data_row = data + y * row_length_ / sizeof(uint32);
|
| - if (ignore_alpha_)
|
| - return data_row[x] & 0xFFFFFF; // Strip out A.
|
| - else
|
| - return data_row[x];
|
| - }
|
| -
|
| - protected:
|
| - void SetSkBitmap(const SkBitmap& bitmap) {
|
| - SkAutoLockPixels lock(bitmap);
|
| - width_ = bitmap.width();
|
| - height_ = bitmap.height();
|
| - row_length_ = static_cast<int>(bitmap.rowBytes());
|
| - size_t size = row_length_ * height_;
|
| - data_.resize(size);
|
| - memcpy(&*data_.begin(), bitmap.getAddr(0, 0), size);
|
| - }
|
| -
|
| - private:
|
| - // Pixel dimensions of the image.
|
| - int width_;
|
| - int height_;
|
| -
|
| - // Length of a line in bytes.
|
| - int row_length_;
|
| -
|
| - // Actual bitmap data in arrays of RGBAs (so when loaded as uint32, it's
|
| - // 0xABGR).
|
| - std::vector<unsigned char> data_;
|
| -
|
| - // Flag to signal if the comparison functions should ignore the alpha channel.
|
| - const bool ignore_alpha_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Image);
|
| -};
|
| -
|
| -// Base for tests. Capability to process an image.
|
| -class ImageTest : public testing::Test {
|
| - public:
|
| - // In what state is the test running.
|
| - enum ProcessAction {
|
| - GENERATE,
|
| - COMPARE,
|
| - NOOP,
|
| - };
|
| -
|
| - ImageTest(ProcessAction default_action)
|
| - : action_(default_action) {
|
| - }
|
| -
|
| - protected:
|
| - virtual void SetUp() {
|
| - const testing::TestInfo& test_info =
|
| - *testing::UnitTest::GetInstance()->current_test_info();
|
| - PathService::Get(base::DIR_SOURCE_ROOT, &test_dir_);
|
| - test_dir_ = test_dir_.AppendASCII("skia").
|
| - AppendASCII("ext").
|
| - AppendASCII("data").
|
| - AppendASCII(test_info.test_case_name()).
|
| - AppendASCII(test_info.name());
|
| -
|
| - // Hack for a quick lowercase. We assume all the tests names are ASCII.
|
| - base::FilePath::StringType tmp(test_dir_.value());
|
| - for (size_t i = 0; i < tmp.size(); ++i)
|
| - tmp[i] = base::ToLowerASCII(tmp[i]);
|
| - test_dir_ = base::FilePath(tmp);
|
| -
|
| - if (action_ == GENERATE) {
|
| - // Make sure the directory exist.
|
| - base::CreateDirectory(test_dir_);
|
| - }
|
| - }
|
| -
|
| - // Returns the fully qualified path of a data file.
|
| - base::FilePath test_file(const base::FilePath::StringType& filename) const {
|
| - // Hack for a quick lowercase. We assume all the test data file names are
|
| - // ASCII.
|
| -#if defined(OS_WIN)
|
| - std::string tmp = base::UTF16ToASCII(filename);
|
| -#else
|
| - std::string tmp(filename);
|
| -#endif
|
| - for (size_t i = 0; i < tmp.size(); ++i)
|
| - tmp[i] = base::ToLowerASCII(tmp[i]);
|
| -
|
| - return test_dir_.AppendASCII(tmp);
|
| - }
|
| -
|
| - // Compares or saves the bitmap currently loaded in the context, depending on
|
| - // kGenerating value. Returns 0 on success or any positive value between ]0,
|
| - // 100] on failure. The return value is the percentage of difference between
|
| - // the image in the file and the image in the canvas.
|
| - double ProcessCanvas(skia::PlatformCanvas& canvas,
|
| - base::FilePath::StringType filename) const {
|
| - filename = filename + FILE_PATH_LITERAL(".png");
|
| - switch (action_) {
|
| - case GENERATE:
|
| - SaveImage(canvas, filename);
|
| - return 0.;
|
| - case COMPARE:
|
| - return CompareImage(canvas, filename);
|
| - case NOOP:
|
| - return 0;
|
| - default:
|
| - // Invalid state, returns that the image is 100 different.
|
| - return 100.;
|
| - }
|
| - }
|
| -
|
| - // Compares the bitmap currently loaded in the context with the file. Returns
|
| - // the percentage of pixel difference between both images, between 0 and 100.
|
| - double CompareImage(skia::PlatformCanvas& canvas,
|
| - const base::FilePath::StringType& filename) const {
|
| - Image image1(canvas);
|
| - Image image2(test_file(filename));
|
| - double diff = image1.PercentageDifferent(image2);
|
| - return diff;
|
| - }
|
| -
|
| - // Saves the bitmap currently loaded in the context into the file.
|
| - void SaveImage(skia::PlatformCanvas& canvas,
|
| - const base::FilePath::StringType& filename) const {
|
| - Image(canvas).SaveToFile(test_file(filename));
|
| - }
|
| -
|
| - ProcessAction action_;
|
| -
|
| - // Path to directory used to contain the test data.
|
| - base::FilePath test_dir_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ImageTest);
|
| -};
|
| -
|
| -// Premultiply the Alpha channel on the R, B and G channels.
|
| -void Premultiply(SkBitmap bitmap) {
|
| - SkAutoLockPixels lock(bitmap);
|
| - for (int x = 0; x < bitmap.width(); ++x) {
|
| - for (int y = 0; y < bitmap.height(); ++y) {
|
| - uint32_t* pixel_addr = bitmap.getAddr32(x, y);
|
| - uint32_t color = *pixel_addr;
|
| - BYTE alpha = SkColorGetA(color);
|
| - if (!alpha) {
|
| - *pixel_addr = 0;
|
| - } else {
|
| - BYTE alpha_offset = alpha / 2;
|
| - *pixel_addr = SkColorSetARGB(
|
| - SkColorGetA(color),
|
| - (SkColorGetR(color) * 255 + alpha_offset) / alpha,
|
| - (SkColorGetG(color) * 255 + alpha_offset) / alpha,
|
| - (SkColorGetB(color) * 255 + alpha_offset) / alpha);
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -void LoadPngFileToSkBitmap(const base::FilePath& filename,
|
| - SkBitmap* bitmap,
|
| - bool is_opaque) {
|
| - std::string compressed;
|
| - base::ReadFileToString(base::MakeAbsoluteFilePath(filename), &compressed);
|
| - ASSERT_TRUE(compressed.size());
|
| -
|
| - ASSERT_TRUE(gfx::PNGCodec::Decode(
|
| - reinterpret_cast<const unsigned char*>(compressed.data()),
|
| - compressed.size(), bitmap));
|
| -
|
| - EXPECT_EQ(is_opaque, bitmap->isOpaque());
|
| - Premultiply(*bitmap);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// Streams an image.
|
| -inline std::ostream& operator<<(std::ostream& out, const Image& image) {
|
| - return out << "Image(" << image.width() << ", "
|
| - << image.height() << ", " << image.row_length() << ")";
|
| -}
|
| -
|
| -// Runs simultaneously the same drawing commands on VectorCanvas and
|
| -// PlatformCanvas and compare the results.
|
| -class VectorCanvasTest : public ImageTest {
|
| - public:
|
| - typedef ImageTest parent;
|
| -
|
| - VectorCanvasTest() : parent(CurrentMode()), compare_canvas_(true) {
|
| - }
|
| -
|
| - protected:
|
| - virtual void SetUp() {
|
| - parent::SetUp();
|
| - Init(100);
|
| - number_ = 0;
|
| - }
|
| -
|
| - virtual void TearDown() {
|
| - delete pcanvas_;
|
| - pcanvas_ = NULL;
|
| -
|
| - delete vcanvas_;
|
| - vcanvas_ = NULL;
|
| -
|
| - delete bitmap_;
|
| - bitmap_ = NULL;
|
| -
|
| - delete context_;
|
| - context_ = NULL;
|
| -
|
| - parent::TearDown();
|
| - }
|
| -
|
| - void Init(int size) {
|
| - size_ = size;
|
| - context_ = new Context();
|
| - bitmap_ = new Bitmap(*context_, size_, size_);
|
| - vcanvas_ = new VectorCanvas(
|
| - VectorPlatformDeviceEmf::CreateDevice(
|
| - size_, size_, true, context_->context()));
|
| - pcanvas_ = CreatePlatformCanvas(size_, size_, false);
|
| -
|
| - // Clear white.
|
| - vcanvas_->drawARGB(255, 255, 255, 255, SkXfermode::kSrc_Mode);
|
| - pcanvas_->drawARGB(255, 255, 255, 255, SkXfermode::kSrc_Mode);
|
| - }
|
| -
|
| - // Compares both canvas and returns the pixel difference in percentage between
|
| - // both images. 0 on success and ]0, 100] on failure.
|
| - double ProcessImage(const base::FilePath::StringType& filename) {
|
| - std::wstring number(base::StringPrintf(L"%02d_", number_++));
|
| - double diff1 = parent::ProcessCanvas(*vcanvas_, number + L"vc_" + filename);
|
| - double diff2 = parent::ProcessCanvas(*pcanvas_, number + L"pc_" + filename);
|
| - if (!compare_canvas_)
|
| - return std::max(diff1, diff2);
|
| -
|
| - Image image1(*vcanvas_);
|
| - Image image2(*pcanvas_);
|
| - double diff = image1.PercentageDifferent(image2);
|
| - return std::max(std::max(diff1, diff2), diff);
|
| - }
|
| -
|
| - // Returns COMPARE, which is the default. If kGenerateSwitch command
|
| - // line argument is used to start this process, GENERATE is returned instead.
|
| - static ProcessAction CurrentMode() {
|
| - return base::CommandLine::ForCurrentProcess()->HasSwitch(kGenerateSwitch)
|
| - ? GENERATE
|
| - : COMPARE;
|
| - }
|
| -
|
| - // Length in x and y of the square canvas.
|
| - int size_;
|
| -
|
| - // Current image number in the current test. Used to number of test files.
|
| - int number_;
|
| -
|
| - // A temporary HDC to draw into.
|
| - Context* context_;
|
| -
|
| - // Bitmap created inside context_.
|
| - Bitmap* bitmap_;
|
| -
|
| - // Vector based canvas.
|
| - VectorCanvas* vcanvas_;
|
| -
|
| - // Pixel based canvas.
|
| - PlatformCanvas* pcanvas_;
|
| -
|
| - // When true (default), vcanvas_ and pcanvas_ contents are compared and
|
| - // verified to be identical.
|
| - bool compare_canvas_;
|
| -};
|
| -
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// Actual tests
|
| -
|
| -#if !defined(USE_AURA) // http://crbug.com/154358
|
| -
|
| -TEST_F(VectorCanvasTest, BasicDrawing) {
|
| - EXPECT_EQ(Image(*vcanvas_).PercentageDifferent(Image(*pcanvas_)), 0.)
|
| - << L"clean";
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("clean")));
|
| -
|
| - // Clear white.
|
| - {
|
| - vcanvas_->drawARGB(255, 255, 255, 255, SkXfermode::kSrc_Mode);
|
| - pcanvas_->drawARGB(255, 255, 255, 255, SkXfermode::kSrc_Mode);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("drawARGB")));
|
| -
|
| - // Diagonal line top-left to bottom-right.
|
| - {
|
| - SkPaint paint;
|
| - // Default color is black.
|
| - vcanvas_->drawLine(10, 10, 90, 90, paint);
|
| - pcanvas_->drawLine(10, 10, 90, 90, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("drawLine_black")));
|
| -
|
| - // Rect.
|
| - {
|
| - SkPaint paint;
|
| - paint.setColor(SK_ColorGREEN);
|
| - vcanvas_->drawRectCoords(25, 25, 75, 75, paint);
|
| - pcanvas_->drawRectCoords(25, 25, 75, 75, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("drawRect_green")));
|
| -
|
| - // A single-point rect doesn't leave any mark.
|
| - {
|
| - SkPaint paint;
|
| - paint.setColor(SK_ColorBLUE);
|
| - vcanvas_->drawRectCoords(5, 5, 5, 5, paint);
|
| - pcanvas_->drawRectCoords(5, 5, 5, 5, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("drawRect_noop")));
|
| -
|
| - // Rect.
|
| - {
|
| - SkPaint paint;
|
| - paint.setColor(SK_ColorBLUE);
|
| - vcanvas_->drawRectCoords(75, 50, 80, 55, paint);
|
| - pcanvas_->drawRectCoords(75, 50, 80, 55, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("drawRect_noop")));
|
| -
|
| - // Empty again
|
| - {
|
| - vcanvas_->drawPaint(SkPaint());
|
| - pcanvas_->drawPaint(SkPaint());
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("drawPaint_black")));
|
| -
|
| - // Horizontal line left to right.
|
| - {
|
| - SkPaint paint;
|
| - paint.setColor(SK_ColorRED);
|
| - vcanvas_->drawLine(10, 20, 90, 20, paint);
|
| - pcanvas_->drawLine(10, 20, 90, 20, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("drawLine_left_to_right")));
|
| -
|
| - // Vertical line downward.
|
| - {
|
| - SkPaint paint;
|
| - paint.setColor(SK_ColorRED);
|
| - vcanvas_->drawLine(30, 10, 30, 90, paint);
|
| - pcanvas_->drawLine(30, 10, 30, 90, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("drawLine_red")));
|
| -}
|
| -
|
| -TEST_F(VectorCanvasTest, Circles) {
|
| - // There is NO WAY to make them agree. At least verify that the output doesn't
|
| - // change across versions. This test is disabled. See bug 1060231.
|
| - compare_canvas_ = false;
|
| -
|
| - // Stroked Circle.
|
| - {
|
| - SkPaint paint;
|
| - SkPath path;
|
| - path.addCircle(50, 75, 10);
|
| - paint.setStyle(SkPaint::kStroke_Style);
|
| - paint.setColor(SK_ColorMAGENTA);
|
| - vcanvas_->drawPath(path, paint);
|
| - pcanvas_->drawPath(path, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("circle_stroke")));
|
| -
|
| - // Filled Circle.
|
| - {
|
| - SkPaint paint;
|
| - SkPath path;
|
| - path.addCircle(50, 25, 10);
|
| - paint.setStyle(SkPaint::kFill_Style);
|
| - vcanvas_->drawPath(path, paint);
|
| - pcanvas_->drawPath(path, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("circle_fill")));
|
| -
|
| - // Stroked Circle over.
|
| - {
|
| - SkPaint paint;
|
| - SkPath path;
|
| - path.addCircle(50, 25, 10);
|
| - paint.setStyle(SkPaint::kStroke_Style);
|
| - paint.setColor(SK_ColorBLUE);
|
| - vcanvas_->drawPath(path, paint);
|
| - pcanvas_->drawPath(path, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("circle_over_strike")));
|
| -
|
| - // Stroke and Fill Circle.
|
| - {
|
| - SkPaint paint;
|
| - SkPath path;
|
| - path.addCircle(12, 50, 10);
|
| - paint.setStyle(SkPaint::kStrokeAndFill_Style);
|
| - paint.setColor(SK_ColorRED);
|
| - vcanvas_->drawPath(path, paint);
|
| - pcanvas_->drawPath(path, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("circle_stroke_and_fill")));
|
| -
|
| - // Line + Quad + Cubic.
|
| - {
|
| - SkPaint paint;
|
| - SkPath path;
|
| - paint.setStyle(SkPaint::kStroke_Style);
|
| - paint.setColor(SK_ColorGREEN);
|
| - path.moveTo(1, 1);
|
| - path.lineTo(60, 40);
|
| - path.lineTo(80, 80);
|
| - path.quadTo(20, 50, 10, 90);
|
| - path.quadTo(50, 20, 90, 10);
|
| - path.cubicTo(20, 40, 50, 50, 10, 10);
|
| - path.cubicTo(30, 20, 50, 50, 90, 10);
|
| - path.addRect(90, 90, 95, 96);
|
| - vcanvas_->drawPath(path, paint);
|
| - pcanvas_->drawPath(path, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("mixed_stroke")));
|
| -}
|
| -
|
| -TEST_F(VectorCanvasTest, LineOrientation) {
|
| - // There is NO WAY to make them agree. At least verify that the output doesn't
|
| - // change across versions. This test is disabled. See bug 1060231.
|
| - compare_canvas_ = false;
|
| -
|
| - // Horizontal lines.
|
| - {
|
| - SkPaint paint;
|
| - paint.setColor(SK_ColorRED);
|
| - // Left to right.
|
| - vcanvas_->drawLine(10, 20, 90, 20, paint);
|
| - pcanvas_->drawLine(10, 20, 90, 20, paint);
|
| - // Right to left.
|
| - vcanvas_->drawLine(90, 30, 10, 30, paint);
|
| - pcanvas_->drawLine(90, 30, 10, 30, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("horizontal")));
|
| -
|
| - // Vertical lines.
|
| - {
|
| - SkPaint paint;
|
| - paint.setColor(SK_ColorRED);
|
| - // Top down.
|
| - vcanvas_->drawLine(20, 10, 20, 90, paint);
|
| - pcanvas_->drawLine(20, 10, 20, 90, paint);
|
| - // Bottom up.
|
| - vcanvas_->drawLine(30, 90, 30, 10, paint);
|
| - pcanvas_->drawLine(30, 90, 30, 10, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("vertical")));
|
| -
|
| - // Try again with a 180 degres rotation.
|
| - vcanvas_->rotate(180);
|
| - pcanvas_->rotate(180);
|
| -
|
| - // Horizontal lines (rotated).
|
| - {
|
| - SkPaint paint;
|
| - paint.setColor(SK_ColorRED);
|
| - vcanvas_->drawLine(-10, -25, -90, -25, paint);
|
| - pcanvas_->drawLine(-10, -25, -90, -25, paint);
|
| - vcanvas_->drawLine(-90, -35, -10, -35, paint);
|
| - pcanvas_->drawLine(-90, -35, -10, -35, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("horizontal_180")));
|
| -
|
| - // Vertical lines (rotated).
|
| - {
|
| - SkPaint paint;
|
| - paint.setColor(SK_ColorRED);
|
| - vcanvas_->drawLine(-25, -10, -25, -90, paint);
|
| - pcanvas_->drawLine(-25, -10, -25, -90, paint);
|
| - vcanvas_->drawLine(-35, -90, -35, -10, paint);
|
| - pcanvas_->drawLine(-35, -90, -35, -10, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("vertical_180")));
|
| -}
|
| -
|
| -TEST_F(VectorCanvasTest, PathOrientation) {
|
| - // There is NO WAY to make them agree. At least verify that the output doesn't
|
| - // change across versions. This test is disabled. See bug 1060231.
|
| - compare_canvas_ = false;
|
| -
|
| - // Horizontal lines.
|
| - {
|
| - SkPaint paint;
|
| - paint.setStyle(SkPaint::kStroke_Style);
|
| - paint.setColor(SK_ColorRED);
|
| - SkPath path;
|
| - SkPoint start;
|
| - start.set(10, 20);
|
| - SkPoint end;
|
| - end.set(90, 20);
|
| - path.moveTo(start);
|
| - path.lineTo(end);
|
| - vcanvas_->drawPath(path, paint);
|
| - pcanvas_->drawPath(path, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("drawPath_ltr")));
|
| -
|
| - // Horizontal lines.
|
| - {
|
| - SkPaint paint;
|
| - paint.setStyle(SkPaint::kStroke_Style);
|
| - paint.setColor(SK_ColorRED);
|
| - SkPath path;
|
| - SkPoint start;
|
| - start.set(90, 30);
|
| - SkPoint end;
|
| - end.set(10, 30);
|
| - path.moveTo(start);
|
| - path.lineTo(end);
|
| - vcanvas_->drawPath(path, paint);
|
| - pcanvas_->drawPath(path, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("drawPath_rtl")));
|
| -}
|
| -
|
| -TEST_F(VectorCanvasTest, DiagonalLines) {
|
| - SkPaint paint;
|
| - paint.setColor(SK_ColorRED);
|
| -
|
| - vcanvas_->drawLine(10, 10, 90, 90, paint);
|
| - pcanvas_->drawLine(10, 10, 90, 90, paint);
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("nw-se")));
|
| -
|
| - // Starting here, there is NO WAY to make them agree. At least verify that the
|
| - // output doesn't change across versions. This test is disabled. See bug
|
| - // 1060231.
|
| - compare_canvas_ = false;
|
| -
|
| - vcanvas_->drawLine(10, 95, 90, 15, paint);
|
| - pcanvas_->drawLine(10, 95, 90, 15, paint);
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("sw-ne")));
|
| -
|
| - vcanvas_->drawLine(90, 10, 10, 90, paint);
|
| - pcanvas_->drawLine(90, 10, 10, 90, paint);
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("ne-sw")));
|
| -
|
| - vcanvas_->drawLine(95, 90, 15, 10, paint);
|
| - pcanvas_->drawLine(95, 90, 15, 10, paint);
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("se-nw")));
|
| -}
|
| -
|
| -#if defined(OS_WIN)
|
| -#define MAYBE_PathEffects DISABLED_PathEffects
|
| -#else
|
| -#define MAYBE_PathEffects PathEffects
|
| -#endif
|
| -TEST_F(VectorCanvasTest, MAYBE_PathEffects) {
|
| - {
|
| - SkPaint paint;
|
| - SkScalar intervals[] = { 1, 1 };
|
| - skia::RefPtr<SkPathEffect> effect = skia::AdoptRef(
|
| - new SkDashPathEffect(intervals, arraysize(intervals), 0));
|
| - paint.setPathEffect(effect.get());
|
| - paint.setColor(SK_ColorMAGENTA);
|
| - paint.setStyle(SkPaint::kStroke_Style);
|
| -
|
| - vcanvas_->drawLine(10, 10, 90, 10, paint);
|
| - pcanvas_->drawLine(10, 10, 90, 10, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("dash_line")));
|
| -
|
| -
|
| - // Starting here, there is NO WAY to make them agree. At least verify that the
|
| - // output doesn't change across versions. This test is disabled. See bug
|
| - // 1060231.
|
| - compare_canvas_ = false;
|
| -
|
| - {
|
| - SkPaint paint;
|
| - SkScalar intervals[] = { 3, 5 };
|
| - skia::RefPtr<SkPathEffect> effect = skia::AdoptRef(
|
| - new SkDashPathEffect(intervals, arraysize(intervals), 0));
|
| - paint.setPathEffect(effect.get());
|
| - paint.setColor(SK_ColorMAGENTA);
|
| - paint.setStyle(SkPaint::kStroke_Style);
|
| -
|
| - SkPath path;
|
| - path.moveTo(10, 15);
|
| - path.lineTo(90, 15);
|
| - path.lineTo(90, 90);
|
| - vcanvas_->drawPath(path, paint);
|
| - pcanvas_->drawPath(path, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("dash_path")));
|
| -
|
| - {
|
| - SkPaint paint;
|
| - SkScalar intervals[] = { 2, 1 };
|
| - skia::RefPtr<SkPathEffect> effect = skia::AdoptRef(
|
| - new SkDashPathEffect(intervals, arraysize(intervals), 0));
|
| - paint.setPathEffect(effect.get());
|
| - paint.setColor(SK_ColorMAGENTA);
|
| - paint.setStyle(SkPaint::kStroke_Style);
|
| -
|
| - vcanvas_->drawRectCoords(20, 20, 30, 30, paint);
|
| - pcanvas_->drawRectCoords(20, 20, 30, 30, paint);
|
| - }
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("dash_rect")));
|
| -
|
| - // This thing looks like it has been drawn by a 3 years old kid. I haven't
|
| - // filed a bug on this since I guess nobody is expecting this to look nice.
|
| - {
|
| - SkPaint paint;
|
| - SkScalar intervals[] = { 1, 1 };
|
| - skia::RefPtr<SkPathEffect> effect = skia::AdoptRef(
|
| - new SkDashPathEffect(intervals, arraysize(intervals), 0));
|
| - paint.setPathEffect(effect.get());
|
| - paint.setColor(SK_ColorMAGENTA);
|
| - paint.setStyle(SkPaint::kStroke_Style);
|
| -
|
| - SkPath path;
|
| - path.addCircle(50, 75, 10);
|
| - vcanvas_->drawPath(path, paint);
|
| - pcanvas_->drawPath(path, paint);
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("circle")));
|
| - }
|
| -}
|
| -
|
| -TEST_F(VectorCanvasTest, Bitmaps) {
|
| - {
|
| - SkBitmap bitmap;
|
| - LoadPngFileToSkBitmap(test_file(L"bitmap_opaque.png"), &bitmap, true);
|
| - vcanvas_->drawBitmap(bitmap, 13, 3, NULL);
|
| - pcanvas_->drawBitmap(bitmap, 13, 3, NULL);
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("opaque")));
|
| - }
|
| -
|
| - {
|
| - SkBitmap bitmap;
|
| - LoadPngFileToSkBitmap(test_file(L"bitmap_alpha.png"), &bitmap, false);
|
| - vcanvas_->drawBitmap(bitmap, 5, 15, NULL);
|
| - pcanvas_->drawBitmap(bitmap, 5, 15, NULL);
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("alpha")));
|
| - }
|
| -}
|
| -
|
| -TEST_F(VectorCanvasTest, ClippingRect) {
|
| - SkBitmap bitmap;
|
| - LoadPngFileToSkBitmap(test_file(L"..\\bitmaps\\bitmap_opaque.png"), &bitmap,
|
| - true);
|
| - SkRect rect;
|
| - rect.fLeft = 2;
|
| - rect.fTop = 2;
|
| - rect.fRight = 30.5f;
|
| - rect.fBottom = 30.5f;
|
| - vcanvas_->clipRect(rect);
|
| - pcanvas_->clipRect(rect);
|
| -
|
| - vcanvas_->drawBitmap(bitmap, 13, 3, NULL);
|
| - pcanvas_->drawBitmap(bitmap, 13, 3, NULL);
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("rect")));
|
| -}
|
| -
|
| -TEST_F(VectorCanvasTest, ClippingPath) {
|
| - SkBitmap bitmap;
|
| - LoadPngFileToSkBitmap(test_file(L"..\\bitmaps\\bitmap_opaque.png"), &bitmap,
|
| - true);
|
| - SkPath path;
|
| - path.addCircle(20, 20, 10);
|
| - vcanvas_->clipPath(path);
|
| - pcanvas_->clipPath(path);
|
| -
|
| - vcanvas_->drawBitmap(bitmap, 14, 3, NULL);
|
| - pcanvas_->drawBitmap(bitmap, 14, 3, NULL);
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("path")));
|
| -}
|
| -
|
| -TEST_F(VectorCanvasTest, ClippingCombined) {
|
| - SkBitmap bitmap;
|
| - LoadPngFileToSkBitmap(test_file(L"..\\bitmaps\\bitmap_opaque.png"), &bitmap,
|
| - true);
|
| -
|
| - SkRect rect;
|
| - rect.fLeft = 2;
|
| - rect.fTop = 2;
|
| - rect.fRight = 30.5f;
|
| - rect.fBottom = 30.5f;
|
| - vcanvas_->clipRect(rect);
|
| - pcanvas_->clipRect(rect);
|
| - SkPath path;
|
| - path.addCircle(20, 20, 10);
|
| - vcanvas_->clipPath(path, SkRegion::kUnion_Op);
|
| - pcanvas_->clipPath(path, SkRegion::kUnion_Op);
|
| -
|
| - vcanvas_->drawBitmap(bitmap, 15, 3, NULL);
|
| - pcanvas_->drawBitmap(bitmap, 15, 3, NULL);
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("combined")));
|
| -}
|
| -
|
| -TEST_F(VectorCanvasTest, ClippingIntersect) {
|
| - SkBitmap bitmap;
|
| - LoadPngFileToSkBitmap(test_file(L"..\\bitmaps\\bitmap_opaque.png"), &bitmap,
|
| - true);
|
| -
|
| - SkRect rect;
|
| - rect.fLeft = 2;
|
| - rect.fTop = 2;
|
| - rect.fRight = 30.5f;
|
| - rect.fBottom = 30.5f;
|
| - vcanvas_->clipRect(rect);
|
| - pcanvas_->clipRect(rect);
|
| - SkPath path;
|
| - path.addCircle(23, 23, 15);
|
| - vcanvas_->clipPath(path);
|
| - pcanvas_->clipPath(path);
|
| -
|
| - vcanvas_->drawBitmap(bitmap, 15, 3, NULL);
|
| - pcanvas_->drawBitmap(bitmap, 15, 3, NULL);
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("intersect")));
|
| -}
|
| -
|
| -TEST_F(VectorCanvasTest, ClippingClean) {
|
| - SkBitmap bitmap;
|
| - LoadPngFileToSkBitmap(test_file(L"..\\bitmaps\\bitmap_opaque.png"), &bitmap,
|
| - true);
|
| - {
|
| - SkAutoCanvasRestore acrv(vcanvas_, true);
|
| - SkAutoCanvasRestore acrp(pcanvas_, true);
|
| - SkRect rect;
|
| - rect.fLeft = 2;
|
| - rect.fTop = 2;
|
| - rect.fRight = 30.5f;
|
| - rect.fBottom = 30.5f;
|
| - vcanvas_->clipRect(rect);
|
| - pcanvas_->clipRect(rect);
|
| -
|
| - vcanvas_->drawBitmap(bitmap, 15, 3, NULL);
|
| - pcanvas_->drawBitmap(bitmap, 15, 3, NULL);
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("clipped")));
|
| - }
|
| - {
|
| - // Verify that the clipping region has been fixed back.
|
| - vcanvas_->drawBitmap(bitmap, 55, 3, NULL);
|
| - pcanvas_->drawBitmap(bitmap, 55, 3, NULL);
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("unclipped")));
|
| - }
|
| -}
|
| -
|
| -// See http://crbug.com/26938
|
| -TEST_F(VectorCanvasTest, DISABLED_Matrix) {
|
| - SkBitmap bitmap;
|
| - LoadPngFileToSkBitmap(test_file(L"..\\bitmaps\\bitmap_opaque.png"), &bitmap,
|
| - true);
|
| - {
|
| - vcanvas_->translate(15, 3);
|
| - pcanvas_->translate(15, 3);
|
| - vcanvas_->drawBitmap(bitmap, 0, 0, NULL);
|
| - pcanvas_->drawBitmap(bitmap, 0, 0, NULL);
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("translate1")));
|
| - }
|
| - {
|
| - vcanvas_->translate(-30, -23);
|
| - pcanvas_->translate(-30, -23);
|
| - vcanvas_->drawBitmap(bitmap, 0, 0, NULL);
|
| - pcanvas_->drawBitmap(bitmap, 0, 0, NULL);
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("translate2")));
|
| - }
|
| - vcanvas_->resetMatrix();
|
| - pcanvas_->resetMatrix();
|
| -
|
| - // For scaling and rotation, they use a different algorithm (nearest
|
| - // neighborhood vs smoothing). At least verify that the output doesn't change
|
| - // across versions.
|
| - compare_canvas_ = false;
|
| -
|
| - {
|
| - vcanvas_->scale(SkDoubleToScalar(1.9), SkDoubleToScalar(1.5));
|
| - pcanvas_->scale(SkDoubleToScalar(1.9), SkDoubleToScalar(1.5));
|
| - vcanvas_->drawBitmap(bitmap, 1, 1, NULL);
|
| - pcanvas_->drawBitmap(bitmap, 1, 1, NULL);
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("scale")));
|
| - }
|
| - vcanvas_->resetMatrix();
|
| - pcanvas_->resetMatrix();
|
| -
|
| - {
|
| - vcanvas_->rotate(67);
|
| - pcanvas_->rotate(67);
|
| - vcanvas_->drawBitmap(bitmap, 20, -50, NULL);
|
| - pcanvas_->drawBitmap(bitmap, 20, -50, NULL);
|
| - EXPECT_EQ(0., ProcessImage(FILE_PATH_LITERAL("rotate")));
|
| - }
|
| -}
|
| -
|
| -#endif // !defined(USE_AURA)
|
| -
|
| -} // namespace skia
|
|
|