1
2/*
3 * Copyright 2012 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8#include "SkFlattenableBuffers.h"
9#include "SkPaint.h"
10#include "SkTypeface.h"
11
12#include "SkColorFilter.h"
13#include "SkDrawLooper.h"
14#include "SkImageFilter.h"
15#include "SkMaskFilter.h"
16#include "SkPathEffect.h"
17#include "SkPixelRef.h"
18#include "SkRasterizer.h"
19#include "SkShader.h"
20#include "SkUnitMapper.h"
21#include "SkXfermode.h"
22
23SkFlattenableReadBuffer::SkFlattenableReadBuffer() {
24    // Set default values. These should be explicitly set by our client
25    // via setFlags() if the buffer came from serialization.
26    fFlags = 0;
27#ifdef SK_SCALAR_IS_FLOAT
28    fFlags |= kScalarIsFloat_Flag;
29#endif
30    if (8 == sizeof(void*)) {
31        fFlags |= kPtrIs64Bit_Flag;
32    }
33}
34
35SkFlattenableReadBuffer::~SkFlattenableReadBuffer() { }
36
37void* SkFlattenableReadBuffer::readFunctionPtr() {
38    void* proc;
39    SkASSERT(sizeof(void*) == this->getArrayCount());
40    this->readByteArray(&proc, sizeof(void*));
41    return proc;
42}
43
44void SkFlattenableReadBuffer::readPaint(SkPaint* paint) {
45    paint->unflatten(*this);
46}
47
48template <typename T> T* SkFlattenableReadBuffer::readFlattenableT() {
49    return static_cast<T*>(this->readFlattenable(T::GetFlattenableType()));
50}
51
52SkColorFilter* SkFlattenableReadBuffer::readColorFilter() {
53    return this->readFlattenableT<SkColorFilter>();
54}
55
56SkDrawLooper* SkFlattenableReadBuffer::readDrawLooper() {
57    return this->readFlattenableT<SkDrawLooper>();
58}
59
60SkImageFilter* SkFlattenableReadBuffer::readImageFilter() {
61    return this->readFlattenableT<SkImageFilter>();
62}
63
64SkMaskFilter* SkFlattenableReadBuffer::readMaskFilter() {
65    return this->readFlattenableT<SkMaskFilter>();
66}
67
68SkPathEffect* SkFlattenableReadBuffer::readPathEffect() {
69    return this->readFlattenableT<SkPathEffect>();
70}
71
72SkPixelRef* SkFlattenableReadBuffer::readPixelRef() {
73    return this->readFlattenableT<SkPixelRef>();
74}
75
76SkRasterizer* SkFlattenableReadBuffer::readRasterizer() {
77    return this->readFlattenableT<SkRasterizer>();
78}
79
80SkShader* SkFlattenableReadBuffer::readShader() {
81    return this->readFlattenableT<SkShader>();
82}
83
84SkUnitMapper* SkFlattenableReadBuffer::readUnitMapper() {
85    return this->readFlattenableT<SkUnitMapper>();
86}
87
88SkXfermode* SkFlattenableReadBuffer::readXfermode() {
89    return this->readFlattenableT<SkXfermode>();
90}
91
92bool SkFlattenableReadBuffer::validate(bool isValid) {
93    return true;
94}
95
96///////////////////////////////////////////////////////////////////////////////
97
98SkFlattenableWriteBuffer::SkFlattenableWriteBuffer() {
99    fFlags = (Flags)0;
100}
101
102SkFlattenableWriteBuffer::~SkFlattenableWriteBuffer() { }
103
104void SkFlattenableWriteBuffer::writeFunctionPtr(void* ptr) {
105    void* ptrStorage[] = { ptr };
106    this->writeByteArray(ptrStorage, sizeof(void*));
107}
108
109void SkFlattenableWriteBuffer::writePaint(const SkPaint& paint) {
110    paint.flatten(*this);
111}
112
113void SkFlattenableWriteBuffer::flattenObject(const SkFlattenable* obj,
114                                             SkFlattenableWriteBuffer& buffer) {
115    obj->flatten(buffer);
116}
117