tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

gfxDrawable.h (6163B)


      1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
      2 * This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this
      4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 #ifndef GFX_DRAWABLE_H
      7 #define GFX_DRAWABLE_H
      8 
      9 #include "gfxRect.h"
     10 #include "gfxMatrix.h"
     11 #include "gfxTypes.h"
     12 #include "mozilla/gfx/2D.h"
     13 #include "mozilla/gfx/Types.h"
     14 #include "nsISupportsImpl.h"
     15 
     16 class gfxContext;
     17 class gfxPattern;
     18 
     19 /**
     20 * gfxDrawable
     21 * An Interface representing something that has an intrinsic size and can draw
     22 * itself repeatedly.
     23 */
     24 class gfxDrawable {
     25  NS_INLINE_DECL_REFCOUNTING(gfxDrawable)
     26 public:
     27  typedef mozilla::gfx::AntialiasMode AntialiasMode;
     28  typedef mozilla::gfx::CompositionOp CompositionOp;
     29  typedef mozilla::gfx::DrawTarget DrawTarget;
     30 
     31  explicit gfxDrawable(const mozilla::gfx::IntSize aSize) : mSize(aSize) {}
     32 
     33  /**
     34   * Draw into aContext filling aFillRect, possibly repeating, using
     35   * aSamplingFilter. aTransform is a userspace to "image"space matrix. For
     36   * example, if Draw draws using a gfxPattern, this is the matrix that should
     37   * be set on the pattern prior to rendering it.
     38   *  @return whether drawing was successful
     39   */
     40  virtual bool Draw(gfxContext* aContext, const gfxRect& aFillRect,
     41                    mozilla::gfx::ExtendMode aExtendMode,
     42                    const mozilla::gfx::SamplingFilter aSamplingFilter,
     43                    gfxFloat aOpacity = 1.0,
     44                    const gfxMatrix& aTransform = gfxMatrix()) = 0;
     45 
     46  virtual bool DrawWithSamplingRect(
     47      DrawTarget* aDrawTarget, CompositionOp aOp, AntialiasMode aAntialiasMode,
     48      const gfxRect& aFillRect, const gfxRect& aSamplingRect,
     49      mozilla::gfx::ExtendMode aExtendMode,
     50      const mozilla::gfx::SamplingFilter aSamplingFilter,
     51      gfxFloat aOpacity = 1.0) {
     52    return false;
     53  }
     54 
     55  virtual mozilla::gfx::IntSize Size() { return mSize; }
     56 
     57 protected:
     58  // Protected destructor, to discourage deletion outside of Release():
     59  virtual ~gfxDrawable() = default;
     60 
     61  const mozilla::gfx::IntSize mSize;
     62 };
     63 
     64 /**
     65 * gfxSurfaceDrawable
     66 * A convenience implementation of gfxDrawable for surfaces.
     67 */
     68 class gfxSurfaceDrawable : public gfxDrawable {
     69 public:
     70  gfxSurfaceDrawable(mozilla::gfx::SourceSurface* aSurface,
     71                     const mozilla::gfx::IntSize aSize,
     72                     const gfxMatrix aTransform = gfxMatrix());
     73  virtual ~gfxSurfaceDrawable() = default;
     74 
     75  virtual bool Draw(gfxContext* aContext, const gfxRect& aFillRect,
     76                    mozilla::gfx::ExtendMode aExtendMode,
     77                    const mozilla::gfx::SamplingFilter aSamplingFilter,
     78                    gfxFloat aOpacity = 1.0,
     79                    const gfxMatrix& aTransform = gfxMatrix()) override;
     80 
     81  virtual bool DrawWithSamplingRect(
     82      DrawTarget* aDrawTarget, CompositionOp aOp, AntialiasMode aAntialiasMode,
     83      const gfxRect& aFillRect, const gfxRect& aSamplingRect,
     84      mozilla::gfx::ExtendMode aExtendMode,
     85      const mozilla::gfx::SamplingFilter aSamplingFilter,
     86      gfxFloat aOpacity = 1.0) override;
     87 
     88 protected:
     89  void DrawInternal(DrawTarget* aDrawTarget, CompositionOp aOp,
     90                    AntialiasMode aAntialiasMode, const gfxRect& aFillRect,
     91                    const mozilla::gfx::IntRect& aSamplingRect,
     92                    mozilla::gfx::ExtendMode aExtendMode,
     93                    const mozilla::gfx::SamplingFilter aSamplingFilter,
     94                    gfxFloat aOpacity,
     95                    const gfxMatrix& aTransform = gfxMatrix());
     96 
     97  RefPtr<mozilla::gfx::SourceSurface> mSourceSurface;
     98  const gfxMatrix mTransform;
     99 };
    100 
    101 /**
    102 * gfxDrawingCallback
    103 * A simple drawing functor.
    104 */
    105 class gfxDrawingCallback {
    106  NS_INLINE_DECL_REFCOUNTING(gfxDrawingCallback)
    107 protected:
    108  // Protected destructor, to discourage deletion outside of Release():
    109  virtual ~gfxDrawingCallback() = default;
    110 
    111 public:
    112  /**
    113   * Draw into aContext filling aFillRect using aSamplingFilter.
    114   * aTransform is a userspace to "image"space matrix. For example, if Draw
    115   * draws using a gfxPattern, this is the matrix that should be set on the
    116   * pattern prior to rendering it.
    117   *  @return whether drawing was successful
    118   */
    119  virtual bool operator()(gfxContext* aContext, const gfxRect& aFillRect,
    120                          const mozilla::gfx::SamplingFilter aSamplingFilter,
    121                          const gfxMatrix& aTransform = gfxMatrix()) = 0;
    122 };
    123 
    124 /**
    125 * gfxCallbackDrawable
    126 * A convenience implementation of gfxDrawable for callbacks.
    127 */
    128 class gfxCallbackDrawable : public gfxDrawable {
    129 public:
    130  gfxCallbackDrawable(gfxDrawingCallback* aCallback,
    131                      const mozilla::gfx::IntSize aSize);
    132  virtual ~gfxCallbackDrawable() = default;
    133 
    134  virtual bool Draw(gfxContext* aContext, const gfxRect& aFillRect,
    135                    mozilla::gfx::ExtendMode aExtendMode,
    136                    const mozilla::gfx::SamplingFilter aSamplingFilter,
    137                    gfxFloat aOpacity = 1.0,
    138                    const gfxMatrix& aTransform = gfxMatrix()) override;
    139 
    140 protected:
    141  already_AddRefed<gfxSurfaceDrawable> MakeSurfaceDrawable(
    142      gfxContext* aContext, mozilla::gfx::SamplingFilter aSamplingFilter =
    143                                mozilla::gfx::SamplingFilter::LINEAR);
    144 
    145  RefPtr<gfxDrawingCallback> mCallback;
    146  RefPtr<gfxSurfaceDrawable> mSurfaceDrawable;
    147 };
    148 
    149 /**
    150 * gfxPatternDrawable
    151 * A convenience implementation of gfxDrawable for patterns.
    152 */
    153 class gfxPatternDrawable : public gfxDrawable {
    154 public:
    155  gfxPatternDrawable(gfxPattern* aPattern, const mozilla::gfx::IntSize aSize);
    156  virtual ~gfxPatternDrawable();
    157 
    158  virtual bool Draw(gfxContext* aContext, const gfxRect& aFillRect,
    159                    mozilla::gfx::ExtendMode aExtendMode,
    160                    const mozilla::gfx::SamplingFilter aSamplingFilter,
    161                    gfxFloat aOpacity = 1.0,
    162                    const gfxMatrix& aTransform = gfxMatrix()) override;
    163 
    164 protected:
    165  already_AddRefed<gfxCallbackDrawable> MakeCallbackDrawable();
    166 
    167  RefPtr<gfxPattern> mPattern;
    168 };
    169 
    170 #endif /* GFX_DRAWABLE_H */