image/LookupResult.h
author L10n Bumper Bot <release+l10nbumper@mozilla.com>
Thu, 08 Nov 2018 04:00:19 -0800
changeset 501103 7bb875130d4e5c249d11c9c0cfab169071d63159
parent 496036 1e53e6af422382ae1ddfee87a7081810b51d8ac5
child 508163 6f3709b3878117466168c40affa7bca0b60cf75b
permissions -rw-r--r--
no bug - Bumping Firefox l10n changesets r=release a=l10n-bump DONTBUILD fy-NL -> 0bb7dbc40693 ga-IE -> f3908a1bdbe1 gd -> fb2f90fb6c55 gl -> d1f341097504 gn -> 1b34bd85e970 gu-IN -> b9e436701735 he -> 2089fb701e11 hi-IN -> e3c5a66c3a31 hr -> 70f7cc013b43 hsb -> 779bf1ff93be hu -> a7696eac59a0 hy-AM -> 39402ec448d5 ia -> a014929c8b9f id -> 64354ab44f7d is -> 58a1e1824c2b ja -> 992f87605e0b ja-JP-mac -> 7d0f88bb10a8 ka -> 178d06697a7e kab -> ab445bdeb0ab kk -> d651702a031d kn -> 02226c531652

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

/**
 * LookupResult is the return type of SurfaceCache's Lookup*() functions. It
 * combines a surface with relevant metadata tracked by SurfaceCache.
 */

#ifndef mozilla_image_LookupResult_h
#define mozilla_image_LookupResult_h

#include "mozilla/Attributes.h"
#include "mozilla/gfx/Point.h"  // for IntSize
#include "mozilla/Move.h"
#include "ISurfaceProvider.h"

namespace mozilla {
namespace image {

enum class MatchType : uint8_t
{
  NOT_FOUND,  // No matching surface and no placeholder.
  PENDING,    // Found a matching placeholder, but no surface.
  EXACT,      // Found a surface that matches exactly.
  SUBSTITUTE_BECAUSE_NOT_FOUND,  // No exact match, but found a similar one.
  SUBSTITUTE_BECAUSE_PENDING,    // Found a similar surface and a placeholder
                                 // for an exact match.

  /* No exact match, but this should be considered an exact match for purposes
   * of deciding whether or not to request a new decode. This is because the
   * cache has determined that callers require too many size variants of this
   * image. It determines the set of sizes which best represent the image, and
   * will only suggest decoding of unavailable sizes from that set. */
  SUBSTITUTE_BECAUSE_BEST
};

/**
 * LookupResult is the return type of SurfaceCache's Lookup*() functions. It
 * combines a surface with relevant metadata tracked by SurfaceCache.
 */
class MOZ_STACK_CLASS LookupResult
{
public:
  explicit LookupResult(MatchType aMatchType)
    : mMatchType(aMatchType)
  {
    MOZ_ASSERT(mMatchType == MatchType::NOT_FOUND ||
               mMatchType == MatchType::PENDING,
               "Only NOT_FOUND or PENDING make sense with no surface");
  }

  LookupResult(LookupResult&& aOther)
    : mSurface(std::move(aOther.mSurface))
    , mMatchType(aOther.mMatchType)
    , mSuggestedSize(aOther.mSuggestedSize)
  { }

  LookupResult(DrawableSurface&& aSurface, MatchType aMatchType)
    : mSurface(std::move(aSurface))
    , mMatchType(aMatchType)
  {
    MOZ_ASSERT(!mSurface || !(mMatchType == MatchType::NOT_FOUND ||
                              mMatchType == MatchType::PENDING),
               "Only NOT_FOUND or PENDING make sense with no surface");
    MOZ_ASSERT(mSurface || mMatchType == MatchType::NOT_FOUND ||
                           mMatchType == MatchType::PENDING,
               "NOT_FOUND or PENDING do not make sense with a surface");
  }

  LookupResult(DrawableSurface&& aSurface, MatchType aMatchType,
               const gfx::IntSize& aSuggestedSize)
    : mSurface(std::move(aSurface))
    , mMatchType(aMatchType)
    , mSuggestedSize(aSuggestedSize)
  {
    MOZ_ASSERT(!mSurface || !(mMatchType == MatchType::NOT_FOUND ||
                              mMatchType == MatchType::PENDING),
               "Only NOT_FOUND or PENDING make sense with no surface");
    MOZ_ASSERT(mSurface || mMatchType == MatchType::NOT_FOUND ||
                           mMatchType == MatchType::PENDING,
               "NOT_FOUND or PENDING do not make sense with a surface");
  }

  LookupResult& operator=(LookupResult&& aOther)
  {
    MOZ_ASSERT(&aOther != this, "Self-move-assignment is not supported");
    mSurface = std::move(aOther.mSurface);
    mMatchType = aOther.mMatchType;
    mSuggestedSize = aOther.mSuggestedSize;
    return *this;
  }

  DrawableSurface& Surface() { return mSurface; }
  const DrawableSurface& Surface() const { return mSurface; }
  const gfx::IntSize& SuggestedSize() const { return mSuggestedSize; }

  /// @return true if this LookupResult contains a surface.
  explicit operator bool() const { return bool(mSurface); }

  /// @return what kind of match this is (exact, substitute, etc.)
  MatchType Type() const { return mMatchType; }

private:
  LookupResult(const LookupResult&) = delete;
  LookupResult& operator=(const LookupResult& aOther) = delete;

  DrawableSurface mSurface;
  MatchType mMatchType;

  /// mSuggestedSize will be the size of the returned surface if the result is
  /// SUBSTITUTE_BECAUSE_BEST. It will be empty for EXACT, and can contain a
  /// non-empty size possibly different from the returned surface (if any) for
  /// all other results. If non-empty, it will always be the size the caller
  /// should request any decodes at.
  gfx::IntSize mSuggestedSize;
};

} // namespace image
} // namespace mozilla

#endif // mozilla_image_LookupResult_h