1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "pdf/progress_control.h" 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <algorithm> 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/logging.h" 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "pdf/draw_utils.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "pdf/resource_consts.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ppapi/cpp/dev/font_dev.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace chrome_pdf { 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const double ProgressControl::kCompleted = 100.0; 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// There is a bug outputting text with alpha 0xFF (opaque) to an intermediate 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// image. It outputs alpha channgel of the text pixels to 0xFF (transparent). 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// And it breaks next alpha blending. 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// For now, let's use alpha 0xFE to work around this bug. 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// TODO(gene): investigate this bug. 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const uint32 kProgressTextColor = 0xFEDDE6FC; 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const uint32 kProgressTextSize = 16; 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const uint32 kImageTextSpacing = 8; 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const uint32 kTopPadding = 8; 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const uint32 kBottomPadding = 12; 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const uint32 kLeftPadding = 10; 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const uint32 kRightPadding = 10; 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int ScaleInt(int val, float scale) { 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return static_cast<int>(val * scale); 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ProgressControl::ProgressControl() 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : progress_(0.0), 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) device_scale_(1.0) { 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ProgressControl::~ProgressControl() { 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ProgressControl::CreateProgressControl( 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) uint32 id, 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool visible, 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Control::Owner* delegate, 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) double progress, 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) float device_scale, 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::vector<pp::ImageData>& images, 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const pp::ImageData& background, 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& text) { 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress_ = progress; 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) text_ = text; 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool res = Control::Create(id, pp::Rect(), visible, delegate); 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (res) 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Reconfigure(background, images, device_scale); 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return res; 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ProgressControl::Reconfigure(const pp::ImageData& background, 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::vector<pp::ImageData>& images, 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) float device_scale) { 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(images.size() != 0); 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) images_ = images; 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) background_ = background; 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) device_scale_ = device_scale; 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Size ctrl_size; 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CalculateLayout(owner()->GetInstance(), images_, background_, text_, 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) device_scale_, &ctrl_size, &image_rc_, &text_rc_); 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect rc(pp::Point(), ctrl_size); 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Control::SetRect(rc, false); 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrepareBackground(); 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ProgressControl::CalculateLayout(pp::Instance* instance, 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::vector<pp::ImageData>& images, 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const pp::ImageData& background, 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& text, 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) float device_scale, 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Size* ctrl_size, 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect* image_rc, 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect* text_rc) { 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(images.size() != 0); 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int image_width = 0; 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int image_height = 0; 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0; i < images.size(); i++) { 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) image_width = std::max(image_width, images[i].size().width()); 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) image_height = std::max(image_height, images[i].size().height()); 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::FontDescription_Dev description; 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) description.set_family(PP_FONTFAMILY_SANSSERIF); 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) description.set_size(ScaleInt(kProgressTextSize, device_scale)); 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) description.set_weight(PP_FONTWEIGHT_BOLD); 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Font_Dev font(instance, description); 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int text_length = font.MeasureSimpleText(text); 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::FontDescription_Dev desc; 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_FontMetrics_Dev metrics; 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) font.Describe(&desc, &metrics); 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int text_height = metrics.height; 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *ctrl_size = pp::Size( 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) image_width + text_length + 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScaleInt(kImageTextSpacing + kLeftPadding + kRightPadding, device_scale), 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::max(image_height, text_height) + 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScaleInt(kTopPadding + kBottomPadding, device_scale)); 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int offset_x = 0; 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int offset_y = 0; 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (ctrl_size->width() < background.size().width()) { 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) offset_x += (background.size().width() - ctrl_size->width()) / 2; 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ctrl_size->set_width(background.size().width()); 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (ctrl_size->height() < background.size().height()) { 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) offset_y += (background.size().height() - ctrl_size->height()) / 2; 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ctrl_size->set_height(background.size().height()); 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *image_rc = pp::Rect(ScaleInt(kLeftPadding, device_scale) + offset_x, 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScaleInt(kTopPadding, device_scale) + offset_y, 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) image_width, 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) image_height); 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *text_rc = pp::Rect( 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ctrl_size->width() - text_length - 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScaleInt(kRightPadding, device_scale) - offset_x, 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (ctrl_size->height() - text_height) / 2, 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) text_length, 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) text_height); 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)size_t ProgressControl::GetImageIngex() const { 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return static_cast<size_t>((progress_ / 100.0) * images_.size()); 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ProgressControl::Paint(pp::ImageData* image_data, const pp::Rect& rc) { 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!visible()) 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect draw_rc = rect().Intersect(rc); 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (draw_rc.IsEmpty()) 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::ImageData buffer(owner()->GetInstance(), ctrl_background_.format(), 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ctrl_background_.size(), false); 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CopyImage(ctrl_background_, pp::Rect(ctrl_background_.size()), 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &buffer, pp::Rect(ctrl_background_.size()), false); 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) size_t index = GetImageIngex(); 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (index >= images_.size()) 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) index = images_.size() - 1; 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AlphaBlend(images_[index], 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect(images_[index].size()), 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &buffer, 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) image_rc_.point(), 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kOpaqueAlpha); 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect image_draw_rc(draw_rc); 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) image_draw_rc.Offset(-rect().x(), -rect().y()); 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AlphaBlend(buffer, 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) image_draw_rc, 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) image_data, 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) draw_rc.point(), 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) transparency()); 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ProgressControl::SetProgress(double progress) { 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) size_t old_index = GetImageIngex(); 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress_ = progress; 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) size_t new_index = GetImageIngex(); 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (progress_ >= kCompleted) { 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress_ = kCompleted; 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) owner()->OnEvent(id(), EVENT_ID_PROGRESS_COMPLETED, NULL); 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (visible() && old_index != new_index) 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) owner()->Invalidate(id(), rect()); 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ProgressControl::PrepareBackground() { 183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AdjustBackground(); 184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::FontDescription_Dev description; 186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) description.set_family(PP_FONTFAMILY_SANSSERIF); 187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) description.set_size(ScaleInt(kProgressTextSize, device_scale_)); 188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) description.set_weight(PP_FONTWEIGHT_BOLD); 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Font_Dev font(owner()->GetInstance(), description); 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::FontDescription_Dev desc; 192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_FontMetrics_Dev metrics; 193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) font.Describe(&desc, &metrics); 194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Point text_origin = pp::Point(text_rc_.x(), 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (text_rc_.y() + text_rc_.bottom() + metrics.x_height) / 2); 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) font.DrawTextAt(&ctrl_background_, pp::TextRun_Dev(text_), text_origin, 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kProgressTextColor, pp::Rect(ctrl_background_.size()), false); 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ProgressControl::AdjustBackground() { 202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ctrl_background_ = pp::ImageData(owner()->GetInstance(), 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_IMAGEDATAFORMAT_BGRA_PREMUL, 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) rect().size(), 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false); 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (rect().size() == background_.size()) { 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CopyImage(background_, pp::Rect(background_.size()), 209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &ctrl_background_, pp::Rect(ctrl_background_.size()), false); 210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // We need to stretch background to new dimentions. To do so, we split 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // background into 9 different parts. We copy corner rects (1,3,7,9) as is, 215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // stretch rectangles between corners (2,4,6,8) in 1 dimention, and 216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // stretch center rect (5) in 2 dimentions. 217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // |---|---|---| 218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // | 1 | 2 | 3 | 219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // |---|---|---| 220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // | 4 | 5 | 6 | 221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // |---|---|---| 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // | 7 | 8 | 9 | 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // |---|---|---| 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int slice_x = background_.size().width() / 3; 225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int slice_y = background_.size().height() / 3; 226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Copy rect 1 228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect src_rc(0, 0, slice_x, slice_y); 229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect dest_rc(0, 0, slice_x, slice_y); 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CopyImage(background_, src_rc, &ctrl_background_, dest_rc, false); 231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Copy rect 3 233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) src_rc.set_x(background_.size().width() - slice_x); 234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dest_rc.set_x(ctrl_background_.size().width() - slice_x); 235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CopyImage(background_, src_rc, &ctrl_background_, dest_rc, false); 236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Copy rect 9 238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) src_rc.set_y(background_.size().height() - slice_y); 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dest_rc.set_y(ctrl_background_.size().height() - slice_y); 240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CopyImage(background_, src_rc, &ctrl_background_, dest_rc, false); 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Copy rect 7 243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) src_rc.set_x(0); 244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dest_rc.set_x(0); 245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CopyImage(background_, src_rc, &ctrl_background_, dest_rc, false); 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Stretch rect 2 248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) src_rc = pp::Rect( 249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) slice_x, 0, background_.size().width() - 2 * slice_x, slice_y); 250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dest_rc = pp::Rect( 251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) slice_x, 0, ctrl_background_.size().width() - 2 * slice_x, slice_y); 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CopyImage(background_, src_rc, &ctrl_background_, dest_rc, true); 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Copy rect 8 255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) src_rc.set_y(background_.size().height() - slice_y); 256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dest_rc.set_y(ctrl_background_.size().height() - slice_y); 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CopyImage(background_, src_rc, &ctrl_background_, dest_rc, true); 258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Stretch rect 4 260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) src_rc = pp::Rect( 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 0, slice_y, slice_x, background_.size().height() - 2 * slice_y); 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dest_rc = pp::Rect( 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 0, slice_y, slice_x, ctrl_background_.size().height() - 2 * slice_y); 264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CopyImage(background_, src_rc, &ctrl_background_, dest_rc, true); 265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Copy rect 6 267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) src_rc.set_x(background_.size().width() - slice_x); 268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dest_rc.set_x(ctrl_background_.size().width() - slice_x); 269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CopyImage(background_, src_rc, &ctrl_background_, dest_rc, true); 270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Stretch rect 5 272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) src_rc = pp::Rect(slice_x, 273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) slice_y, 274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) background_.size().width() - 2 * slice_x, 275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) background_.size().height() - 2 * slice_y); 276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dest_rc = pp::Rect(slice_x, 277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) slice_y, 278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ctrl_background_.size().width() - 2 * slice_x, 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ctrl_background_.size().height() - 2 * slice_y); 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CopyImage(background_, src_rc, &ctrl_background_, dest_rc, true); 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace chrome_pdf 284