1c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com 202f65f2d9168f2304a09d784dbcfeefb7669c8b4reed@google.com#include "SkBitmap.h" 3a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org#include "SkTableColorFilter.h" 4c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com#include "SkColorPriv.h" 58b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkReadBuffer.h" 68b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkWriteBuffer.h" 7a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org#include "SkUnPreMultiply.h" 81202c2ac563cdeb07406872825706b83e335c977robertphillips@google.com#include "SkString.h" 9a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 10a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgclass SkTable_ColorFilter : public SkColorFilter { 11a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgpublic: 12a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkTable_ColorFilter(const uint8_t tableA[], const uint8_t tableR[], 13a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org const uint8_t tableG[], const uint8_t tableB[]) { 14f23f5f7f499b0dc885dc4e4544cdfc6ef6280d1emike@reedtribe.org fBitmap = NULL; 15a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org fFlags = 0; 16f23f5f7f499b0dc885dc4e4544cdfc6ef6280d1emike@reedtribe.org 17a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org uint8_t* dst = fStorage; 18a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org if (tableA) { 19a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org memcpy(dst, tableA, 256); 20a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org dst += 256; 21a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org fFlags |= kA_Flag; 22a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } 23a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org if (tableR) { 24a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org memcpy(dst, tableR, 256); 25a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org dst += 256; 26a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org fFlags |= kR_Flag; 27a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } 28a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org if (tableG) { 29a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org memcpy(dst, tableG, 256); 30a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org dst += 256; 31a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org fFlags |= kG_Flag; 32a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } 33a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org if (tableB) { 34a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org memcpy(dst, tableB, 256); 35a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org fFlags |= kB_Flag; 36a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } 37a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } 38a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 391bb4be2384c48c2c8dfa4c855095792886b1b3a0tomhudson@google.com virtual ~SkTable_ColorFilter() { 401bb4be2384c48c2c8dfa4c855095792886b1b3a0tomhudson@google.com SkDELETE(fBitmap); 411bb4be2384c48c2c8dfa4c855095792886b1b3a0tomhudson@google.com } 421bb4be2384c48c2c8dfa4c855095792886b1b3a0tomhudson@google.com 43b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com virtual bool asComponentTable(SkBitmap* table) const SK_OVERRIDE; 44b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 45b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com#if SK_SUPPORT_GPU 46b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt virtual GrFragmentProcessor* asFragmentProcessor(GrContext* context) const SK_OVERRIDE; 47b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com#endif 48f23f5f7f499b0dc885dc4e4544cdfc6ef6280d1emike@reedtribe.org 49a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org virtual void filterSpan(const SkPMColor src[], int count, 50bada64428a52b4fc1f31a0a1982c2301ec57601creed@google.com SkPMColor dst[]) const SK_OVERRIDE; 51a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 520f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org SK_TO_STRING_OVERRIDE() 531202c2ac563cdeb07406872825706b83e335c977robertphillips@google.com 54ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkTable_ColorFilter) 55f23f5f7f499b0dc885dc4e4544cdfc6ef6280d1emike@reedtribe.org 56371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com enum { 57371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com kA_Flag = 1 << 0, 58371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com kR_Flag = 1 << 1, 59371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com kG_Flag = 1 << 2, 60371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com kB_Flag = 1 << 3, 61371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com }; 62371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com 63a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgprotected: 649fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING 658b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkTable_ColorFilter(SkReadBuffer& buffer); 669fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#endif 678b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE; 68a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 69a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgprivate: 70b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com mutable const SkBitmap* fBitmap; // lazily allocated 71f23f5f7f499b0dc885dc4e4544cdfc6ef6280d1emike@reedtribe.org 72a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org uint8_t fStorage[256 * 4]; 73a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org unsigned fFlags; 74a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 759fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed friend class SkTableColorFilter; 769fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed 77a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org typedef SkColorFilter INHERITED; 78a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}; 79a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 80a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic const uint8_t gIdentityTable[] = { 81fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 82fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 83fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 84fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 85fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 86fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 87fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 88fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 89fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 90fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 91fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 92fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 93fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 94fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 95fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 96fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 97fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 98fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 99fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 100fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 101fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 102fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 103fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 104fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 105fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 106fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 107fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 108fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 109fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 110fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 111fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 112a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF 113a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}; 114a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 115a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgvoid SkTable_ColorFilter::filterSpan(const SkPMColor src[], int count, 116bada64428a52b4fc1f31a0a1982c2301ec57601creed@google.com SkPMColor dst[]) const { 117a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org const uint8_t* table = fStorage; 118a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org const uint8_t* tableA = gIdentityTable; 119a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org const uint8_t* tableR = gIdentityTable; 120a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org const uint8_t* tableG = gIdentityTable; 121a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org const uint8_t* tableB = gIdentityTable; 122a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org if (fFlags & kA_Flag) { 123a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org tableA = table; table += 256; 124a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } 125a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org if (fFlags & kR_Flag) { 126a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org tableR = table; table += 256; 127a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } 128a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org if (fFlags & kG_Flag) { 129a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org tableG = table; table += 256; 130a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } 131a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org if (fFlags & kB_Flag) { 132a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org tableB = table; 133a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } 134a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 135a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org const SkUnPreMultiply::Scale* scaleTable = SkUnPreMultiply::GetScaleTable(); 136a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org for (int i = 0; i < count; ++i) { 137a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkPMColor c = src[i]; 138a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org unsigned a, r, g, b; 139a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org if (0 == c) { 140a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org a = r = g = b = 0; 141a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } else { 142a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org a = SkGetPackedA32(c); 143a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org r = SkGetPackedR32(c); 144a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org g = SkGetPackedG32(c); 145a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org b = SkGetPackedB32(c); 146a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 147a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org if (a < 255) { 148a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkUnPreMultiply::Scale scale = scaleTable[a]; 149a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org r = SkUnPreMultiply::ApplyScale(scale, r); 150a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org g = SkUnPreMultiply::ApplyScale(scale, g); 151a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org b = SkUnPreMultiply::ApplyScale(scale, b); 152a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } 153a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } 154a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org dst[i] = SkPremultiplyARGBInline(tableA[a], tableR[r], 155a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org tableG[g], tableB[b]); 156a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org } 157a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org} 158a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 1590f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org#ifndef SK_IGNORE_TO_STRING 1601202c2ac563cdeb07406872825706b83e335c977robertphillips@google.comvoid SkTable_ColorFilter::toString(SkString* str) const { 1611202c2ac563cdeb07406872825706b83e335c977robertphillips@google.com str->append("SkTable_ColorFilter"); 1621202c2ac563cdeb07406872825706b83e335c977robertphillips@google.com} 1631202c2ac563cdeb07406872825706b83e335c977robertphillips@google.com#endif 1641202c2ac563cdeb07406872825706b83e335c977robertphillips@google.com 165a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic const uint8_t gCountNibBits[] = { 166a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 0, 1, 1, 2, 167a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 1, 2, 2, 3, 168a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 1, 2, 2, 3, 169a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 2, 3, 3, 4 170a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}; 171a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 172a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org#include "SkPackBits.h" 173a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 1748b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.orgvoid SkTable_ColorFilter::flatten(SkWriteBuffer& buffer) const { 175a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org uint8_t storage[5*256]; 176a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org int count = gCountNibBits[fFlags & 0xF]; 177a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org size_t size = SkPackBits::Pack8(fStorage, count * 256, storage); 178a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkASSERT(size <= sizeof(storage)); 179a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 1809fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed buffer.write32(fFlags); 181c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com buffer.writeByteArray(storage, size); 182a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org} 183a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 1849fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reedSkFlattenable* SkTable_ColorFilter::CreateProc(SkReadBuffer& buffer) { 1859fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed const int flags = buffer.read32(); 1869fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed const size_t count = gCountNibBits[flags & 0xF]; 1879fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed SkASSERT(count <= 4); 1889fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed 1899fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed uint8_t packedStorage[5*256]; 1909fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed size_t packedSize = buffer.getArrayCount(); 1919fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed if (!buffer.validate(packedSize <= sizeof(packedStorage))) { 1929fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed return NULL; 1939fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed } 1949fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed if (!buffer.readByteArray(packedStorage, packedSize)) { 1959fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed return NULL; 1969fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed } 1979fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed 1989fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed uint8_t unpackedStorage[4*256]; 1999fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed size_t unpackedSize = SkPackBits::Unpack8(packedStorage, packedSize, unpackedStorage); 2009fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed // now check that we got the size we expected 201334896049dc5e1620d754368dc6d02856e79dc91senorblanco if (!buffer.validate(unpackedSize == count*256)) { 2029fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed return NULL; 2039fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed } 2049fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed 2059fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed const uint8_t* a = NULL; 2069fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed const uint8_t* r = NULL; 2079fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed const uint8_t* g = NULL; 2089fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed const uint8_t* b = NULL; 2099fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed const uint8_t* ptr = unpackedStorage; 2109fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed 2119fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed if (flags & kA_Flag) { 2129fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed a = ptr; 2139fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed ptr += 256; 2149fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed } 2159fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed if (flags & kR_Flag) { 2169fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed r = ptr; 2179fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed ptr += 256; 2189fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed } 2199fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed if (flags & kG_Flag) { 2209fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed g = ptr; 2219fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed ptr += 256; 2229fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed } 2239fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed if (flags & kB_Flag) { 2249fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed b = ptr; 2259fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed ptr += 256; 2269fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed } 2279fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed return SkTableColorFilter::CreateARGB(a, r, g, b); 2289fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed} 2299fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed 2309fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING 2318b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.orgSkTable_ColorFilter::SkTable_ColorFilter(SkReadBuffer& buffer) : INHERITED(buffer) { 232f23f5f7f499b0dc885dc4e4544cdfc6ef6280d1emike@reedtribe.org fBitmap = NULL; 233f23f5f7f499b0dc885dc4e4544cdfc6ef6280d1emike@reedtribe.org 234a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org uint8_t storage[5*256]; 235a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 236a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org fFlags = buffer.readInt(); 237c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com 238c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com size_t size = buffer.getArrayCount(); 239c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com SkASSERT(size <= sizeof(storage)); 240ef74fa189b738e13295d6a96f86a6e10223505a8commit-bot@chromium.org buffer.validate(size <= sizeof(storage)); 241025128811219dc45fd99b6c4d1d14f833cf7a26ecommit-bot@chromium.org buffer.readByteArray(storage, size); 242a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 2430e51577a14f903ffeafa117a75954baeb173ffb9humper@google.com SkDEBUGCODE(size_t raw = ) SkPackBits::Unpack8(storage, size, fStorage); 244a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 245a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkASSERT(raw <= sizeof(fStorage)); 2460e51577a14f903ffeafa117a75954baeb173ffb9humper@google.com SkDEBUGCODE(size_t count = gCountNibBits[fFlags & 0xF]); 247a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org SkASSERT(raw == count * 256); 248a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org} 2499fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#endif 250a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 251b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.combool SkTable_ColorFilter::asComponentTable(SkBitmap* table) const { 252f23f5f7f499b0dc885dc4e4544cdfc6ef6280d1emike@reedtribe.org if (table) { 253f23f5f7f499b0dc885dc4e4544cdfc6ef6280d1emike@reedtribe.org if (NULL == fBitmap) { 254b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com SkBitmap* bmp = SkNEW(SkBitmap); 2559ebcac54635cde63110d73ad7c43d70772e7872freed@google.com bmp->allocPixels(SkImageInfo::MakeA8(256, 4)); 256b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com uint8_t* bitmapPixels = bmp->getAddr8(0, 0); 257580711694654b8edc70028d09c4211445b661466twiz@google.com int offset = 0; 258580711694654b8edc70028d09c4211445b661466twiz@google.com static const unsigned kFlags[] = { kA_Flag, kR_Flag, kG_Flag, kB_Flag }; 259580711694654b8edc70028d09c4211445b661466twiz@google.com 260580711694654b8edc70028d09c4211445b661466twiz@google.com for (int x = 0; x < 4; ++x) { 261580711694654b8edc70028d09c4211445b661466twiz@google.com if (!(fFlags & kFlags[x])) { 262580711694654b8edc70028d09c4211445b661466twiz@google.com memcpy(bitmapPixels, gIdentityTable, sizeof(gIdentityTable)); 263580711694654b8edc70028d09c4211445b661466twiz@google.com } else { 264580711694654b8edc70028d09c4211445b661466twiz@google.com memcpy(bitmapPixels, fStorage + offset, 256); 265580711694654b8edc70028d09c4211445b661466twiz@google.com offset += 256; 266580711694654b8edc70028d09c4211445b661466twiz@google.com } 267580711694654b8edc70028d09c4211445b661466twiz@google.com bitmapPixels += 256; 268580711694654b8edc70028d09c4211445b661466twiz@google.com } 269b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com fBitmap = bmp; 270f23f5f7f499b0dc885dc4e4544cdfc6ef6280d1emike@reedtribe.org } 271f23f5f7f499b0dc885dc4e4544cdfc6ef6280d1emike@reedtribe.org *table = *fBitmap; 272f23f5f7f499b0dc885dc4e4544cdfc6ef6280d1emike@reedtribe.org } 273f23f5f7f499b0dc885dc4e4544cdfc6ef6280d1emike@reedtribe.org return true; 274f23f5f7f499b0dc885dc4e4544cdfc6ef6280d1emike@reedtribe.org} 275f23f5f7f499b0dc885dc4e4544cdfc6ef6280d1emike@reedtribe.org 276b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com#if SK_SUPPORT_GPU 277b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 278b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "GrProcessor.h" 279b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "GrTBackendProcessorFactory.h" 280b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "gl/GrGLProcessor.h" 28130ba436f04e61d4505fb854d5fc56079636e0788joshualitt#include "gl/builders/GrGLProgramBuilder.h" 282b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com#include "SkGr.h" 283b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 284b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.comclass GLColorTableEffect; 285b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 286b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass ColorTableEffect : public GrFragmentProcessor { 287b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.compublic: 288b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt static GrFragmentProcessor* Create(GrTexture* texture, unsigned flags) { 28955fad7af61c21d502acb9891d631e8aa29e3628cbsalomon return SkNEW_ARGS(ColorTableEffect, (texture, flags)); 2900ac6af49975c54c2debf41e9200af416ecd2d973bsalomon@google.com } 291b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 292b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com virtual ~ColorTableEffect(); 293b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 294b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com static const char* Name() { return "ColorTable"; } 295b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERRIDE; 296b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 297371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; 298371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com 299b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt typedef GLColorTableEffect GLProcessor; 300b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 301b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.comprivate: 302b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt virtual bool onIsEqual(const GrProcessor&) const SK_OVERRIDE; 30368b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com 3040ac6af49975c54c2debf41e9200af416ecd2d973bsalomon@google.com explicit ColorTableEffect(GrTexture* texture, unsigned flags); 3050ac6af49975c54c2debf41e9200af416ecd2d973bsalomon@google.com 306b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GR_DECLARE_FRAGMENT_PROCESSOR_TEST; 307b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 308b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com GrTextureAccess fTextureAccess; 309371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com unsigned fFlags; // currently not used in shader code, just to assist 310371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com // getConstantColorComponents(). 311b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 312b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt typedef GrFragmentProcessor INHERITED; 313b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com}; 314b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 315b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GLColorTableEffect : public GrGLFragmentProcessor { 316b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.compublic: 317b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GLColorTableEffect(const GrBackendProcessorFactory&, const GrProcessor&); 318b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 31930ba436f04e61d4505fb854d5fc56079636e0788joshualitt virtual void emitCode(GrGLProgramBuilder*, 320b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrFragmentProcessor&, 321b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrProcessorKey&, 32222a800a2578564a8b66bd4d9903ef4186c37f35cbsalomon@google.com const char* outputColor, 32322a800a2578564a8b66bd4d9903ef4186c37f35cbsalomon@google.com const char* inputColor, 32477af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com const TransformedCoordsArray&, 32522a800a2578564a8b66bd4d9903ef4186c37f35cbsalomon@google.com const TextureSamplerArray&) SK_OVERRIDE; 326b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 327b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_OVERRIDE {} 328b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 329b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt static void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKeyBuilder* b) {} 330b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 331b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.comprivate: 332b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 333b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt typedef GrGLFragmentProcessor INHERITED; 334b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com}; 335b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 336b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGLColorTableEffect::GLColorTableEffect(const GrBackendProcessorFactory& factory, const GrProcessor&) 337b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com : INHERITED(factory) { 338b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com } 339b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 34030ba436f04e61d4505fb854d5fc56079636e0788joshualittvoid GLColorTableEffect::emitCode(GrGLProgramBuilder* builder, 341b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrFragmentProcessor&, 342b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrProcessorKey&, 343b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com const char* outputColor, 344b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com const char* inputColor, 34577af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com const TransformedCoordsArray&, 346b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com const TextureSamplerArray& samplers) { 34722a800a2578564a8b66bd4d9903ef4186c37f35cbsalomon@google.com 348b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com static const float kColorScaleFactor = 255.0f / 256.0f; 349b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com static const float kColorOffsetFactor = 1.0f / 512.0f; 35030ba436f04e61d4505fb854d5fc56079636e0788joshualitt GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); 351b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com if (NULL == inputColor) { 352b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com // the input color is solid white (all ones). 353b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com static const float kMaxValue = kColorScaleFactor + kColorOffsetFactor; 35430ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tvec4 coord = vec4(%f, %f, %f, %f);\n", 355f910d3b23bcf590ee937628dbab8e39a98ee5860bsalomon@google.com kMaxValue, kMaxValue, kMaxValue, kMaxValue); 356b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 357b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com } else { 35830ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tfloat nonZeroAlpha = max(%s.a, .0001);\n", inputColor); 35930ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tvec4 coord = vec4(%s.rgb / nonZeroAlpha, nonZeroAlpha);\n", inputColor); 36030ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\tcoord = coord * %f + vec4(%f, %f, %f, %f);\n", 361f910d3b23bcf590ee937628dbab8e39a98ee5860bsalomon@google.com kColorScaleFactor, 362f910d3b23bcf590ee937628dbab8e39a98ee5860bsalomon@google.com kColorOffsetFactor, kColorOffsetFactor, 363f910d3b23bcf590ee937628dbab8e39a98ee5860bsalomon@google.com kColorOffsetFactor, kColorOffsetFactor); 364b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com } 365b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 36630ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\t%s.a = ", outputColor); 36730ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->appendTextureLookup(samplers[0], "vec2(coord.a, 0.125)"); 36830ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend(";\n"); 369b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 37030ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\t%s.r = ", outputColor); 37130ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->appendTextureLookup(samplers[0], "vec2(coord.r, 0.375)"); 37230ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend(";\n"); 373b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 37430ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\t%s.g = ", outputColor); 37530ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->appendTextureLookup(samplers[0], "vec2(coord.g, 0.625)"); 37630ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend(";\n"); 377b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 37830ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\t%s.b = ", outputColor); 37930ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->appendTextureLookup(samplers[0], "vec2(coord.b, 0.875)"); 38030ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppend(";\n"); 381b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 38230ba436f04e61d4505fb854d5fc56079636e0788joshualitt fsBuilder->codeAppendf("\t\t%s.rgb *= %s.a;\n", outputColor, outputColor); 383b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com} 384b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 385b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com/////////////////////////////////////////////////////////////////////////////// 386b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 387371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.comColorTableEffect::ColorTableEffect(GrTexture* texture, unsigned flags) 388371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com : fTextureAccess(texture, "a") 389371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com , fFlags(flags) { 39050db75c871b203081a32190ab173f13c785a147fbsalomon@google.com this->addTextureAccess(&fTextureAccess); 391b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com} 392b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 393b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.comColorTableEffect::~ColorTableEffect() { 394b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com} 395b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 396b0a8a377f832c59cee939ad721e1f87d378b7142joshualittconst GrBackendFragmentProcessorFactory& ColorTableEffect::getFactory() const { 397b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt return GrTBackendFragmentProcessorFactory<ColorTableEffect>::getInstance(); 398b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com} 399b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 400b0a8a377f832c59cee939ad721e1f87d378b7142joshualittbool ColorTableEffect::onIsEqual(const GrProcessor& sBase) const { 4018a252f79629b189a03de22cd8ff0312c5bccedd1bsalomon@google.com return this->texture(0) == sBase.texture(0); 402b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com} 403b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 404371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.comvoid ColorTableEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { 405371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com // If we kept the table in the effect then we could actually run known inputs through the 406371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com // table. 407371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com if (fFlags & SkTable_ColorFilter::kR_Flag) { 408b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com *validFlags &= ~kR_GrColorComponentFlag; 409371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com } 410371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com if (fFlags & SkTable_ColorFilter::kG_Flag) { 411b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com *validFlags &= ~kG_GrColorComponentFlag; 412371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com } 413371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com if (fFlags & SkTable_ColorFilter::kB_Flag) { 414b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com *validFlags &= ~kB_GrColorComponentFlag; 415371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com } 416371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com if (fFlags & SkTable_ColorFilter::kA_Flag) { 417b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com *validFlags &= ~kA_GrColorComponentFlag; 418371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com } 419371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com} 420371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com 421371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com 422b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com/////////////////////////////////////////////////////////////////////////////// 423b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 424b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGR_DEFINE_FRAGMENT_PROCESSOR_TEST(ColorTableEffect); 425b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 426b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* ColorTableEffect::TestCreate(SkRandom* random, 427b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrContext* context, 428b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrDrawTargetCaps&, 429b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrTexture* textures[]) { 430371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com static unsigned kAllFlags = SkTable_ColorFilter::kR_Flag | SkTable_ColorFilter::kG_Flag | 431371e105da5d9fdfff3b4242b37ff6fc09214c8c8bsalomon@google.com SkTable_ColorFilter::kB_Flag | SkTable_ColorFilter::kA_Flag; 432b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt return ColorTableEffect::Create(textures[GrProcessorUnitTest::kAlphaTextureIdx], kAllFlags); 433b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com} 434b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 435b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* SkTable_ColorFilter::asFragmentProcessor(GrContext* context) const { 436b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com SkBitmap bitmap; 437b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrFragmentProcessor* fp = NULL; 438b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com this->asComponentTable(&bitmap); 4398ea78d83dc4e8243c16eedf8100a3987c54123fabsalomon@google.com // passing NULL because this effect does no tiling or filtering. 44095ed55adc6b8f0cee063c2cf2e14782773b0087fbsalomon@google.com GrTexture* texture = GrLockAndRefCachedBitmapTexture(context, bitmap, NULL); 44149f085dddff10473b6ebf832a974288300224e60bsalomon if (texture) { 442b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt fp = ColorTableEffect::Create(texture, fFlags); 443b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 444c7d624ec535adcc388cad35b3475872b08cd90c0commit-bot@chromium.org // Unlock immediately, this is not great, but we don't have a way of 445c7d624ec535adcc388cad35b3475872b08cd90c0commit-bot@chromium.org // knowing when else to unlock it currently. TODO: Remove this when 446c7d624ec535adcc388cad35b3475872b08cd90c0commit-bot@chromium.org // unref becomes the unlock replacement for all types of textures. 447c7d624ec535adcc388cad35b3475872b08cd90c0commit-bot@chromium.org GrUnlockAndUnrefCachedBitmapTexture(texture); 448c7d624ec535adcc388cad35b3475872b08cd90c0commit-bot@chromium.org } 449b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt return fp; 450b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com} 451b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 452b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com#endif // SK_SUPPORT_GPU 453b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.com 454a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org/////////////////////////////////////////////////////////////////////////////// 455a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 456a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org#ifdef SK_CPU_BENDIAN 457a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org#else 458a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org #define SK_A32_INDEX (3 - (SK_A32_SHIFT >> 3)) 459a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org #define SK_R32_INDEX (3 - (SK_R32_SHIFT >> 3)) 460a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org #define SK_G32_INDEX (3 - (SK_G32_SHIFT >> 3)) 461a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org #define SK_B32_INDEX (3 - (SK_B32_SHIFT >> 3)) 462a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org#endif 463a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 464a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org/////////////////////////////////////////////////////////////////////////////// 465a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 466a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgSkColorFilter* SkTableColorFilter::Create(const uint8_t table[256]) { 467a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org return SkNEW_ARGS(SkTable_ColorFilter, (table, table, table, table)); 468a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org} 469a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org 470a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgSkColorFilter* SkTableColorFilter::CreateARGB(const uint8_t tableA[256], 471a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org const uint8_t tableR[256], 472a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org const uint8_t tableG[256], 473a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org const uint8_t tableB[256]) { 474a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org return SkNEW_ARGS(SkTable_ColorFilter, (tableA, tableR, tableG, tableB)); 475a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org} 476a2ca41e3afdd8fad5e0e924dec029f33918e0a67djsollen@google.com 477a2ca41e3afdd8fad5e0e924dec029f33918e0a67djsollen@google.comSK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkTableColorFilter) 478a2ca41e3afdd8fad5e0e924dec029f33918e0a67djsollen@google.com SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkTable_ColorFilter) 479a2ca41e3afdd8fad5e0e924dec029f33918e0a67djsollen@google.comSK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 480