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