/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkBitmap.h" #include "SkCanvas.h" #include "SkColor.h" #include "SkColorFilter.h" #include "SkGradientShader.h" #include "SkPaint.h" #include "SkPictureFlat.h" #include "SkShader.h" #include "SkXfermode.h" #include "Test.h" struct SkFlattenableTraits { static void flatten(SkWriteBuffer& buffer, const SkFlattenable& flattenable) { buffer.writeFlattenable(&flattenable); } }; struct SkBitmapTraits { static void flatten(SkWriteBuffer& buffer, const SkBitmap& bitmap) { bitmap.flatten(buffer); } }; class Controller : public SkChunkFlatController { public: Controller() : INHERITED(1024) { this->INHERITED::setNamedFactorySet(SkNEW(SkNamedFactorySet))->unref(); } private: typedef SkChunkFlatController INHERITED; }; /** * Verify that two SkFlatData objects that created from the same object are * identical when using an SkNamedFactorySet. * @param reporter Object to report failures. * @param obj Flattenable object to be flattened. * @param flattenProc Function that flattens objects with the same type as obj. */ template static void testCreate(skiatest::Reporter* reporter, const T& obj) { Controller controller; // No need to delete data because that will be taken care of by the controller. SkFlatData* data1 = SkFlatData::Create(&controller, obj, 0); SkFlatData* data2 = SkFlatData::Create(&controller, obj, 1); REPORTER_ASSERT(reporter, *data1 == *data2); } DEF_TEST(FlatData, reporter) { // Test flattening SkShader SkPoint points[2]; points[0].set(0, 0); points[1].set(SkIntToScalar(20), SkIntToScalar(20)); SkColor colors[2]; colors[0] = SK_ColorRED; colors[1] = SK_ColorBLUE; SkAutoTUnref shader(SkGradientShader::CreateLinear(points, colors, NULL, 2, SkShader::kRepeat_TileMode)); testCreate(reporter, *shader); // Test SkBitmap { SkBitmap bm; bm.setConfig(SkBitmap::kARGB_8888_Config, 50, 50); bm.allocPixels(); SkCanvas canvas(bm); SkPaint paint; paint.setShader(shader); canvas.drawPaint(paint); testCreate(reporter, bm); } // Test SkColorFilter SkAutoTUnref cf(SkColorFilter::CreateLightingFilter(SK_ColorBLUE, SK_ColorRED)); testCreate(reporter, *cf); // Test SkXfermode SkAutoTUnref xfer(SkXfermode::Create(SkXfermode::kDstOver_Mode)); testCreate(reporter, *xfer); }