SampleCamera.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /*
  2. * Copyright 2011 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 "include/core/SkCanvas.h"
  8. #include "include/core/SkShader.h"
  9. #include "include/core/SkString.h"
  10. #include "include/utils/SkCamera.h"
  11. #include "samplecode/DecodeFile.h"
  12. #include "samplecode/Sample.h"
  13. #include "src/effects/SkEmbossMaskFilter.h"
  14. #include "tools/Resources.h"
  15. #include "tools/timer/TimeUtils.h"
  16. namespace {
  17. class CameraView : public Sample {
  18. SkTArray<sk_sp<SkShader>> fShaders;
  19. int fShaderIndex = 0;
  20. bool fFrontFace = false;
  21. SkScalar fRX = 0;
  22. SkScalar fRY = 0;
  23. SkString name() override { return SkString("Camera"); }
  24. void onOnceBeforeDraw() override {
  25. for (const char* resource : {
  26. "images/mandrill_512_q075.jpg",
  27. "images/dog.jpg",
  28. "images/gamut.png",
  29. }) {
  30. SkBitmap bm;
  31. if (GetResourceAsBitmap(resource, &bm)) {
  32. SkRect src = { 0, 0, SkIntToScalar(bm.width()), SkIntToScalar(bm.height()) };
  33. SkRect dst = { -150, -150, 150, 150 };
  34. SkMatrix matrix;
  35. matrix.setRectToRect(src, dst, SkMatrix::kFill_ScaleToFit);
  36. fShaders.push_back(bm.makeShader(&matrix));
  37. }
  38. }
  39. this->setBGColor(0xFFDDDDDD);
  40. }
  41. void onDrawContent(SkCanvas* canvas) override {
  42. if (fShaders.count() > 0) {
  43. canvas->translate(this->width()/2, this->height()/2);
  44. Sk3DView view;
  45. view.rotateX(fRX);
  46. view.rotateY(fRY);
  47. view.applyToCanvas(canvas);
  48. bool frontFace = view.dotWithNormal(0, 0, SK_Scalar1) < 0;
  49. if (frontFace != fFrontFace) {
  50. fFrontFace = frontFace;
  51. fShaderIndex = (fShaderIndex + 1) % fShaders.count();
  52. }
  53. SkPaint paint;
  54. paint.setAntiAlias(true);
  55. paint.setShader(fShaders[fShaderIndex]);
  56. paint.setFilterQuality(kLow_SkFilterQuality);
  57. SkRect r = { -150, -150, 150, 150 };
  58. canvas->drawRoundRect(r, 30, 30, paint);
  59. }
  60. }
  61. bool onAnimate(double nanos) override {
  62. fRY = nanos ? TimeUtils::Scaled(1e-9 * nanos, 90, 360) : 0;
  63. return true;
  64. }
  65. };
  66. } // namespace
  67. DEF_SAMPLE( return new CameraView(); )