PaintTest.cpp revision b44cd65a53fa016a238e2bd3d01b5434dbc05da3
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 8a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com#include "Test.h" 9a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com#include "SkPath.h" 10a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com#include "SkPaint.h" 11b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#include "SkLayerDrawLooper.h" 12b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#include "SkBlurMaskFilter.h" 13b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com 14b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.comstatic void test_copy(skiatest::Reporter* reporter) { 15b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com SkPaint paint; 16b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com // set a few member variables 17b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com paint.setStyle(SkPaint::kStrokeAndFill_Style); 18b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com paint.setTextAlign(SkPaint::kLeft_Align); 19b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com paint.setStrokeWidth(SkIntToScalar(2)); 20b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com // set a few pointers 21b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com SkLayerDrawLooper* looper = new SkLayerDrawLooper(); 22b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com paint.setLooper(looper)->unref(); 23b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com SkMaskFilter* mask = SkBlurMaskFilter::Create(1, SkBlurMaskFilter::kNormal_BlurStyle); 24b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com paint.setMaskFilter(mask)->unref(); 25b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com 26b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com // copy the paint using the copy constructor and check they are the same 27b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com SkPaint copiedPaint = paint; 28b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com REPORTER_ASSERT(reporter, paint == copiedPaint); 29b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com 30b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#ifdef SK_BUILD_FOR_ANDROID 31b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com // the copy constructor should preserve the Generation ID 32b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com int32_t paintGenID = paint.getGenerationID(); 33b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com int32_t copiedPaintGenID = copiedPaint.getGenerationID(); 34b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com REPORTER_ASSERT(reporter, paintGenID == copiedPaintGenID); 35b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com REPORTER_ASSERT(reporter, !memcmp(&paint, &copiedPaint, sizeof(paint))); 36b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#endif 37b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com 38b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com // copy the paint using the equal operator and check they are the same 39b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com copiedPaint = paint; 40b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com REPORTER_ASSERT(reporter, paint == copiedPaint); 41b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com 42b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#ifdef SK_BUILD_FOR_ANDROID 43b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com // the equals operator should increment the Generation ID 44b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com REPORTER_ASSERT(reporter, paint.getGenerationID() == paintGenID); 45b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com REPORTER_ASSERT(reporter, copiedPaint.getGenerationID() != copiedPaintGenID); 46b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com copiedPaintGenID = copiedPaint.getGenerationID(); // reset to the new value 47b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com REPORTER_ASSERT(reporter, memcmp(&paint, &copiedPaint, sizeof(paint))); 48b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#endif 49b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com 50b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com // clean the paint and check they are back to their initial states 51b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com SkPaint cleanPaint; 52b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com paint.reset(); 53b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com copiedPaint.reset(); 54b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com REPORTER_ASSERT(reporter, cleanPaint == paint); 55b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com REPORTER_ASSERT(reporter, cleanPaint == copiedPaint); 56b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com 57b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#ifdef SK_BUILD_FOR_ANDROID 58b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com // the reset function should increment the Generation ID 59b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com REPORTER_ASSERT(reporter, paint.getGenerationID() != paintGenID); 60b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com REPORTER_ASSERT(reporter, copiedPaint.getGenerationID() != copiedPaintGenID); 61b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com REPORTER_ASSERT(reporter, memcmp(&cleanPaint, &paint, sizeof(cleanPaint))); 62b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com REPORTER_ASSERT(reporter, memcmp(&cleanPaint, &copiedPaint, sizeof(cleanPaint))); 63b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#endif 64b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com} 65a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 66a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com// found and fixed for webkit: mishandling when we hit recursion limit on 67a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com// mostly degenerate cubic flatness test 68a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.comstatic void regression_cubic(skiatest::Reporter* reporter) { 69a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com SkPath path, stroke; 70a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com SkPaint paint; 71a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 72d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com path.moveTo(SkFloatToFixed(460.2881309415525f), 73d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com SkFloatToFixed(303.250847066498)); 74d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com path.cubicTo(SkFloatToFixed(463.36378422175284), 75d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com SkFloatToFixed(302.1169735073363), 76d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com SkFloatToFixed(456.32239330810046), 77d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com SkFloatToFixed(304.720354932878), 78d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com SkFloatToFixed(453.15255460013304), 79d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com SkFloatToFixed(305.788586869862)); 80a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 81a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com SkRect fillR, strokeR; 82a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com fillR = path.getBounds(); 83a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 84a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com paint.setStyle(SkPaint::kStroke_Style); 85a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com paint.setStrokeWidth(SkIntToScalar(2)); 86a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com paint.getFillPath(path, &stroke); 87a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com strokeR = stroke.getBounds(); 88a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 89a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com SkRect maxR = fillR; 90a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com SkScalar miter = SkMaxScalar(SK_Scalar1, paint.getStrokeMiter()); 91a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com SkScalar inset = paint.getStrokeJoin() == SkPaint::kMiter_Join ? 92a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com SkScalarMul(paint.getStrokeWidth(), miter) : 93a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com paint.getStrokeWidth(); 94a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com maxR.inset(-inset, -inset); 95a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 96a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com // test that our stroke didn't explode 97a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com REPORTER_ASSERT(reporter, maxR.contains(strokeR)); 98a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com} 99a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 100a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.comstatic void TestPaint(skiatest::Reporter* reporter) { 101a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com // TODO add general paint tests 102b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com test_copy(reporter); 103a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 104a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com // regression tests 105a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com regression_cubic(reporter); 106a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com} 107a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 108a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com#include "TestClassDef.h" 109a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.comDEFINE_TESTCLASS("Paint", TestPaintClass, TestPaint) 110