Fix LUT intrinsic.

bug 10427951

Change-Id: I0eeca42f309321c62ad3eac94de1812054a23501
diff --git a/cpp/ScriptIntrinsics.cpp b/cpp/ScriptIntrinsics.cpp
index 2f52896..35f2a31 100644
--- a/cpp/ScriptIntrinsics.cpp
+++ b/cpp/ScriptIntrinsics.cpp
@@ -490,13 +490,14 @@
 
 ScriptIntrinsicLUT::ScriptIntrinsicLUT(sp<RS> rs, sp<const Element> e)
     : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_LUT, e), mDirty(true) {
-    LUT = Allocation::createSized(rs, e, 1024);
+    LUT = Allocation::createSized(rs, Element::U8(rs), 1024);
     for (int i = 0; i < 256; i++) {
         mCache[i] = i;
         mCache[i+256] = i;
         mCache[i+512] = i;
         mCache[i+768] = i;
     }
+    setVar(0, LUT);
 }
 
 void ScriptIntrinsicLUT::forEach(sp<Allocation> ain, sp<Allocation> aout) {
@@ -513,45 +514,30 @@
 
 }
 
-void ScriptIntrinsicLUT::setTable(unsigned int offset, unsigned char base, unsigned char length, unsigned char* lutValues) {
-    if ((base + length) >= 256 || length == 0) {
+void ScriptIntrinsicLUT::setTable(unsigned int offset, unsigned char base, unsigned int length, unsigned char* lutValues) {
+    if ((base + length) > 256 || length == 0) {
+        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "LUT out of range");
         return;
     }
     mDirty = true;
-    for (int i = 0; i < length; i++) {
+    for (unsigned int i = 0; i < length; i++) {
         mCache[offset + base + i] = lutValues[i];
     }
 }
 
-void ScriptIntrinsicLUT::setRed(unsigned char base, unsigned char length, unsigned char* lutValues) {
-    if (base + length >= 256) {
-        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "LUT out of range");
-        return;
-    }
+void ScriptIntrinsicLUT::setRed(unsigned char base, unsigned int length, unsigned char* lutValues) {
     setTable(0, base, length, lutValues);
 }
 
-void ScriptIntrinsicLUT::setGreen(unsigned char base, unsigned char length, unsigned char* lutValues) {
-    if (base + length >= 256) {
-        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "LUT out of range");
-        return;
-    }
+void ScriptIntrinsicLUT::setGreen(unsigned char base, unsigned int length, unsigned char* lutValues) {
     setTable(256, base, length, lutValues);
 }
 
-void ScriptIntrinsicLUT::setBlue(unsigned char base, unsigned char length, unsigned char* lutValues) {
-    if (base + length >= 256) {
-        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "LUT out of range");
-        return;
-    }
+void ScriptIntrinsicLUT::setBlue(unsigned char base, unsigned int length, unsigned char* lutValues) {
     setTable(512, base, length, lutValues);
 }
 
-void ScriptIntrinsicLUT::setAlpha(unsigned char base, unsigned char length, unsigned char* lutValues) {
-    if (base + length >= 256) {
-        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "LUT out of range");
-        return;
-    }
+void ScriptIntrinsicLUT::setAlpha(unsigned char base, unsigned int length, unsigned char* lutValues) {
     setTable(768, base, length, lutValues);
 }
 
diff --git a/cpp/rsCppStructs.h b/cpp/rsCppStructs.h
index a2a6fcf..913fd91 100644
--- a/cpp/rsCppStructs.h
+++ b/cpp/rsCppStructs.h
@@ -780,16 +780,16 @@
     sp<Allocation> LUT;
     bool mDirty;
     unsigned char mCache[1024];
-    void setTable(unsigned int offset, unsigned char base, unsigned char length, unsigned char* lutValues);
+    void setTable(unsigned int offset, unsigned char base, unsigned int length, unsigned char* lutValues);
     ScriptIntrinsicLUT(sp<RS> rs, sp<const Element> e);
 
  public:
     static sp<ScriptIntrinsicLUT> create(sp<RS> rs, sp<const Element> e);
     void forEach(sp<Allocation> ain, sp<Allocation> aout);
-    void setRed(unsigned char base, unsigned char length, unsigned char* lutValues);
-    void setGreen(unsigned char base, unsigned char length, unsigned char* lutValues);
-    void setBlue(unsigned char base, unsigned char length, unsigned char* lutValues);
-    void setAlpha(unsigned char base, unsigned char length, unsigned char* lutValues);
+    void setRed(unsigned char base, unsigned int length, unsigned char* lutValues);
+    void setGreen(unsigned char base, unsigned int length, unsigned char* lutValues);
+    void setBlue(unsigned char base, unsigned int length, unsigned char* lutValues);
+    void setAlpha(unsigned char base, unsigned int length, unsigned char* lutValues);
     virtual ~ScriptIntrinsicLUT();
 };