SkImageInfoPriv.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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. #ifndef SkImageInfoPriv_DEFINED
  8. #define SkImageInfoPriv_DEFINED
  9. #include "include/core/SkImageInfo.h"
  10. enum SkColorTypeComponentFlag {
  11. kRed_SkColorTypeComponentFlag = 0x1,
  12. kGreen_SkColorTypeComponentFlag = 0x2,
  13. kBlue_SkColorTypeComponentFlag = 0x4,
  14. kAlpha_SkColorTypeComponentFlag = 0x8,
  15. kGray_SkColorTypeComponentFlag = 0x10,
  16. kRGB_SkColorTypeComponentFlags = kRed_SkColorTypeComponentFlag |
  17. kGreen_SkColorTypeComponentFlag |
  18. kBlue_SkColorTypeComponentFlag,
  19. kRGBA_SkColorTypeComponentFlags = kRGB_SkColorTypeComponentFlags |
  20. kAlpha_SkColorTypeComponentFlag,
  21. };
  22. static inline uint32_t SkColorTypeComponentFlags(SkColorType ct) {
  23. switch (ct) {
  24. case kUnknown_SkColorType: return 0;
  25. case kAlpha_8_SkColorType: return kAlpha_SkColorTypeComponentFlag;
  26. case kRGB_565_SkColorType: return kRGB_SkColorTypeComponentFlags;
  27. case kARGB_4444_SkColorType: return kRGBA_SkColorTypeComponentFlags;
  28. case kRGBA_8888_SkColorType: return kRGBA_SkColorTypeComponentFlags;
  29. case kRGB_888x_SkColorType: return kRGB_SkColorTypeComponentFlags;
  30. case kBGRA_8888_SkColorType: return kRGBA_SkColorTypeComponentFlags;
  31. case kRGBA_1010102_SkColorType: return kRGBA_SkColorTypeComponentFlags;
  32. case kRGB_101010x_SkColorType: return kRGB_SkColorTypeComponentFlags;
  33. case kGray_8_SkColorType: return kGray_SkColorTypeComponentFlag;
  34. case kRGBA_F16Norm_SkColorType: return kRGBA_SkColorTypeComponentFlags;
  35. case kRGBA_F16_SkColorType: return kRGBA_SkColorTypeComponentFlags;
  36. case kRGBA_F32_SkColorType: return kRGBA_SkColorTypeComponentFlags;
  37. }
  38. return 0;
  39. }
  40. static inline bool SkColorTypeIsAlphaOnly(SkColorType ct) {
  41. return kAlpha_SkColorTypeComponentFlag == SkColorTypeComponentFlags(ct);
  42. }
  43. static inline bool SkAlphaTypeIsValid(unsigned value) {
  44. return value <= kLastEnum_SkAlphaType;
  45. }
  46. static inline bool SkColorTypeIsGray(SkColorType ct) {
  47. auto flags = SkColorTypeComponentFlags(ct);
  48. // Currently assuming that a color type has only gray or does not have gray.
  49. SkASSERT(!(kGray_SkColorTypeComponentFlag & flags) || kGray_SkColorTypeComponentFlag == flags);
  50. return kGray_SkColorTypeComponentFlag == flags;
  51. }
  52. static int SkColorTypeShiftPerPixel(SkColorType ct) {
  53. switch (ct) {
  54. case kUnknown_SkColorType: return 0;
  55. case kAlpha_8_SkColorType: return 0;
  56. case kRGB_565_SkColorType: return 1;
  57. case kARGB_4444_SkColorType: return 1;
  58. case kRGBA_8888_SkColorType: return 2;
  59. case kRGB_888x_SkColorType: return 2;
  60. case kBGRA_8888_SkColorType: return 2;
  61. case kRGBA_1010102_SkColorType: return 2;
  62. case kRGB_101010x_SkColorType: return 2;
  63. case kGray_8_SkColorType: return 0;
  64. case kRGBA_F16Norm_SkColorType: return 3;
  65. case kRGBA_F16_SkColorType: return 3;
  66. case kRGBA_F32_SkColorType: return 4;
  67. }
  68. return 0;
  69. }
  70. static inline size_t SkColorTypeMinRowBytes(SkColorType ct, int width) {
  71. return width * SkColorTypeBytesPerPixel(ct);
  72. }
  73. static inline bool SkColorTypeIsValid(unsigned value) {
  74. return value <= kLastEnum_SkColorType;
  75. }
  76. static inline size_t SkColorTypeComputeOffset(SkColorType ct, int x, int y, size_t rowBytes) {
  77. if (kUnknown_SkColorType == ct) {
  78. return 0;
  79. }
  80. return y * rowBytes + (x << SkColorTypeShiftPerPixel(ct));
  81. }
  82. /**
  83. * Returns true if |info| contains a valid combination of width, height, colorType, and alphaType.
  84. */
  85. static inline bool SkImageInfoIsValid(const SkImageInfo& info) {
  86. if (info.width() <= 0 || info.height() <= 0) {
  87. return false;
  88. }
  89. const int kMaxDimension = SK_MaxS32 >> 2;
  90. if (info.width() > kMaxDimension || info.height() > kMaxDimension) {
  91. return false;
  92. }
  93. if (kUnknown_SkColorType == info.colorType() || kUnknown_SkAlphaType == info.alphaType()) {
  94. return false;
  95. }
  96. return true;
  97. }
  98. /**
  99. * Returns true if Skia has defined a pixel conversion from the |src| to the |dst|.
  100. * Returns false otherwise.
  101. */
  102. static inline bool SkImageInfoValidConversion(const SkImageInfo& dst, const SkImageInfo& src) {
  103. return SkImageInfoIsValid(dst) && SkImageInfoIsValid(src);
  104. }
  105. #endif // SkImageInfoPriv_DEFINED