/* libs/pixelflinger/buffer.cpp
**
** Copyright 2006, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License"); 
** you may not use this file except in compliance with the License. 
** You may obtain a copy of the License at 
**
**     http://www.apache.org/licenses/LICENSE-2.0 
**
** Unless required by applicable law or agreed to in writing, software 
** distributed under the License is distributed on an "AS IS" BASIS, 
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
** See the License for the specific language governing permissions and 
** limitations under the License.
*/


#include <assert.h>

#include "buffer.h"

namespace android {
// ----------------------------------------------------------------------------

static void read_pixel(const surface_t* s, context_t* c,
        uint32_t x, uint32_t y, pixel_t* pixel);
static void write_pixel(const surface_t* s, context_t* c,
        uint32_t x, uint32_t y, const pixel_t* pixel);
static void readRGB565(const surface_t* s, context_t* c,
        uint32_t x, uint32_t y, pixel_t* pixel);
static void readABGR8888(const surface_t* s, context_t* c,
        uint32_t x, uint32_t y, pixel_t* pixel);

static uint32_t logic_op(int op, uint32_t s, uint32_t d);
static uint32_t extract(uint32_t v, int h, int l, int bits);
static uint32_t expand(uint32_t v, int sbits, int dbits);
static uint32_t downshift_component(uint32_t in, uint32_t v,
        int sh, int sl, int dh, int dl, int ch, int cl, int dither);

// ----------------------------------------------------------------------------

void ggl_init_texture(context_t* c)
{
    for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; i++) {
        texture_t& t = c->state.texture[i];
        t.s_coord = GGL_ONE_TO_ONE;
        t.t_coord = GGL_ONE_TO_ONE;
        t.s_wrap = GGL_REPEAT;
        t.t_wrap = GGL_REPEAT;
        t.min_filter = GGL_NEAREST;
        t.mag_filter = GGL_NEAREST;
        t.env = GGL_MODULATE;
    }
    c->activeTMU = &(c->state.texture[0]);
}

void ggl_set_surface(context_t* c, surface_t* dst, const GGLSurface* src)
{
    dst->width = src->width;
    dst->height = src->height;
    dst->stride = src->stride;
    dst->data = src->data;
    dst->format = src->format;
    dst->dirty = 1;
    if (__builtin_expect(dst->stride < 0, false)) {
        const GGLFormat& pixelFormat(c->formats[dst->format]);
        const int32_t bpr = -dst->stride * pixelFormat.size;
        dst->data += bpr * (dst->height-1);
    }
}

static void pick_read_write(surface_t* s)
{
    // Choose best reader/writers.
    switch (s->format) {
        case GGL_PIXEL_FORMAT_RGBA_8888:    s->read = readABGR8888;  break;
        case GGL_PIXEL_FORMAT_RGB_565:      s->read = readRGB565;    break;
        default:                            s->read = read_pixel;    break;
    }
    s->write = write_pixel;
}

void ggl_pick_texture(context_t* c)
{
    for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; ++i) {
        surface_t& s = c->state.texture[i].surface;
        if ((!c->state.texture[i].enable) || (!s.dirty))
            continue;
        s.dirty = 0;
        pick_read_write(&s);
        generated_tex_vars_t& gen = c->generated_vars.texture[i];
        gen.width   = s.width;
        gen.height  = s.height;
        gen.stride  = s.stride;
        gen.data    = int32_t(s.data);
    }
}

void ggl_pick_cb(context_t* c)
{
    surface_t& s = c->state.buffers.color;
    if (s.dirty) {
        s.dirty = 0;
        pick_read_write(&s);
    }
}

// ----------------------------------------------------------------------------

void read_pixel(const surface_t* s, context_t* c,
        uint32_t x, uint32_t y, pixel_t* pixel)
{
    assert((x < s->width) && (y < s->height));

    const GGLFormat* f = &(c->formats[s->format]);
    int32_t index = x + (s->stride * y);
    uint8_t* const data = s->data + index * f->size;
    uint32_t v = 0;
    switch (f->size) {
        case 1:		v = *data;									break;
        case 2:		v = *(uint16_t*)data;						break;
        case 3:		v = (data[2]<<16)|(data[1]<<8)|data[0];     break;
        case 4:		v = GGL_RGBA_TO_HOST(*(uint32_t*)data);		break;
    }
    for (int i=0 ; i<4 ; i++) {
        pixel->s[i] = f->c[i].h - f->c[i].l;
        if (pixel->s[i])
            pixel->c[i] = extract(v,  f->c[i].h,  f->c[i].l, f->size*8);
    }
}

