gecko-dev/image/SVGDrawingParameters.h
Andrew Osmond cee95ec8de Bug 1456558 - Part 3. Implement factor of 2 scaling support for SVGs in VectorImage. r=tnikkel
If FLAG_HIGH_QUALITY_SCALING is used, we should use
SurfaceCache::LookupBestMatch just like how it is done in RasterImage.
This may provide an alternative size at which we should rasterize the
SVG instead of the requested size. Since SurfaceCache imposes a maximum
size for which it will permit rasterized SVGs, we should also bypass the
cache entirely if we are well above that and simply draw directly to the
draw target in such cases.

With WebRender, it is somewhat more complicated. We will now return
NOT_SUPPORTED if the size is too big, and this should trigger fallback
to blob images. This should only produce drawing commands for the
relevant region and save us the high cost of rasterized a very large
surface on the main thread, which at the same time, looking as crisp as
a user would expect.
2018-09-20 20:22:06 -04:00

71 lines
2.2 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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 mozilla_image_SVGDrawingParameters_h
#define mozilla_image_SVGDrawingParameters_h
#include "gfxContext.h"
#include "gfxTypes.h"
#include "ImageRegion.h"
#include "mozilla/gfx/Point.h"
#include "mozilla/gfx/Types.h"
#include "mozilla/Maybe.h"
#include "nsSize.h"
#include "SVGImageContext.h"
namespace mozilla {
namespace image {
struct SVGDrawingParameters
{
typedef mozilla::gfx::IntSize IntSize;
typedef mozilla::gfx::SamplingFilter SamplingFilter;
SVGDrawingParameters(gfxContext* aContext,
const nsIntSize& aRasterSize,
const nsIntSize& aDrawSize,
const ImageRegion& aRegion,
SamplingFilter aSamplingFilter,
const Maybe<SVGImageContext>& aSVGContext,
float aAnimationTime,
uint32_t aFlags,
float aOpacity)
: context(aContext)
, size(aRasterSize)
, drawSize(aDrawSize)
, region(aRegion)
, samplingFilter(aSamplingFilter)
, svgContext(aSVGContext)
, viewportSize(aRasterSize)
, animationTime(aAnimationTime)
, flags(aFlags)
, opacity(aOpacity)
{
if (aSVGContext) {
auto sz = aSVGContext->GetViewportSize();
if (sz) {
viewportSize = nsIntSize(sz->width, sz->height); // XXX losing unit
}
}
}
gfxContext* context;
IntSize size; // Size to rasterize a surface at.
IntSize drawSize; // Size to draw the given surface at.
ImageRegion region;
SamplingFilter samplingFilter;
const Maybe<SVGImageContext>& svgContext;
nsIntSize viewportSize;
float animationTime;
uint32_t flags;
gfxFloat opacity;
};
} // namespace image
} // namespace mozilla
#endif // mozilla_image_SVGDrawingParameters_h