// Copyright 2015 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/opacity_filter_canvas.h" #include "third_party/skia/include/core/SkPaint.h" #include "third_party/skia/include/core/SkTLazy.h" namespace skia { OpacityFilterCanvas::OpacityFilterCanvas(SkCanvas* canvas, float opacity, bool disable_image_filtering) : INHERITED(canvas), alpha_(SkScalarRoundToInt(opacity * 255)), disable_image_filtering_(disable_image_filtering) { } bool OpacityFilterCanvas::onFilter(SkTCopyOnFirstWrite* paint, Type) const { // TODO(fmalita): with the new onFilter() API we could override alpha even // when the original paint is null; is this something we should do? if (*paint) { if (alpha_ < 255) paint->writable()->setAlpha(alpha_); if (disable_image_filtering_) paint->writable()->setFilterQuality(kNone_SkFilterQuality); } return true; } void OpacityFilterCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix, const SkPaint* paint) { SkTCopyOnFirstWrite filteredPaint(paint); if (this->onFilter(&filteredPaint, kPicture_Type)) { // Unfurl pictures in order to filter nested paints. this->SkCanvas::onDrawPicture(picture, matrix, filteredPaint); } } } // namespace skia