19ce78f26f529fd3e10a3eb4f044bc3f0037ead56djsollen@google.com 2e54ef29a2cc707807a3b5581fc01f49f75a3bf86reed@google.com#include "SkBitmap.h" 3e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org#include "SkTableColorFilter.h" 49ce78f26f529fd3e10a3eb4f044bc3f0037ead56djsollen@google.com#include "SkColorPriv.h" 59ce78f26f529fd3e10a3eb4f044bc3f0037ead56djsollen@google.com#include "SkFlattenableBuffers.h" 6e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org#include "SkUnPreMultiply.h" 7d3712669f4746905eb23f522b80b842d6fa7d493robertphillips@google.com#include "SkString.h" 8e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 9e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.orgclass SkTable_ColorFilter : public SkColorFilter { 10e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.orgpublic: 11e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org SkTable_ColorFilter(const uint8_t tableA[], const uint8_t tableR[], 12e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org const uint8_t tableG[], const uint8_t tableB[]) { 137484d391b74a0699b3938138a02a8d64479f5ddbmike@reedtribe.org fBitmap = NULL; 14e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org fFlags = 0; 157484d391b74a0699b3938138a02a8d64479f5ddbmike@reedtribe.org 16e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org uint8_t* dst = fStorage; 17e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org if (tableA) { 18e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org memcpy(dst, tableA, 256); 19e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org dst += 256; 20e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org fFlags |= kA_Flag; 21e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org } 22e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org if (tableR) { 23e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org memcpy(dst, tableR, 256); 24e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org dst += 256; 25e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org fFlags |= kR_Flag; 26e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org } 27e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org if (tableG) { 28e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org memcpy(dst, tableG, 256); 29e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org dst += 256; 30e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org fFlags |= kG_Flag; 31e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org } 32e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org if (tableB) { 33e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org memcpy(dst, tableB, 256); 34e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org fFlags |= kB_Flag; 35e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org } 36e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org } 37e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 38b3f152d3ed3f7eb58602d1f2d1cb257444518080tomhudson@google.com virtual ~SkTable_ColorFilter() { 39b3f152d3ed3f7eb58602d1f2d1cb257444518080tomhudson@google.com SkDELETE(fBitmap); 40b3f152d3ed3f7eb58602d1f2d1cb257444518080tomhudson@google.com } 41b3f152d3ed3f7eb58602d1f2d1cb257444518080tomhudson@google.com 42f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com virtual bool asComponentTable(SkBitmap* table) const SK_OVERRIDE; 43f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 44f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com#if SK_SUPPORT_GPU 4538b58f31a3070ea9254d55894a59528270ac67ddbsalomon@google.com virtual GrEffectRef* asNewEffect(GrContext* context) const SK_OVERRIDE; 46f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com#endif 477484d391b74a0699b3938138a02a8d64479f5ddbmike@reedtribe.org 48e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org virtual void filterSpan(const SkPMColor src[], int count, 4930fbfea86dac6e5a2134d2ad04574b6420143b48reed@google.com SkPMColor dst[]) const SK_OVERRIDE; 50e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 51d3712669f4746905eb23f522b80b842d6fa7d493robertphillips@google.com SkDEVCODE(virtual void toString(SkString* str) const SK_OVERRIDE;) 52d3712669f4746905eb23f522b80b842d6fa7d493robertphillips@google.com 534d1d95c61576960796347e1dd5006d878e9d2dc0djsollen@google.com SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkTable_ColorFilter) 547484d391b74a0699b3938138a02a8d64479f5ddbmike@reedtribe.org 551de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com enum { 561de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com kA_Flag = 1 << 0, 571de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com kR_Flag = 1 << 1, 581de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com kG_Flag = 1 << 2, 591de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com kB_Flag = 1 << 3, 601de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com }; 611de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com 62e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.orgprotected: 63e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org SkTable_ColorFilter(SkFlattenableReadBuffer& buffer); 64cd2e444e946f5cfec4723f5bc46e9487d82e8e54djsollen@google.com virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE; 65e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 66e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.orgprivate: 67f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com mutable const SkBitmap* fBitmap; // lazily allocated 687484d391b74a0699b3938138a02a8d64479f5ddbmike@reedtribe.org 69e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org uint8_t fStorage[256 * 4]; 70e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org unsigned fFlags; 71e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 72e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org typedef SkColorFilter INHERITED; 73e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org}; 74e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 75e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.orgstatic const uint8_t gIdentityTable[] = { 76935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 77935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 78935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 79935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 80935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 81935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 82935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 83935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 84935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 85935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 86935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 87935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 88935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 89935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 90935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 91935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 92935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 93935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 94935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 95935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 96935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 97935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 98935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 99935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 100935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 101935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 102935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 103935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 104935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 105935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 106935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 107e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF 108e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org}; 109e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 110e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.orgvoid SkTable_ColorFilter::filterSpan(const SkPMColor src[], int count, 11130fbfea86dac6e5a2134d2ad04574b6420143b48reed@google.com SkPMColor dst[]) const { 112e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org const uint8_t* table = fStorage; 113e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org const uint8_t* tableA = gIdentityTable; 114e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org const uint8_t* tableR = gIdentityTable; 115e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org const uint8_t* tableG = gIdentityTable; 116e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org const uint8_t* tableB = gIdentityTable; 117e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org if (fFlags & kA_Flag) { 118e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org tableA = table; table += 256; 119e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org } 120e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org if (fFlags & kR_Flag) { 121e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org tableR = table; table += 256; 122e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org } 123e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org if (fFlags & kG_Flag) { 124e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org tableG = table; table += 256; 125e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org } 126e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org if (fFlags & kB_Flag) { 127e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org tableB = table; 128e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org } 129e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 130e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org const SkUnPreMultiply::Scale* scaleTable = SkUnPreMultiply::GetScaleTable(); 131e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org for (int i = 0; i < count; ++i) { 132e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org SkPMColor c = src[i]; 133e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org unsigned a, r, g, b; 134e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org if (0 == c) { 135e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org a = r = g = b = 0; 136e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org } else { 137e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org a = SkGetPackedA32(c); 138e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org r = SkGetPackedR32(c); 139e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org g = SkGetPackedG32(c); 140e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org b = SkGetPackedB32(c); 141e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 142e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org if (a < 255) { 143e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org SkUnPreMultiply::Scale scale = scaleTable[a]; 144e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org r = SkUnPreMultiply::ApplyScale(scale, r); 145e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org g = SkUnPreMultiply::ApplyScale(scale, g); 146e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org b = SkUnPreMultiply::ApplyScale(scale, b); 147e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org } 148e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org } 149e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org dst[i] = SkPremultiplyARGBInline(tableA[a], tableR[r], 150e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org tableG[g], tableB[b]); 151e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org } 152e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org} 153e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 154d3712669f4746905eb23f522b80b842d6fa7d493robertphillips@google.com#ifdef SK_DEVELOPER 155d3712669f4746905eb23f522b80b842d6fa7d493robertphillips@google.comvoid SkTable_ColorFilter::toString(SkString* str) const { 156d3712669f4746905eb23f522b80b842d6fa7d493robertphillips@google.com str->append("SkTable_ColorFilter"); 157d3712669f4746905eb23f522b80b842d6fa7d493robertphillips@google.com} 158d3712669f4746905eb23f522b80b842d6fa7d493robertphillips@google.com#endif 159d3712669f4746905eb23f522b80b842d6fa7d493robertphillips@google.com 160e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.orgstatic const uint8_t gCountNibBits[] = { 161e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 0, 1, 1, 2, 162e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 1, 2, 2, 3, 163e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 1, 2, 2, 3, 164e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 2, 3, 3, 4 165e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org}; 166e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 167e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org#include "SkPackBits.h" 168e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 169cd2e444e946f5cfec4723f5bc46e9487d82e8e54djsollen@google.comvoid SkTable_ColorFilter::flatten(SkFlattenableWriteBuffer& buffer) const { 170e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org this->INHERITED::flatten(buffer); 171e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 172e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org uint8_t storage[5*256]; 173e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org int count = gCountNibBits[fFlags & 0xF]; 174e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org size_t size = SkPackBits::Pack8(fStorage, count * 256, storage); 175e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org SkASSERT(size <= sizeof(storage)); 176e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 177e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org// SkDebugf("raw %d packed %d\n", count * 256, size); 178935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 179e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org buffer.writeInt(fFlags); 1809ce78f26f529fd3e10a3eb4f044bc3f0037ead56djsollen@google.com buffer.writeByteArray(storage, size); 181e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org} 182e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 183e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.orgSkTable_ColorFilter::SkTable_ColorFilter(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { 1847484d391b74a0699b3938138a02a8d64479f5ddbmike@reedtribe.org fBitmap = NULL; 1857484d391b74a0699b3938138a02a8d64479f5ddbmike@reedtribe.org 186e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org uint8_t storage[5*256]; 187e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 188e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org fFlags = buffer.readInt(); 1899ce78f26f529fd3e10a3eb4f044bc3f0037ead56djsollen@google.com 1909ce78f26f529fd3e10a3eb4f044bc3f0037ead56djsollen@google.com size_t size = buffer.getArrayCount(); 1919ce78f26f529fd3e10a3eb4f044bc3f0037ead56djsollen@google.com SkASSERT(size <= sizeof(storage)); 192863cb3951e8da2d2eb8efd57c94d8f5ba069123ccommit-bot@chromium.org buffer.readByteArray(storage, size); 193e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 194afcc161571327871da95761248abefeaafed40a4humper@google.com SkDEBUGCODE(size_t raw = ) SkPackBits::Unpack8(storage, size, fStorage); 195e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 196e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org SkASSERT(raw <= sizeof(fStorage)); 197afcc161571327871da95761248abefeaafed40a4humper@google.com SkDEBUGCODE(size_t count = gCountNibBits[fFlags & 0xF]); 198e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org SkASSERT(raw == count * 256); 199e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org} 200e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 201f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.combool SkTable_ColorFilter::asComponentTable(SkBitmap* table) const { 2027484d391b74a0699b3938138a02a8d64479f5ddbmike@reedtribe.org if (table) { 2037484d391b74a0699b3938138a02a8d64479f5ddbmike@reedtribe.org if (NULL == fBitmap) { 204f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com SkBitmap* bmp = SkNEW(SkBitmap); 205f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com bmp->setConfig(SkBitmap::kA8_Config, 256, 4, 256); 206f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com bmp->allocPixels(); 207f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com uint8_t* bitmapPixels = bmp->getAddr8(0, 0); 208becae500bc4c6ee7d4489468c0e99616a1218953twiz@google.com int offset = 0; 209becae500bc4c6ee7d4489468c0e99616a1218953twiz@google.com static const unsigned kFlags[] = { kA_Flag, kR_Flag, kG_Flag, kB_Flag }; 210becae500bc4c6ee7d4489468c0e99616a1218953twiz@google.com 211becae500bc4c6ee7d4489468c0e99616a1218953twiz@google.com for (int x = 0; x < 4; ++x) { 212becae500bc4c6ee7d4489468c0e99616a1218953twiz@google.com if (!(fFlags & kFlags[x])) { 213becae500bc4c6ee7d4489468c0e99616a1218953twiz@google.com memcpy(bitmapPixels, gIdentityTable, sizeof(gIdentityTable)); 214becae500bc4c6ee7d4489468c0e99616a1218953twiz@google.com } else { 215becae500bc4c6ee7d4489468c0e99616a1218953twiz@google.com memcpy(bitmapPixels, fStorage + offset, 256); 216becae500bc4c6ee7d4489468c0e99616a1218953twiz@google.com offset += 256; 217becae500bc4c6ee7d4489468c0e99616a1218953twiz@google.com } 218becae500bc4c6ee7d4489468c0e99616a1218953twiz@google.com bitmapPixels += 256; 219becae500bc4c6ee7d4489468c0e99616a1218953twiz@google.com } 220f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com fBitmap = bmp; 2217484d391b74a0699b3938138a02a8d64479f5ddbmike@reedtribe.org } 2227484d391b74a0699b3938138a02a8d64479f5ddbmike@reedtribe.org *table = *fBitmap; 2237484d391b74a0699b3938138a02a8d64479f5ddbmike@reedtribe.org } 2247484d391b74a0699b3938138a02a8d64479f5ddbmike@reedtribe.org return true; 2257484d391b74a0699b3938138a02a8d64479f5ddbmike@reedtribe.org} 2267484d391b74a0699b3938138a02a8d64479f5ddbmike@reedtribe.org 227f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com#if SK_SUPPORT_GPU 228f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 2293829e11b4220c9dd4b23985111deefa061716435bsalomon@google.com#include "GrEffect.h" 2308780f037626b5196962a39ab76afd51f094a7765bsalomon@google.com#include "GrTBackendEffectFactory.h" 231aab3f0a5176fa13f1f0452386651dc5c8676ba68bsalomon@google.com#include "gl/GrGLEffect.h" 232f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com#include "SkGr.h" 233f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 234f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.comclass GLColorTableEffect; 235f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 2363829e11b4220c9dd4b23985111deefa061716435bsalomon@google.comclass ColorTableEffect : public GrEffect { 237f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.compublic: 23838b58f31a3070ea9254d55894a59528270ac67ddbsalomon@google.com static GrEffectRef* Create(GrTexture* texture, unsigned flags) { 239ba8399f132a172950b49dec019e910ff681928f6bsalomon@google.com AutoEffectUnref effect(SkNEW_ARGS(ColorTableEffect, (texture, flags))); 24086e2faff92b4e897e1e38e8728f098a5d9d22034bsalomon@google.com return CreateEffectRef(effect); 24138b58f31a3070ea9254d55894a59528270ac67ddbsalomon@google.com } 242f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 243f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com virtual ~ColorTableEffect(); 244f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 245f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com static const char* Name() { return "ColorTable"; } 2461f64de790a624dc250d3da0789b3ada6251facb7bsalomon@google.com virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; 247f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 2481de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; 2491de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com 250ca5e87e973b87209b5ffa298b8bc6ce0c512a204bsalomon@google.com typedef GLColorTableEffect GLEffect; 251f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 252f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.comprivate: 2536a2cef0e27af0600fe1afcc0fcda2f3011371be9bsalomon@google.com virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; 254c230a788e0c4339ca1638b79c493055d75ceefc5bsalomon@google.com 25538b58f31a3070ea9254d55894a59528270ac67ddbsalomon@google.com explicit ColorTableEffect(GrTexture* texture, unsigned flags); 25638b58f31a3070ea9254d55894a59528270ac67ddbsalomon@google.com 2577e0b48a766909be86a2923d909b85c111de4d237bsalomon@google.com GR_DECLARE_EFFECT_TEST; 258f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 259f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com GrTextureAccess fTextureAccess; 2601de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com unsigned fFlags; // currently not used in shader code, just to assist 2611de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com // getConstantColorComponents(). 262f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 2633829e11b4220c9dd4b23985111deefa061716435bsalomon@google.com typedef GrEffect INHERITED; 264f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com}; 265f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 2668780f037626b5196962a39ab76afd51f094a7765bsalomon@google.comclass GLColorTableEffect : public GrGLEffect { 267f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.compublic: 2688bc9236bf27d711cc7fe5cd618b02d29d7c59881bsalomon@google.com GLColorTableEffect(const GrBackendEffectFactory&, const GrDrawEffect&); 269f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 2708780f037626b5196962a39ab76afd51f094a7765bsalomon@google.com virtual void emitCode(GrGLShaderBuilder*, 2718bc9236bf27d711cc7fe5cd618b02d29d7c59881bsalomon@google.com const GrDrawEffect&, 2728780f037626b5196962a39ab76afd51f094a7765bsalomon@google.com EffectKey, 2738780f037626b5196962a39ab76afd51f094a7765bsalomon@google.com const char* outputColor, 2748780f037626b5196962a39ab76afd51f094a7765bsalomon@google.com const char* inputColor, 2750a42d756187a602db0d7455bf08fe9b1ced08854bsalomon@google.com const TransformedCoordsArray&, 2768780f037626b5196962a39ab76afd51f094a7765bsalomon@google.com const TextureSamplerArray&) SK_OVERRIDE; 277f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 2788bc9236bf27d711cc7fe5cd618b02d29d7c59881bsalomon@google.com virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE {} 279f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 2808bc9236bf27d711cc7fe5cd618b02d29d7c59881bsalomon@google.com static EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); 281f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 282f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.comprivate: 283f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 2848780f037626b5196962a39ab76afd51f094a7765bsalomon@google.com typedef GrGLEffect INHERITED; 285f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com}; 286f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 2878bc9236bf27d711cc7fe5cd618b02d29d7c59881bsalomon@google.comGLColorTableEffect::GLColorTableEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&) 288f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com : INHERITED(factory) { 289f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com } 290f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 2918780f037626b5196962a39ab76afd51f094a7765bsalomon@google.comvoid GLColorTableEffect::emitCode(GrGLShaderBuilder* builder, 2928bc9236bf27d711cc7fe5cd618b02d29d7c59881bsalomon@google.com const GrDrawEffect&, 2938780f037626b5196962a39ab76afd51f094a7765bsalomon@google.com EffectKey, 294f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com const char* outputColor, 295f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com const char* inputColor, 2960a42d756187a602db0d7455bf08fe9b1ced08854bsalomon@google.com const TransformedCoordsArray&, 297f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com const TextureSamplerArray& samplers) { 2988780f037626b5196962a39ab76afd51f094a7765bsalomon@google.com 299f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com static const float kColorScaleFactor = 255.0f / 256.0f; 300f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com static const float kColorOffsetFactor = 1.0f / 512.0f; 301f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com if (NULL == inputColor) { 302f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com // the input color is solid white (all ones). 303f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com static const float kMaxValue = kColorScaleFactor + kColorOffsetFactor; 304093bc9ad71adeb7a2a6a2aa3d123e846f2f6f8f4bsalomon@google.com builder->fsCodeAppendf("\t\tvec4 coord = vec4(%f, %f, %f, %f);\n", 305093bc9ad71adeb7a2a6a2aa3d123e846f2f6f8f4bsalomon@google.com kMaxValue, kMaxValue, kMaxValue, kMaxValue); 306f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 307f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com } else { 308093bc9ad71adeb7a2a6a2aa3d123e846f2f6f8f4bsalomon@google.com builder->fsCodeAppendf("\t\tfloat nonZeroAlpha = max(%s.a, .0001);\n", inputColor); 309093bc9ad71adeb7a2a6a2aa3d123e846f2f6f8f4bsalomon@google.com builder->fsCodeAppendf("\t\tvec4 coord = vec4(%s.rgb / nonZeroAlpha, nonZeroAlpha);\n", inputColor); 310093bc9ad71adeb7a2a6a2aa3d123e846f2f6f8f4bsalomon@google.com builder->fsCodeAppendf("\t\tcoord = coord * %f + vec4(%f, %f, %f, %f);\n", 311093bc9ad71adeb7a2a6a2aa3d123e846f2f6f8f4bsalomon@google.com kColorScaleFactor, 312093bc9ad71adeb7a2a6a2aa3d123e846f2f6f8f4bsalomon@google.com kColorOffsetFactor, kColorOffsetFactor, 313093bc9ad71adeb7a2a6a2aa3d123e846f2f6f8f4bsalomon@google.com kColorOffsetFactor, kColorOffsetFactor); 314f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com } 315f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 316093bc9ad71adeb7a2a6a2aa3d123e846f2f6f8f4bsalomon@google.com builder->fsCodeAppendf("\t\t%s.a = ", outputColor); 317651caa1c3a543cde0f805555ee3c8ff9ca2782f1commit-bot@chromium.org builder->fsAppendTextureLookup(samplers[0], "vec2(coord.a, 0.125)"); 318093bc9ad71adeb7a2a6a2aa3d123e846f2f6f8f4bsalomon@google.com builder->fsCodeAppend(";\n"); 319f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 320093bc9ad71adeb7a2a6a2aa3d123e846f2f6f8f4bsalomon@google.com builder->fsCodeAppendf("\t\t%s.r = ", outputColor); 321651caa1c3a543cde0f805555ee3c8ff9ca2782f1commit-bot@chromium.org builder->fsAppendTextureLookup(samplers[0], "vec2(coord.r, 0.375)"); 322093bc9ad71adeb7a2a6a2aa3d123e846f2f6f8f4bsalomon@google.com builder->fsCodeAppend(";\n"); 323f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 324093bc9ad71adeb7a2a6a2aa3d123e846f2f6f8f4bsalomon@google.com builder->fsCodeAppendf("\t\t%s.g = ", outputColor); 325651caa1c3a543cde0f805555ee3c8ff9ca2782f1commit-bot@chromium.org builder->fsAppendTextureLookup(samplers[0], "vec2(coord.g, 0.625)"); 326093bc9ad71adeb7a2a6a2aa3d123e846f2f6f8f4bsalomon@google.com builder->fsCodeAppend(";\n"); 327f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 328093bc9ad71adeb7a2a6a2aa3d123e846f2f6f8f4bsalomon@google.com builder->fsCodeAppendf("\t\t%s.b = ", outputColor); 329651caa1c3a543cde0f805555ee3c8ff9ca2782f1commit-bot@chromium.org builder->fsAppendTextureLookup(samplers[0], "vec2(coord.b, 0.875)"); 330093bc9ad71adeb7a2a6a2aa3d123e846f2f6f8f4bsalomon@google.com builder->fsCodeAppend(";\n"); 331f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 332093bc9ad71adeb7a2a6a2aa3d123e846f2f6f8f4bsalomon@google.com builder->fsCodeAppendf("\t\t%s.rgb *= %s.a;\n", outputColor, outputColor); 333f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com} 334f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 3358bc9236bf27d711cc7fe5cd618b02d29d7c59881bsalomon@google.comGrGLEffect::EffectKey GLColorTableEffect::GenKey(const GrDrawEffect&, const GrGLCaps&) { 336f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com return 0; 337f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com} 338f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 339f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com/////////////////////////////////////////////////////////////////////////////// 340f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 3411de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.comColorTableEffect::ColorTableEffect(GrTexture* texture, unsigned flags) 3421de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com : fTextureAccess(texture, "a") 3431de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com , fFlags(flags) { 344a5877cb932de3005a49b16e9c50fd569a9f75214bsalomon@google.com this->addTextureAccess(&fTextureAccess); 345f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com} 346f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 347f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.comColorTableEffect::~ColorTableEffect() { 348f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com} 349f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 3501f64de790a624dc250d3da0789b3ada6251facb7bsalomon@google.comconst GrBackendEffectFactory& ColorTableEffect::getFactory() const { 3511f64de790a624dc250d3da0789b3ada6251facb7bsalomon@google.com return GrTBackendEffectFactory<ColorTableEffect>::getInstance(); 352f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com} 353f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 3546a2cef0e27af0600fe1afcc0fcda2f3011371be9bsalomon@google.combool ColorTableEffect::onIsEqual(const GrEffect& sBase) const { 3556a2cef0e27af0600fe1afcc0fcda2f3011371be9bsalomon@google.com return this->texture(0) == sBase.texture(0); 356f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com} 357f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 3581de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.comvoid ColorTableEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { 3591de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com // If we kept the table in the effect then we could actually run known inputs through the 3601de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com // table. 3611de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com if (fFlags & SkTable_ColorFilter::kR_Flag) { 362c3abb7baff528b64f175e08350a92a0d72ca24bebsalomon@google.com *validFlags &= ~kR_GrColorComponentFlag; 3631de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com } 3641de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com if (fFlags & SkTable_ColorFilter::kG_Flag) { 365c3abb7baff528b64f175e08350a92a0d72ca24bebsalomon@google.com *validFlags &= ~kG_GrColorComponentFlag; 3661de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com } 3671de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com if (fFlags & SkTable_ColorFilter::kB_Flag) { 368c3abb7baff528b64f175e08350a92a0d72ca24bebsalomon@google.com *validFlags &= ~kB_GrColorComponentFlag; 3691de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com } 3701de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com if (fFlags & SkTable_ColorFilter::kA_Flag) { 371c3abb7baff528b64f175e08350a92a0d72ca24bebsalomon@google.com *validFlags &= ~kA_GrColorComponentFlag; 3721de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com } 3731de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com} 3741de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com 3751de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com 376f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com/////////////////////////////////////////////////////////////////////////////// 377f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 3787e0b48a766909be86a2923d909b85c111de4d237bsalomon@google.comGR_DEFINE_EFFECT_TEST(ColorTableEffect); 379f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 380680372190ee596c7485dcf2974c824fcf6a355dccommit-bot@chromium.orgGrEffectRef* ColorTableEffect::TestCreate(SkRandom* random, 38138b58f31a3070ea9254d55894a59528270ac67ddbsalomon@google.com GrContext* context, 382516b4c312ba95ab60863c325482ee6c36618f706bsalomon@google.com const GrDrawTargetCaps&, 38338b58f31a3070ea9254d55894a59528270ac67ddbsalomon@google.com GrTexture* textures[]) { 3841de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com static unsigned kAllFlags = SkTable_ColorFilter::kR_Flag | SkTable_ColorFilter::kG_Flag | 3851de939642d66a6408694ff753d25dd5a2cf8ed68bsalomon@google.com SkTable_ColorFilter::kB_Flag | SkTable_ColorFilter::kA_Flag; 38638b58f31a3070ea9254d55894a59528270ac67ddbsalomon@google.com return ColorTableEffect::Create(textures[GrEffectUnitTest::kAlphaTextureIdx], kAllFlags); 387f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com} 388f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 38938b58f31a3070ea9254d55894a59528270ac67ddbsalomon@google.comGrEffectRef* SkTable_ColorFilter::asNewEffect(GrContext* context) const { 390f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com SkBitmap bitmap; 391d80f9a6090e60dd508c86c4fcbb5e7456aa9d581commit-bot@chromium.org GrEffectRef* effect = NULL; 392f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com this->asComponentTable(&bitmap); 39301930d4fb6c68c3a2b50922f0bc49032535f5740bsalomon@google.com // passing NULL because this effect does no tiling or filtering. 3948f5dc5a363c2e9548f3b48325a1579a5da92e21absalomon@google.com GrTexture* texture = GrLockAndRefCachedBitmapTexture(context, bitmap, NULL); 395d80f9a6090e60dd508c86c4fcbb5e7456aa9d581commit-bot@chromium.org if (NULL != texture) { 396d80f9a6090e60dd508c86c4fcbb5e7456aa9d581commit-bot@chromium.org effect = ColorTableEffect::Create(texture, fFlags); 397f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 398d80f9a6090e60dd508c86c4fcbb5e7456aa9d581commit-bot@chromium.org // Unlock immediately, this is not great, but we don't have a way of 399d80f9a6090e60dd508c86c4fcbb5e7456aa9d581commit-bot@chromium.org // knowing when else to unlock it currently. TODO: Remove this when 400d80f9a6090e60dd508c86c4fcbb5e7456aa9d581commit-bot@chromium.org // unref becomes the unlock replacement for all types of textures. 401d80f9a6090e60dd508c86c4fcbb5e7456aa9d581commit-bot@chromium.org GrUnlockAndUnrefCachedBitmapTexture(texture); 402d80f9a6090e60dd508c86c4fcbb5e7456aa9d581commit-bot@chromium.org } 403fbd361fc3e9d31df4c783729bb9c0ccba91e0221bsalomon@google.com return effect; 404f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com} 405f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 406f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com#endif // SK_SUPPORT_GPU 407f47c590b0536f34c161071649b8cc2652ce4323fbsalomon@google.com 408e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org/////////////////////////////////////////////////////////////////////////////// 409e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 410e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org#ifdef SK_CPU_BENDIAN 411e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org#else 412e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org #define SK_A32_INDEX (3 - (SK_A32_SHIFT >> 3)) 413e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org #define SK_R32_INDEX (3 - (SK_R32_SHIFT >> 3)) 414e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org #define SK_G32_INDEX (3 - (SK_G32_SHIFT >> 3)) 415e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org #define SK_B32_INDEX (3 - (SK_B32_SHIFT >> 3)) 416e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org#endif 417e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 418e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org/////////////////////////////////////////////////////////////////////////////// 419e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 420e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.orgSkColorFilter* SkTableColorFilter::Create(const uint8_t table[256]) { 421e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org return SkNEW_ARGS(SkTable_ColorFilter, (table, table, table, table)); 422e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org} 423e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org 424e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.orgSkColorFilter* SkTableColorFilter::CreateARGB(const uint8_t tableA[256], 425e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org const uint8_t tableR[256], 426e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org const uint8_t tableG[256], 427e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org const uint8_t tableB[256]) { 428e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org return SkNEW_ARGS(SkTable_ColorFilter, (tableA, tableR, tableG, tableB)); 429e955118832ba6d39d4d855868476c273377fa08emike@reedtribe.org} 430ddb0cad6160279713c79b080e1b7668889ef0ac7djsollen@google.com 431ddb0cad6160279713c79b080e1b7668889ef0ac7djsollen@google.comSK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkTableColorFilter) 432ddb0cad6160279713c79b080e1b7668889ef0ac7djsollen@google.com SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkTable_ColorFilter) 433ddb0cad6160279713c79b080e1b7668889ef0ac7djsollen@google.comSK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 434