1211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy/* 2211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy * Copyright (C) 2012 The Android Open Source Project 3211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy * 4211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy * you may not use this file except in compliance with the License. 6211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy * You may obtain a copy of the License at 7211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy * 8211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy * http://www.apache.org/licenses/LICENSE-2.0 9211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy * 10211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy * Unless required by applicable law or agreed to in writing, software 11211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy * See the License for the specific language governing permissions and 14211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy * limitations under the License. 15211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy */ 16211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 17211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy#include "Caches.h" 18211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy#include "Dither.h" 19211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 20211efea7376371ee755edd2ad03e83ef6eea464eRomain Guynamespace android { 21211efea7376371ee755edd2ad03e83ef6eea464eRomain Guynamespace uirenderer { 22211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 23211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy/////////////////////////////////////////////////////////////////////////////// 24211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy// Defines 25211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy/////////////////////////////////////////////////////////////////////////////// 26211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 27211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy// Must be a power of two 28211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy#define DITHER_KERNEL_SIZE 4 29211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 30211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy/////////////////////////////////////////////////////////////////////////////// 31211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy// Lifecycle 32211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy/////////////////////////////////////////////////////////////////////////////// 33211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 34211efea7376371ee755edd2ad03e83ef6eea464eRomain Guyvoid Dither::bindDitherTexture() { 35211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy if (!mInitialized) { 36211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy const uint8_t pattern[] = { 37211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 0, 8, 2, 10, 38211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 12, 4, 14, 6, 39211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 3, 11, 1, 9, 40211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 15, 7, 13, 5 41211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy }; 42211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 43211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy glGenTextures(1, &mDitherTexture); 44211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy glBindTexture(GL_TEXTURE_2D, mDitherTexture); 45211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 46211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 47211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 48211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 49211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 50211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 51211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 52211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 53211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 54211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, DITHER_KERNEL_SIZE, DITHER_KERNEL_SIZE, 0, 55211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy GL_ALPHA, GL_UNSIGNED_BYTE, &pattern); 56211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 57211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy mInitialized = true; 58211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy } else { 59211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy glBindTexture(GL_TEXTURE_2D, mDitherTexture); 60211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy } 61211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy} 62211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 63211efea7376371ee755edd2ad03e83ef6eea464eRomain Guyvoid Dither::clear() { 64211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy if (mInitialized) { 65211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy glDeleteTextures(1, &mDitherTexture); 66211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy } 67211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy} 68211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 69211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy/////////////////////////////////////////////////////////////////////////////// 70211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy// Program management 71211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy/////////////////////////////////////////////////////////////////////////////// 72211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 73211efea7376371ee755edd2ad03e83ef6eea464eRomain Guyvoid Dither::setupProgram(Program* program, GLuint* textureUnit) { 74211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy GLuint textureSlot = (*textureUnit)++; 75211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy Caches::getInstance().activeTexture(textureSlot); 76211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 77211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy bindDitherTexture(); 78211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 79a1d12dd619c86c9ac121a3095ff5e5633c11e876Chet Haase float ditherSize = 1.0f / DITHER_KERNEL_SIZE; 80211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy glUniform1i(program->getUniform("ditherSampler"), textureSlot); 81a1d12dd619c86c9ac121a3095ff5e5633c11e876Chet Haase glUniform1f(program->getUniform("ditherSize"), ditherSize); 82a1d12dd619c86c9ac121a3095ff5e5633c11e876Chet Haase glUniform1f(program->getUniform("ditherSizeSquared"), ditherSize * ditherSize); 83211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy} 84211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy 85211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy}; // namespace uirenderer 86211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy}; // namespace android 87