15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (c) 2012, Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef OpaqueRegionSkia_h 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define OpaqueRegionSkia_h 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/IntRect.h" 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "SkBitmap.h" 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "SkCanvas.h" 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "SkPaint.h" 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "SkPoint.h" 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "SkRect.h" 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class GraphicsContext; 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// This class is an encapsulation of functionality for GraphicsContext, and its methods are mirrored 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// there for the outside world. It tracks paints and computes what area will be opaque. 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class OpaqueRegionSkia { 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OpaqueRegionSkia(); 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~OpaqueRegionSkia(); 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The resulting opaque region as a single rect. 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect asRect() const; 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void pushCanvasLayer(const SkPaint*); 5653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) void popCanvasLayer(const GraphicsContext*); 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setImageMask(const SkRect& imageOpaqueRect); 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum DrawType { 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FillOnly, 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FillOrStroke 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) void didDrawRect(const GraphicsContext*, const SkRect&, const SkPaint&, const SkBitmap* sourceBitmap); 6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) void didDrawPath(const GraphicsContext*, const SkPath&, const SkPaint&); 6753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) void didDrawPoints(const GraphicsContext*, SkCanvas::PointMode, int numPoints, const SkPoint[], const SkPaint&); 6853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) void didDrawBounded(const GraphicsContext*, const SkRect&, const SkPaint&); 6953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) void didDrawUnbounded(const GraphicsContext*, const SkPaint&, DrawType); 70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) struct CanvasLayerState { 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CanvasLayerState() 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : hasImageMask(false) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , opaqueRect(SkRect::MakeEmpty()) 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { } 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SkPaint paint; 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // An image mask is being applied to the layer. 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool hasImageMask; 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The opaque area in the image mask. 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SkRect imageOpaqueRect; 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SkRect opaqueRect; 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 8853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) void didDraw(const GraphicsContext*, const SkRect&, const SkPaint&, const SkBitmap* sourceBitmap, bool fillsBounds, DrawType); 8953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) void applyOpaqueRegionFromLayer(const GraphicsContext*, const SkRect& layerOpaqueRect, const SkPaint&); 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void markRectAsOpaque(const SkRect&); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void markRectAsNonOpaque(const SkRect&); 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void markAllAsNonOpaque(); 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) SkRect& currentTrackingOpaqueRect(); 95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SkRect m_opaqueRect; 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<CanvasLayerState, 3> m_canvasLayerStack; 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // OpaqueRegionSkia_h 103