summaryrefslogtreecommitdiffstats
path: root/chromium/skia/ext/lazy_pixel_ref_utils.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/skia/ext/lazy_pixel_ref_utils.cc')
-rw-r--r--chromium/skia/ext/lazy_pixel_ref_utils.cc411
1 files changed, 0 insertions, 411 deletions
diff --git a/chromium/skia/ext/lazy_pixel_ref_utils.cc b/chromium/skia/ext/lazy_pixel_ref_utils.cc
deleted file mode 100644
index 4b3d297e025..00000000000
--- a/chromium/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