/*
 * Copyright 2016 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkPipe_DEFINED
#define SkPipe_DEFINED

#include "SkData.h"

class SkCanvas;
class SkImage;
class SkPicture;
class SkTypefaceSerializer;
class SkTypefaceDeserializer;
class SkImageSerializer;
class SkImageDeserializer;
class SkWStream;

class SkPipeSerializer {
public:
    SkPipeSerializer();
    ~SkPipeSerializer();

    // Ownership is not transferred, so caller must ceep the serializer alive
    void setTypefaceSerializer(SkTypefaceSerializer*);
    void setImageSerializer(SkImageSerializer*);

    void resetCache();

    sk_sp<SkData> writeImage(SkImage*);
    sk_sp<SkData> writePicture(SkPicture*);

    void writeImage(SkImage*, SkWStream*);
    void writePicture(SkPicture*, SkWStream*);

    SkCanvas* beginWrite(const SkRect& cullBounds, SkWStream*);
    void endWrite();

private:
    class Impl;
    std::unique_ptr<Impl> fImpl;
};

class SkPipeDeserializer {
public:
    SkPipeDeserializer();
    ~SkPipeDeserializer();

    // Ownership is not transferred, so caller must ceep the deserializer alive
    void setTypefaceDeserializer(SkTypefaceDeserializer*);
    void setImageDeserializer(SkImageDeserializer*);

    sk_sp<SkImage> readImage(const SkData* data) {
        if (!data) {
            return nullptr;
        }
        return this->readImage(data->data(), data->size());
    }

    sk_sp<SkPicture> readPicture(const SkData* data) {
        if (!data) {
            return nullptr;
        }
        return this->readPicture(data->data(), data->size());
    }

    sk_sp<SkImage> readImage(const void*, size_t);
    sk_sp<SkPicture> readPicture(const void*, size_t);

    bool playback(const void*, size_t, SkCanvas*);

private:
    class Impl;
    std::unique_ptr<Impl> fImpl;
};

//////////////////////////////////////////////////////////////////////////////////////////////////

class SkTypefaceSerializer {
public:
    virtual ~SkTypefaceSerializer() {}

    virtual sk_sp<SkData> serialize(SkTypeface*) = 0;
};

class SkImageSerializer {
public:
    virtual ~SkImageSerializer() {}

    virtual sk_sp<SkData> serialize(SkImage*) = 0;
};


class SkTypefaceDeserializer {
public:
    virtual ~SkTypefaceDeserializer() {}

    virtual sk_sp<SkTypeface> deserialize(const void* data, size_t size) = 0;
};

#endif
