Bug 923341 - Part 1: Add a gfxSurfaceDrawable constructor for a DrawTarget. r=seth

This commit is contained in:
Matt Woodrow 2013-11-13 17:31:12 +13:00
Родитель c145795685
Коммит 35d6def1cc
2 изменённых файлов: 36 добавлений и 1 удалений

Просмотреть файл

@ -12,6 +12,9 @@
#include "gfxXlibSurface.h"
#endif
using namespace mozilla;
using namespace mozilla::gfx;
gfxSurfaceDrawable::gfxSurfaceDrawable(gfxASurface* aSurface,
const gfxIntSize aSize,
const gfxMatrix aTransform)
@ -21,6 +24,15 @@ gfxSurfaceDrawable::gfxSurfaceDrawable(gfxASurface* aSurface,
{
}
gfxSurfaceDrawable::gfxSurfaceDrawable(DrawTarget* aDrawTarget,
const gfxIntSize aSize,
const gfxMatrix aTransform)
: gfxDrawable(aSize)
, mDrawTarget(aDrawTarget)
, mTransform(aTransform)
{
}
static gfxMatrix
DeviceToImageTransform(gfxContext* aContext,
const gfxMatrix& aUserSpaceToImageSpace)
@ -105,7 +117,19 @@ gfxSurfaceDrawable::Draw(gfxContext* aContext,
const GraphicsFilter& aFilter,
const gfxMatrix& aTransform)
{
nsRefPtr<gfxPattern> pattern = new gfxPattern(mSurface);
nsRefPtr<gfxPattern> pattern;
if (mDrawTarget) {
if (aContext->IsCairo()) {
nsRefPtr<gfxASurface> source =
gfxPlatform::GetPlatform()->GetThebesSurfaceForDrawTarget(mDrawTarget);
pattern = new gfxPattern(source);
} else {
RefPtr<SourceSurface> source = mDrawTarget->Snapshot();
pattern = new gfxPattern(source, Matrix());
}
} else {
pattern = new gfxPattern(mSurface);
}
if (aRepeat) {
pattern->SetExtend(gfxPattern::EXTEND_REPEAT);
pattern->SetFilter(aFilter);
@ -136,6 +160,13 @@ gfxSurfaceDrawable::Draw(gfxContext* aContext,
already_AddRefed<gfxImageSurface>
gfxSurfaceDrawable::GetAsImageSurface()
{
if (mDrawTarget) {
// TODO: Find a way to implement this. The caller really wants a 'sub-image' of
// the original, without having to do a copy. GetDataSurface() might just copy,
// which isn't useful.
return nullptr;
}
return mSurface->GetAsImageSurface();
}

Просмотреть файл

@ -10,6 +10,7 @@
#include "gfxRect.h"
#include "gfxMatrix.h"
#include "GraphicsFilter.h"
#include "mozilla/gfx/2D.h"
class gfxASurface;
class gfxImageSurface;
@ -55,6 +56,8 @@ class gfxSurfaceDrawable : public gfxDrawable {
public:
gfxSurfaceDrawable(gfxASurface* aSurface, const gfxIntSize aSize,
const gfxMatrix aTransform = gfxMatrix());
gfxSurfaceDrawable(mozilla::gfx::DrawTarget* aDT, const gfxIntSize aSize,
const gfxMatrix aTransform = gfxMatrix());
virtual ~gfxSurfaceDrawable() {}
virtual bool Draw(gfxContext* aContext,
@ -67,6 +70,7 @@ public:
protected:
nsRefPtr<gfxASurface> mSurface;
mozilla::RefPtr<mozilla::gfx::DrawTarget> mDrawTarget;
const gfxMatrix mTransform;
};