|
Packit |
f0b94e |
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
Packit |
f0b94e |
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
Packit |
f0b94e |
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
Packit |
f0b94e |
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
Packit |
f0b94e |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
#ifndef nsCSSRenderingGradients_h__
|
|
Packit |
f0b94e |
#define nsCSSRenderingGradients_h__
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
#include "nsLayoutUtils.h"
|
|
Packit |
f0b94e |
#include "nsStyleStruct.h"
|
|
Packit |
f0b94e |
#include "Units.h"
|
|
Packit |
f0b94e |
#include "mozilla/Maybe.h"
|
|
Packit |
f0b94e |
#include "mozilla/gfx/2D.h"
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
namespace mozilla {
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
namespace layers {
|
|
Packit |
f0b94e |
class StackingContextHelper;
|
|
Packit |
f0b94e |
} // namespace layers
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
namespace wr {
|
|
Packit |
f0b94e |
class DisplayListBuilder;
|
|
Packit |
f0b94e |
} // namespace wr
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// A resolved color stop, with a specific position along the gradient line and
|
|
Packit |
f0b94e |
// a color.
|
|
Packit |
f0b94e |
struct ColorStop {
|
|
Packit |
f0b94e |
ColorStop() : mPosition(0), mIsMidpoint(false) {}
|
|
Packit |
f0b94e |
ColorStop(double aPosition, bool aIsMidPoint, const gfx::Color& aColor)
|
|
Packit |
f0b94e |
: mPosition(aPosition), mIsMidpoint(aIsMidPoint), mColor(aColor) {}
|
|
Packit |
f0b94e |
double mPosition; // along the gradient line; 0=start, 1=end
|
|
Packit |
f0b94e |
bool mIsMidpoint;
|
|
Packit |
f0b94e |
gfx::Color mColor;
|
|
Packit |
f0b94e |
};
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
class nsCSSGradientRenderer final {
|
|
Packit |
f0b94e |
public:
|
|
Packit |
f0b94e |
/**
|
|
Packit |
f0b94e |
* Prepare a nsCSSGradientRenderer for a gradient for an element.
|
|
Packit |
f0b94e |
* aIntrinsicSize - the size of the source gradient.
|
|
Packit |
f0b94e |
*/
|
|
Packit |
f0b94e |
static nsCSSGradientRenderer Create(nsPresContext* aPresContext,
|
|
Packit |
f0b94e |
nsStyleGradient* aGradient,
|
|
Packit |
f0b94e |
const nsSize& aIntrinsiceSize);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
/**
|
|
Packit |
f0b94e |
* Draw the gradient to aContext
|
|
Packit |
f0b94e |
* aDest - where the first tile of gradient is
|
|
Packit |
f0b94e |
* aFill - the area to be filled with tiles of aDest
|
|
Packit |
f0b94e |
* aSrc - the area of the gradient that will fill aDest
|
|
Packit |
f0b94e |
* aRepeatSize - the distance from the origin of a tile
|
|
Packit |
f0b94e |
* to the next origin of a tile
|
|
Packit |
f0b94e |
* aDirtyRect - pixels outside of this area may be skipped
|
|
Packit |
f0b94e |
*/
|
|
Packit |
f0b94e |
void Paint(gfxContext& aContext, const nsRect& aDest, const nsRect& aFill,
|
|
Packit |
f0b94e |
const nsSize& aRepeatSize, const mozilla::CSSIntRect& aSrc,
|
|
Packit |
f0b94e |
const nsRect& aDirtyRect, float aOpacity = 1.0);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
/**
|
|
Packit |
f0b94e |
* Collect the gradient parameters
|
|
Packit |
f0b94e |
*/
|
|
Packit |
f0b94e |
void BuildWebRenderParameters(float aOpacity, wr::ExtendMode& aMode,
|
|
Packit |
f0b94e |
nsTArray<wr::GradientStop>& aStops,
|
|
Packit |
f0b94e |
LayoutDevicePoint& aLineStart,
|
|
Packit |
f0b94e |
LayoutDevicePoint& aLineEnd,
|
|
Packit |
f0b94e |
LayoutDeviceSize& aGradientRadius);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
/**
|
|
Packit |
f0b94e |
* Build display items for the gradient
|
|
Packit |
f0b94e |
* aLayer - the layer to make this display item relative to
|
|
Packit |
f0b94e |
* aDest - where the first tile of gradient is
|
|
Packit |
f0b94e |
* aFill - the area to be filled with tiles of aDest
|
|
Packit |
f0b94e |
* aRepeatSize - the distance from the origin of a tile
|
|
Packit |
f0b94e |
* to the next origin of a tile
|
|
Packit |
f0b94e |
* aSrc - the area of the gradient that will fill aDest
|
|
Packit |
f0b94e |
*/
|
|
Packit |
f0b94e |
void BuildWebRenderDisplayItems(wr::DisplayListBuilder& aBuilder,
|
|
Packit |
f0b94e |
const layers::StackingContextHelper& aSc,
|
|
Packit |
f0b94e |
const nsRect& aDest, const nsRect& aFill,
|
|
Packit |
f0b94e |
const nsSize& aRepeatSize,
|
|
Packit |
f0b94e |
const mozilla::CSSIntRect& aSrc,
|
|
Packit |
f0b94e |
bool aIsBackfaceVisible,
|
|
Packit |
f0b94e |
float aOpacity = 1.0);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
private:
|
|
Packit |
f0b94e |
nsCSSGradientRenderer() {}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
nsPresContext* mPresContext;
|
|
Packit |
f0b94e |
nsStyleGradient* mGradient;
|
|
Packit |
f0b94e |
nsTArray<ColorStop> mStops;
|
|
Packit |
f0b94e |
gfxPoint mLineStart, mLineEnd;
|
|
Packit |
f0b94e |
double mRadiusX, mRadiusY;
|
|
Packit |
f0b94e |
};
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
} // namespace mozilla
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
#endif /* nsCSSRenderingGradients_h__ */
|