SkAndroidFrameworkUtils.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /*
  2. * Copyright 2017 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/android/SkAndroidFrameworkUtils.h"
  8. #include "include/core/SkCanvas.h"
  9. #include "include/utils/SkPaintFilterCanvas.h"
  10. #include "src/core/SkDevice.h"
  11. #include "src/image/SkSurface_Base.h"
  12. #if SK_SUPPORT_GPU
  13. #include "src/gpu/GrClip.h"
  14. #include "src/gpu/GrRenderTargetContext.h"
  15. #include "src/gpu/GrStyle.h"
  16. #include "src/gpu/GrUserStencilSettings.h"
  17. #include "src/gpu/effects/GrDisableColorXP.h"
  18. #endif //SK_SUPPORT_GPU
  19. #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
  20. #include <log/log.h>
  21. #if SK_SUPPORT_GPU
  22. bool SkAndroidFrameworkUtils::clipWithStencil(SkCanvas* canvas) {
  23. SkRegion clipRegion;
  24. canvas->temporary_internal_getRgnClip(&clipRegion);
  25. if (clipRegion.isEmpty()) {
  26. return false;
  27. }
  28. SkBaseDevice* device = canvas->getDevice();
  29. if (!device) {
  30. return false;
  31. }
  32. GrRenderTargetContext* rtc = device->accessRenderTargetContext();
  33. if (!rtc) {
  34. return false;
  35. }
  36. GrPaint grPaint;
  37. grPaint.setXPFactory(GrDisableColorXPFactory::Get());
  38. GrNoClip noClip;
  39. static constexpr GrUserStencilSettings kDrawToStencil(
  40. GrUserStencilSettings::StaticInit<
  41. 0x1,
  42. GrUserStencilTest::kAlways,
  43. 0x1,
  44. GrUserStencilOp::kReplace,
  45. GrUserStencilOp::kReplace,
  46. 0x1>()
  47. );
  48. rtc->drawRegion(noClip, std::move(grPaint), GrAA::kNo, SkMatrix::I(), clipRegion,
  49. GrStyle::SimpleFill(), &kDrawToStencil);
  50. return true;
  51. }
  52. #endif //SK_SUPPORT_GPU
  53. void SkAndroidFrameworkUtils::SafetyNetLog(const char* bugNumber) {
  54. android_errorWriteLog(0x534e4554, bugNumber);
  55. }
  56. sk_sp<SkSurface> SkAndroidFrameworkUtils::getSurfaceFromCanvas(SkCanvas* canvas) {
  57. sk_sp<SkSurface> surface(SkSafeRef(canvas->getSurfaceBase()));
  58. return surface;
  59. }
  60. int SkAndroidFrameworkUtils::SaveBehind(SkCanvas* canvas, const SkRect* subset) {
  61. return canvas->only_axis_aligned_saveBehind(subset);
  62. }
  63. SkCanvas* SkAndroidFrameworkUtils::getBaseWrappedCanvas(SkCanvas* canvas) {
  64. auto pfc = canvas->internal_private_asPaintFilterCanvas();
  65. auto result = canvas;
  66. while (pfc) {
  67. result = pfc->proxy();
  68. pfc = result->internal_private_asPaintFilterCanvas();
  69. }
  70. return result;
  71. }
  72. #endif // SK_BUILD_FOR_ANDROID_FRAMEWORK