| /* | |
| * Copyright (C) 2014 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| #ifndef PAINT_UTILS_H | |
| #define PAINT_UTILS_H | |
| #include <GLES2/gl2.h> | |
| #include <utils/Blur.h> | |
| #include <SkColorFilter.h> | |
| #include <SkPaint.h> | |
| #include <SkShader.h> | |
| namespace android { | |
| namespace uirenderer { | |
| /** | |
| * Utility methods for accessing data within SkPaint, and providing defaults | |
| * with optional SkPaint pointers. | |
| */ | |
| class PaintUtils { | |
| public: | |
| static inline GLenum getFilter(const SkPaint* paint) { | |
| if (!paint || paint->getFilterQuality() != kNone_SkFilterQuality) { | |
| return GL_LINEAR; | |
| } | |
| return GL_NEAREST; | |
| } | |
| static bool isOpaquePaint(const SkPaint* paint) { | |
| if (!paint) return true; // default (paintless) behavior is SrcOver, black | |
| if (paint->getAlpha() != 0xFF || PaintUtils::isBlendedShader(paint->getShader()) || | |
| PaintUtils::isBlendedColorFilter(paint->getColorFilter())) { | |
| return false; | |
| } | |
| // Only let simple srcOver / src blending modes declare opaque, since behavior is clear. | |
| SkBlendMode mode = paint->getBlendMode(); | |
| return mode == SkBlendMode::kSrcOver || mode == SkBlendMode::kSrc; | |
| } | |
| static bool isBlendedShader(const SkShader* shader) { return shader && !shader->isOpaque(); } | |
| static bool isBlendedColorFilter(const SkColorFilter* filter) { | |
| return filter && !filter->isAlphaUnchanged(); | |
| } | |
| static inline SkBlendMode getBlendModeDirect(const SkPaint* paint) { | |
| return paint ? paint->getBlendMode() : SkBlendMode::kSrcOver; | |
| } | |
| static inline int getAlphaDirect(const SkPaint* paint) { | |
| return paint ? paint->getAlpha() : 255; | |
| } | |
| }; // class PaintUtils | |
| } /* namespace uirenderer */ | |
| } /* namespace android */ | |
| #endif /* PAINT_UTILS_H */ |