SkLights.cpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /*
  2. * Copyright 2016 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "src/core/SkReadBuffer.h"
  8. #include "src/shaders/SkLights.h"
  9. sk_sp<SkLights> SkLights::MakeFromBuffer(SkReadBuffer& buf) {
  10. Builder builder;
  11. SkColor3f ambColor;
  12. if (!buf.readScalarArray(&ambColor.fX, 3)) {
  13. return nullptr;
  14. }
  15. builder.setAmbientLightColor(ambColor);
  16. int numLights = buf.readInt();
  17. for (int l = 0; l < numLights; ++l) {
  18. bool isPoint = buf.readBool();
  19. SkColor3f color;
  20. if (!buf.readScalarArray(&color.fX, 3)) {
  21. return nullptr;
  22. }
  23. SkVector3 dirOrPos;
  24. if (!buf.readScalarArray(&dirOrPos.fX, 3)) {
  25. return nullptr;
  26. }
  27. if (isPoint) {
  28. SkScalar intensity;
  29. intensity = buf.readScalar();
  30. Light light = Light::MakePoint(color, dirOrPos, intensity);
  31. builder.add(light);
  32. } else {
  33. Light light = Light::MakeDirectional(color, dirOrPos);
  34. builder.add(light);
  35. }
  36. }
  37. return builder.finish();
  38. }
  39. void SkLights::flatten(SkWriteBuffer& buf) const {
  40. buf.writeScalarArray(&this->ambientLightColor().fX, 3);
  41. buf.writeInt(this->numLights());
  42. for (int l = 0; l < this->numLights(); ++l) {
  43. const Light& light = this->light(l);
  44. bool isPoint = Light::kPoint_LightType == light.type();
  45. buf.writeBool(isPoint);
  46. buf.writeScalarArray(&light.color().fX, 3);
  47. buf.writeScalarArray(&light.dir().fX, 3);
  48. if (isPoint) {
  49. buf.writeScalar(light.intensity());
  50. }
  51. }
  52. }