blob: ed911b6b95a521ae1793b94300dffb97a84054ca [file] [log] [blame]
[email protected]1b1e9eff2014-05-20 01:56:401// 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
10namespace chrome_pdf {
11
12Control::Control()
13 : id_(kInvalidControlId),
14 visible_(false),
15 owner_(NULL),
16 transparency_(kOpaqueAlpha) {
17}
18
19Control::~Control() {
20}
21
22bool 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
34bool Control::HandleEvent(const pp::InputEvent& event) {
35 return false;
36}
37
38void 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
[email protected]5eced8f72014-06-06 21:49:0447 // painting (causes problems with semi-transparent controls) we'll
[email protected]1b1e9eff2014-05-20 01:56:4048 // 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);
[email protected]5eced8f72014-06-06 21:49:0452 if (buffer.is_null())
53 return;
54
[email protected]1b1e9eff2014-05-20 01:56:4055 pp::Rect draw_rc = pp::Rect(image_data->size()).Intersect(rect());
tsepezd734d192014-09-03 23:17:4956 pp::Rect ctrl_rc = pp::Rect(draw_rc.point() - rect().point(), draw_rc.size());
[email protected]1b1e9eff2014-05-20 01:56:4057 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
79void Control::Show(bool visible, bool invalidate) {
80 if (visible_ != visible) {
81 visible_ = visible;
82 if (invalidate)
83 owner_->Invalidate(id_, rc_);
84 }
85}
86
87void 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
95void 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
104void 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
113void Control::MoveTo(const pp::Point& origin, bool invalidate) {
114 MoveBy(origin - rc_.point(), invalidate);
115}
116
117} // namespace chrome_pdf