Loading core/jni/android/graphics/DrawFilter.cpp +47 −5 Original line number Diff line number Diff line Loading @@ -30,6 +30,35 @@ namespace android { // Custom version of SkPaintFlagsDrawFilter that also calls setFilterLevel. class CompatFlagsDrawFilter : public SkPaintFlagsDrawFilter { public: CompatFlagsDrawFilter(uint32_t clearFlags, uint32_t setFlags, SkPaint::FilterLevel desiredLevel) : SkPaintFlagsDrawFilter(clearFlags, setFlags) , fDesiredLevel(desiredLevel) { } virtual bool filter(SkPaint* paint, Type type) { SkPaintFlagsDrawFilter::filter(paint, type); paint->setFilterLevel(fDesiredLevel); return true; } private: const SkPaint::FilterLevel fDesiredLevel; }; // Returns whether flags contains FILTER_BITMAP_FLAG. If flags does, remove it. static inline bool hadFiltering(jint& flags) { // Equivalent to the Java Paint's FILTER_BITMAP_FLAG. static const uint32_t sFilterBitmapFlag = 0x02; const bool result = (flags & sFilterBitmapFlag) != 0; flags &= ~sFilterBitmapFlag; return result; } class SkDrawFilterGlue { public: Loading @@ -40,12 +69,25 @@ public: static jlong CreatePaintFlagsDF(JNIEnv* env, jobject clazz, jint clearFlags, jint setFlags) { // trim off any out-of-range bits clearFlags &= SkPaint::kAllFlags; setFlags &= SkPaint::kAllFlags; if (clearFlags | setFlags) { SkDrawFilter* filter = new SkPaintFlagsDrawFilter(clearFlags, setFlags); // Mask both groups of flags to remove FILTER_BITMAP_FLAG, which no // longer has a Skia equivalent flag (instead it corresponds to // calling setFilterLevel), and keep track of which group(s), if // any, had the flag set. const bool turnFilteringOn = hadFiltering(setFlags); const bool turnFilteringOff = hadFiltering(clearFlags); SkDrawFilter* filter; if (turnFilteringOn) { // Turning filtering on overrides turning it off. filter = new CompatFlagsDrawFilter(clearFlags, setFlags, SkPaint::kLow_FilterLevel); } else if (turnFilteringOff) { filter = new CompatFlagsDrawFilter(clearFlags, setFlags, SkPaint::kNone_FilterLevel); } else { filter = new SkPaintFlagsDrawFilter(clearFlags, setFlags); } return reinterpret_cast<jlong>(filter); } else { return NULL; Loading Loading
core/jni/android/graphics/DrawFilter.cpp +47 −5 Original line number Diff line number Diff line Loading @@ -30,6 +30,35 @@ namespace android { // Custom version of SkPaintFlagsDrawFilter that also calls setFilterLevel. class CompatFlagsDrawFilter : public SkPaintFlagsDrawFilter { public: CompatFlagsDrawFilter(uint32_t clearFlags, uint32_t setFlags, SkPaint::FilterLevel desiredLevel) : SkPaintFlagsDrawFilter(clearFlags, setFlags) , fDesiredLevel(desiredLevel) { } virtual bool filter(SkPaint* paint, Type type) { SkPaintFlagsDrawFilter::filter(paint, type); paint->setFilterLevel(fDesiredLevel); return true; } private: const SkPaint::FilterLevel fDesiredLevel; }; // Returns whether flags contains FILTER_BITMAP_FLAG. If flags does, remove it. static inline bool hadFiltering(jint& flags) { // Equivalent to the Java Paint's FILTER_BITMAP_FLAG. static const uint32_t sFilterBitmapFlag = 0x02; const bool result = (flags & sFilterBitmapFlag) != 0; flags &= ~sFilterBitmapFlag; return result; } class SkDrawFilterGlue { public: Loading @@ -40,12 +69,25 @@ public: static jlong CreatePaintFlagsDF(JNIEnv* env, jobject clazz, jint clearFlags, jint setFlags) { // trim off any out-of-range bits clearFlags &= SkPaint::kAllFlags; setFlags &= SkPaint::kAllFlags; if (clearFlags | setFlags) { SkDrawFilter* filter = new SkPaintFlagsDrawFilter(clearFlags, setFlags); // Mask both groups of flags to remove FILTER_BITMAP_FLAG, which no // longer has a Skia equivalent flag (instead it corresponds to // calling setFilterLevel), and keep track of which group(s), if // any, had the flag set. const bool turnFilteringOn = hadFiltering(setFlags); const bool turnFilteringOff = hadFiltering(clearFlags); SkDrawFilter* filter; if (turnFilteringOn) { // Turning filtering on overrides turning it off. filter = new CompatFlagsDrawFilter(clearFlags, setFlags, SkPaint::kLow_FilterLevel); } else if (turnFilteringOff) { filter = new CompatFlagsDrawFilter(clearFlags, setFlags, SkPaint::kNone_FilterLevel); } else { filter = new SkPaintFlagsDrawFilter(clearFlags, setFlags); } return reinterpret_cast<jlong>(filter); } else { return NULL; Loading