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