Index: skia/ext/lazy_pixel_ref_utils.cc |
diff --git a/skia/ext/lazy_pixel_ref_utils.cc b/skia/ext/lazy_pixel_ref_utils.cc |
deleted file mode 100644 |
index 4b3d297e0253195a16a8322c032ccbd7cc377ec4..0000000000000000000000000000000000000000 |
--- a/skia/ext/lazy_pixel_ref_utils.cc |
+++ /dev/null |
@@ -1,411 +0,0 @@ |
-// Copyright 2013 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 "skia/ext/lazy_pixel_ref_utils.h" |
- |
-#include <algorithm> |
- |
-#include "skia/ext/lazy_pixel_ref.h" |
-#include "third_party/skia/include/core/SkBitmapDevice.h" |
-#include "third_party/skia/include/core/SkCanvas.h" |
-#include "third_party/skia/include/core/SkData.h" |
-#include "third_party/skia/include/core/SkDraw.h" |
-#include "third_party/skia/include/core/SkPixelRef.h" |
-#include "third_party/skia/include/core/SkRRect.h" |
-#include "third_party/skia/include/core/SkRect.h" |
-#include "third_party/skia/include/core/SkShader.h" |
-#include "third_party/skia/src/core/SkRasterClip.h" |
- |
-namespace skia { |
- |
-namespace { |
- |
-// URI label for a lazily decoded SkPixelRef. |
-const char kLabelLazyDecoded[] = "lazy"; |
- |
-class LazyPixelRefSet { |
- public: |
- LazyPixelRefSet( |
- std::vector<LazyPixelRefUtils::PositionLazyPixelRef>* pixel_refs) |
- : pixel_refs_(pixel_refs) {} |
- |
- void Add(SkPixelRef* pixel_ref, const SkRect& rect) { |
- // Only save lazy pixel refs. |
- if (pixel_ref->getURI() && |
- !strcmp(pixel_ref->getURI(), kLabelLazyDecoded)) { |
- LazyPixelRefUtils::PositionLazyPixelRef position_pixel_ref; |
- position_pixel_ref.lazy_pixel_ref = |
- static_cast<skia::LazyPixelRef*>(pixel_ref); |
- position_pixel_ref.pixel_ref_rect = rect; |
- pixel_refs_->push_back(position_pixel_ref); |
- } |
- } |
- |
- private: |
- std::vector<LazyPixelRefUtils::PositionLazyPixelRef>* pixel_refs_; |
-}; |
- |
-class GatherPixelRefDevice : public SkBitmapDevice { |
- public: |
- GatherPixelRefDevice(const SkBitmap& bm, LazyPixelRefSet* lazy_pixel_ref_set) |
- : SkBitmapDevice(bm), lazy_pixel_ref_set_(lazy_pixel_ref_set) {} |
- |
- virtual void clear(SkColor color) SK_OVERRIDE {} |
- virtual void writePixels(const SkBitmap& bitmap, |
- int x, |
- int y, |
- SkCanvas::Config8888 config8888) SK_OVERRIDE {} |
- |
- virtual void drawPaint(const SkDraw& draw, const SkPaint& paint) SK_OVERRIDE { |
- SkBitmap bitmap; |
- if (GetBitmapFromPaint(paint, &bitmap)) { |
- SkRect clip_rect = SkRect::Make(draw.fRC->getBounds()); |
- AddBitmap(bitmap, clip_rect); |
- } |
- } |
- |
- virtual void drawPoints(const SkDraw& draw, |
- SkCanvas::PointMode mode, |
- size_t count, |
- const SkPoint points[], |
- const SkPaint& paint) SK_OVERRIDE { |
- SkBitmap bitmap; |
- if (!GetBitmapFromPaint(paint, &bitmap)) |
- return; |
- |
- if (count == 0) |
- return; |
- |
- SkPoint min_point = points[0]; |
- SkPoint max_point = points[0]; |
- for (size_t i = 1; i < count; ++i) { |
- const SkPoint& point = points[i]; |
- min_point.set(std::min(min_point.x(), point.x()), |
- std::min(min_point.y(), point.y())); |
- max_point.set(std::max(max_point.x(), point.x()), |
- std::max(max_point.y(), point.y())); |
- } |
- |
- SkRect bounds = SkRect::MakeLTRB( |
- min_point.x(), min_point.y(), max_point.x(), max_point.y()); |
- |
- GatherPixelRefDevice::drawRect(draw, bounds, paint); |
- } |
- virtual void drawRect(const SkDraw& draw, |
- const SkRect& rect, |
- const SkPaint& paint) SK_OVERRIDE { |
- SkBitmap bitmap; |
- if (GetBitmapFromPaint(paint, &bitmap)) { |
- SkRect mapped_rect; |
- draw.fMatrix->mapRect(&mapped_rect, rect); |
- mapped_rect.intersect(SkRect::Make(draw.fRC->getBounds())); |
- AddBitmap(bitmap, mapped_rect); |
- } |
- } |
- virtual void drawOval(const SkDraw& draw, |
- const SkRect& rect, |
- const SkPaint& paint) SK_OVERRIDE { |
- GatherPixelRefDevice::drawRect(draw, rect, paint); |
- } |
- virtual void drawRRect(const SkDraw& draw, |
- const SkRRect& rect, |
- const SkPaint& paint) SK_OVERRIDE { |
- GatherPixelRefDevice::drawRect(draw, rect.rect(), paint); |
- } |
- virtual void drawPath(const SkDraw& draw, |
- const SkPath& path, |
- const SkPaint& paint, |
- const SkMatrix* pre_path_matrix, |
- bool path_is_mutable) SK_OVERRIDE { |
- SkBitmap bitmap; |
- if (!GetBitmapFromPaint(paint, &bitmap)) |
- return; |
- |
- SkRect path_bounds = path.getBounds(); |
- SkRect final_rect; |
- if (pre_path_matrix != NULL) |
- pre_path_matrix->mapRect(&final_rect, path_bounds); |
- else |
- final_rect = path_bounds; |
- |
- GatherPixelRefDevice::drawRect(draw, final_rect, paint); |
- } |
- virtual void drawBitmap(const SkDraw& draw, |
- const SkBitmap& bitmap, |
- const SkMatrix& matrix, |
- const SkPaint& paint) SK_OVERRIDE { |
- SkMatrix total_matrix; |
- total_matrix.setConcat(*draw.fMatrix, matrix); |
- |
- SkRect bitmap_rect = SkRect::MakeWH(bitmap.width(), bitmap.height()); |
- SkRect mapped_rect; |
- total_matrix.mapRect(&mapped_rect, bitmap_rect); |
- AddBitmap(bitmap, mapped_rect); |
- |
- SkBitmap paint_bitmap; |
- if (GetBitmapFromPaint(paint, &paint_bitmap)) |
- AddBitmap(paint_bitmap, mapped_rect); |
- } |
- virtual void drawBitmapRect(const SkDraw& draw, |
- const SkBitmap& bitmap, |
- const SkRect* src_or_null, |
- const SkRect& dst, |
- const SkPaint& paint, |
- SkCanvas::DrawBitmapRectFlags flags) SK_OVERRIDE { |
- SkRect bitmap_rect = SkRect::MakeWH(bitmap.width(), bitmap.height()); |
- SkMatrix matrix; |
- matrix.setRectToRect(bitmap_rect, dst, SkMatrix::kFill_ScaleToFit); |
- GatherPixelRefDevice::drawBitmap(draw, bitmap, matrix, paint); |
- } |
- virtual void drawSprite(const SkDraw& draw, |
- const SkBitmap& bitmap, |
- int x, |
- int y, |
- const SkPaint& paint) SK_OVERRIDE { |
- // Sprites aren't affected by current matrix, so we can't reuse drawRect. |
- SkMatrix matrix; |
- matrix.setTranslate(x, y); |
- |
- SkRect bitmap_rect = SkRect::MakeWH(bitmap.width(), bitmap.height()); |
- SkRect mapped_rect; |
- matrix.mapRect(&mapped_rect, bitmap_rect); |
- |
- AddBitmap(bitmap, mapped_rect); |
- SkBitmap paint_bitmap; |
- if (GetBitmapFromPaint(paint, &paint_bitmap)) |
- AddBitmap(paint_bitmap, mapped_rect); |
- } |
- virtual void drawText(const SkDraw& draw, |
- const void* text, |
- size_t len, |
- SkScalar x, |
- SkScalar y, |
- const SkPaint& paint) SK_OVERRIDE { |
- SkBitmap bitmap; |
- if (!GetBitmapFromPaint(paint, &bitmap)) |
- return; |
- |
- // Math is borrowed from SkBBoxRecord |
- SkRect bounds; |
- paint.measureText(text, len, &bounds); |
- SkPaint::FontMetrics metrics; |
- paint.getFontMetrics(&metrics); |
- |
- if (paint.isVerticalText()) { |
- SkScalar h = bounds.fBottom - bounds.fTop; |
- if (paint.getTextAlign() == SkPaint::kCenter_Align) { |
- bounds.fTop -= h / 2; |
- bounds.fBottom -= h / 2; |
- } |
- bounds.fBottom += metrics.fBottom; |
- bounds.fTop += metrics.fTop; |
- } else { |
- SkScalar w = bounds.fRight - bounds.fLeft; |
- if (paint.getTextAlign() == SkPaint::kCenter_Align) { |
- bounds.fLeft -= w / 2; |
- bounds.fRight -= w / 2; |
- } else if (paint.getTextAlign() == SkPaint::kRight_Align) { |
- bounds.fLeft -= w; |
- bounds.fRight -= w; |
- } |
- bounds.fTop = metrics.fTop; |
- bounds.fBottom = metrics.fBottom; |
- } |
- |
- SkScalar pad = (metrics.fBottom - metrics.fTop) / 2; |
- bounds.fLeft -= pad; |
- bounds.fRight += pad; |
- bounds.fLeft += x; |
- bounds.fRight += x; |
- bounds.fTop += y; |
- bounds.fBottom += y; |
- |
- GatherPixelRefDevice::drawRect(draw, bounds, paint); |
- } |
- virtual void drawPosText(const SkDraw& draw, |
- const void* text, |
- size_t len, |
- const SkScalar pos[], |
- SkScalar const_y, |
- int scalars_per_pos, |
- const SkPaint& paint) SK_OVERRIDE { |
- SkBitmap bitmap; |
- if (!GetBitmapFromPaint(paint, &bitmap)) |
- return; |
- |
- if (len == 0) |
- return; |
- |
- // Similar to SkDraw asserts. |
- SkASSERT(scalars_per_pos == 1 || scalars_per_pos == 2); |
- |
- SkPoint min_point; |
- SkPoint max_point; |
- if (scalars_per_pos == 1) { |
- min_point.set(pos[0], const_y); |
- max_point.set(pos[0], const_y); |
- } else if (scalars_per_pos == 2) { |
- min_point.set(pos[0], const_y + pos[1]); |
- max_point.set(pos[0], const_y + pos[1]); |
- } |
- |
- for (size_t i = 0; i < len; ++i) { |
- SkScalar x = pos[i * scalars_per_pos]; |
- SkScalar y = const_y; |
- if (scalars_per_pos == 2) |
- y += pos[i * scalars_per_pos + 1]; |
- |
- min_point.set(std::min(x, min_point.x()), std::min(y, min_point.y())); |
- max_point.set(std::max(x, max_point.x()), std::max(y, max_point.y())); |
- } |
- |
- SkRect bounds = SkRect::MakeLTRB( |
- min_point.x(), min_point.y(), max_point.x(), max_point.y()); |
- |
- // Math is borrowed from SkBBoxRecord |
- SkPaint::FontMetrics metrics; |
- paint.getFontMetrics(&metrics); |
- |
- bounds.fTop += metrics.fTop; |
- bounds.fBottom += metrics.fBottom; |
- |
- SkScalar pad = (metrics.fTop - metrics.fBottom) / 2; |
- bounds.fLeft += pad; |
- bounds.fRight -= pad; |
- |
- GatherPixelRefDevice::drawRect(draw, bounds, paint); |
- } |
- virtual void drawTextOnPath(const SkDraw& draw, |
- const void* text, |
- size_t len, |
- const SkPath& path, |
- const SkMatrix* matrix, |
- const SkPaint& paint) SK_OVERRIDE { |
- SkBitmap bitmap; |
- if (!GetBitmapFromPaint(paint, &bitmap)) |
- return; |
- |
- // Math is borrowed from SkBBoxRecord |
- SkRect bounds = path.getBounds(); |
- SkPaint::FontMetrics metrics; |
- paint.getFontMetrics(&metrics); |
- |
- SkScalar pad = metrics.fTop; |
- bounds.fLeft += pad; |
- bounds.fRight -= pad; |
- bounds.fTop += pad; |
- bounds.fBottom -= pad; |
- |
- GatherPixelRefDevice::drawRect(draw, bounds, paint); |
- } |
- virtual void drawVertices(const SkDraw& draw, |
- SkCanvas::VertexMode, |
- int vertex_count, |
- const SkPoint verts[], |
- const SkPoint texs[], |
- const SkColor colors[], |
- SkXfermode* xmode, |
- const uint16_t indices[], |
- int index_count, |
- const SkPaint& paint) SK_OVERRIDE { |
- GatherPixelRefDevice::drawPoints( |
- draw, SkCanvas::kPolygon_PointMode, vertex_count, verts, paint); |
- } |
- virtual void drawDevice(const SkDraw&, |
- SkBaseDevice*, |
- int x, |
- int y, |
- const SkPaint&) SK_OVERRIDE {} |
- |
- protected: |
- virtual bool onReadPixels(const SkBitmap& bitmap, |
- int x, |
- int y, |
- SkCanvas::Config8888 config8888) SK_OVERRIDE { |
- return false; |
- } |
- |
- private: |
- LazyPixelRefSet* lazy_pixel_ref_set_; |
- |
- void AddBitmap(const SkBitmap& bm, const SkRect& rect) { |
- SkRect canvas_rect = SkRect::MakeWH(width(), height()); |
- SkRect paint_rect = SkRect::MakeEmpty(); |
- paint_rect.intersect(rect, canvas_rect); |
- lazy_pixel_ref_set_->Add(bm.pixelRef(), paint_rect); |
- } |
- |
- bool GetBitmapFromPaint(const SkPaint& paint, SkBitmap* bm) { |
- SkShader* shader = paint.getShader(); |
- if (shader) { |
- // Check whether the shader is a gradient in order to prevent generation |
- // of bitmaps from gradient shaders, which implement asABitmap. |
- if (SkShader::kNone_GradientType == shader->asAGradient(NULL)) |
- return shader->asABitmap(bm, NULL, NULL); |
- } |
- return false; |
- } |
-}; |
- |
-class NoSaveLayerCanvas : public SkCanvas { |
- public: |
- NoSaveLayerCanvas(SkBaseDevice* device) : INHERITED(device) {} |
- |
- // Turn saveLayer() into save() for speed, should not affect correctness. |
- virtual int saveLayer(const SkRect* bounds, |
- const SkPaint* paint, |
- SaveFlags flags) SK_OVERRIDE { |
- |
- // Like SkPictureRecord, we don't want to create layers, but we do need |
- // to respect the save and (possibly) its rect-clip. |
- int count = this->INHERITED::save(flags); |
- if (bounds) { |
- this->INHERITED::clipRectBounds(bounds, flags, NULL); |
- } |
- return count; |
- } |
- |
- // Disable aa for speed. |
- virtual bool clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) |
- SK_OVERRIDE { |
- return this->INHERITED::clipRect(rect, op, false); |
- } |
- |
- virtual bool clipPath(const SkPath& path, SkRegion::Op op, bool doAA) |
- SK_OVERRIDE { |
- return this->updateClipConservativelyUsingBounds( |
- path.getBounds(), op, path.isInverseFillType()); |
- } |
- virtual bool clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) |
- SK_OVERRIDE { |
- return this->updateClipConservativelyUsingBounds( |
- rrect.getBounds(), op, false); |
- } |
- |
- private: |
- typedef SkCanvas INHERITED; |
-}; |
- |
-} // namespace |
- |
-void LazyPixelRefUtils::GatherPixelRefs( |
- SkPicture* picture, |
- std::vector<PositionLazyPixelRef>* lazy_pixel_refs) { |
- lazy_pixel_refs->clear(); |
- LazyPixelRefSet pixel_ref_set(lazy_pixel_refs); |
- |
- SkBitmap empty_bitmap; |
- empty_bitmap.setConfig( |
- SkBitmap::kNo_Config, picture->width(), picture->height()); |
- |
- GatherPixelRefDevice device(empty_bitmap, &pixel_ref_set); |
- NoSaveLayerCanvas canvas(&device); |
- |
- canvas.clipRect(SkRect::MakeWH(picture->width(), picture->height()), |
- SkRegion::kIntersect_Op, |
- false); |
- canvas.drawPicture(*picture); |
-} |
- |
-} // namespace skia |