Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Unified Diff: src/effects/SkTableColorFilter.cpp

Issue 968993004: add virtuals to optimize composing colorfilters (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix param warning Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/effects/SkColorMatrixFilter.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/effects/SkTableColorFilter.cpp
diff --git a/src/effects/SkTableColorFilter.cpp b/src/effects/SkTableColorFilter.cpp
index 37fdd902232a481535a0f76b67c0ee99b91d3863..d6c3e5f03274b7e772086bcf05ed5ac349efe564 100644
--- a/src/effects/SkTableColorFilter.cpp
+++ b/src/effects/SkTableColorFilter.cpp
@@ -41,13 +41,13 @@ public:
}
bool asComponentTable(SkBitmap* table) const SK_OVERRIDE;
+ SkColorFilter* newComposed(const SkColorFilter* inner) const SK_OVERRIDE;
#if SK_SUPPORT_GPU
GrFragmentProcessor* asFragmentProcessor(GrContext* context) const SK_OVERRIDE;
#endif
- virtual void filterSpan(const SkPMColor src[], int count,
- SkPMColor dst[]) const SK_OVERRIDE;
+ void filterSpan(const SkPMColor src[], int count, SkPMColor dst[]) const SK_OVERRIDE;
SK_TO_STRING_OVERRIDE()
@@ -109,8 +109,7 @@ static const uint8_t gIdentityTable[] = {
0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
};
-void SkTable_ColorFilter::filterSpan(const SkPMColor src[], int count,
- SkPMColor dst[]) const {
+void SkTable_ColorFilter::filterSpan(const SkPMColor src[], int count, SkPMColor dst[]) const {
const uint8_t* table = fStorage;
const uint8_t* tableA = gIdentityTable;
const uint8_t* tableR = gIdentityTable;
@@ -274,6 +273,56 @@ bool SkTable_ColorFilter::asComponentTable(SkBitmap* table) const {
return true;
}
+// Combines the two lookup tables so that making a lookup using res[] has
+// the same effect as making a lookup through inner[] then outer[].
+static void combine_tables(uint8_t res[256], const uint8_t outer[256], const uint8_t inner[256]) {
+ for (int i = 0; i < 256; i++) {
+ res[i] = outer[inner[i]];
+ }
+}
+
+SkColorFilter* SkTable_ColorFilter::newComposed(const SkColorFilter* innerFilter) const {
+ SkBitmap innerBM;
+ if (!innerFilter->asComponentTable(&innerBM)) {
+ return NULL;
+ }
+
+ innerBM.lockPixels();
+ if (NULL == innerBM.getPixels()) {
+ return NULL;
+ }
+
+ const uint8_t* table = fStorage;
+ const uint8_t* tableA = gIdentityTable;
+ const uint8_t* tableR = gIdentityTable;
+ const uint8_t* tableG = gIdentityTable;
+ const uint8_t* tableB = gIdentityTable;
+ if (fFlags & kA_Flag) {
+ tableA = table; table += 256;
+ }
+ if (fFlags & kR_Flag) {
+ tableR = table; table += 256;
+ }
+ if (fFlags & kG_Flag) {
+ tableG = table; table += 256;
+ }
+ if (fFlags & kB_Flag) {
+ tableB = table;
+ }
+
+ uint8_t concatA[256];
+ uint8_t concatR[256];
+ uint8_t concatG[256];
+ uint8_t concatB[256];
+
+ combine_tables(concatA, tableA, innerBM.getAddr8(0, 0));
+ combine_tables(concatR, tableR, innerBM.getAddr8(0, 1));
+ combine_tables(concatG, tableG, innerBM.getAddr8(0, 2));
+ combine_tables(concatB, tableB, innerBM.getAddr8(0, 3));
+
+ return SkTableColorFilter::CreateARGB(concatA, concatR, concatG, concatB);
+}
+
#if SK_SUPPORT_GPU
#include "GrFragmentProcessor.h"
« no previous file with comments | « src/effects/SkColorMatrixFilter.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698