10c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com/*
20c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com * Copyright 2012 Google Inc.
30c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com *
40c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com * Use of this source code is governed by a BSD-style license that can be
50c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com * found in the LICENSE file.
60c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com */
70c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com
80c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com#include "SkBitmap.h"
90c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com#include "SkCanvas.h"
100c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com#include "SkColor.h"
110c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com#include "SkColorFilter.h"
120c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com#include "SkGradientShader.h"
130c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com#include "SkPaint.h"
140c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com#include "SkPictureFlat.h"
150c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com#include "SkShader.h"
160c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com#include "SkXfermode.h"
178f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h"
180c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com
1907adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.orgstruct SkFlattenableTraits {
20186c0ccac25229534ec6fb84726043083304d4d1commit-bot@chromium.org    static void Flatten(SkWriteBuffer& buffer, const SkFlattenable& flattenable) {
2107adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.org        buffer.writeFlattenable(&flattenable);
2207adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.org    }
2307adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.org};
240c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com
251554360a9511d996e1618d19c163c810ef3f128cscroggo@google.comclass Controller : public SkChunkFlatController {
261554360a9511d996e1618d19c163c810ef3f128cscroggo@google.compublic:
271554360a9511d996e1618d19c163c810ef3f128cscroggo@google.com    Controller() : INHERITED(1024) {
281554360a9511d996e1618d19c163c810ef3f128cscroggo@google.com        this->INHERITED::setNamedFactorySet(SkNEW(SkNamedFactorySet))->unref();
291554360a9511d996e1618d19c163c810ef3f128cscroggo@google.com    }
301554360a9511d996e1618d19c163c810ef3f128cscroggo@google.comprivate:
311554360a9511d996e1618d19c163c810ef3f128cscroggo@google.com    typedef SkChunkFlatController INHERITED;
321554360a9511d996e1618d19c163c810ef3f128cscroggo@google.com};
331554360a9511d996e1618d19c163c810ef3f128cscroggo@google.com
340c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com/**
350c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com * Verify that two SkFlatData objects that created from the same object are
360c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com * identical when using an SkNamedFactorySet.
370c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com * @param reporter Object to report failures.
380c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com * @param obj Flattenable object to be flattened.
390c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com * @param flattenProc Function that flattens objects with the same type as obj.
400c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com */
4107adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.orgtemplate <typename Traits, typename T>
4207adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.orgstatic void testCreate(skiatest::Reporter* reporter, const T& obj) {
431554360a9511d996e1618d19c163c810ef3f128cscroggo@google.com    Controller controller;
4407adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.org    // No need to delete data because that will be taken care of by the controller.
4507adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.org    SkFlatData* data1 = SkFlatData::Create<Traits>(&controller, obj, 0);
4607adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.org    SkFlatData* data2 = SkFlatData::Create<Traits>(&controller, obj, 1);
479e3074e968f52eb02fdc329bb9fbe7be5e674268mtklein@google.com    REPORTER_ASSERT(reporter, *data1 == *data2);
480c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com}
490c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com
50e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(FlatData, reporter) {
510c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com    // Test flattening SkShader
520c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com    SkPoint points[2];
530c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com    points[0].set(0, 0);
540c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com    points[1].set(SkIntToScalar(20), SkIntToScalar(20));
550c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com    SkColor colors[2];
560c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com    colors[0] = SK_ColorRED;
570c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com    colors[1] = SK_ColorBLUE;
5807adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.org
5907adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.org    SkAutoTUnref<SkShader> shader(SkGradientShader::CreateLinear(points, colors, NULL, 2,
6007adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.org                                                                 SkShader::kRepeat_TileMode));
6107adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.org    testCreate<SkFlattenableTraits>(reporter, *shader);
620c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com
630c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com    // Test SkColorFilter
6407adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.org    SkAutoTUnref<SkColorFilter> cf(SkColorFilter::CreateLightingFilter(SK_ColorBLUE, SK_ColorRED));
6507adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.org    testCreate<SkFlattenableTraits>(reporter, *cf);
660c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com
670c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com    // Test SkXfermode
6807adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.org    SkAutoTUnref<SkXfermode> xfer(SkXfermode::Create(SkXfermode::kDstOver_Mode));
6907adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.org    testCreate<SkFlattenableTraits>(reporter, *xfer);
700c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com}
71