180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2012 Google Inc.
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkAnnotation_DEFINED
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkAnnotation_DEFINED
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkFlattenable.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkData;
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkDataSet;
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkStream;
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkWStream;
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  Experimental class for annotating draws. Do not use directly yet.
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  Use helper functions at the bottom of this file for now.
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkAnnotation : public SkFlattenable {
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    enum Flags {
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // If set, the associated drawing primitive should not be drawn
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        kNoDraw_Flag  = 1 << 0,
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAnnotation(SkDataSet*, uint32_t flags);
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual ~SkAnnotation();
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t getFlags() const { return fFlags; }
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDataSet* getDataSet() const { return fDataSet; }
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool isNoDraw() const { return SkToBool(fFlags & kNoDraw_Flag); }
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /**
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     *  Helper for search the annotation's dataset.
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     */
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkData* find(const char name[]) const;
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkAnnotation)
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAnnotation(SkFlattenableReadBuffer&);
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE;
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDataSet*  fDataSet;
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t    fFlags;
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void writeToStream(SkWStream*) const;
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void readFromStream(SkStream*);
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkFlattenable INHERITED;
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  Experimental collection of predefined Keys into the Annotation dictionary
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkAnnotationKeys {
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /**
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     *  Returns the canonical key whose payload is a URL
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     */
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    static const char* URL_Key();
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// Experimental helper functions to use Annotations
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustruct SkRect;
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkCanvas;
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  Experimental!
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  Annotate the canvas by associating the specified URL with the
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  specified rectangle (in local coordinates, just like drawRect). If the
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  backend of this canvas does not support annotations, this call is
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  safely ignored.
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  The caller is responsible for managing its ownership of the SkData.
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSK_API void SkAnnotateRectWithURL(SkCanvas*, const SkRect&, SkData*);
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
90