Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(585)

Side by Side Diff: skia/ext/pixel_ref_utils.cc

Issue 1294673006: Update GatherPixelRefDevice to the new SkImage/SkPixelRef API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: update cc_unittests Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/test/skia_common.cc ('k') | skia/ext/pixel_ref_utils_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "skia/ext/pixel_ref_utils.h" 5 #include "skia/ext/pixel_ref_utils.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "third_party/skia/include/core/SkBitmapDevice.h" 9 #include "third_party/skia/include/core/SkBitmapDevice.h"
10 #include "third_party/skia/include/core/SkCanvas.h" 10 #include "third_party/skia/include/core/SkCanvas.h"
11 #include "third_party/skia/include/core/SkData.h" 11 #include "third_party/skia/include/core/SkData.h"
12 #include "third_party/skia/include/core/SkDraw.h" 12 #include "third_party/skia/include/core/SkDraw.h"
13 #include "third_party/skia/include/core/SkPath.h" 13 #include "third_party/skia/include/core/SkPath.h"
14 #include "third_party/skia/include/core/SkPixelRef.h" 14 #include "third_party/skia/include/core/SkPixelRef.h"
15 #include "third_party/skia/include/core/SkRRect.h" 15 #include "third_party/skia/include/core/SkRRect.h"
16 #include "third_party/skia/include/core/SkRect.h" 16 #include "third_party/skia/include/core/SkRect.h"
17 #include "third_party/skia/include/core/SkShader.h" 17 #include "third_party/skia/include/core/SkShader.h"
18 #include "third_party/skia/include/core/SkTextBlob.h" 18 #include "third_party/skia/include/core/SkTextBlob.h"
19 #include "third_party/skia/include/utils/SkNoSaveLayerCanvas.h" 19 #include "third_party/skia/include/utils/SkNoSaveLayerCanvas.h"
20 #include "third_party/skia/src/core/SkRasterClip.h" 20 #include "third_party/skia/src/core/SkRasterClip.h"
21 21
22 namespace skia { 22 namespace skia {
23 23
24 namespace { 24 namespace {
25 25
26 // URI label for a discardable SkPixelRef.
27 const char kLabelDiscardable[] = "discardable";
28
29 class DiscardablePixelRefSet { 26 class DiscardablePixelRefSet {
30 public: 27 public:
31 DiscardablePixelRefSet( 28 DiscardablePixelRefSet(
32 std::vector<PixelRefUtils::PositionPixelRef>* pixel_refs) 29 std::vector<PixelRefUtils::PositionPixelRef>* pixel_refs)
33 : pixel_refs_(pixel_refs) {} 30 : pixel_refs_(pixel_refs) {}
34 31
35 void Add(SkPixelRef* pixel_ref, 32 void Add(SkPixelRef* pixel_ref,
36 const SkRect& rect, 33 const SkRect& rect,
37 const SkMatrix& matrix, 34 const SkMatrix& matrix,
38 SkFilterQuality filter_quality) { 35 SkFilterQuality filter_quality) {
39 // Only save discardable pixel refs. 36 // We should only be saving discardable pixel refs.
40 if (pixel_ref->getURI() && 37 SkASSERT(pixel_ref);
41 !strcmp(pixel_ref->getURI(), kLabelDiscardable)) { 38 SkASSERT(pixel_ref->isLazyGenerated());
42 PixelRefUtils::PositionPixelRef position_pixel_ref; 39
43 position_pixel_ref.pixel_ref = pixel_ref; 40 PixelRefUtils::PositionPixelRef position_pixel_ref;
44 position_pixel_ref.pixel_ref_rect = rect; 41 position_pixel_ref.pixel_ref = pixel_ref;
45 position_pixel_ref.matrix = matrix; 42 position_pixel_ref.pixel_ref_rect = rect;
46 position_pixel_ref.filter_quality = filter_quality; 43 position_pixel_ref.matrix = matrix;
47 pixel_refs_->push_back(position_pixel_ref); 44 position_pixel_ref.filter_quality = filter_quality;
48 } 45 pixel_refs_->push_back(position_pixel_ref);
49 } 46 }
50 47
51 private: 48 private:
52 std::vector<PixelRefUtils::PositionPixelRef>* pixel_refs_; 49 std::vector<PixelRefUtils::PositionPixelRef>* pixel_refs_;
53 }; 50 };
54 51
55 class GatherPixelRefDevice : public SkBitmapDevice { 52 class GatherPixelRefDevice : public SkBitmapDevice {
56 public: 53 public:
57 GatherPixelRefDevice(const SkBitmap& bm, 54 GatherPixelRefDevice(const SkBitmap& bm,
58 DiscardablePixelRefSet* pixel_ref_set) 55 DiscardablePixelRefSet* pixel_ref_set)
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 matrix.mapRect(&mapped_rect, bitmap_rect); 173 matrix.mapRect(&mapped_rect, bitmap_rect);
177 174
178 SkMatrix identity; 175 SkMatrix identity;
179 identity.setIdentity(); 176 identity.setIdentity();
180 // Sprites aren't affected by current matrix, so use the identity matrix. 177 // Sprites aren't affected by current matrix, so use the identity matrix.
181 AddBitmap(bitmap, mapped_rect, identity, paint.getFilterQuality()); 178 AddBitmap(bitmap, mapped_rect, identity, paint.getFilterQuality());
182 SkBitmap paint_bitmap; 179 SkBitmap paint_bitmap;
183 if (GetBitmapFromPaint(paint, &paint_bitmap)) 180 if (GetBitmapFromPaint(paint, &paint_bitmap))
184 AddBitmap(paint_bitmap, mapped_rect, identity, paint.getFilterQuality()); 181 AddBitmap(paint_bitmap, mapped_rect, identity, paint.getFilterQuality());
185 } 182 }
183 void drawImage(const SkDraw& draw,
184 const SkImage* image,
185 SkScalar x,
186 SkScalar y,
187 const SkPaint& paint) override {
188 const SkMatrix image_matrix = SkMatrix::MakeTrans(x, y);
189 DrawImageInternal(draw, image, image_matrix, paint);
190 }
191 void drawImageRect(const SkDraw& draw,
192 const SkImage* image,
193 const SkRect* src_or_null,
194 const SkRect& dst,
195 const SkPaint& paint,
196 SkCanvas::SrcRectConstraint) override {
197 const SkRect src = src_or_null
198 ? *src_or_null
199 : SkRect::MakeIWH(image->width(), image->height());
200 const SkMatrix image_matrix =
201 SkMatrix::MakeRectToRect(src, dst, SkMatrix::kFill_ScaleToFit);
202 DrawImageInternal(draw, image, image_matrix, paint);
203 }
186 void drawText(const SkDraw& draw, 204 void drawText(const SkDraw& draw,
187 const void* text, 205 const void* text,
188 size_t len, 206 size_t len,
189 SkScalar x, 207 SkScalar x,
190 SkScalar y, 208 SkScalar y,
191 const SkPaint& paint) override { 209 const SkPaint& paint) override {
192 SkBitmap bitmap; 210 SkBitmap bitmap;
193 if (!GetBitmapFromPaint(paint, &bitmap)) 211 if (!GetBitmapFromPaint(paint, &bitmap))
194 return; 212 return;
195 213
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 return false; 365 return false;
348 } 366 }
349 367
350 private: 368 private:
351 DiscardablePixelRefSet* pixel_ref_set_; 369 DiscardablePixelRefSet* pixel_ref_set_;
352 370
353 void AddBitmap(const SkBitmap& bm, 371 void AddBitmap(const SkBitmap& bm,
354 const SkRect& rect, 372 const SkRect& rect,
355 const SkMatrix& matrix, 373 const SkMatrix& matrix,
356 SkFilterQuality filter_quality) { 374 SkFilterQuality filter_quality) {
357 SkRect canvas_rect = SkRect::MakeWH(width(), height()); 375 const SkRect canvas_rect = SkRect::Make(imageInfo().bounds());
358 if (rect.intersects(canvas_rect)) { 376 if (rect.intersects(canvas_rect) && bm.pixelRef()->isLazyGenerated()) {
359 pixel_ref_set_->Add(bm.pixelRef(), rect, matrix, filter_quality); 377 pixel_ref_set_->Add(bm.pixelRef(), rect, matrix, filter_quality);
360 } 378 }
361 } 379 }
362 380
381 void AddImage(const SkImage* image,
382 const SkRect& rect,
383 const SkMatrix& matrix,
384 SkFilterQuality filter_quality) {
385 const SkRect canvas_rect = SkRect::Make(imageInfo().bounds());
386 if (rect.intersects(canvas_rect) && image->isLazyGenerated()) {
387 SkBitmap bm;
388 if (image->asLegacyBitmap(&bm, SkImage::kRO_LegacyBitmapMode) && bm.pixelR ef()) {
389 pixel_ref_set_->Add(bm.pixelRef(), rect, matrix, filter_quality);
390 }
391 }
392 }
393
363 bool GetBitmapFromPaint(const SkPaint& paint, SkBitmap* bm) { 394 bool GetBitmapFromPaint(const SkPaint& paint, SkBitmap* bm) {
364 SkShader* shader = paint.getShader(); 395 SkShader* shader = paint.getShader();
365 if (shader) { 396 if (shader) {
366 // Check whether the shader is a gradient in order to prevent generation 397 // Check whether the shader is a gradient in order to prevent generation
367 // of bitmaps from gradient shaders, which implement asABitmap. 398 // of bitmaps from gradient shaders, which implement asABitmap.
368 if (SkShader::kNone_GradientType == shader->asAGradient(NULL)) 399 if (SkShader::kNone_GradientType == shader->asAGradient(NULL))
369 return shader->asABitmap(bm, NULL, NULL); 400 return shader->asABitmap(bm, NULL, NULL);
370 } 401 }
371 return false; 402 return false;
372 } 403 }
404
405 void DrawImageInternal(const SkDraw& draw,
406 const SkImage* image,
407 const SkMatrix& matrix,
408 const SkPaint& paint) {
409 const SkMatrix total_matrix = SkMatrix::Concat(*draw.fMatrix, matrix);
410 const SkRect image_rect = SkRect::MakeIWH(image->width(), image->height()) ;
411 SkRect mapped_rect;
412 total_matrix.mapRect(&mapped_rect, image_rect);
413 AddImage(image, mapped_rect, total_matrix, paint.getFilterQuality());
414
415 SkBitmap paint_bitmap;
416 if (GetBitmapFromPaint(paint, &paint_bitmap)) {
417 AddBitmap(paint_bitmap, mapped_rect, total_matrix,
418 paint.getFilterQuality());
419 }
420 }
373 }; 421 };
374 422
375 } // namespace 423 } // namespace
376 424
377 void PixelRefUtils::GatherDiscardablePixelRefs( 425 void PixelRefUtils::GatherDiscardablePixelRefs(
378 SkPicture* picture, 426 SkPicture* picture,
379 std::vector<PositionPixelRef>* pixel_refs) { 427 std::vector<PositionPixelRef>* pixel_refs) {
380 pixel_refs->clear(); 428 pixel_refs->clear();
381 DiscardablePixelRefSet pixel_ref_set(pixel_refs); 429 DiscardablePixelRefSet pixel_ref_set(pixel_refs);
382 430
383 SkRect picture_bounds = picture->cullRect(); 431 SkRect picture_bounds = picture->cullRect();
384 SkIRect picture_ibounds = picture_bounds.roundOut(); 432 SkIRect picture_ibounds = picture_bounds.roundOut();
385 SkBitmap empty_bitmap; 433 SkBitmap empty_bitmap;
386 // Use right/bottom as the size so that we don't need a translate and, as a 434 // Use right/bottom as the size so that we don't need a translate and, as a
387 // result, the information is returned relative to the picture's origin. 435 // result, the information is returned relative to the picture's origin.
388 empty_bitmap.setInfo(SkImageInfo::MakeUnknown(picture_ibounds.right(), 436 empty_bitmap.setInfo(SkImageInfo::MakeUnknown(picture_ibounds.right(),
389 picture_ibounds.bottom())); 437 picture_ibounds.bottom()));
390 438
391 GatherPixelRefDevice device(empty_bitmap, &pixel_ref_set); 439 GatherPixelRefDevice device(empty_bitmap, &pixel_ref_set);
392 SkNoSaveLayerCanvas canvas(&device); 440 SkNoSaveLayerCanvas canvas(&device);
393 441
394 canvas.drawPicture(picture); 442 canvas.drawPicture(picture);
395 } 443 }
396 444
397 } // namespace skia 445 } // namespace skia
OLDNEW
« no previous file with comments | « cc/test/skia_common.cc ('k') | skia/ext/pixel_ref_utils_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698