canvas_painter.cc 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. // Copyright 2015 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ui/compositor/canvas_painter.h"
  5. #include "cc/paint/display_item_list.h"
  6. namespace ui {
  7. CanvasPainter::CanvasPainter(SkBitmap* output,
  8. const gfx::Size& output_size,
  9. float device_scale_factor,
  10. SkColor clear_color,
  11. bool is_pixel_canvas)
  12. : output_(output),
  13. pixel_output_size_(
  14. gfx::ScaleToCeiledSize(output_size, device_scale_factor)),
  15. raster_scale_(is_pixel_canvas ? 1.f : device_scale_factor),
  16. clear_color_(clear_color),
  17. list_(new cc::DisplayItemList),
  18. context_(list_.get(),
  19. device_scale_factor,
  20. gfx::Rect(output_size),
  21. is_pixel_canvas) {}
  22. CanvasPainter::~CanvasPainter() {
  23. SkImageInfo info =
  24. SkImageInfo::MakeN32(pixel_output_size_.width(),
  25. pixel_output_size_.height(), kPremul_SkAlphaType);
  26. if (!output_->tryAllocPixels(info))
  27. return;
  28. SkCanvas canvas(*output_, SkSurfaceProps{});
  29. canvas.clear(clear_color_);
  30. // When pixel canvas is enabled, the recordings and canvas are already scaled
  31. // to the correct raster size. This additional scaling is not required and
  32. // hence |raster_scale_| should be equal to 1 during this operation.
  33. canvas.scale(raster_scale_, raster_scale_);
  34. list_->Finalize();
  35. list_->Raster(&canvas, nullptr);
  36. }
  37. } // namespace ui