| |
| /* |
| * Copyright 2016 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "src/core/SkReadBuffer.h" |
| #include "src/shaders/SkLights.h" |
| |
| sk_sp<SkLights> SkLights::MakeFromBuffer(SkReadBuffer& buf) { |
| Builder builder; |
| |
| SkColor3f ambColor; |
| if (!buf.readScalarArray(&ambColor.fX, 3)) { |
| return nullptr; |
| } |
| |
| builder.setAmbientLightColor(ambColor); |
| |
| int numLights = buf.readInt(); |
| |
| for (int l = 0; l < numLights; ++l) { |
| bool isPoint = buf.readBool(); |
| |
| SkColor3f color; |
| if (!buf.readScalarArray(&color.fX, 3)) { |
| return nullptr; |
| } |
| |
| SkVector3 dirOrPos; |
| if (!buf.readScalarArray(&dirOrPos.fX, 3)) { |
| return nullptr; |
| } |
| |
| if (isPoint) { |
| SkScalar intensity; |
| intensity = buf.readScalar(); |
| Light light = Light::MakePoint(color, dirOrPos, intensity); |
| builder.add(light); |
| } else { |
| Light light = Light::MakeDirectional(color, dirOrPos); |
| builder.add(light); |
| } |
| } |
| |
| return builder.finish(); |
| } |
| |
| void SkLights::flatten(SkWriteBuffer& buf) const { |
| buf.writeScalarArray(&this->ambientLightColor().fX, 3); |
| |
| buf.writeInt(this->numLights()); |
| for (int l = 0; l < this->numLights(); ++l) { |
| const Light& light = this->light(l); |
| |
| bool isPoint = Light::kPoint_LightType == light.type(); |
| |
| buf.writeBool(isPoint); |
| buf.writeScalarArray(&light.color().fX, 3); |
| buf.writeScalarArray(&light.dir().fX, 3); |
| |
| if (isPoint) { |
| buf.writeScalar(light.intensity()); |
| } |
| } |
| } |