12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/app_list/views/cached_label.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/base/layout.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/canvas.h" 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/views/widget/widget.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace app_list { 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CachedLabel::CachedLabel() 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : needs_repaint_(true) { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CachedLabel::PaintToBackingImage() { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (image_.size() == size() && !needs_repaint_) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool is_opaque = SkColorGetA(background_color()) == 0xFF; 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) float scale_factor = 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::GetScaleFactorForNativeView(GetWidget()->GetNativeView()); 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gfx::Canvas canvas(size(), scale_factor, is_opaque); 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // If a background is provided, it will initialize the canvas in 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // View::OnPaintBackground(). Otherwise, the background must be set here. 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!background()) { 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) canvas.FillRect( 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetLocalBounds(), background_color(), SkXfermode::kSrc_Mode); 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Label::OnPaint(&canvas); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_ = gfx::ImageSkia(canvas.ExtractImageRep()); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_repaint_ = false; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CachedLabel::OnPaint(gfx::Canvas* canvas) { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PaintToBackingImage(); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->DrawImageInt(image_, 0, 0); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void CachedLabel::OnDeviceScaleFactorChanged( 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) float device_scale_factor) { 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Invalidate(); 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) View::OnDeviceScaleFactorChanged(device_scale_factor); 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace app_list 51