diff options
Diffstat (limited to 'xfa_test/pdf/control.cc')
-rw-r--r-- | xfa_test/pdf/control.cc | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/xfa_test/pdf/control.cc b/xfa_test/pdf/control.cc new file mode 100644 index 0000000000..ed911b6b95 --- /dev/null +++ b/xfa_test/pdf/control.cc @@ -0,0 +1,117 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "pdf/control.h" + +#include "base/logging.h" +#include "pdf/draw_utils.h" + +namespace chrome_pdf { + +Control::Control() + : id_(kInvalidControlId), + visible_(false), + owner_(NULL), + transparency_(kOpaqueAlpha) { +} + +Control::~Control() { +} + +bool Control::Create(uint32 id, const pp::Rect& rc, + bool visible, Owner* owner) { + DCHECK(owner); + if (owner_ || id == kInvalidControlId) + return false; // Already created or id is invalid. + id_ = id; + rc_ = rc; + visible_ = visible; + owner_ = owner; + return true; +} + +bool Control::HandleEvent(const pp::InputEvent& event) { + return false; +} + +void Control::PaintMultipleRects(pp::ImageData* image_data, + const std::list<pp::Rect>& rects) { + DCHECK(rects.size() > 0); + if (rects.size() == 1) { + Paint(image_data, rects.front()); + return; + } + + // Some rects in the input list may overlap. To prevent double + // painting (causes problems with semi-transparent controls) we'll + // paint control into buffer image data only once and copy requested + // rectangles. + pp::ImageData buffer(owner()->GetInstance(), image_data->format(), + rect().size(), false); + if (buffer.is_null()) + return; + + pp::Rect draw_rc = pp::Rect(image_data->size()).Intersect(rect()); + pp::Rect ctrl_rc = pp::Rect(draw_rc.point() - rect().point(), draw_rc.size()); + CopyImage(*image_data, draw_rc, &buffer, ctrl_rc, false); + + // Temporary move control to origin (0,0) and draw it into temp buffer. + // Move to the original position afterward. Since this is going on temp + // buffer, we don't need to invalidate here. + pp::Rect temp = rect(); + MoveTo(pp::Point(0, 0), false); + Paint(&buffer, ctrl_rc); + MoveTo(temp.point(), false); + + std::list<pp::Rect>::const_iterator iter; + for (iter = rects.begin(); iter != rects.end(); ++iter) { + pp::Rect draw_rc = rect().Intersect(*iter); + if (!draw_rc.IsEmpty()) { + // Copy requested rect from the buffer image. + pp::Rect src_rc = draw_rc; + src_rc.Offset(-rect().x(), -rect().y()); + CopyImage(buffer, src_rc, image_data, draw_rc, false); + } + } +} + +void Control::Show(bool visible, bool invalidate) { + if (visible_ != visible) { + visible_ = visible; + if (invalidate) + owner_->Invalidate(id_, rc_); + } +} + +void Control::AdjustTransparency(uint8 transparency, bool invalidate) { + if (transparency_ != transparency) { + transparency_ = transparency; + if (invalidate && visible_) + owner_->Invalidate(id_, rc_); + } +} + +void Control::MoveBy(const pp::Point& offset, bool invalidate) { + pp::Rect old_rc = rc_; + rc_.Offset(offset); + if (invalidate && visible_) { + owner()->Invalidate(id(), old_rc); + owner()->Invalidate(id(), rect()); + } +} + +void Control::SetRect(const pp::Rect& rc, bool invalidate) { + pp::Rect old_rc = rc_; + rc_ = rc; + if (invalidate && visible_) { + owner()->Invalidate(id(), old_rc); + owner()->Invalidate(id(), rect()); + } +} + +void Control::MoveTo(const pp::Point& origin, bool invalidate) { + MoveBy(origin - rc_.point(), invalidate); +} + +} // namespace chrome_pdf |