| Index: ui/gfx/image/image.cc
|
| diff --git a/ui/gfx/image/image.cc b/ui/gfx/image/image.cc
|
| deleted file mode 100644
|
| index 3046f36de28ca135c6d57fcb71617add6202e210..0000000000000000000000000000000000000000
|
| --- a/ui/gfx/image/image.cc
|
| +++ /dev/null
|
| @@ -1,761 +0,0 @@
|
| -// Copyright (c) 2012 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.
|
| -
|
| -#include "ui/gfx/image/image.h"
|
| -
|
| -#include <algorithm>
|
| -#include <set>
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/stl_util.h"
|
| -#include "third_party/skia/include/core/SkBitmap.h"
|
| -#include "ui/gfx/image/image_png_rep.h"
|
| -#include "ui/gfx/image/image_skia.h"
|
| -#include "ui/gfx/image/image_skia_source.h"
|
| -#include "ui/gfx/size.h"
|
| -
|
| -#if !defined(OS_IOS)
|
| -#include "ui/gfx/codec/png_codec.h"
|
| -#endif
|
| -
|
| -#if defined(OS_IOS)
|
| -#include "base/mac/foundation_util.h"
|
| -#include "ui/gfx/image/image_skia_util_ios.h"
|
| -#elif defined(OS_MACOSX)
|
| -#include "base/mac/mac_util.h"
|
| -#include "ui/gfx/image/image_skia_util_mac.h"
|
| -#endif
|
| -
|
| -namespace gfx {
|
| -
|
| -namespace internal {
|
| -
|
| -#if defined(OS_IOS)
|
| -scoped_refptr<base::RefCountedMemory> Get1xPNGBytesFromUIImage(
|
| - UIImage* uiimage);
|
| -// Caller takes ownership of the returned UIImage.
|
| -UIImage* CreateUIImageFromPNG(
|
| - const std::vector<ImagePNGRep>& image_png_reps);
|
| -gfx::Size UIImageSize(UIImage* image);
|
| -#elif defined(OS_MACOSX)
|
| -scoped_refptr<base::RefCountedMemory> Get1xPNGBytesFromNSImage(
|
| - NSImage* nsimage);
|
| -// Caller takes ownership of the returned NSImage.
|
| -NSImage* NSImageFromPNG(const std::vector<ImagePNGRep>& image_png_reps,
|
| - CGColorSpaceRef color_space);
|
| -gfx::Size NSImageSize(NSImage* image);
|
| -#endif // defined(OS_MACOSX)
|
| -
|
| -#if defined(OS_IOS)
|
| -ImageSkia* ImageSkiaFromPNG(
|
| - const std::vector<ImagePNGRep>& image_png_reps);
|
| -scoped_refptr<base::RefCountedMemory> Get1xPNGBytesFromImageSkia(
|
| - const ImageSkia* skia);
|
| -#else
|
| -// Returns a 16x16 red image to visually show error in decoding PNG.
|
| -// Caller takes ownership of returned ImageSkia.
|
| -ImageSkia* GetErrorImageSkia() {
|
| - SkBitmap bitmap;
|
| - bitmap.allocN32Pixels(16, 16);
|
| - bitmap.eraseARGB(0xff, 0xff, 0, 0);
|
| - return new ImageSkia(ImageSkiaRep(bitmap, 1.0f));
|
| -}
|
| -
|
| -class PNGImageSource : public ImageSkiaSource {
|
| - public:
|
| - PNGImageSource() {}
|
| - ~PNGImageSource() override {}
|
| -
|
| - ImageSkiaRep GetImageForScale(float scale) override {
|
| - if (image_skia_reps_.empty())
|
| - return ImageSkiaRep();
|
| -
|
| - const ImageSkiaRep* rep = NULL;
|
| - // gfx::ImageSkia passes one of the resource scale factors. The source
|
| - // should return:
|
| - // 1) The ImageSkiaRep with the highest scale if all available
|
| - // scales are smaller than |scale|.
|
| - // 2) The ImageSkiaRep with the smallest one that is larger than |scale|.
|
| - for (ImageSkiaRepSet::const_iterator iter = image_skia_reps_.begin();
|
| - iter != image_skia_reps_.end(); ++iter) {
|
| - if ((*iter).scale() == scale)
|
| - return (*iter);
|
| - if (!rep || rep->scale() < (*iter).scale())
|
| - rep = &(*iter);
|
| - if (rep->scale() >= scale)
|
| - break;
|
| - }
|
| - return rep ? *rep : ImageSkiaRep();
|
| - }
|
| -
|
| - const gfx::Size size() const {
|
| - return size_;
|
| - }
|
| -
|
| - bool AddPNGData(const ImagePNGRep& png_rep) {
|
| - const gfx::ImageSkiaRep rep = ToImageSkiaRep(png_rep);
|
| - if (rep.is_null())
|
| - return false;
|
| - if (size_.IsEmpty())
|
| - size_ = gfx::Size(rep.GetWidth(), rep.GetHeight());
|
| - image_skia_reps_.insert(rep);
|
| - return true;
|
| - }
|
| -
|
| - static ImageSkiaRep ToImageSkiaRep(const ImagePNGRep& png_rep) {
|
| - scoped_refptr<base::RefCountedMemory> raw_data = png_rep.raw_data;
|
| - CHECK(raw_data.get());
|
| - SkBitmap bitmap;
|
| - if (!PNGCodec::Decode(raw_data->front(), raw_data->size(),
|
| - &bitmap)) {
|
| - LOG(ERROR) << "Unable to decode PNG for " << png_rep.scale << ".";
|
| - return ImageSkiaRep();
|
| - }
|
| - return ImageSkiaRep(bitmap, png_rep.scale);
|
| - }
|
| -
|
| - private:
|
| - struct Compare {
|
| - bool operator()(const ImageSkiaRep& rep1, const ImageSkiaRep& rep2) {
|
| - return rep1.scale() < rep2.scale();
|
| - }
|
| - };
|
| -
|
| - typedef std::set<ImageSkiaRep, Compare> ImageSkiaRepSet;
|
| - ImageSkiaRepSet image_skia_reps_;
|
| - gfx::Size size_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(PNGImageSource);
|
| -};
|
| -
|
| -ImageSkia* ImageSkiaFromPNG(
|
| - const std::vector<ImagePNGRep>& image_png_reps) {
|
| - if (image_png_reps.empty())
|
| - return GetErrorImageSkia();
|
| - scoped_ptr<PNGImageSource> image_source(new PNGImageSource);
|
| -
|
| - for (size_t i = 0; i < image_png_reps.size(); ++i) {
|
| - if (!image_source->AddPNGData(image_png_reps[i]))
|
| - return GetErrorImageSkia();
|
| - }
|
| - const gfx::Size& size = image_source->size();
|
| - DCHECK(!size.IsEmpty());
|
| - if (size.IsEmpty())
|
| - return GetErrorImageSkia();
|
| - return new ImageSkia(image_source.release(), size);
|
| -}
|
| -
|
| -scoped_refptr<base::RefCountedMemory> Get1xPNGBytesFromImageSkia(
|
| - const ImageSkia* image_skia) {
|
| - ImageSkiaRep image_skia_rep = image_skia->GetRepresentation(1.0f);
|
| -
|
| - scoped_refptr<base::RefCountedBytes> png_bytes(new base::RefCountedBytes());
|
| - if (image_skia_rep.scale() != 1.0f ||
|
| - !PNGCodec::EncodeBGRASkBitmap(image_skia_rep.sk_bitmap(), false,
|
| - &png_bytes->data())) {
|
| - return NULL;
|
| - }
|
| - return png_bytes;
|
| -}
|
| -#endif
|
| -
|
| -class ImageRepPNG;
|
| -class ImageRepSkia;
|
| -class ImageRepCocoa;
|
| -class ImageRepCocoaTouch;
|
| -
|
| -// An ImageRep is the object that holds the backing memory for an Image. Each
|
| -// RepresentationType has an ImageRep subclass that is responsible for freeing
|
| -// the memory that the ImageRep holds. When an ImageRep is created, it expects
|
| -// to take ownership of the image, without having to retain it or increase its
|
| -// reference count.
|
| -class ImageRep {
|
| - public:
|
| - explicit ImageRep(Image::RepresentationType rep) : type_(rep) {}
|
| -
|
| - // Deletes the associated pixels of an ImageRep.
|
| - virtual ~ImageRep() {}
|
| -
|
| - // Cast helpers ("fake RTTI").
|
| - ImageRepPNG* AsImageRepPNG() {
|
| - CHECK_EQ(type_, Image::kImageRepPNG);
|
| - return reinterpret_cast<ImageRepPNG*>(this);
|
| - }
|
| -
|
| - ImageRepSkia* AsImageRepSkia() {
|
| - CHECK_EQ(type_, Image::kImageRepSkia);
|
| - return reinterpret_cast<ImageRepSkia*>(this);
|
| - }
|
| -
|
| -#if defined(OS_IOS)
|
| - ImageRepCocoaTouch* AsImageRepCocoaTouch() {
|
| - CHECK_EQ(type_, Image::kImageRepCocoaTouch);
|
| - return reinterpret_cast<ImageRepCocoaTouch*>(this);
|
| - }
|
| -#elif defined(OS_MACOSX)
|
| - ImageRepCocoa* AsImageRepCocoa() {
|
| - CHECK_EQ(type_, Image::kImageRepCocoa);
|
| - return reinterpret_cast<ImageRepCocoa*>(this);
|
| - }
|
| -#endif
|
| -
|
| - Image::RepresentationType type() const { return type_; }
|
| -
|
| - virtual int Width() const = 0;
|
| - virtual int Height() const = 0;
|
| - virtual gfx::Size Size() const = 0;
|
| -
|
| - private:
|
| - Image::RepresentationType type_;
|
| -};
|
| -
|
| -class ImageRepPNG : public ImageRep {
|
| - public:
|
| - ImageRepPNG() : ImageRep(Image::kImageRepPNG) {
|
| - }
|
| -
|
| - ImageRepPNG(const std::vector<ImagePNGRep>& image_png_reps)
|
| - : ImageRep(Image::kImageRepPNG),
|
| - image_png_reps_(image_png_reps) {
|
| - }
|
| -
|
| - ~ImageRepPNG() override {}
|
| -
|
| - int Width() const override { return Size().width(); }
|
| -
|
| - int Height() const override { return Size().height(); }
|
| -
|
| - gfx::Size Size() const override {
|
| - // Read the PNG data to get the image size, caching it.
|
| - if (!size_cache_) {
|
| - for (std::vector<ImagePNGRep>::const_iterator it = image_reps().begin();
|
| - it != image_reps().end(); ++it) {
|
| - if (it->scale == 1.0f) {
|
| - size_cache_.reset(new gfx::Size(it->Size()));
|
| - return *size_cache_;
|
| - }
|
| - }
|
| - size_cache_.reset(new gfx::Size);
|
| - }
|
| -
|
| - return *size_cache_;
|
| - }
|
| -
|
| - const std::vector<ImagePNGRep>& image_reps() const { return image_png_reps_; }
|
| -
|
| - private:
|
| - std::vector<ImagePNGRep> image_png_reps_;
|
| -
|
| - // Cached to avoid having to parse the raw data multiple times.
|
| - mutable scoped_ptr<gfx::Size> size_cache_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ImageRepPNG);
|
| -};
|
| -
|
| -class ImageRepSkia : public ImageRep {
|
| - public:
|
| - // Takes ownership of |image|.
|
| - explicit ImageRepSkia(ImageSkia* image)
|
| - : ImageRep(Image::kImageRepSkia),
|
| - image_(image) {
|
| - }
|
| -
|
| - ~ImageRepSkia() override {}
|
| -
|
| - int Width() const override { return image_->width(); }
|
| -
|
| - int Height() const override { return image_->height(); }
|
| -
|
| - gfx::Size Size() const override { return image_->size(); }
|
| -
|
| - ImageSkia* image() { return image_.get(); }
|
| -
|
| - private:
|
| - scoped_ptr<ImageSkia> image_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ImageRepSkia);
|
| -};
|
| -
|
| -#if defined(OS_IOS)
|
| -class ImageRepCocoaTouch : public ImageRep {
|
| - public:
|
| - explicit ImageRepCocoaTouch(UIImage* image)
|
| - : ImageRep(Image::kImageRepCocoaTouch),
|
| - image_(image) {
|
| - CHECK(image);
|
| - }
|
| -
|
| - virtual ~ImageRepCocoaTouch() {
|
| - base::mac::NSObjectRelease(image_);
|
| - image_ = nil;
|
| - }
|
| -
|
| - virtual int Width() const override {
|
| - return Size().width();
|
| - }
|
| -
|
| - virtual int Height() const override {
|
| - return Size().height();
|
| - }
|
| -
|
| - virtual gfx::Size Size() const override {
|
| - return internal::UIImageSize(image_);
|
| - }
|
| -
|
| - UIImage* image() const { return image_; }
|
| -
|
| - private:
|
| - UIImage* image_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ImageRepCocoaTouch);
|
| -};
|
| -#elif defined(OS_MACOSX)
|
| -class ImageRepCocoa : public ImageRep {
|
| - public:
|
| - explicit ImageRepCocoa(NSImage* image)
|
| - : ImageRep(Image::kImageRepCocoa),
|
| - image_(image) {
|
| - CHECK(image);
|
| - }
|
| -
|
| - ~ImageRepCocoa() override {
|
| - base::mac::NSObjectRelease(image_);
|
| - image_ = nil;
|
| - }
|
| -
|
| - int Width() const override { return Size().width(); }
|
| -
|
| - int Height() const override { return Size().height(); }
|
| -
|
| - gfx::Size Size() const override { return internal::NSImageSize(image_); }
|
| -
|
| - NSImage* image() const { return image_; }
|
| -
|
| - private:
|
| - NSImage* image_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ImageRepCocoa);
|
| -};
|
| -#endif // defined(OS_MACOSX)
|
| -
|
| -// The Storage class acts similarly to the pixels in a SkBitmap: the Image
|
| -// class holds a refptr instance of Storage, which in turn holds all the
|
| -// ImageReps. This way, the Image can be cheaply copied.
|
| -class ImageStorage : public base::RefCounted<ImageStorage> {
|
| - public:
|
| - ImageStorage(Image::RepresentationType default_type)
|
| - : default_representation_type_(default_type),
|
| -#if defined(OS_MACOSX) && !defined(OS_IOS)
|
| - default_representation_color_space_(
|
| - base::mac::GetGenericRGBColorSpace()),
|
| -#endif // defined(OS_MACOSX) && !defined(OS_IOS)
|
| - representations_deleter_(&representations_) {
|
| - }
|
| -
|
| - Image::RepresentationType default_representation_type() {
|
| - return default_representation_type_;
|
| - }
|
| - Image::RepresentationMap& representations() { return representations_; }
|
| -
|
| -#if defined(OS_MACOSX) && !defined(OS_IOS)
|
| - void set_default_representation_color_space(CGColorSpaceRef color_space) {
|
| - default_representation_color_space_ = color_space;
|
| - }
|
| - CGColorSpaceRef default_representation_color_space() {
|
| - return default_representation_color_space_;
|
| - }
|
| -#endif // defined(OS_MACOSX) && !defined(OS_IOS)
|
| -
|
| - private:
|
| - friend class base::RefCounted<ImageStorage>;
|
| -
|
| - ~ImageStorage() {}
|
| -
|
| - // The type of image that was passed to the constructor. This key will always
|
| - // exist in the |representations_| map.
|
| - Image::RepresentationType default_representation_type_;
|
| -
|
| -#if defined(OS_MACOSX) && !defined(OS_IOS)
|
| - // The default representation's colorspace. This is used for converting to
|
| - // NSImage. This field exists to compensate for PNGCodec not writing or
|
| - // reading colorspace ancillary chunks. (sRGB, iCCP).
|
| - // Not owned.
|
| - CGColorSpaceRef default_representation_color_space_;
|
| -#endif // defined(OS_MACOSX) && !defined(OS_IOS)
|
| -
|
| - // All the representations of an Image. Size will always be at least one, with
|
| - // more for any converted representations.
|
| - Image::RepresentationMap representations_;
|
| -
|
| - STLValueDeleter<Image::RepresentationMap> representations_deleter_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ImageStorage);
|
| -};
|
| -
|
| -} // namespace internal
|
| -
|
| -Image::Image() {
|
| - // |storage_| is NULL for empty Images.
|
| -}
|
| -
|
| -Image::Image(const std::vector<ImagePNGRep>& image_reps) {
|
| - // Do not store obviously invalid ImagePNGReps.
|
| - std::vector<ImagePNGRep> filtered;
|
| - for (size_t i = 0; i < image_reps.size(); ++i) {
|
| - if (image_reps[i].raw_data.get() && image_reps[i].raw_data->size())
|
| - filtered.push_back(image_reps[i]);
|
| - }
|
| -
|
| - if (filtered.empty())
|
| - return;
|
| -
|
| - storage_ = new internal::ImageStorage(Image::kImageRepPNG);
|
| - internal::ImageRepPNG* rep = new internal::ImageRepPNG(filtered);
|
| - AddRepresentation(rep);
|
| -}
|
| -
|
| -Image::Image(const ImageSkia& image) {
|
| - if (!image.isNull()) {
|
| - storage_ = new internal::ImageStorage(Image::kImageRepSkia);
|
| - internal::ImageRepSkia* rep = new internal::ImageRepSkia(
|
| - new ImageSkia(image));
|
| - AddRepresentation(rep);
|
| - }
|
| -}
|
| -
|
| -#if defined(OS_IOS)
|
| -Image::Image(UIImage* image)
|
| - : storage_(new internal::ImageStorage(Image::kImageRepCocoaTouch)) {
|
| - if (image) {
|
| - internal::ImageRepCocoaTouch* rep = new internal::ImageRepCocoaTouch(image);
|
| - AddRepresentation(rep);
|
| - }
|
| -}
|
| -#elif defined(OS_MACOSX)
|
| -Image::Image(NSImage* image) {
|
| - if (image) {
|
| - storage_ = new internal::ImageStorage(Image::kImageRepCocoa);
|
| - internal::ImageRepCocoa* rep = new internal::ImageRepCocoa(image);
|
| - AddRepresentation(rep);
|
| - }
|
| -}
|
| -#endif
|
| -
|
| -Image::Image(const Image& other) : storage_(other.storage_) {
|
| -}
|
| -
|
| -Image& Image::operator=(const Image& other) {
|
| - storage_ = other.storage_;
|
| - return *this;
|
| -}
|
| -
|
| -Image::~Image() {
|
| -}
|
| -
|
| -// static
|
| -Image Image::CreateFrom1xBitmap(const SkBitmap& bitmap) {
|
| - return Image(ImageSkia::CreateFrom1xBitmap(bitmap));
|
| -}
|
| -
|
| -// static
|
| -Image Image::CreateFrom1xPNGBytes(const unsigned char* input,
|
| - size_t input_size) {
|
| - if (input_size == 0u)
|
| - return Image();
|
| -
|
| - scoped_refptr<base::RefCountedBytes> raw_data(new base::RefCountedBytes());
|
| - raw_data->data().assign(input, input + input_size);
|
| -
|
| - return CreateFrom1xPNGBytes(raw_data);
|
| -}
|
| -
|
| -Image Image::CreateFrom1xPNGBytes(
|
| - const scoped_refptr<base::RefCountedMemory>& input) {
|
| - if (!input.get() || input->size() == 0u)
|
| - return Image();
|
| -
|
| - std::vector<ImagePNGRep> image_reps;
|
| - image_reps.push_back(ImagePNGRep(input, 1.0f));
|
| - return Image(image_reps);
|
| -}
|
| -
|
| -const SkBitmap* Image::ToSkBitmap() const {
|
| - // Possibly create and cache an intermediate ImageRepSkia.
|
| - return ToImageSkia()->bitmap();
|
| -}
|
| -
|
| -const ImageSkia* Image::ToImageSkia() const {
|
| - internal::ImageRep* rep = GetRepresentation(kImageRepSkia, false);
|
| - if (!rep) {
|
| - switch (DefaultRepresentationType()) {
|
| - case kImageRepPNG: {
|
| - internal::ImageRepPNG* png_rep =
|
| - GetRepresentation(kImageRepPNG, true)->AsImageRepPNG();
|
| - rep = new internal::ImageRepSkia(
|
| - internal::ImageSkiaFromPNG(png_rep->image_reps()));
|
| - break;
|
| - }
|
| -#if defined(OS_IOS)
|
| - case kImageRepCocoaTouch: {
|
| - internal::ImageRepCocoaTouch* native_rep =
|
| - GetRepresentation(kImageRepCocoaTouch, true)
|
| - ->AsImageRepCocoaTouch();
|
| - rep = new internal::ImageRepSkia(new ImageSkia(
|
| - ImageSkiaFromUIImage(native_rep->image())));
|
| - break;
|
| - }
|
| -#elif defined(OS_MACOSX)
|
| - case kImageRepCocoa: {
|
| - internal::ImageRepCocoa* native_rep =
|
| - GetRepresentation(kImageRepCocoa, true)->AsImageRepCocoa();
|
| - rep = new internal::ImageRepSkia(new ImageSkia(
|
| - ImageSkiaFromNSImage(native_rep->image())));
|
| - break;
|
| - }
|
| -#endif
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| - CHECK(rep);
|
| - AddRepresentation(rep);
|
| - }
|
| - return rep->AsImageRepSkia()->image();
|
| -}
|
| -
|
| -#if defined(OS_IOS)
|
| -UIImage* Image::ToUIImage() const {
|
| - internal::ImageRep* rep = GetRepresentation(kImageRepCocoaTouch, false);
|
| - if (!rep) {
|
| - switch (DefaultRepresentationType()) {
|
| - case kImageRepPNG: {
|
| - internal::ImageRepPNG* png_rep =
|
| - GetRepresentation(kImageRepPNG, true)->AsImageRepPNG();
|
| - rep = new internal::ImageRepCocoaTouch(internal::CreateUIImageFromPNG(
|
| - png_rep->image_reps()));
|
| - break;
|
| - }
|
| - case kImageRepSkia: {
|
| - internal::ImageRepSkia* skia_rep =
|
| - GetRepresentation(kImageRepSkia, true)->AsImageRepSkia();
|
| - UIImage* image = UIImageFromImageSkia(*skia_rep->image());
|
| - base::mac::NSObjectRetain(image);
|
| - rep = new internal::ImageRepCocoaTouch(image);
|
| - break;
|
| - }
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| - CHECK(rep);
|
| - AddRepresentation(rep);
|
| - }
|
| - return rep->AsImageRepCocoaTouch()->image();
|
| -}
|
| -#elif defined(OS_MACOSX)
|
| -NSImage* Image::ToNSImage() const {
|
| - internal::ImageRep* rep = GetRepresentation(kImageRepCocoa, false);
|
| - if (!rep) {
|
| - CGColorSpaceRef default_representation_color_space =
|
| - storage_->default_representation_color_space();
|
| -
|
| - switch (DefaultRepresentationType()) {
|
| - case kImageRepPNG: {
|
| - internal::ImageRepPNG* png_rep =
|
| - GetRepresentation(kImageRepPNG, true)->AsImageRepPNG();
|
| - rep = new internal::ImageRepCocoa(internal::NSImageFromPNG(
|
| - png_rep->image_reps(), default_representation_color_space));
|
| - break;
|
| - }
|
| - case kImageRepSkia: {
|
| - internal::ImageRepSkia* skia_rep =
|
| - GetRepresentation(kImageRepSkia, true)->AsImageRepSkia();
|
| - NSImage* image = NSImageFromImageSkiaWithColorSpace(*skia_rep->image(),
|
| - default_representation_color_space);
|
| - base::mac::NSObjectRetain(image);
|
| - rep = new internal::ImageRepCocoa(image);
|
| - break;
|
| - }
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| - CHECK(rep);
|
| - AddRepresentation(rep);
|
| - }
|
| - return rep->AsImageRepCocoa()->image();
|
| -}
|
| -#endif
|
| -
|
| -scoped_refptr<base::RefCountedMemory> Image::As1xPNGBytes() const {
|
| - if (IsEmpty())
|
| - return new base::RefCountedBytes();
|
| -
|
| - internal::ImageRep* rep = GetRepresentation(kImageRepPNG, false);
|
| -
|
| - if (rep) {
|
| - const std::vector<ImagePNGRep>& image_png_reps =
|
| - rep->AsImageRepPNG()->image_reps();
|
| - for (size_t i = 0; i < image_png_reps.size(); ++i) {
|
| - if (image_png_reps[i].scale == 1.0f)
|
| - return image_png_reps[i].raw_data;
|
| - }
|
| - return new base::RefCountedBytes();
|
| - }
|
| -
|
| - scoped_refptr<base::RefCountedMemory> png_bytes(NULL);
|
| - switch (DefaultRepresentationType()) {
|
| -#if defined(OS_IOS)
|
| - case kImageRepCocoaTouch: {
|
| - internal::ImageRepCocoaTouch* cocoa_touch_rep =
|
| - GetRepresentation(kImageRepCocoaTouch, true)
|
| - ->AsImageRepCocoaTouch();
|
| - png_bytes = internal::Get1xPNGBytesFromUIImage(
|
| - cocoa_touch_rep->image());
|
| - break;
|
| - }
|
| -#elif defined(OS_MACOSX)
|
| - case kImageRepCocoa: {
|
| - internal::ImageRepCocoa* cocoa_rep =
|
| - GetRepresentation(kImageRepCocoa, true)->AsImageRepCocoa();
|
| - png_bytes = internal::Get1xPNGBytesFromNSImage(cocoa_rep->image());
|
| - break;
|
| - }
|
| -#endif
|
| - case kImageRepSkia: {
|
| - internal::ImageRepSkia* skia_rep =
|
| - GetRepresentation(kImageRepSkia, true)->AsImageRepSkia();
|
| - png_bytes = internal::Get1xPNGBytesFromImageSkia(skia_rep->image());
|
| - break;
|
| - }
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| - if (!png_bytes.get() || !png_bytes->size()) {
|
| - // Add an ImageRepPNG with no data such that the conversion is not
|
| - // attempted each time we want the PNG bytes.
|
| - AddRepresentation(new internal::ImageRepPNG());
|
| - return new base::RefCountedBytes();
|
| - }
|
| -
|
| - // Do not insert representations for scale factors other than 1x even if
|
| - // they are available because:
|
| - // - Only the 1x PNG bytes can be accessed.
|
| - // - ImageRepPNG is not used as an intermediate type in converting to a
|
| - // final type eg (converting from ImageRepSkia to ImageRepPNG to get an
|
| - // ImageRepCocoa).
|
| - std::vector<ImagePNGRep> image_png_reps;
|
| - image_png_reps.push_back(ImagePNGRep(png_bytes, 1.0f));
|
| - rep = new internal::ImageRepPNG(image_png_reps);
|
| - AddRepresentation(rep);
|
| - return png_bytes;
|
| -}
|
| -
|
| -SkBitmap Image::AsBitmap() const {
|
| - return IsEmpty() ? SkBitmap() : *ToSkBitmap();
|
| -}
|
| -
|
| -ImageSkia Image::AsImageSkia() const {
|
| - return IsEmpty() ? ImageSkia() : *ToImageSkia();
|
| -}
|
| -
|
| -#if defined(OS_MACOSX) && !defined(OS_IOS)
|
| -NSImage* Image::AsNSImage() const {
|
| - return IsEmpty() ? nil : ToNSImage();
|
| -}
|
| -#endif
|
| -
|
| -scoped_refptr<base::RefCountedMemory> Image::Copy1xPNGBytes() const {
|
| - scoped_refptr<base::RefCountedMemory> original = As1xPNGBytes();
|
| - scoped_refptr<base::RefCountedBytes> copy(new base::RefCountedBytes());
|
| - copy->data().assign(original->front(), original->front() + original->size());
|
| - return copy;
|
| -}
|
| -
|
| -ImageSkia* Image::CopyImageSkia() const {
|
| - return new ImageSkia(*ToImageSkia());
|
| -}
|
| -
|
| -SkBitmap* Image::CopySkBitmap() const {
|
| - return new SkBitmap(*ToSkBitmap());
|
| -}
|
| -
|
| -#if defined(OS_IOS)
|
| -UIImage* Image::CopyUIImage() const {
|
| - UIImage* image = ToUIImage();
|
| - base::mac::NSObjectRetain(image);
|
| - return image;
|
| -}
|
| -#elif defined(OS_MACOSX)
|
| -NSImage* Image::CopyNSImage() const {
|
| - NSImage* image = ToNSImage();
|
| - base::mac::NSObjectRetain(image);
|
| - return image;
|
| -}
|
| -#endif
|
| -
|
| -bool Image::HasRepresentation(RepresentationType type) const {
|
| - return storage_.get() && storage_->representations().count(type) != 0;
|
| -}
|
| -
|
| -size_t Image::RepresentationCount() const {
|
| - if (!storage_.get())
|
| - return 0;
|
| -
|
| - return storage_->representations().size();
|
| -}
|
| -
|
| -bool Image::IsEmpty() const {
|
| - return RepresentationCount() == 0;
|
| -}
|
| -
|
| -int Image::Width() const {
|
| - if (IsEmpty())
|
| - return 0;
|
| - return GetRepresentation(DefaultRepresentationType(), true)->Width();
|
| -}
|
| -
|
| -int Image::Height() const {
|
| - if (IsEmpty())
|
| - return 0;
|
| - return GetRepresentation(DefaultRepresentationType(), true)->Height();
|
| -}
|
| -
|
| -gfx::Size Image::Size() const {
|
| - if (IsEmpty())
|
| - return gfx::Size();
|
| - return GetRepresentation(DefaultRepresentationType(), true)->Size();
|
| -}
|
| -
|
| -void Image::SwapRepresentations(Image* other) {
|
| - storage_.swap(other->storage_);
|
| -}
|
| -
|
| -#if defined(OS_MACOSX) && !defined(OS_IOS)
|
| -void Image::SetSourceColorSpace(CGColorSpaceRef color_space) {
|
| - if (storage_.get())
|
| - storage_->set_default_representation_color_space(color_space);
|
| -}
|
| -#endif // defined(OS_MACOSX) && !defined(OS_IOS)
|
| -
|
| -Image::RepresentationType Image::DefaultRepresentationType() const {
|
| - CHECK(storage_.get());
|
| - return storage_->default_representation_type();
|
| -}
|
| -
|
| -internal::ImageRep* Image::GetRepresentation(
|
| - RepresentationType rep_type, bool must_exist) const {
|
| - CHECK(storage_.get());
|
| - RepresentationMap::iterator it = storage_->representations().find(rep_type);
|
| - if (it == storage_->representations().end()) {
|
| - CHECK(!must_exist);
|
| - return NULL;
|
| - }
|
| - return it->second;
|
| -}
|
| -
|
| -void Image::AddRepresentation(internal::ImageRep* rep) const {
|
| - CHECK(storage_.get());
|
| - storage_->representations().insert(std::make_pair(rep->type(), rep));
|
| -}
|
| -
|
| -} // namespace gfx
|
|
|