image/SVGDrawingParameters.h
author Andrew Osmond <aosmond@mozilla.com>
Thu, 20 Sep 2018 18:15:34 -0400
changeset 496029 70d8f11cf6e8278b8e1509a69bd02adc0168e606
parent 406863 69ceb4c8dbb84e0e9c1a0869eb60499681aca92d
child 496030 fac7810a8f317798d8d78e6cdd4034bf18385001
permissions -rw-r--r--
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.

/* -*- 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