07adb6359f
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
89 lines
2.8 KiB
C++
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);
|
|
}
|