LCOV - code coverage report
Current view: top level - gfx/skia/skia/include/core - SkFlattenable.h (source / functions) Hit Total Coverage
Test: output.info Lines: 2 4 50.0 %
Date: 2017-07-14 16:53:18 Functions: 2 5 40.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright 2006 The Android Open Source Project
       3             :  *
       4             :  * Use of this source code is governed by a BSD-style license that can be
       5             :  * found in the LICENSE file.
       6             :  */
       7             : 
       8             : #ifndef SkFlattenable_DEFINED
       9             : #define SkFlattenable_DEFINED
      10             : 
      11             : #include "SkRefCnt.h"
      12             : 
      13             : class SkReadBuffer;
      14             : class SkWriteBuffer;
      15             : 
      16             : class SkPrivateEffectInitializer;
      17             : 
      18             : /*
      19             :  *  Flattening is straight-forward:
      20             :  *      1. call getFactory() so we have a function-ptr to recreate the subclass
      21             :  *      2. call flatten(buffer) to write out enough data for the factory to read
      22             :  *
      23             :  *  Unflattening is easy for the caller: new_instance = factory(buffer)
      24             :  *
      25             :  *  The complexity of supporting this is as follows.
      26             :  *
      27             :  *  If your subclass wants to control unflattening, use this macro in your declaration:
      28             :  *      SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS
      29             :  *  This will provide a getFactory(), and require that the subclass implements CreateProc.
      30             :  *
      31             :  *  For older buffers (before the DEEPFLATTENING change, the macros below declare
      32             :  *  a thin factory DeepCreateProc. It checks the version of the buffer, and if it is pre-deep,
      33             :  *  then it calls through to a (usually protected) constructor, passing the buffer.
      34             :  *  If the buffer is newer, then it directly calls the "real" factory: CreateProc.
      35             :  */
      36             : 
      37             : #define SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP() static void InitializeFlattenables();
      38             : 
      39             : #define SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(flattenable) \
      40             :     void flattenable::InitializeFlattenables() {
      41             : 
      42             : #define SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END \
      43             :     }
      44             : 
      45             : #define SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(flattenable) \
      46             :     SkFlattenable::Register(#flattenable, flattenable::CreateProc, \
      47             :                             flattenable::GetFlattenableType());
      48             : 
      49             : #define SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(flattenable)    \
      50             :     private:                                                                \
      51             :     static sk_sp<SkFlattenable> CreateProc(SkReadBuffer&);                        \
      52             :     friend class SkFlattenable::PrivateInitializer;                         \
      53             :     public:                                                                 \
      54             :     Factory getFactory() const override { return CreateProc; }
      55             : 
      56             : /** For SkFlattenable derived objects with a valid type
      57             :     This macro should only be used in base class objects in core
      58             :   */
      59             : #define SK_DEFINE_FLATTENABLE_TYPE(flattenable) \
      60             :     static Type GetFlattenableType() { \
      61             :         return k##flattenable##_Type; \
      62             :     }
      63             : 
      64             : /** \class SkFlattenable
      65             : 
      66             :  SkFlattenable is the base class for objects that need to be flattened
      67             :  into a data stream for either transport or as part of the key to the
      68             :  font cache.
      69             :  */
      70         171 : class SK_API SkFlattenable : public SkRefCnt {
      71             : public:
      72             :     enum Type {
      73             :         kSkColorFilter_Type,
      74             :         kSkDrawable_Type,
      75             :         kSkDrawLooper_Type,
      76             :         kSkImageFilter_Type,
      77             :         kSkMaskFilter_Type,
      78             :         kSkPathEffect_Type,
      79             :         kSkPixelRef_Type,
      80             :         kSkRasterizer_Type,
      81             :         kSkShader_Type,
      82             :         kSkUnused_Type,     // used to be SkUnitMapper
      83             :         kSkXfermode_Type,
      84             :         kSkNormalSource_Type,
      85             :     };
      86             : 
      87             :     typedef sk_sp<SkFlattenable> (*Factory)(SkReadBuffer&);
      88             : 
      89         171 :     SkFlattenable() {}
      90             : 
      91             :     /** Implement this to return a factory function pointer that can be called
      92             :      to recreate your class given a buffer (previously written to by your
      93             :      override of flatten().
      94             :      */
      95             :     virtual Factory getFactory() const = 0;
      96             : 
      97             :     /**
      98             :      *  Returns the name of the object's class.
      99             :      *
     100             :      *  Subclasses should override this function if they intend to provide
     101             :      *  support for flattening without using the global registry.
     102             :      *
     103             :      *  If the flattenable is registered, there is no need to override.
     104             :      */
     105           0 :     virtual const char* getTypeName() const { return FactoryToName(getFactory()); }
     106             : 
     107             :     static Factory NameToFactory(const char name[]);
     108             :     static const char* FactoryToName(Factory);
     109             :     static bool NameToType(const char name[], Type* type);
     110             : 
     111             :     static void Register(const char name[], Factory, Type);
     112             : 
     113             :     /**
     114             :      *  Override this if your subclass needs to record data that it will need to recreate itself
     115             :      *  from its CreateProc (returned by getFactory()).
     116             :      */
     117           0 :     virtual void flatten(SkWriteBuffer&) const {}
     118             : 
     119             : protected:
     120             :     class PrivateInitializer {
     121             :     public:
     122             :         static void InitCore();
     123             :         static void InitEffects();
     124             :     };
     125             : 
     126             : private:
     127             :     static void InitializeFlattenablesIfNeeded();
     128             : 
     129             :     friend class SkGraphics;
     130             : 
     131             :     typedef SkRefCnt INHERITED;
     132             : };
     133             : 
     134             : #endif

Generated by: LCOV version 1.13