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