10910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/* 20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 30910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * 40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 50910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * you may not use this file except in compliance with the License. 60910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * You may obtain a copy of the License at 70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * 80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * See the License for the specific language governing permissions and 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * limitations under the License. 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkBounder_DEFINED 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkBounder_DEFINED 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTypes.h" 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkRefCnt.h" 2286cd5d6eb40d1bfbfa4eed24f28d8a0f485d63f4Mike Reed#include "SkPoint.h" 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2486cd5d6eb40d1bfbfa4eed24f28d8a0f485d63f4Mike Reedstruct SkGlyph; 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstruct SkIRect; 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstruct SkPoint; 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstruct SkRect; 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkPaint; 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkPath; 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkRegion; 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** \class SkBounder 330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Base class for intercepting the device bounds of shapes before they are drawn. 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Install a subclass of this in your canvas. 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkBounder : public SkRefCnt { 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 3987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger SkBounder(); 4087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /* Call to perform a clip test before calling onIRect. 420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Returns the result from onIRect. 430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool doIRect(const SkIRect&); 4586cd5d6eb40d1bfbfa4eed24f28d8a0f485d63f4Mike Reed bool doIRectGlyph(const SkIRect& , int x, int y, const SkGlyph&); 4686cd5d6eb40d1bfbfa4eed24f28d8a0f485d63f4Mike Reed 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected: 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Override in your subclass. This is called with the device bounds of an 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project object (text, geometry, image) just before it is drawn. If your method 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project returns false, the drawing for that shape is aborted. If your method 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project returns true, drawing continues. The bounds your method receives have already 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project been transformed in to device coordinates, and clipped to the current clip. 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 54091f227385b467090b5a7169a8e2faf19eca7105Mike Reed virtual bool onIRect(const SkIRect&) { 55091f227385b467090b5a7169a8e2faf19eca7105Mike Reed return false; 56091f227385b467090b5a7169a8e2faf19eca7105Mike Reed } 57091f227385b467090b5a7169a8e2faf19eca7105Mike Reed 5886cd5d6eb40d1bfbfa4eed24f28d8a0f485d63f4Mike Reed /** Passed to onIRectGlyph with the information about the current glyph. 5986cd5d6eb40d1bfbfa4eed24f28d8a0f485d63f4Mike Reed LSB and RSB are fixed-point (16.16) coordinates of the start and end 6086cd5d6eb40d1bfbfa4eed24f28d8a0f485d63f4Mike Reed of the glyph's advance 6186cd5d6eb40d1bfbfa4eed24f28d8a0f485d63f4Mike Reed */ 6286cd5d6eb40d1bfbfa4eed24f28d8a0f485d63f4Mike Reed struct GlyphRec { 6386cd5d6eb40d1bfbfa4eed24f28d8a0f485d63f4Mike Reed SkIPoint fLSB; //!< fixed-point left-side-bearing of the glyph 6486cd5d6eb40d1bfbfa4eed24f28d8a0f485d63f4Mike Reed SkIPoint fRSB; //!< fixed-point right-side-bearing of the glyph 6586cd5d6eb40d1bfbfa4eed24f28d8a0f485d63f4Mike Reed uint16_t fGlyphID; 6686cd5d6eb40d1bfbfa4eed24f28d8a0f485d63f4Mike Reed uint16_t fFlags; //!< currently set to 0 6786cd5d6eb40d1bfbfa4eed24f28d8a0f485d63f4Mike Reed }; 6886cd5d6eb40d1bfbfa4eed24f28d8a0f485d63f4Mike Reed 69091f227385b467090b5a7169a8e2faf19eca7105Mike Reed /** Optionally, override in your subclass to receive the glyph ID when 70091f227385b467090b5a7169a8e2faf19eca7105Mike Reed text drawing supplies the device bounds of the object. 71091f227385b467090b5a7169a8e2faf19eca7105Mike Reed */ 7286cd5d6eb40d1bfbfa4eed24f28d8a0f485d63f4Mike Reed virtual bool onIRectGlyph(const SkIRect& r, const GlyphRec&) { 73091f227385b467090b5a7169a8e2faf19eca7105Mike Reed return onIRect(r); 74091f227385b467090b5a7169a8e2faf19eca7105Mike Reed } 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Called after each shape has been drawn. The default implementation does 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project nothing, but your override could use this notification to signal itself 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project that the offscreen being rendered into needs to be updated to the screen. 790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void commit(); 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool doHairline(const SkPoint&, const SkPoint&, const SkPaint&); 840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool doRect(const SkRect&, const SkPaint&); 850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool doPath(const SkPath&, const SkPaint&, bool doFill); 860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void setClip(const SkRegion* clip) { fClip = clip; } 870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkRegion* fClip; 890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend class SkAutoBounderCommit; 900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend class SkDraw; 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend class SkDrawIter; 920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend struct Draw1Glyph; 930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project friend class SkMaskFilter; 940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 98