// 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. #include "chrome/browser/icon_loader.h" #include <gdk-pixbuf/gdk-pixbuf.h> #include <gio/gio.h> #include <gtk/gtk.h> #include "base/file_util.h" #include "base/logging.h" #include "base/message_loop.h" #include "base/mime_util.h" #include "base/threading/thread.h" #include "base/string_util.h" static int SizeToInt(IconLoader::IconSize size) { int pixels = 48; if (size == IconLoader::NORMAL) pixels = 32; else if (size == IconLoader::SMALL) pixels = 16; return pixels; } void IconLoader::ReadIcon() { filename_ = mime_util::GetMimeIcon(group_, SizeToInt(icon_size_)); file_util::ReadFileToString(filename_, &icon_data_); target_message_loop_->PostTask(FROM_HERE, NewRunnableMethod(this, &IconLoader::ParseIcon)); } void IconLoader::ParseIcon() { int size = SizeToInt(icon_size_); // It would be more convenient to use gdk_pixbuf_new_from_stream_at_scale // but that is only available after 2.14. GdkPixbufLoader* loader = gdk_pixbuf_loader_new(); gdk_pixbuf_loader_set_size(loader, size, size); gdk_pixbuf_loader_write(loader, reinterpret_cast<const guchar*>(icon_data_.data()), icon_data_.length(), NULL); gdk_pixbuf_loader_close(loader, NULL); // At this point, the pixbuf is owned by the loader. GdkPixbuf* pixbuf = gdk_pixbuf_loader_get_pixbuf(loader); if (pixbuf) { DCHECK_EQ(size, gdk_pixbuf_get_width(pixbuf)); DCHECK_EQ(size, gdk_pixbuf_get_height(pixbuf)); // Takes ownership of |pixbuf|. g_object_ref(pixbuf); image_.reset(new gfx::Image(pixbuf)); } else { LOG(WARNING) << "Unsupported file type or load error: " << filename_.value(); } g_object_unref(loader); NotifyDelegate(); }