| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 // | 4 // |
| 5 // Download utility implementation | 5 // Download utility implementation |
| 6 | 6 |
| 7 #define _USE_MATH_DEFINES // For VC++ to get M_PI. This has to be first. | 7 #define _USE_MATH_DEFINES // For VC++ to get M_PI. This has to be first. |
| 8 | 8 |
| 9 #include "chrome/browser/download/download_util.h" | 9 #include "chrome/browser/download/download_util.h" |
| 10 | 10 |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 // Download progress painting -------------------------------------------------- | 164 // Download progress painting -------------------------------------------------- |
| 165 | 165 |
| 166 // Common images used for download progress animations. We load them once the | 166 // Common images used for download progress animations. We load them once the |
| 167 // first time we do a progress paint, then reuse them as they are always the | 167 // first time we do a progress paint, then reuse them as they are always the |
| 168 // same. | 168 // same. |
| 169 gfx::ImageSkia* g_foreground_16 = NULL; | 169 gfx::ImageSkia* g_foreground_16 = NULL; |
| 170 gfx::ImageSkia* g_background_16 = NULL; | 170 gfx::ImageSkia* g_background_16 = NULL; |
| 171 gfx::ImageSkia* g_foreground_32 = NULL; | 171 gfx::ImageSkia* g_foreground_32 = NULL; |
| 172 gfx::ImageSkia* g_background_32 = NULL; | 172 gfx::ImageSkia* g_background_32 = NULL; |
| 173 | 173 |
| 174 void PaintCustomDownloadProgress(gfx::Canvas* canvas, |
| 175 const gfx::ImageSkia& background_image, |
| 176 const gfx::ImageSkia& foreground_image, |
| 177 int image_size, |
| 178 const gfx::Rect& bounds, |
| 179 int start_angle, |
| 180 int percent_done) { |
| 181 // Draw the background progress image. |
| 182 canvas->DrawImageInt(background_image, |
| 183 bounds.x(), |
| 184 bounds.y()); |
| 185 |
| 186 // Layer the foreground progress image in an arc proportional to the download |
| 187 // progress. The arc grows clockwise, starting in the midnight position, as |
| 188 // the download progresses. However, if the download does not have known total |
| 189 // size (the server didn't give us one), then we just spin an arc around until |
| 190 // we're done. |
| 191 float sweep_angle = 0.0; |
| 192 float start_pos = static_cast<float>(kStartAngleDegrees); |
| 193 if (percent_done < 0) { |
| 194 sweep_angle = kUnknownAngleDegrees; |
| 195 start_pos = static_cast<float>(start_angle); |
| 196 } else if (percent_done > 0) { |
| 197 sweep_angle = static_cast<float>(kMaxDegrees / 100.0 * percent_done); |
| 198 } |
| 199 |
| 200 // Set up an arc clipping region for the foreground image. Don't bother using |
| 201 // a clipping region if it would round to 360 (really 0) degrees, since that |
| 202 // would eliminate the foreground completely and be quite confusing (it would |
| 203 // look like 0% complete when it should be almost 100%). |
| 204 canvas->Save(); |
| 205 if (sweep_angle < static_cast<float>(kMaxDegrees - 1)) { |
| 206 SkRect oval; |
| 207 oval.set(SkIntToScalar(bounds.x()), |
| 208 SkIntToScalar(bounds.y()), |
| 209 SkIntToScalar(bounds.x() + image_size), |
| 210 SkIntToScalar(bounds.y() + image_size)); |
| 211 SkPath path; |
| 212 path.arcTo(oval, |
| 213 SkFloatToScalar(start_pos), |
| 214 SkFloatToScalar(sweep_angle), false); |
| 215 path.lineTo(SkIntToScalar(bounds.x() + image_size / 2), |
| 216 SkIntToScalar(bounds.y() + image_size / 2)); |
| 217 |
| 218 // gfx::Canvas::ClipPath does not provide for anti-aliasing. |
| 219 canvas->sk_canvas()->clipPath(path, SkRegion::kIntersect_Op, true); |
| 220 } |
| 221 |
| 222 canvas->DrawImageInt(foreground_image, |
| 223 bounds.x(), |
| 224 bounds.y()); |
| 225 canvas->Restore(); |
| 226 } |
| 227 |
| 228 |
| 174 void PaintDownloadProgress(gfx::Canvas* canvas, | 229 void PaintDownloadProgress(gfx::Canvas* canvas, |
| 175 #if defined(TOOLKIT_VIEWS) | 230 #if defined(TOOLKIT_VIEWS) |
| 176 views::View* containing_view, | 231 views::View* containing_view, |
| 177 #endif | 232 #endif |
| 178 int origin_x, | 233 int origin_x, |
| 179 int origin_y, | 234 int origin_y, |
| 180 int start_angle, | 235 int start_angle, |
| 181 int percent_done, | 236 int percent_done, |
| 182 PaintDownloadProgressSize size) { | 237 PaintDownloadProgressSize size) { |
| 183 // Load up our common images. | 238 // Load up our common images. |
| (...skipping 26 matching lines...) Expand all Loading... |
| 210 // Mirror the positions if necessary. | 265 // Mirror the positions if necessary. |
| 211 int mirrored_x = containing_view->GetMirroredXForRect(bounds); | 266 int mirrored_x = containing_view->GetMirroredXForRect(bounds); |
| 212 bounds.set_x(mirrored_x); | 267 bounds.set_x(mirrored_x); |
| 213 #endif | 268 #endif |
| 214 | 269 |
| 215 // Draw the background progress image. | 270 // Draw the background progress image. |
| 216 canvas->DrawImageInt(*background, | 271 canvas->DrawImageInt(*background, |
| 217 bounds.x(), | 272 bounds.x(), |
| 218 bounds.y()); | 273 bounds.y()); |
| 219 | 274 |
| 220 // Layer the foreground progress image in an arc proportional to the download | 275 PaintCustomDownloadProgress(canvas, *background, *foreground, |
| 221 // progress. The arc grows clockwise, starting in the midnight position, as | 276 kProgressIconSize, bounds, start_angle, |
| 222 // the download progresses. However, if the download does not have known total | 277 percent_done); |
| 223 // size (the server didn't give us one), then we just spin an arc around until | |
| 224 // we're done. | |
| 225 float sweep_angle = 0.0; | |
| 226 float start_pos = static_cast<float>(kStartAngleDegrees); | |
| 227 if (percent_done < 0) { | |
| 228 sweep_angle = kUnknownAngleDegrees; | |
| 229 start_pos = static_cast<float>(start_angle); | |
| 230 } else if (percent_done > 0) { | |
| 231 sweep_angle = static_cast<float>(kMaxDegrees / 100.0 * percent_done); | |
| 232 } | |
| 233 | |
| 234 // Set up an arc clipping region for the foreground image. Don't bother using | |
| 235 // a clipping region if it would round to 360 (really 0) degrees, since that | |
| 236 // would eliminate the foreground completely and be quite confusing (it would | |
| 237 // look like 0% complete when it should be almost 100%). | |
| 238 canvas->Save(); | |
| 239 if (sweep_angle < static_cast<float>(kMaxDegrees - 1)) { | |
| 240 SkRect oval; | |
| 241 oval.set(SkIntToScalar(bounds.x()), | |
| 242 SkIntToScalar(bounds.y()), | |
| 243 SkIntToScalar(bounds.x() + kProgressIconSize), | |
| 244 SkIntToScalar(bounds.y() + kProgressIconSize)); | |
| 245 SkPath path; | |
| 246 path.arcTo(oval, | |
| 247 SkFloatToScalar(start_pos), | |
| 248 SkFloatToScalar(sweep_angle), false); | |
| 249 path.lineTo(SkIntToScalar(bounds.x() + kProgressIconSize / 2), | |
| 250 SkIntToScalar(bounds.y() + kProgressIconSize / 2)); | |
| 251 | |
| 252 // gfx::Canvas::ClipPath does not provide for anti-aliasing. | |
| 253 canvas->sk_canvas()->clipPath(path, SkRegion::kIntersect_Op, true); | |
| 254 } | |
| 255 | |
| 256 canvas->DrawImageInt(*foreground, | |
| 257 bounds.x(), | |
| 258 bounds.y()); | |
| 259 canvas->Restore(); | |
| 260 } | 278 } |
| 261 | 279 |
| 262 void PaintDownloadComplete(gfx::Canvas* canvas, | 280 void PaintDownloadComplete(gfx::Canvas* canvas, |
| 263 #if defined(TOOLKIT_VIEWS) | 281 #if defined(TOOLKIT_VIEWS) |
| 264 views::View* containing_view, | 282 views::View* containing_view, |
| 265 #endif | 283 #endif |
| 266 int origin_x, | 284 int origin_x, |
| 267 int origin_y, | 285 int origin_y, |
| 268 double animation_progress, | 286 double animation_progress, |
| 269 PaintDownloadProgressSize size) { | 287 PaintDownloadProgressSize size) { |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 ShowInShelfData* data = | 521 ShowInShelfData* data = |
| 504 static_cast<ShowInShelfData*>(item->GetUserData(kShowInShelfKey)); | 522 static_cast<ShowInShelfData*>(item->GetUserData(kShowInShelfKey)); |
| 505 return !data || data->should_show(); | 523 return !data || data->should_show(); |
| 506 } | 524 } |
| 507 | 525 |
| 508 void SetShouldShowInShelf(content::DownloadItem* item, bool should_show) { | 526 void SetShouldShowInShelf(content::DownloadItem* item, bool should_show) { |
| 509 item->SetUserData(kShowInShelfKey, new ShowInShelfData(should_show)); | 527 item->SetUserData(kShowInShelfKey, new ShowInShelfData(should_show)); |
| 510 } | 528 } |
| 511 | 529 |
| 512 } // namespace download_util | 530 } // namespace download_util |
| OLD | NEW |