image/src/Image.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/image/src/Image.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,143 @@
     1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.8 +
     1.9 +#include "nsMimeTypes.h"
    1.10 +
    1.11 +#include "Image.h"
    1.12 +
    1.13 +namespace mozilla {
    1.14 +namespace image {
    1.15 +
    1.16 +// Constructor
    1.17 +ImageResource::ImageResource(ImageURL* aURI) :
    1.18 +  mURI(aURI),
    1.19 +  mInnerWindowId(0),
    1.20 +  mAnimationConsumers(0),
    1.21 +  mAnimationMode(kNormalAnimMode),
    1.22 +  mInitialized(false),
    1.23 +  mAnimating(false),
    1.24 +  mError(false)
    1.25 +{
    1.26 +}
    1.27 +
    1.28 +uint32_t
    1.29 +ImageResource::SizeOfData()
    1.30 +{
    1.31 +  if (mError)
    1.32 +    return 0;
    1.33 +
    1.34 +  // This is not used by memory reporters, but for sizing the cache, which is
    1.35 +  // why it uses |moz_malloc_size_of| rather than a
    1.36 +  // |MOZ_DEFINE_MALLOC_SIZE_OF|.
    1.37 +  return uint32_t(HeapSizeOfSourceWithComputedFallback(moz_malloc_size_of) +
    1.38 +                  HeapSizeOfDecodedWithComputedFallback(moz_malloc_size_of) +
    1.39 +                  NonHeapSizeOfDecoded() +
    1.40 +                  OutOfProcessSizeOfDecoded());
    1.41 +}
    1.42 +
    1.43 +// Translates a mimetype into a concrete decoder
    1.44 +Image::eDecoderType
    1.45 +Image::GetDecoderType(const char *aMimeType)
    1.46 +{
    1.47 +  // By default we don't know
    1.48 +  eDecoderType rv = eDecoderType_unknown;
    1.49 +
    1.50 +  // PNG
    1.51 +  if (!strcmp(aMimeType, IMAGE_PNG))
    1.52 +    rv = eDecoderType_png;
    1.53 +  else if (!strcmp(aMimeType, IMAGE_X_PNG))
    1.54 +    rv = eDecoderType_png;
    1.55 +
    1.56 +  // GIF
    1.57 +  else if (!strcmp(aMimeType, IMAGE_GIF))
    1.58 +    rv = eDecoderType_gif;
    1.59 +
    1.60 +
    1.61 +  // JPEG
    1.62 +  else if (!strcmp(aMimeType, IMAGE_JPEG))
    1.63 +    rv = eDecoderType_jpeg;
    1.64 +  else if (!strcmp(aMimeType, IMAGE_PJPEG))
    1.65 +    rv = eDecoderType_jpeg;
    1.66 +  else if (!strcmp(aMimeType, IMAGE_JPG))
    1.67 +    rv = eDecoderType_jpeg;
    1.68 +
    1.69 +  // BMP
    1.70 +  else if (!strcmp(aMimeType, IMAGE_BMP))
    1.71 +    rv = eDecoderType_bmp;
    1.72 +  else if (!strcmp(aMimeType, IMAGE_BMP_MS))
    1.73 +    rv = eDecoderType_bmp;
    1.74 +
    1.75 +
    1.76 +  // ICO
    1.77 +  else if (!strcmp(aMimeType, IMAGE_ICO))
    1.78 +    rv = eDecoderType_ico;
    1.79 +  else if (!strcmp(aMimeType, IMAGE_ICO_MS))
    1.80 +    rv = eDecoderType_ico;
    1.81 +
    1.82 +  // Icon
    1.83 +  else if (!strcmp(aMimeType, IMAGE_ICON_MS))
    1.84 +    rv = eDecoderType_icon;
    1.85 +
    1.86 +  return rv;
    1.87 +}
    1.88 +
    1.89 +void
    1.90 +ImageResource::IncrementAnimationConsumers()
    1.91 +{
    1.92 +  MOZ_ASSERT(NS_IsMainThread(), "Main thread only to encourage serialization "
    1.93 +                                "with DecrementAnimationConsumers");
    1.94 +  mAnimationConsumers++;
    1.95 +}
    1.96 +
    1.97 +void
    1.98 +ImageResource::DecrementAnimationConsumers()
    1.99 +{
   1.100 +  MOZ_ASSERT(NS_IsMainThread(), "Main thread only to encourage serialization "
   1.101 +                                "with IncrementAnimationConsumers");
   1.102 +  NS_ABORT_IF_FALSE(mAnimationConsumers >= 1, "Invalid no. of animation consumers!");
   1.103 +  mAnimationConsumers--;
   1.104 +}
   1.105 +
   1.106 +nsresult
   1.107 +ImageResource::GetAnimationModeInternal(uint16_t* aAnimationMode)
   1.108 +{
   1.109 +  if (mError)
   1.110 +    return NS_ERROR_FAILURE;
   1.111 +
   1.112 +  NS_ENSURE_ARG_POINTER(aAnimationMode);
   1.113 +
   1.114 +  *aAnimationMode = mAnimationMode;
   1.115 +  return NS_OK;
   1.116 +}
   1.117 +
   1.118 +nsresult
   1.119 +ImageResource::SetAnimationModeInternal(uint16_t aAnimationMode)
   1.120 +{
   1.121 +  if (mError)
   1.122 +    return NS_ERROR_FAILURE;
   1.123 +
   1.124 +  NS_ASSERTION(aAnimationMode == kNormalAnimMode ||
   1.125 +               aAnimationMode == kDontAnimMode ||
   1.126 +               aAnimationMode == kLoopOnceAnimMode,
   1.127 +               "Wrong Animation Mode is being set!");
   1.128 +
   1.129 +  mAnimationMode = aAnimationMode;
   1.130 +
   1.131 +  return NS_OK;
   1.132 +}
   1.133 +
   1.134 +void
   1.135 +ImageResource::EvaluateAnimation()
   1.136 +{
   1.137 +  if (!mAnimating && ShouldAnimate()) {
   1.138 +    nsresult rv = StartAnimation();
   1.139 +    mAnimating = NS_SUCCEEDED(rv);
   1.140 +  } else if (mAnimating && !ShouldAnimate()) {
   1.141 +    StopAnimation();
   1.142 +  }
   1.143 +}
   1.144 +
   1.145 +} // namespace image
   1.146 +} // namespace mozilla

mercurial