65044bfe02
In SkLayerRasterizer::snapshotRasterizer() and ::detachRasterizer(), if no layers have been added, do not attempt to create an SkLayerRasterizer. Instead, return NULL. This fixes an error when running tests on Android. Update dox to state that NULL may be returned. Add tests. R=reed@google.com Author: scroggo@google.com Review URL: https://codereview.chromium.org/313653006
112 lines
3.6 KiB
C++
112 lines
3.6 KiB
C++
|
|
/*
|
|
* Copyright 2006 The Android Open Source Project
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
|
|
#ifndef SkLayerRasterizer_DEFINED
|
|
#define SkLayerRasterizer_DEFINED
|
|
|
|
#include "SkRasterizer.h"
|
|
#include "SkDeque.h"
|
|
#include "SkScalar.h"
|
|
|
|
class SkPaint;
|
|
|
|
class SK_API SkLayerRasterizer : public SkRasterizer {
|
|
public:
|
|
virtual ~SkLayerRasterizer();
|
|
|
|
class SK_API Builder {
|
|
public:
|
|
Builder();
|
|
~Builder();
|
|
|
|
void addLayer(const SkPaint& paint) {
|
|
this->addLayer(paint, 0, 0);
|
|
}
|
|
|
|
/**
|
|
* Add a new layer (above any previous layers) to the rasterizer.
|
|
* The layer will extract those fields that affect the mask from
|
|
* the specified paint, but will not retain a reference to the paint
|
|
* object itself, so it may be reused without danger of side-effects.
|
|
*/
|
|
void addLayer(const SkPaint& paint, SkScalar dx, SkScalar dy);
|
|
|
|
/**
|
|
* Pass queue of layers on to newly created layer rasterizer and return it. The builder
|
|
* *cannot* be used any more after calling this function. If no layers have been added,
|
|
* returns NULL.
|
|
*
|
|
* The caller is responsible for calling unref() on the returned object, if non NULL.
|
|
*/
|
|
SkLayerRasterizer* detachRasterizer();
|
|
|
|
/**
|
|
* Create and return a new immutable SkLayerRasterizer that contains a shapshot of the
|
|
* layers that were added to the Builder, without modifying the Builder. The Builder
|
|
* *may* be used after calling this function. It will continue to hold any layers
|
|
* previously added, so consecutive calls to this function will return identical objects,
|
|
* and objects returned by future calls to this function contain all the layers in
|
|
* previously returned objects. If no layers have been added, returns NULL.
|
|
*
|
|
* Future calls to addLayer will not affect rasterizers previously returned by this call.
|
|
*
|
|
* The caller is responsible for calling unref() on the returned object, if non NULL.
|
|
*/
|
|
SkLayerRasterizer* snapshotRasterizer() const;
|
|
|
|
private:
|
|
SkDeque* fLayers;
|
|
};
|
|
|
|
#ifdef SK_SUPPORT_LEGACY_LAYERRASTERIZER_API
|
|
void addLayer(const SkPaint& paint) {
|
|
this->addLayer(paint, 0, 0);
|
|
}
|
|
|
|
/** Add a new layer (above any previous layers) to the rasterizer.
|
|
The layer will extract those fields that affect the mask from
|
|
the specified paint, but will not retain a reference to the paint
|
|
object itself, so it may be reused without danger of side-effects.
|
|
*/
|
|
void addLayer(const SkPaint& paint, SkScalar dx, SkScalar dy);
|
|
#endif
|
|
|
|
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLayerRasterizer)
|
|
|
|
protected:
|
|
SkLayerRasterizer(SkDeque* layers);
|
|
SkLayerRasterizer(SkReadBuffer&);
|
|
virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
|
|
|
|
// override from SkRasterizer
|
|
virtual bool onRasterize(const SkPath& path, const SkMatrix& matrix,
|
|
const SkIRect* clipBounds,
|
|
SkMask* mask, SkMask::CreateMode mode) const;
|
|
|
|
#ifdef SK_SUPPORT_LEGACY_LAYERRASTERIZER_API
|
|
public:
|
|
#endif
|
|
SkLayerRasterizer();
|
|
|
|
private:
|
|
#ifdef SK_SUPPORT_LEGACY_LAYERRASTERIZER_API
|
|
SkDeque* fLayers;
|
|
#else
|
|
const SkDeque* const fLayers;
|
|
#endif
|
|
|
|
static SkDeque* ReadLayers(SkReadBuffer& buffer);
|
|
|
|
friend class LayerRasterizerTester;
|
|
|
|
typedef SkRasterizer INHERITED;
|
|
};
|
|
|
|
#endif
|