Home | History | Annotate | Download | only in core
      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 
     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 
     62 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