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