Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa_test / pdf / control.cc
1 // Copyright (c) 2012 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
5 #include "pdf/control.h"
6
7 #include "base/logging.h"
8 #include "pdf/draw_utils.h"
9
10 namespace chrome_pdf {
11
12 Control::Control()
13     : id_(kInvalidControlId),
14       visible_(false),
15       owner_(NULL),
16       transparency_(kOpaqueAlpha) {
17 }
18
19 Control::~Control() {
20 }
21
22 bool Control::Create(uint32 id, const pp::Rect& rc,
23                      bool visible, Owner* owner) {
24   DCHECK(owner);
25   if (owner_ || id == kInvalidControlId)
26     return false;  // Already created or id is invalid.
27   id_ = id;
28   rc_ = rc;
29   visible_ = visible;
30   owner_ = owner;
31   return true;
32 }
33
34 bool Control::HandleEvent(const pp::InputEvent& event) {
35   return false;
36 }
37
38 void Control::PaintMultipleRects(pp::ImageData* image_data,
39                                  const std::list<pp::Rect>& rects) {
40   DCHECK(rects.size() > 0);
41   if (rects.size() == 1) {
42     Paint(image_data, rects.front());
43     return;
44   }
45
46   // Some rects in the input list may overlap. To prevent double
47   // painting (causes problems with semi-transparent controls) we'll
48   // paint control into buffer image data only once and copy requested
49   // rectangles.
50   pp::ImageData buffer(owner()->GetInstance(), image_data->format(),
51                        rect().size(), false);
52   if (buffer.is_null())
53     return;
54
55   pp::Rect draw_rc = pp::Rect(image_data->size()).Intersect(rect());
56   pp::Rect ctrl_rc = pp::Rect(draw_rc.point() - rect().point(), draw_rc.size());
57   CopyImage(*image_data, draw_rc, &buffer, ctrl_rc, false);
58
59   // Temporary move control to origin (0,0) and draw it into temp buffer.
60   // Move to the original position afterward. Since this is going on temp
61   // buffer, we don't need to invalidate here.
62   pp::Rect temp = rect();
63   MoveTo(pp::Point(0, 0), false);
64   Paint(&buffer, ctrl_rc);
65   MoveTo(temp.point(), false);
66
67   std::list<pp::Rect>::const_iterator iter;
68   for (iter = rects.begin(); iter != rects.end(); ++iter) {
69     pp::Rect draw_rc = rect().Intersect(*iter);
70     if (!draw_rc.IsEmpty()) {
71       // Copy requested rect from the buffer image.
72       pp::Rect src_rc = draw_rc;
73       src_rc.Offset(-rect().x(), -rect().y());
74       CopyImage(buffer, src_rc, image_data, draw_rc, false);
75     }
76   }
77 }
78
79 void Control::Show(bool visible, bool invalidate) {
80   if (visible_ != visible) {
81     visible_ = visible;
82     if (invalidate)
83       owner_->Invalidate(id_, rc_);
84   }
85 }
86
87 void Control::AdjustTransparency(uint8 transparency, bool invalidate) {
88   if (transparency_ != transparency) {
89     transparency_ = transparency;
90     if (invalidate && visible_)
91       owner_->Invalidate(id_, rc_);
92   }
93 }
94
95 void Control::MoveBy(const pp::Point& offset, bool invalidate) {
96   pp::Rect old_rc = rc_;
97   rc_.Offset(offset);
98   if (invalidate && visible_) {
99     owner()->Invalidate(id(), old_rc);
100     owner()->Invalidate(id(), rect());
101   }
102 }
103
104 void Control::SetRect(const pp::Rect& rc, bool invalidate) {
105   pp::Rect old_rc = rc_;
106   rc_ = rc;
107   if (invalidate && visible_) {
108     owner()->Invalidate(id(), old_rc);
109     owner()->Invalidate(id(), rect());
110   }
111 }
112
113 void Control::MoveTo(const pp::Point& origin, bool invalidate) {
114   MoveBy(origin - rc_.point(), invalidate);
115 }
116
117 }  // namespace chrome_pdf