15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/logging.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/android/thumbnail/thumbnail.h"
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/browser/android/ui_resource_provider.h"
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/gfx/geometry/size_conversions.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace {
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)SkBitmap CreateSmallHolderBitmap() {
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SkBitmap small_bitmap;
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SkCanvas canvas(small_bitmap);
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  small_bitmap.allocPixels(
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kOpaque_SkAlphaType));
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  canvas.drawColor(SK_ColorWHITE);
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  small_bitmap.setImmutable();
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return small_bitmap;
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // anonymous namespace
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)scoped_ptr<Thumbnail> Thumbnail::Create(
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    TabId tab_id,
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const base::Time& time_stamp,
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    float scale,
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    content::UIResourceProvider* ui_resource_provider,
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ThumbnailDelegate* thumbnail_delegate) {
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return make_scoped_ptr(new Thumbnail(
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      tab_id, time_stamp, scale, ui_resource_provider, thumbnail_delegate));
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)Thumbnail::Thumbnail(TabId tab_id,
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     const base::Time& time_stamp,
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     float scale,
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     content::UIResourceProvider* ui_resource_provider,
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     ThumbnailDelegate* thumbnail_delegate)
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : tab_id_(tab_id),
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      time_stamp_(time_stamp),
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      scale_(scale),
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      bitmap_(gfx::Size(1, 1), true),
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ui_resource_id_(0),
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      retrieved_(false),
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ui_resource_provider_(ui_resource_provider),
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      thumbnail_delegate_(thumbnail_delegate) {
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)Thumbnail::~Thumbnail() {
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ClearUIResourceId();
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void Thumbnail::SetBitmap(const SkBitmap& bitmap) {
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(!bitmap.empty());
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ClearUIResourceId();
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scaled_content_size_ =
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      gfx::ScaleSize(gfx::Size(bitmap.width(), bitmap.height()), 1.f / scale_);
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scaled_data_size_ = scaled_content_size_;
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bitmap_ = cc::UIResourceBitmap(bitmap);
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void Thumbnail::SetCompressedBitmap(skia::RefPtr<SkPixelRef> compressed_bitmap,
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    const gfx::Size& content_size) {
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(compressed_bitmap);
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(!content_size.IsEmpty());
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ClearUIResourceId();
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  gfx::Size data_size(compressed_bitmap->info().width(),
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      compressed_bitmap->info().height());
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scaled_content_size_ = gfx::ScaleSize(content_size, 1.f / scale_);
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scaled_data_size_ = gfx::ScaleSize(data_size, 1.f / scale_);
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bitmap_ = cc::UIResourceBitmap(compressed_bitmap, data_size);
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void Thumbnail::CreateUIResource() {
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(ui_resource_provider_);
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!ui_resource_id_)
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui_resource_id_ = ui_resource_provider_->CreateUIResource(this);
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cc::UIResourceBitmap Thumbnail::GetBitmap(cc::UIResourceId uid,
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          bool resource_lost) {
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (retrieved_)
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return bitmap_;
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  retrieved_ = true;
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cc::UIResourceBitmap old_bitmap(bitmap_);
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Return a place holder for all other calls to GetBitmap.
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bitmap_ = cc::UIResourceBitmap(CreateSmallHolderBitmap());
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return old_bitmap;
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void Thumbnail::UIResourceIsInvalid() {
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui_resource_id_ = 0;
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (thumbnail_delegate_)
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    thumbnail_delegate_->InvalidateCachedThumbnail(this);
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void Thumbnail::ClearUIResourceId() {
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (ui_resource_id_ && ui_resource_provider_)
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui_resource_provider_->DeleteUIResource(ui_resource_id_);
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui_resource_id_ = 0;
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
106