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