| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 #include "cc/raster/image_hijack_canvas.h" | 5 #include "cc/raster/image_hijack_canvas.h" |
| 6 | 6 |
| 7 #include "base/optional.h" | 7 #include "base/optional.h" |
| 8 #include "base/trace_event/trace_event.h" | 8 #include "base/trace_event/trace_event.h" |
| 9 #include "cc/paint/discardable_image_map.h" | 9 #include "cc/paint/discardable_image_map.h" |
| 10 #include "cc/tiles/image_decode_cache.h" | 10 #include "cc/tiles/image_decode_cache.h" |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 // forwarded to the raster canvas. | 149 // forwarded to the raster canvas. |
| 150 SkCanvas::onDrawPicture(picture, matrix, paint); | 150 SkCanvas::onDrawPicture(picture, matrix, paint); |
| 151 } | 151 } |
| 152 | 152 |
| 153 void ImageHijackCanvas::onDrawImage(const SkImage* image, | 153 void ImageHijackCanvas::onDrawImage(const SkImage* image, |
| 154 SkScalar x, | 154 SkScalar x, |
| 155 SkScalar y, | 155 SkScalar y, |
| 156 const SkPaint* paint) { | 156 const SkPaint* paint) { |
| 157 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 157 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 158 "ImageHijackCanvas::onDrawImage"); | 158 "ImageHijackCanvas::onDrawImage"); |
| 159 SkRect rect = SkRect::MakeXYWH(x, y, SkIntToScalar(image->width()), |
| 160 SkIntToScalar(image->height())); |
| 161 if (QuickRejectDraw(rect, paint)) |
| 162 return; |
| 163 |
| 159 if (!image->isLazyGenerated()) { | 164 if (!image->isLazyGenerated()) { |
| 160 DCHECK(!ShouldSkipImage(image)); | 165 DCHECK(!ShouldSkipImage(image)); |
| 161 SkNWayCanvas::onDrawImage(image, x, y, paint); | 166 SkNWayCanvas::onDrawImage(image, x, y, paint); |
| 162 return; | 167 return; |
| 163 } | 168 } |
| 164 | 169 |
| 165 if (ShouldSkipImage(image)) | 170 if (ShouldSkipImage(image)) |
| 166 return; | 171 return; |
| 167 | 172 |
| 168 SkMatrix ctm = getTotalMatrix(); | 173 SkMatrix ctm = getTotalMatrix(); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 190 SkNWayCanvas::restore(); | 195 SkNWayCanvas::restore(); |
| 191 } | 196 } |
| 192 | 197 |
| 193 void ImageHijackCanvas::onDrawImageRect(const SkImage* image, | 198 void ImageHijackCanvas::onDrawImageRect(const SkImage* image, |
| 194 const SkRect* src, | 199 const SkRect* src, |
| 195 const SkRect& dst, | 200 const SkRect& dst, |
| 196 const SkPaint* paint, | 201 const SkPaint* paint, |
| 197 SrcRectConstraint constraint) { | 202 SrcRectConstraint constraint) { |
| 198 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 203 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 199 "ImageHijackCanvas::onDrawImageRect"); | 204 "ImageHijackCanvas::onDrawImageRect"); |
| 205 if (QuickRejectDraw(dst, paint)) |
| 206 return; |
| 207 |
| 200 if (!image->isLazyGenerated()) { | 208 if (!image->isLazyGenerated()) { |
| 201 DCHECK(!ShouldSkipImage(image)); | 209 DCHECK(!ShouldSkipImage(image)); |
| 202 SkNWayCanvas::onDrawImageRect(image, src, dst, paint, constraint); | 210 SkNWayCanvas::onDrawImageRect(image, src, dst, paint, constraint); |
| 203 return; | 211 return; |
| 204 } | 212 } |
| 205 | 213 |
| 206 if (ShouldSkipImage(image)) | 214 if (ShouldSkipImage(image)) |
| 207 return; | 215 return; |
| 208 | 216 |
| 209 SkRect src_storage; | 217 SkRect src_storage; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 233 adjusted_src.x() * x_scale, adjusted_src.y() * y_scale, | 241 adjusted_src.x() * x_scale, adjusted_src.y() * y_scale, |
| 234 adjusted_src.width() * x_scale, adjusted_src.height() * y_scale); | 242 adjusted_src.width() * x_scale, adjusted_src.height() * y_scale); |
| 235 } | 243 } |
| 236 SkNWayCanvas::onDrawImageRect(decoded_image.image().get(), &adjusted_src, dst, | 244 SkNWayCanvas::onDrawImageRect(decoded_image.image().get(), &adjusted_src, dst, |
| 237 decoded_paint, constraint); | 245 decoded_paint, constraint); |
| 238 } | 246 } |
| 239 | 247 |
| 240 void ImageHijackCanvas::onDrawRect(const SkRect& r, const SkPaint& paint) { | 248 void ImageHijackCanvas::onDrawRect(const SkRect& r, const SkPaint& paint) { |
| 241 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 249 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 242 "ImageHijackCanvas::onDrawRect"); | 250 "ImageHijackCanvas::onDrawRect"); |
| 251 if (QuickRejectDraw(r, &paint)) |
| 252 return; |
| 253 |
| 243 if (ShouldSkipImageInPaint(paint)) | 254 if (ShouldSkipImageInPaint(paint)) |
| 244 return; | 255 return; |
| 245 | 256 |
| 246 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate( | 257 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate( |
| 247 image_decode_cache_, getTotalMatrix(), paint, target_color_space_); | 258 image_decode_cache_, getTotalMatrix(), paint, target_color_space_); |
| 248 if (!image_paint.has_value()) { | 259 if (!image_paint.has_value()) { |
| 249 SkNWayCanvas::onDrawRect(r, paint); | 260 SkNWayCanvas::onDrawRect(r, paint); |
| 250 return; | 261 return; |
| 251 } | 262 } |
| 252 SkNWayCanvas::onDrawRect(r, image_paint.value().paint()); | 263 SkNWayCanvas::onDrawRect(r, image_paint.value().paint()); |
| 253 } | 264 } |
| 254 | 265 |
| 255 void ImageHijackCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { | 266 void ImageHijackCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { |
| 256 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 267 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 257 "ImageHijackCanvas::onDrawPath"); | 268 "ImageHijackCanvas::onDrawPath"); |
| 269 if (QuickRejectDraw(path.getBounds(), &paint)) |
| 270 return; |
| 271 |
| 258 if (ShouldSkipImageInPaint(paint)) | 272 if (ShouldSkipImageInPaint(paint)) |
| 259 return; | 273 return; |
| 260 | 274 |
| 261 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate( | 275 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate( |
| 262 image_decode_cache_, getTotalMatrix(), paint, target_color_space_); | 276 image_decode_cache_, getTotalMatrix(), paint, target_color_space_); |
| 263 if (!image_paint.has_value()) { | 277 if (!image_paint.has_value()) { |
| 264 SkNWayCanvas::onDrawPath(path, paint); | 278 SkNWayCanvas::onDrawPath(path, paint); |
| 265 return; | 279 return; |
| 266 } | 280 } |
| 267 SkNWayCanvas::onDrawPath(path, image_paint.value().paint()); | 281 SkNWayCanvas::onDrawPath(path, image_paint.value().paint()); |
| 268 } | 282 } |
| 269 | 283 |
| 270 void ImageHijackCanvas::onDrawOval(const SkRect& r, const SkPaint& paint) { | 284 void ImageHijackCanvas::onDrawOval(const SkRect& r, const SkPaint& paint) { |
| 271 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 285 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 272 "ImageHijackCanvas::onDrawOval"); | 286 "ImageHijackCanvas::onDrawOval"); |
| 287 if (QuickRejectDraw(r, &paint)) |
| 288 return; |
| 289 |
| 273 if (ShouldSkipImageInPaint(paint)) | 290 if (ShouldSkipImageInPaint(paint)) |
| 274 return; | 291 return; |
| 275 | 292 |
| 276 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate( | 293 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate( |
| 277 image_decode_cache_, getTotalMatrix(), paint, target_color_space_); | 294 image_decode_cache_, getTotalMatrix(), paint, target_color_space_); |
| 278 if (!image_paint.has_value()) { | 295 if (!image_paint.has_value()) { |
| 279 SkNWayCanvas::onDrawOval(r, paint); | 296 SkNWayCanvas::onDrawOval(r, paint); |
| 280 return; | 297 return; |
| 281 } | 298 } |
| 282 SkNWayCanvas::onDrawOval(r, image_paint.value().paint()); | 299 SkNWayCanvas::onDrawOval(r, image_paint.value().paint()); |
| 283 } | 300 } |
| 284 | 301 |
| 285 void ImageHijackCanvas::onDrawArc(const SkRect& r, | 302 void ImageHijackCanvas::onDrawArc(const SkRect& r, |
| 286 SkScalar start_angle, | 303 SkScalar start_angle, |
| 287 SkScalar sweep_angle, | 304 SkScalar sweep_angle, |
| 288 bool use_center, | 305 bool use_center, |
| 289 const SkPaint& paint) { | 306 const SkPaint& paint) { |
| 290 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 307 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 291 "ImageHijackCanvas::onDrawArc"); | 308 "ImageHijackCanvas::onDrawArc"); |
| 309 if (QuickRejectDraw(r, &paint)) |
| 310 return; |
| 311 |
| 292 if (ShouldSkipImageInPaint(paint)) | 312 if (ShouldSkipImageInPaint(paint)) |
| 293 return; | 313 return; |
| 294 | 314 |
| 295 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate( | 315 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate( |
| 296 image_decode_cache_, getTotalMatrix(), paint, target_color_space_); | 316 image_decode_cache_, getTotalMatrix(), paint, target_color_space_); |
| 297 if (!image_paint.has_value()) { | 317 if (!image_paint.has_value()) { |
| 298 SkNWayCanvas::onDrawArc(r, start_angle, sweep_angle, use_center, paint); | 318 SkNWayCanvas::onDrawArc(r, start_angle, sweep_angle, use_center, paint); |
| 299 return; | 319 return; |
| 300 } | 320 } |
| 301 SkNWayCanvas::onDrawArc(r, start_angle, sweep_angle, use_center, | 321 SkNWayCanvas::onDrawArc(r, start_angle, sweep_angle, use_center, |
| 302 image_paint.value().paint()); | 322 image_paint.value().paint()); |
| 303 } | 323 } |
| 304 | 324 |
| 305 void ImageHijackCanvas::onDrawRRect(const SkRRect& rr, const SkPaint& paint) { | 325 void ImageHijackCanvas::onDrawRRect(const SkRRect& rr, const SkPaint& paint) { |
| 306 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 326 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 307 "ImageHijackCanvas::onDrawRRect"); | 327 "ImageHijackCanvas::onDrawRRect"); |
| 328 if (QuickRejectDraw(rr.rect(), &paint)) |
| 329 return; |
| 330 |
| 308 if (ShouldSkipImageInPaint(paint)) | 331 if (ShouldSkipImageInPaint(paint)) |
| 309 return; | 332 return; |
| 310 | 333 |
| 311 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate( | 334 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate( |
| 312 image_decode_cache_, getTotalMatrix(), paint, target_color_space_); | 335 image_decode_cache_, getTotalMatrix(), paint, target_color_space_); |
| 313 if (!image_paint.has_value()) { | 336 if (!image_paint.has_value()) { |
| 314 SkNWayCanvas::onDrawRRect(rr, paint); | 337 SkNWayCanvas::onDrawRRect(rr, paint); |
| 315 return; | 338 return; |
| 316 } | 339 } |
| 317 SkNWayCanvas::onDrawRRect(rr, image_paint.value().paint()); | 340 SkNWayCanvas::onDrawRRect(rr, image_paint.value().paint()); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 332 "ImageHijackCanvas::ShouldSkipImage", "imageId", | 355 "ImageHijackCanvas::ShouldSkipImage", "imageId", |
| 333 image->uniqueID(), "skip", skip); | 356 image->uniqueID(), "skip", skip); |
| 334 return skip; | 357 return skip; |
| 335 } | 358 } |
| 336 | 359 |
| 337 bool ImageHijackCanvas::ShouldSkipImageInPaint(const SkPaint& paint) const { | 360 bool ImageHijackCanvas::ShouldSkipImageInPaint(const SkPaint& paint) const { |
| 338 const SkImage* image = GetImageInPaint(paint); | 361 const SkImage* image = GetImageInPaint(paint); |
| 339 return image ? ShouldSkipImage(image) : false; | 362 return image ? ShouldSkipImage(image) : false; |
| 340 } | 363 } |
| 341 | 364 |
| 365 bool ImageHijackCanvas::QuickRejectDraw(const SkRect& rect, |
| 366 const SkPaint* paint) const { |
| 367 if (nullptr == paint || paint->canComputeFastBounds()) { |
| 368 SkRect tmp = rect; |
| 369 if (paint) |
| 370 paint->computeFastBounds(tmp, &tmp); |
| 371 return quickReject(tmp); |
| 372 } |
| 373 |
| 374 return false; |
| 375 } |
| 376 |
| 342 } // namespace cc | 377 } // namespace cc |
| OLD | NEW |