void readRGB565(const surface_t* s, context_t* c,
        uint32_t x, uint32_t y, pixel_t* pixel)
{
    uint16_t v = *(reinterpret_cast<uint16_t*>(s->data) + (x + (s->stride * y)));
    pixel->c[0] = 0;
    pixel->c[1] = v>>11;
    pixel->c[2] = (v>>5)&0x3F;
    pixel->c[3] = v&0x1F;
    pixel->s[0] = 0;
    pixel->s[1] = 5;
    pixel->s[2] = 6;
    pixel->s[3] = 5;
}

void readABGR8888(const surface_t* s, context_t* c,
        uint32_t x, uint32_t y, pixel_t* pixel)
{
    uint32_t v = *(reinterpret_cast<uint32_t*>(s->data) + (x + (s->stride * y)));
    v = GGL_RGBA_TO_HOST(v);
    pixel->c[0] = v>>24;        // A
    pixel->c[1] = v&0xFF;       // R
    pixel->c[2] = (v>>8)&0xFF;  // G
    pixel->c[3] = (v>>16)&0xFF; // B
    pixel->s[0] = 
    pixel->s[1] = 
    pixel->s[2] = 
    pixel->s[3] = 8;
}

void write_pixel(const surface_t* s, context_t* c,
        uint32_t x, uint32_t y, const pixel_t* pixel)
{
    assert((x < s->width) && (y < s->height));

    int dither = -1;
    if (c->state.enables & GGL_ENABLE_DITHER) {
        dither = c->ditherMatrix[ (x & GGL_DITHER_MASK) +
                ((y & GGL_DITHER_MASK)<<GGL_DITHER_ORDER_SHIFT) ];
    }

    const GGLFormat* f = &(c->formats[s->format]);
    int32_t index = x + (s->stride * y);
    uint8_t* const data = s->data + index * f->size;
        
    uint32_t mask = 0;
    uint32_t v = 0;
    for (int i=0 ; i<4 ; i++) {
        const int component_mask = 1 << i;
        if (f->components>=GGL_LUMINANCE &&
                (i==GGLFormat::GREEN || i==GGLFormat::BLUE)) {
            // destinations L formats don't have G or B
            continue;
        }
        const int l = f->c[i].l;
        const int h = f->c[i].h;
        if (h && (c->state.mask.color & component_mask)) {
            mask |= (((1<<(h-l))-1)<<l);
            uint32_t u = pixel->c[i];
            int32_t pixelSize = pixel->s[i];
            if (pixelSize < (h-l)) {
                u = expand(u, pixelSize, h-l);
                pixelSize = h-l;
            }
            v = downshift_component(v, u, pixelSize, 0, h, l, 0, 0, dither);
        }
    }

    if ((c->state.mask.color != 0xF) || 
        (c->state.enables & GGL_ENABLE_LOGIC_OP)) {
        uint32_t d = 0;
        switch (f->size) {
            case 1:	d = *data;									break;
            case 2:	d = *(uint16_t*)data;						break;
            case 3:	d = (data[2]<<16)|(data[1]<<8)|data[0];     break;
            case 4:	d = GGL_RGBA_TO_HOST(*(uint32_t*)data);		break;
        }
        if (c->state.enables & GGL_ENABLE_LOGIC_OP) {
            v = logic_op(c->state.logic_op.opcode, v, d);            
            v &= mask;
        }
        v |= (d & ~mask);
    }

    switch (f->size) {
        case 1:		*data = v;									break;
        case 2:		*(uint16_t*)data = v;						break;
        case 3:
            data[0] = v;
            data[1] = v>>8;
            data[2] = v>>16;
            break;
        case 4:		*(uint32_t*)data = GGL_HOST_TO_RGBA(v);     break;
    }
}

static uint32_t logic_op(int op, uint32_t s, uint32_t d)
{
    switch(op) {
    case GGL_CLEAR:         return 0;
    case GGL_AND:           return s & d;
    case GGL_AND_REVERSE:   return s & ~d;
    case GGL_COPY:          return s;
    case GGL_AND_INVERTED:  return ~s & d;
    case GGL_NOOP:          return d;
    case GGL_XOR:           return s ^ d;
    case GGL_OR:            return s | d;
    case GGL_NOR:           return ~(s | d);
    case GGL_EQUIV:         return ~(s ^ d);
    case GGL_INVERT:        return ~d;
    case GGL_OR_REVERSE:    return s | ~d;
    case GGL_COPY_INVERTED: return ~s;
    case GGL_OR_INVERTED:   return ~s | d;
    case GGL_NAND:          return ~(s & d);
    case GGL_SET:           return ~0;
    };
    return s;
}            


