DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Implementation

Mercurial (33b7b8e81b4b)

VCS Links

gfxCallbackDrawable

gfxDrawable

gfxDrawingCallback

gfxPatternDrawable

gfxSurfaceDrawable

Macros

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef GFX_DRAWABLE_H
#define GFX_DRAWABLE_H

#include "gfxRect.h"
#include "gfxMatrix.h"
#include "gfxTypes.h"
#include "mozilla/gfx/2D.h"
#include "mozilla/gfx/Types.h"
#include "nsISupportsImpl.h"

class gfxContext;
class gfxPattern;

/**
 * gfxDrawable
 * An Interface representing something that has an intrinsic size and can draw
 * itself repeatedly.
 */
class gfxDrawable {
    NS_INLINE_DECL_REFCOUNTING(gfxDrawable)
public:
    typedef mozilla::gfx::AntialiasMode AntialiasMode;
    typedef mozilla::gfx::CompositionOp CompositionOp;
    typedef mozilla::gfx::DrawTarget DrawTarget;

    explicit gfxDrawable(const mozilla::gfx::IntSize aSize)
     : mSize(aSize) {}

    /**
     * Draw into aContext filling aFillRect, possibly repeating, using aSamplingFilter.
     * aTransform is a userspace to "image"space matrix. For example, if Draw
     * draws using a gfxPattern, this is the matrix that should be set on the
     * pattern prior to rendering it.
     *  @return whether drawing was successful
     */
    virtual bool Draw(gfxContext* aContext,
                        const gfxRect& aFillRect,
                        mozilla::gfx::ExtendMode aExtendMode,
                        const mozilla::gfx::SamplingFilter aSamplingFilter,
                        gfxFloat aOpacity = 1.0,
                        const gfxMatrix& aTransform = gfxMatrix()) = 0;

    virtual bool DrawWithSamplingRect(DrawTarget* aDrawTarget,
                                      CompositionOp aOp,
                                      AntialiasMode aAntialiasMode,
                                      const gfxRect& aFillRect,
                                      const gfxRect& aSamplingRect,
                                      mozilla::gfx::ExtendMode aExtendMode,
                                      const mozilla::gfx::SamplingFilter aSamplingFilter,
                                      gfxFloat aOpacity = 1.0)
    {
        return false;
    }

    virtual mozilla::gfx::IntSize Size() { return mSize; }

protected:
    // Protected destructor, to discourage deletion outside of Release():
    virtual ~gfxDrawable() {}

    const mozilla::gfx::IntSize mSize;
};

/**
 * gfxSurfaceDrawable
 * A convenience implementation of gfxDrawable for surfaces.
 */
class gfxSurfaceDrawable : public gfxDrawable {
public:
    gfxSurfaceDrawable(mozilla::gfx::SourceSurface* aSurface, const mozilla::gfx::IntSize aSize,
                       const gfxMatrix aTransform = gfxMatrix());
    virtual ~gfxSurfaceDrawable() {}

    virtual bool Draw(gfxContext* aContext,
                        const gfxRect& aFillRect,
                        mozilla::gfx::ExtendMode aExtendMode,
                        const mozilla::gfx::SamplingFilter aSamplingFilter,
                        gfxFloat aOpacity = 1.0,
                        const gfxMatrix& aTransform = gfxMatrix());

    virtual bool DrawWithSamplingRect(DrawTarget* aDrawTarget,
                                      CompositionOp aOp,
                                      AntialiasMode aAntialiasMode,
                                      const gfxRect& aFillRect,
                                      const gfxRect& aSamplingRect,
                                      mozilla::gfx::ExtendMode aExtendMode,
                                      const mozilla::gfx::SamplingFilter aSamplingFilter,
                                      gfxFloat aOpacity = 1.0);

protected:
    void DrawInternal(DrawTarget* aDrawTarget,
                      CompositionOp aOp,
                      AntialiasMode aAntialiasMode,
                      const gfxRect& aFillRect,
                      const mozilla::gfx::IntRect& aSamplingRect,
                      mozilla::gfx::ExtendMode aExtendMode,
                      const mozilla::gfx::SamplingFilter aSamplingFilter,
                      gfxFloat aOpacity,
                      const gfxMatrix& aTransform = gfxMatrix());

    RefPtr<mozilla::gfx::SourceSurface> mSourceSurface;
    const gfxMatrix mTransform;
};

/**
 * gfxDrawingCallback
 * A simple drawing functor.
 */
class gfxDrawingCallback {
    NS_INLINE_DECL_REFCOUNTING(gfxDrawingCallback)
protected:
    // Protected destructor, to discourage deletion outside of Release():
    virtual ~gfxDrawingCallback() {}

public:
    /**
     * Draw into aContext filling aFillRect using aSamplingFilter.
     * aTransform is a userspace to "image"space matrix. For example, if Draw
     * draws using a gfxPattern, this is the matrix that should be set on the
     * pattern prior to rendering it.
     *  @return whether drawing was successful
     */
    virtual bool operator()(gfxContext* aContext,
                            const gfxRect& aFillRect,
                            const mozilla::gfx::SamplingFilter aSamplingFilter,
                            const gfxMatrix& aTransform = gfxMatrix()) = 0;

};

/**
 * gfxCallbackDrawable
 * A convenience implementation of gfxDrawable for callbacks.
 */
class gfxCallbackDrawable : public gfxDrawable {
public:
    gfxCallbackDrawable(gfxDrawingCallback* aCallback, const mozilla::gfx::IntSize aSize);
    virtual ~gfxCallbackDrawable() {}

    virtual bool Draw(gfxContext* aContext,
                      const gfxRect& aFillRect,
                      mozilla::gfx::ExtendMode aExtendMode,
                      const mozilla::gfx::SamplingFilter aSamplingFilter,
                      gfxFloat aOpacity = 1.0,
                      const gfxMatrix& aTransform = gfxMatrix());

protected:
    already_AddRefed<gfxSurfaceDrawable>
    MakeSurfaceDrawable(gfxContext* aContext,
                        mozilla::gfx::SamplingFilter aSamplingFilter =
                        mozilla::gfx::SamplingFilter::LINEAR);

    RefPtr<gfxDrawingCallback> mCallback;
    RefPtr<gfxSurfaceDrawable> mSurfaceDrawable;
};

/**
 * gfxPatternDrawable
 * A convenience implementation of gfxDrawable for patterns.
 */
class gfxPatternDrawable : public gfxDrawable {
public:
    gfxPatternDrawable(gfxPattern* aPattern,
                       const mozilla::gfx::IntSize aSize);
    virtual ~gfxPatternDrawable();

    virtual bool Draw(gfxContext* aContext,
                      const gfxRect& aFillRect,
                      mozilla::gfx::ExtendMode aExtendMode,
                      const mozilla::gfx::SamplingFilter aSamplingFilter,
                      gfxFloat aOpacity = 1.0,
                      const gfxMatrix& aTransform = gfxMatrix());


protected:
    already_AddRefed<gfxCallbackDrawable> MakeCallbackDrawable();

    RefPtr<gfxPattern> mPattern;
};

#endif /* GFX_DRAWABLE_H */