accelerated_widget_mac.mm 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // Copyright 2014 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/accelerated_widget_mac/accelerated_widget_mac.h"
  5. #include <map>
  6. #include "base/lazy_instance.h"
  7. #include "base/mac/mac_util.h"
  8. #include "ui/gfx/geometry/dip_util.h"
  9. #include "ui/gfx/geometry/size_conversions.h"
  10. namespace ui {
  11. namespace {
  12. typedef std::map<gfx::AcceleratedWidget,AcceleratedWidgetMac*>
  13. WidgetToHelperMap;
  14. base::LazyInstance<WidgetToHelperMap>::DestructorAtExit g_widget_to_helper_map;
  15. } // namespace
  16. ////////////////////////////////////////////////////////////////////////////////
  17. // AcceleratedWidgetMac
  18. AcceleratedWidgetMac::AcceleratedWidgetMac() : view_(nullptr) {
  19. // Use a sequence number as the accelerated widget handle that we can use
  20. // to look up the internals structure.
  21. static uint64_t last_sequence_number = 0;
  22. native_widget_ = ++last_sequence_number;
  23. g_widget_to_helper_map.Pointer()->insert(
  24. std::make_pair(native_widget_, this));
  25. }
  26. AcceleratedWidgetMac::~AcceleratedWidgetMac() {
  27. DCHECK(!view_);
  28. g_widget_to_helper_map.Pointer()->erase(native_widget_);
  29. }
  30. void AcceleratedWidgetMac::SetNSView(AcceleratedWidgetMacNSView* view) {
  31. DCHECK(view && !view_);
  32. view_ = view;
  33. }
  34. void AcceleratedWidgetMac::ResetNSView() {
  35. last_ca_layer_params_valid_ = false;
  36. view_ = nullptr;
  37. }
  38. const gfx::CALayerParams* AcceleratedWidgetMac::GetCALayerParams() const {
  39. if (!last_ca_layer_params_valid_)
  40. return nullptr;
  41. return &last_ca_layer_params_;
  42. }
  43. bool AcceleratedWidgetMac::HasFrameOfSize(
  44. const gfx::Size& dip_size) const {
  45. if (!last_ca_layer_params_valid_)
  46. return false;
  47. // TODO(danakj): We should avoid lossy conversions to integer DIPs.
  48. gfx::Size last_swap_size_dip = gfx::ToFlooredSize(gfx::ConvertSizeToDips(
  49. last_ca_layer_params_.pixel_size, last_ca_layer_params_.scale_factor));
  50. return last_swap_size_dip == dip_size;
  51. }
  52. // static
  53. AcceleratedWidgetMac* AcceleratedWidgetMac::Get(gfx::AcceleratedWidget widget) {
  54. WidgetToHelperMap::const_iterator found =
  55. g_widget_to_helper_map.Pointer()->find(widget);
  56. // This can end up being accessed after the underlying widget has been
  57. // destroyed, but while the ui::Compositor is still being destroyed.
  58. // Return NULL in these cases.
  59. if (found == g_widget_to_helper_map.Pointer()->end())
  60. return nullptr;
  61. return found->second;
  62. }
  63. void AcceleratedWidgetMac::SetSuspended(bool is_suspended) {
  64. is_suspended_ = is_suspended;
  65. }
  66. void AcceleratedWidgetMac::UpdateCALayerTree(
  67. const gfx::CALayerParams& ca_layer_params) {
  68. if (is_suspended_)
  69. return;
  70. last_ca_layer_params_valid_ = true;
  71. last_ca_layer_params_ = ca_layer_params;
  72. if (view_)
  73. view_->AcceleratedWidgetCALayerParamsUpdated();
  74. }
  75. } // namespace ui