uint32_t ggl_expand(uint32_t v, int sbits, int dbits)
{
    return expand(v, sbits, dbits);
}

uint32_t ggl_pack_color(context_t* c, int32_t format,
        GGLcolor r, GGLcolor g, GGLcolor b, GGLcolor a)
{
    const GGLFormat* f = &(c->formats[format]);
    uint32_t p = 0;
    const int32_t hbits = GGL_COLOR_BITS;
    const int32_t lbits = GGL_COLOR_BITS - 8;
    p = downshift_component(p, r,   hbits, lbits,  f->rh, f->rl, 0, 1, -1);
    p = downshift_component(p, g,   hbits, lbits,  f->gh, f->gl, 0, 1, -1);
    p = downshift_component(p, b,   hbits, lbits,  f->bh, f->bl, 0, 1, -1);
    p = downshift_component(p, a,   hbits, lbits,  f->ah, f->al, 0, 1, -1);
    switch (f->size) {
    case 1: p |= p << 8;    // fallthrough
    case 2: p |= p << 16;
    }
    return p;
}

// ----------------------------------------------------------------------------

// extract a component from a word
uint32_t extract(uint32_t v, int h, int l, int bits)
{
	assert(h);
	if (l) {
		v >>= l;
	}
	if (h != bits) {
		v &= (1<<(h-l))-1;
	}
	return v;
}

// expand a component from sbits to dbits
uint32_t expand(uint32_t v, int sbits, int dbits)
{
    if (dbits > sbits) {
        assert(sbits);
        if (sbits==1) {
            v = (v<<dbits) - v;
        } else {
            if (dbits % sbits) {
                v <<= (dbits-sbits);
                dbits -= sbits;
                do {
                    v |= v>>sbits;
                    dbits -= sbits;
                    sbits *= 2;
                } while (dbits>0);
            } else {
                dbits -= sbits;
                do {
                    v |= v<<sbits;
                    dbits -= sbits;
                    if (sbits*2 < dbits) {
                        sbits *= 2;
                    }
                } while (dbits > 0);
            }
        }
    }
	return v;
}

// downsample a component from sbits to dbits
// and shift / construct the pixel
uint32_t downshift_component(	uint32_t in, uint32_t v,
                                int sh, int sl,		// src
                                int dh, int dl,		// dst
                                int ch, int cl,		// clear
                                int dither)
{
	const int sbits = sh-sl;
	const int dbits = dh-dl;
    
	assert(sbits>=dbits);


    if (sbits>dbits) {
        if (dither>=0) {
            v -= (v>>dbits);				// fix up
            const int shift = (GGL_DITHER_BITS - (sbits-dbits));
            if (shift >= 0)   v += (dither >> shift) << sl;
            else              v += (dither << (-shift)) << sl;
        } else {
            // don't do that right now, so we can reproduce the same
            // artifacts we get on ARM (Where we don't do this)
            // -> this is not really needed if we don't dither
            //if (dBits > 1) { // result already OK if dBits==1
            //    v -= (v>>dbits);				// fix up
            //    v += 1 << ((sbits-dbits)-1);	// rounding
            //}
        }
    }


	// we need to clear the high bits of the source
	if (ch) {
		v <<= 32-sh;
		sl += 32-sh;
        sh = 32;
	}
	
	if (dl) {
		if (cl || (sbits>dbits)) {
			v >>= sh-dbits;
			sl = 0;
			sh = dbits;
            in |= v<<dl;
		} else {
			// sbits==dbits and we don't need to clean the lower bits
			// so we just have to shift the component to the right location
            int shift = dh-sh;
            in |= v<<shift;
		}
	} else {
		// destination starts at bit 0
		// ie: sh-dh == sh-dbits
		int shift = sh-dh;
		if (shift > 0)      in |= v>>shift;
		else if (shift < 0) in |= v<<shift;
		else                in |= v;
	}
	return in;
}

// ----------------------------------------------------------------------------
}; // namespace android
