blob: 875cbf170de3c0fe1718755134ed3764dd1b6a8e [file] [log] [blame]
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// An Image wraps an image any flavor, be it platform-native GdkBitmap/NSImage,
// or a SkBitmap. This also provides easy conversion to other image types
// through operator overloading. It will cache the converted representations
// internally to prevent double-conversion.
//
// The lifetime of both the initial representation and any converted ones are
// tied to the lifetime of the Image's internal storage. To allow Images to be
// cheaply passed around by value, the actual image data is stored in a ref-
// counted member. When all Images referencing this storage are deleted, the
// actual representations are deleted, too.
#ifndef UI_GFX_IMAGE_H_
#define UI_GFX_IMAGE_H_
#pragma once
#include <map>
#include <vector>
#include "base/basictypes.h"
#include "base/gtest_prod_util.h"
#include "base/memory/ref_counted.h"
#include "build/build_config.h"
#include "ui/gfx/native_widget_types.h" // Forward-declares GdkPixbuf and NSImage.
class SkBitmap;
namespace {
class ImageTest;
class ImageMacTest;
}
namespace gfx {
namespace internal {
class ImageRep;
class ImageStorage;
}
class Image {
public:
enum RepresentationType {
kGdkPixbufRep,
kNSImageRep,
kSkBitmapRep,
};
typedef std::map<RepresentationType, internal::ImageRep*> RepresentationMap;
// Creates a new image with the default representation. The object will take
// ownership of the image.
explicit Image(const SkBitmap* bitmap);
// To create an Image that supports multiple resolutions pass a vector
// of bitmaps, one for each resolution.
explicit Image(const std::vector<const SkBitmap*>& bitmaps);
#if defined(OS_LINUX)
// Does not increase |pixbuf|'s reference count; expects to take ownership.
explicit Image(GdkPixbuf* pixbuf);
#elif defined(OS_MACOSX)
// Does not retain |image|; expects to take ownership.
// A single NSImage object can contain multiple bitmaps so there's no reason
// to pass a vector of these.
explicit Image(NSImage* image);
#endif
// Initializes a new Image by AddRef()ing |other|'s internal storage.
Image(const Image& other);
// Copies a reference to |other|'s storage.
Image& operator=(const Image& other);
// Deletes the image and, if the only owner of the storage, all of its cached
// representations.
~Image();
// Conversion handlers.
operator const SkBitmap*() const ;
operator const SkBitmap&() const;
#if defined(OS_LINUX)
operator GdkPixbuf*() const;
#elif defined(OS_MACOSX)
operator NSImage*() const;
#endif
// Gets the number of bitmaps in this image. This may cause a conversion
// to a bitmap representation. Note, this function and GetSkBitmapAtIndex()
// are primarily meant to be used by the theme provider.
size_t GetNumberOfSkBitmaps() const;
// Gets the bitmap at the given index. This may cause a conversion
// to a bitmap representation. Note, the internal ordering of bitmaps is not
// guaranteed.
const SkBitmap* GetSkBitmapAtIndex(size_t index) const;
// Inspects the representations map to see if the given type exists.
bool HasRepresentation(RepresentationType type) const;
// Returns the number of representations.
size_t RepresentationCount() const;
// Swaps this image's internal representations with |other|.
void SwapRepresentations(gfx::Image* other);
private:
// Returns the ImageRep for the default representation.
internal::ImageRep* DefaultRepresentation() const;
// Returns a ImageRep for the given representation type, converting and
// caching if necessary.
internal::ImageRep* GetRepresentation(RepresentationType rep) const;
// Stores a representation into the map.
void AddRepresentation(internal::ImageRep* rep) const;
// Internal class that holds all the representations. This allows the Image to
// be cheaply copied.
scoped_refptr<internal::ImageStorage> storage_;
friend class ::ImageTest;
friend class ::ImageMacTest;
};
} // namespace gfx
#endif // UI_GFX_IMAGE_H_