Home | History | Annotate | Download | only in core
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 #include "SkDither.h"
      9 
     10 /*  The base dither matrix we use to derive optimized ones for 565 and 4444
     11 
     12     { 0,  32, 8,  40, 2,  34, 10, 42 },
     13     { 48, 16, 56, 24, 50, 18, 58, 26 },
     14     { 12, 44, 4,  36, 14, 46, 6,  38 },
     15     { 60, 28, 52, 20, 62, 30, 54, 22 },
     16     { 3,  35, 11, 43, 1,  33, 9,  41 },
     17     { 51, 19, 59, 27, 49, 17, 57, 25 },
     18     { 15, 47, 7,  39, 13, 45, 5,  37 },
     19     { 63, 31, 55, 23, 61, 29, 53, 21 }
     20 
     21     The 4444 version only needs 4 bits, and given that we can reduce its size
     22     since the other 4x4 sub pieces all look the same once we truncate the bits.
     23 
     24     The 565 version only needs 3 bits for red/blue, and only 2 bits for green.
     25     For simplicity, we store 3 bits, and have the dither macros for green know
     26     this, and they shift the dither value down by 1 to make it 2 bits.
     27  */
     28 
     29 #ifdef ENABLE_DITHER_MATRIX_4X4
     30 
     31 const uint8_t gDitherMatrix_4Bit_4X4[4][4] = {
     32     {  0,  8,  2, 10 },
     33     { 12,  4, 14,  6 },
     34     {  3, 11,  1,  9 },
     35     { 15,  7, 13,  5 }
     36 };
     37 
     38 const uint8_t gDitherMatrix_3Bit_4X4[4][4] = {
     39     {  0,  4,  1,  5 },
     40     {  6,  2,  7,  3 },
     41     {  1,  5,  0,  4 },
     42     {  7,  3,  6,  2 }
     43 };
     44 
     45 #else   // used packed shorts for a scanlines worth of dither values
     46 
     47 const uint16_t gDitherMatrix_4Bit_16[4] = {
     48     0xA280, 0x6E4C, 0x91B3, 0x5D7F
     49 };
     50 
     51 const uint16_t gDitherMatrix_3Bit_16[4] = {
     52     0x5140, 0x3726, 0x4051, 0x2637
     53 };
     54 
     55 #endif
     56