Annotation of tme/generic/fb.c, revision 1.1

1.1     ! root        1: /* $Id: fb.c,v 1.2 2003/07/31 01:35:12 fredette Exp $ */
        !             2: 
        !             3: /* generic/fb.c - generic framebuffer implementation support: */
        !             4: 
        !             5: /*
        !             6:  * Copyright (c) 2003 Matt Fredette
        !             7:  * All rights reserved.
        !             8:  *
        !             9:  * Redistribution and use in source and binary forms, with or without
        !            10:  * modification, are permitted provided that the following conditions
        !            11:  * are met:
        !            12:  * 1. Redistributions of source code must retain the above copyright
        !            13:  *    notice, this list of conditions and the following disclaimer.
        !            14:  * 2. Redistributions in binary form must reproduce the above copyright
        !            15:  *    notice, this list of conditions and the following disclaimer in the
        !            16:  *    documentation and/or other materials provided with the distribution.
        !            17:  * 3. All advertising materials mentioning features or use of this software
        !            18:  *    must display the following acknowledgement:
        !            19:  *      This product includes software developed by Matt Fredette.
        !            20:  * 4. The name of the author may not be used to endorse or promote products
        !            21:  *    derived from this software without specific prior written permission.
        !            22:  *
        !            23:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            24:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
        !            25:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
        !            26:  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
        !            27:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
        !            28:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
        !            29:  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            30:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
        !            31:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
        !            32:  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            33:  * POSSIBILITY OF SUCH DAMAGE.
        !            34:  */
        !            35: 
        !            36: #include <tme/common.h>
        !            37: _TME_RCSID("$Id: fb.c,v 1.2 2003/07/31 01:35:12 fredette Exp $");
        !            38: 
        !            39: /* includes: */
        !            40: #include <tme/generic/fb.h>
        !            41: 
        !            42: /* include the automatically-generated translation functions: */
        !            43: #include "fb-xlat-auto.c"
        !            44: 
        !            45: /* this returns the best translation function: */
        !            46: const struct tme_fb_xlat *
        !            47: tme_fb_xlat_best(const struct tme_fb_xlat *xlat_user)
        !            48: {
        !            49:   unsigned int xlat_i;
        !            50:   const struct tme_fb_xlat *xlat;
        !            51:   const struct tme_fb_xlat *xlat_best;
        !            52:   unsigned int xlat_best_score, xlat_score;
        !            53: 
        !            54:   /* loop over the xlats: */
        !            55:   xlat_best = NULL;
        !            56:   xlat_best_score = 0;
        !            57:   for (xlat_i = 0;
        !            58:        xlat_i < TME_ARRAY_ELS(tme_fb_xlats);
        !            59:        xlat_i++) {
        !            60: 
        !            61:     /* get this xlat: */
        !            62:     xlat = &tme_fb_xlats[xlat_i];
        !            63:     xlat_score = 0;
        !            64: 
        !            65:     /* if this xlat only works for a particular value of the given
        !            66:        member, and the user's value is different, we cannot use this
        !            67:        xlat.  otherwise, increase this xlat's score: */
        !            68: #define TME_FB_XLAT_SCORE(score, member, specific)     \
        !            69: if ((xlat->member specific)                            \
        !            70:     && (xlat->member != xlat_user->member)) {          \
        !            71:   continue;                                            \
        !            72: }                                                      \
        !            73: if (xlat->member specific)                             \
        !            74:   xlat_score += score
        !            75: 
        !            76:     TME_FB_XLAT_SCORE(100, tme_fb_xlat_width, != 0);
        !            77:     TME_FB_XLAT_SCORE(100, tme_fb_xlat_height, != 0);
        !            78:     TME_FB_XLAT_SCORE(  0, tme_fb_xlat_scale, || TRUE);
        !            79:     TME_FB_XLAT_SCORE(100, tme_fb_xlat_src_depth, != 0);
        !            80:     TME_FB_XLAT_SCORE(100, tme_fb_xlat_src_bits_per_pixel, != 0);
        !            81:     TME_FB_XLAT_SCORE(100, tme_fb_xlat_src_skipx, >= 0);
        !            82:     TME_FB_XLAT_SCORE(100, tme_fb_xlat_src_scanline_pad, != 0);
        !            83:     TME_FB_XLAT_SCORE(  0, tme_fb_xlat_src_order, || TRUE);
        !            84:     TME_FB_XLAT_SCORE(100, tme_fb_xlat_dst_depth, != 0);
        !            85:     TME_FB_XLAT_SCORE(100, tme_fb_xlat_dst_bits_per_pixel, != 0);
        !            86:     TME_FB_XLAT_SCORE(100, tme_fb_xlat_dst_skipx, >= 0);
        !            87:     TME_FB_XLAT_SCORE(100, tme_fb_xlat_dst_scanline_pad, != 0);
        !            88:     TME_FB_XLAT_SCORE(  0, tme_fb_xlat_dst_order, || TRUE);
        !            89: 
        !            90: #undef TME_FB_XLAT_SCORE
        !            91: 
        !            92:     /* update the best xlat: */
        !            93:     if (xlat_best == NULL
        !            94:        || xlat_best_score < xlat_score) {
        !            95:       xlat_best = xlat;
        !            96:       xlat_best_score = xlat_score;
        !            97:     }
        !            98:   }
        !            99: 
        !           100:   /* return the best xlat: */
        !           101:   assert (xlat_best != NULL);
        !           102:   return (xlat_best);
        !           103: }
        !           104: 
        !           105: /* this returns nonzero iff the translation function is optimal: */
        !           106: int
        !           107: tme_fb_xlat_is_optimal(const struct tme_fb_xlat *xlat)
        !           108: {
        !           109:   return (xlat->tme_fb_xlat_width != 0
        !           110:          && xlat->tme_fb_xlat_height != 0
        !           111:          && xlat->tme_fb_xlat_src_depth != 0
        !           112:          && xlat->tme_fb_xlat_src_bits_per_pixel != 0
        !           113:          && xlat->tme_fb_xlat_src_skipx >= 0
        !           114:          && xlat->tme_fb_xlat_src_scanline_pad != 0
        !           115:          && xlat->tme_fb_xlat_dst_depth != 0
        !           116:          && xlat->tme_fb_xlat_dst_bits_per_pixel != 0
        !           117:          && xlat->tme_fb_xlat_dst_skipx >= 0
        !           118:          && xlat->tme_fb_xlat_dst_scanline_pad != 0);
        !           119: }
        !           120: 
        !           121: /* this returns the number of bytes required for a source framebuffer
        !           122:    scanline: */
        !           123: static unsigned long
        !           124: _tme_fb_xlat_src_bypl(const struct tme_fb_connection *src)
        !           125: {
        !           126:   /* NB that this definition must match the one in the
        !           127:      automatically-generated xlat functions: */
        !           128:   const unsigned long src_bypl
        !           129:     = (((((src->tme_fb_connection_skipx
        !           130:           + src->tme_fb_connection_width)
        !           131:          * src->tme_fb_connection_bits_per_pixel)
        !           132:         + (src->tme_fb_connection_scanline_pad - 1))
        !           133:        & -src->tme_fb_connection_scanline_pad)
        !           134:        / 8);
        !           135:   return (src_bypl);
        !           136: }
        !           137: 
        !           138: /* this returns the number of bytes required for a source framebuffer: */
        !           139: static unsigned long
        !           140: _tme_fb_xlat_src_bypb_real(const struct tme_fb_connection *src)
        !           141: {
        !           142:   /* NB that these definitions must match those in the
        !           143:      automatically-generated xlat functions: */
        !           144:   const unsigned long src_bypl
        !           145:     = _tme_fb_xlat_src_bypl(src);
        !           146:   const unsigned long src_bypb_real
        !           147:     = (((src->tme_fb_connection_height * src_bypl) + 3) & -4);
        !           148:   return (src_bypb_real);
        !           149: }
        !           150: 
        !           151: /* this returns the number of bytes allocated for a source framebuffer.
        !           152:    this includes the guard regions that are needed to guarantee that
        !           153:    the translation function main loop terminates: */
        !           154: static unsigned long
        !           155: _tme_fb_xlat_src_bypb(const struct tme_fb_connection *src)
        !           156: {
        !           157:   /* NB that this definition must match the one in the
        !           158:      automatically-generated xlat functions: */
        !           159:   const unsigned long src_bypl
        !           160:     = _tme_fb_xlat_src_bypl(src);
        !           161:   const unsigned long src_bypb_real
        !           162:     = _tme_fb_xlat_src_bypb_real(src);
        !           163:   const unsigned long src_bypb
        !           164:     = ((src_bypb_real + (src_bypl * 2)) & -4);
        !           165:   return (src_bypb);
        !           166: }
        !           167: 
        !           168: /* this forces the next translation to retranslate the entire buffer: */
        !           169: void
        !           170: tme_fb_xlat_redraw(struct tme_fb_connection *src)
        !           171: {
        !           172:   const tme_uint32_t *src_user;
        !           173:   tme_uint32_t *src_back;
        !           174:   unsigned int count32;
        !           175: 
        !           176:   src_user
        !           177:     = ((const tme_uint32_t *) 
        !           178:        src->tme_fb_connection_buffer);
        !           179:   src_back
        !           180:     = ((tme_uint32_t *) 
        !           181:        (src->tme_fb_connection_buffer
        !           182:        + _tme_fb_xlat_src_bypb(src)));
        !           183:   for (count32 = _tme_fb_xlat_src_bypb_real(src) / sizeof(tme_uint32_t);
        !           184:        count32-- > 0; ) {
        !           185:     *(src_back++) = ~(*(src_user++));
        !           186:   }
        !           187: }
        !           188: 
        !           189: /* this allocates memory for a source framebuffer: */
        !           190: int
        !           191: tme_fb_xlat_alloc_src(struct tme_fb_connection *src)
        !           192: {
        !           193: 
        !           194:   /* allocate the buffer.  remember, this is really two buffers - the
        !           195:      first half is the real, current framebuffer, and the second half
        !           196:      holds the last frame that was translated: */
        !           197:   src->tme_fb_connection_buffer
        !           198:     = tme_new0(tme_uint8_t,
        !           199:               _tme_fb_xlat_src_bypb(src) * 2);
        !           200: 
        !           201:   /* force the next translation to do a complete redraw: */
        !           202:   tme_fb_xlat_redraw(src);
        !           203:   
        !           204:   return (TME_OK);
        !           205: }
        !           206: 
        !           207: /* this scores a framebuffer connection: */
        !           208: int
        !           209: tme_fb_connection_score(struct tme_connection *conn, unsigned int *_score)
        !           210: {
        !           211:   struct tme_fb_connection *conn_fb;
        !           212:   struct tme_fb_connection *conn_fb_other;
        !           213: 
        !           214:   /* both sides must be Ethernet connections: */
        !           215:   assert(conn->tme_connection_type == TME_CONNECTION_FRAMEBUFFER);
        !           216:   assert(conn->tme_connection_other->tme_connection_type == TME_CONNECTION_FRAMEBUFFER);
        !           217: 
        !           218:   /* one side must be a real display and the other side must be a
        !           219:      framebuffer emulator: */
        !           220:   conn_fb = (struct tme_fb_connection *) conn;
        !           221:   conn_fb_other = (struct tme_fb_connection *) conn->tme_connection_other;
        !           222:   *_score = ((conn_fb->tme_fb_connection_mode_change != NULL)
        !           223:             != (conn_fb_other->tme_fb_connection_mode_change != NULL));
        !           224:   return (TME_OK);
        !           225: }
        !           226: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.