1
2 /*
3 * Copyright 2016 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
9 #include "SkLights.h"
10 #include "SkReadBuffer.h"
11
MakeFromBuffer(SkReadBuffer & buf)12 sk_sp<SkLights> SkLights::MakeFromBuffer(SkReadBuffer& buf) {
13 Builder builder;
14
15 SkColor3f ambColor;
16 if (!buf.readScalarArray(&ambColor.fX, 3)) {
17 return nullptr;
18 }
19
20 builder.setAmbientLightColor(ambColor);
21
22 int numLights = buf.readInt();
23
24 for (int l = 0; l < numLights; ++l) {
25 bool isPoint = buf.readBool();
26
27 SkColor3f color;
28 if (!buf.readScalarArray(&color.fX, 3)) {
29 return nullptr;
30 }
31
32 SkVector3 dirOrPos;
33 if (!buf.readScalarArray(&dirOrPos.fX, 3)) {
34 return nullptr;
35 }
36
37 sk_sp<SkImage> depthMap;
38 bool hasShadowMap = buf.readBool();
39 if (hasShadowMap) {
40 if (!(depthMap = buf.readImage())) {
41 return nullptr;
42 }
43 }
44
45 bool isRadial = buf.readBool();
46 if (isPoint) {
47 SkScalar intensity;
48 intensity = buf.readScalar();
49 Light light = Light::MakePoint(color, dirOrPos, intensity, isRadial);
50 light.setShadowMap(depthMap);
51 builder.add(light);
52 } else {
53 Light light = Light::MakeDirectional(color, dirOrPos, isRadial);
54 light.setShadowMap(depthMap);
55 builder.add(light);
56 }
57 }
58
59 return builder.finish();
60 }
61
flatten(SkWriteBuffer & buf) const62 void SkLights::flatten(SkWriteBuffer& buf) const {
63 buf.writeScalarArray(&this->ambientLightColor().fX, 3);
64
65 buf.writeInt(this->numLights());
66 for (int l = 0; l < this->numLights(); ++l) {
67 const Light& light = this->light(l);
68
69 bool isPoint = Light::kPoint_LightType == light.type();
70
71 buf.writeBool(isPoint);
72 buf.writeScalarArray(&light.color().fX, 3);
73 buf.writeScalarArray(&light.dir().fX, 3);
74
75 bool hasShadowMap = light.getShadowMap() != nullptr;
76 buf.writeBool(hasShadowMap);
77
78 bool isRadial = light.isRadial();
79 buf.writeBool(isRadial);
80
81 if (hasShadowMap) {
82 buf.writeImage(light.getShadowMap());
83 }
84 if (isPoint) {
85 buf.writeScalar(light.intensity());
86 }
87 }
88 }
89