11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDither.h"
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*  The base dither matrix we use to derive optimized ones for 565 and 4444
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    { 0,  32, 8,  40, 2,  34, 10, 42 },
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    { 48, 16, 56, 24, 50, 18, 58, 26 },
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    { 12, 44, 4,  36, 14, 46, 6,  38 },
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    { 60, 28, 52, 20, 62, 30, 54, 22 },
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    { 3,  35, 11, 43, 1,  33, 9,  41 },
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    { 51, 19, 59, 27, 49, 17, 57, 25 },
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    { 15, 47, 7,  39, 13, 45, 5,  37 },
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    { 63, 31, 55, 23, 61, 29, 53, 21 }
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    The 4444 version only needs 4 bits, and given that we can reduce its size
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    since the other 4x4 sub pieces all look the same once we truncate the bits.
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    The 565 version only needs 3 bits for red/blue, and only 2 bits for green.
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    For simplicity, we store 3 bits, and have the dither macros for green know
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    this, and they shift the dither value down by 1 to make it 2 bits.
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef ENABLE_DITHER_MATRIX_4X4
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst uint8_t gDitherMatrix_4Bit_4X4[4][4] = {
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {  0,  8,  2, 10 },
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    { 12,  4, 14,  6 },
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {  3, 11,  1,  9 },
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    { 15,  7, 13,  5 }
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst uint8_t gDitherMatrix_3Bit_4X4[4][4] = {
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {  0,  4,  1,  5 },
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {  6,  2,  7,  3 },
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {  1,  5,  0,  4 },
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {  7,  3,  6,  2 }
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else   // used packed shorts for a scanlines worth of dither values
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst uint16_t gDitherMatrix_4Bit_16[4] = {
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    0xA280, 0x6E4C, 0x91B3, 0x5D7F
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst uint16_t gDitherMatrix_3Bit_16[4] = {
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    0x5140, 0x3726, 0x4051, 0x2637
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
57