skia2/tests/FlatDataTest.cpp
commit-bot@chromium.org 07adb6359f Function pointers -> templates in SkPictureFlat.
These flatten/unflatten function pointers were driving me nuts when reading the
generated assembly for this code.  We don't need the flexibility of function
pointers here, so let's use templates to make it more manageable.  You'll
notice we get much better typing now on flatten/unflatten.

BUG=
R=reed@google.com

Author: mtklein@google.com

Review URL: https://codereview.chromium.org/123213004

git-svn-id: http://skia.googlecode.com/svn/trunk@12873 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 22:20:49 +00:00

89 lines
2.8 KiB
C++

/*
* 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 "Test.h"
#include "TestClassDef.h"
#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"
struct SkFlattenableTraits {
static void flatten(SkOrderedWriteBuffer& buffer, const SkFlattenable& flattenable) {
buffer.writeFlattenable(&flattenable);
}
};
struct SkBitmapTraits {
static void flatten(SkOrderedWriteBuffer& 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 <typename Traits, typename T>
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<Traits>(&controller, obj, 0);
SkFlatData* data2 = SkFlatData::Create<Traits>(&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<SkShader> shader(SkGradientShader::CreateLinear(points, colors, NULL, 2,
SkShader::kRepeat_TileMode));
testCreate<SkFlattenableTraits>(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<SkBitmapTraits>(reporter, bm);
}
// Test SkColorFilter
SkAutoTUnref<SkColorFilter> cf(SkColorFilter::CreateLightingFilter(SK_ColorBLUE, SK_ColorRED));
testCreate<SkFlattenableTraits>(reporter, *cf);
// Test SkXfermode
SkAutoTUnref<SkXfermode> xfer(SkXfermode::Create(SkXfermode::kDstOver_Mode));
testCreate<SkFlattenableTraits>(reporter, *xfer);
}