?? offscr8bpp.c
字號(hào):
//*****************************************************************************
//
// offscr8bpp.c - 8 BPP off-screen display buffer driver.
//
// Copyright (c) 2008-2010 Texas Instruments Incorporated. All rights reserved.
// Software License Agreement
//
// Texas Instruments (TI) is supplying this software for use solely and
// exclusively on TI's microcontroller products. The software is owned by
// TI and/or its suppliers, and is protected under applicable copyright
// laws. You may not combine this software with "viral" open-source
// software in order to form a larger program.
//
// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
// DAMAGES, FOR ANY REASON WHATSOEVER.
//
// This is part of revision 5821 of the Stellaris Graphics Library.
//
//*****************************************************************************
#include "driverlib/debug.h"
#include "grlib/grlib.h"
//*****************************************************************************
//
//! \addtogroup primitives_api
//! @{
//
//*****************************************************************************
//*****************************************************************************
//
//! Translates a 24-bit RGB color to a display driver-specific color.
//!
//! \param pvDisplayData is a pointer to the driver-specific data for this
//! display driver.
//! \param ulValue is the 24-bit RGB color. The least-significant byte is the
//! blue channel, the next byte is the green channel, and the third byte is the
//! red channel.
//!
//! This function translates a 24-bit RGB color into a value that can be
//! written into the display's frame buffer in order to reproduce that color,
//! or the closest possible approximation of that color.
//!
//! \return Returns the display-driver specific color.
//
//*****************************************************************************
static unsigned long
GrOffScreen8BPPColorTranslate(void *pvDisplayData, unsigned long ulValue)
unsigned long ulIdx, ulDiff, ulMatchIdx, ulMatchDiff, ulR, ulG, ulB;
unsigned char *pucPalette;
//
// Check the arguments.
//
ASSERT(pvDisplayData);
//
// Get a pointer to the palette for the off-screen buffer.
//
pucPalette = (unsigned char *)pvDisplayData + 6;
//
// Extract the red, green, and blue component from the input color.
//
ulR = (ulValue >> ClrRedShift) & 0xff;
ulG = (ulValue >> ClrGreenShift) & 0xff;
ulB = (ulValue >> ClrBlueShift) & 0xff;
//
// Set the match such that the first palette entry will be a better match.
//
ulMatchIdx = 0;
ulMatchDiff = 0xffffffff;
//
// Loop through the colors in the palette.
//
for(ulIdx = 0; ulIdx < 256; ulIdx++, pucPalette += 3)
{
//
// Compute the Cartesian distance between these two colors.
//
ulDiff = (((pucPalette[2] - ulR) * (pucPalette[2] - ulR)) +
((pucPalette[1] - ulG) * (pucPalette[1] - ulG)) +
((pucPalette[0] - ulB) * (pucPalette[0] - ulB)));
//
// See if this color is a closer match than any of the previous colors.
//
if(ulDiff < ulMatchDiff)
{
//
// Save this color as the new best match.
//
ulMatchDiff = ulDiff;
ulMatchIdx = ulIdx;
}
//
// Stop looking if an exact match was found.
//
if(ulDiff == 0)
{
break;
}
}
//
// Return the index of the best match.
//
return(ulMatchIdx);
}
//*****************************************************************************
//
//! Draws a pixel on the screen.
//!
//! \param pvDisplayData is a pointer to the driver-specific data for this
//! display driver.
//! \param lX is the X coordinate of the pixel.
//! \param lY is the Y coordinate of the pixel.
//! \param ulValue is the color of the pixel.
//!
//! This function sets the given pixel to a particular color. The coordinates
//! of the pixel are assumed to be within the extents of the display.
//!
//! \return None.
//
//*****************************************************************************
static void
GrOffScreen8BPPPixelDraw(void *pvDisplayData, long lX, long lY,
{
unsigned char *pucData;
//
// Check the arguments.
//
ASSERT(pvDisplayData);
//
// Create a character pointer for the display-specific data (which points
// to the image buffer).
//
pucData = (unsigned char *)pvDisplayData;
//
// Get the offset to the byte of the image buffer that contains the pixel
// in question.
//
pucData += (*(unsigned short *)(pucData + 1) * lY) + lX + 6 + (256 * 3);
//
// Write this pixel into the image buffer.
//
*pucData = ulValue;
}
//*****************************************************************************
//
//! Draws a horizontal sequence of pixels on the screen.
//!
//! \param pvDisplayData is a pointer to the driver-specific data for this
//! display driver.
//! \param lX is the X coordinate of the first pixel.
//! \param lY is the Y coordinate of the first pixel.
//! \param lX0 is sub-pixel offset within the pixel data, which is valid for 1
//! or 4 bit per pixel formats.
//! \param lCount is the number of pixels to draw.
//! \param lBPP is the number of bits per pixel; must be 1, 4, or 8.
//! \param pucData is a pointer to the pixel data. For 1 and 4 bit per pixel
//! formats, the most significant bit(s) represent the left-most pixel.
//! \param pucPalette is a pointer to the palette used to draw the pixels.
//!
//! This function draws a horizontal sequence of pixels on the screen, using
//! the supplied palette. For 1 bit per pixel format, the palette contains
//! pre-translated colors; for 4 and 8 bit per pixel formats, the palette
//! contains 24-bit RGB values that must be translated before being written to
//! the display.
//!
//! \return None.
//
//*****************************************************************************
static void
GrOffScreen8BPPPixelDrawMultiple(void *pvDisplayData, long lX, long lY,
long lX0, long lCount, long lBPP,
const unsigned char *pucData,
const unsigned char *pucPalette)
{
unsigned char *pucPtr;
unsigned long ulByte;
//
// Check the arguments.
//
ASSERT(pvDisplayData);
ASSERT(pucData);
ASSERT(pucPalette);
//
// Create a character pointer for the display-specific data (which points
// to the image buffer).
//
pucPtr = (unsigned char *)pvDisplayData;
//
// Get the offset to the byte of the image buffer that contains the
// starting pixel.
//
pucPtr += (*(unsigned short *)(pucPtr + 1) * lY) + lX + 6 + (256 * 3);
//
// Determine how to interpret the pixel data based on the number of bits
// per pixel.
//
switch(lBPP)
{
//
// The pixel data is in 1 bit per pixel format.
//
case 1:
{
//
// Loop while there are more pixels to draw.
//
while(lCount)
{
//
// Get the next byte of image data.
//
ulByte = *pucData++;
//
// Loop through the pixels in this byte of image data.
//
for(; (lX0 < 8) && lCount; lX0++, lCount--)
{
//
// Draw this pixel in the appropriate color.
//
*pucPtr++ = (((unsigned long *)pucPalette)[(ulByte >>
(7 - lX0)) &
1]);
}
//
// Start at the beginning of the next byte of image data.
//
lX0 = 0;
}
//
// The image data has been drawn.
//
break;
}
//
// The pixel data is in 4 bit per pixel format.
//
case 4:
{
//
// Loop while there are more pixels to draw. "Duff's device" is
// used to jump into the middle of the loop if the first nibble of
// the pixel data should not be used. Duff's device makes use of
// the fact that a case statement is legal anywhere within a
// sub-block of a switch statement. See
// http://en.wikipedia.org/wiki/Duff's_device for detailed
// information about Duff's device.
//
switch(lX0 & 1)
{
case 0:
while(lCount)
{
//
// Get the upper nibble of the next byte of pixel data
// and extract the corresponding entry from the
// palette.
//
ulByte = (*pucData >> 4) * 3;
ulByte = (*(unsigned long *)(pucPalette + ulByte) &
0x00ffffff);
//
// Translate this palette entry and write it to the
// screen.
//
*pucPtr++ =
GrOffScreen8BPPColorTranslate(pvDisplayData,
ulByte);
//
// Decrement the count of pixels to draw.
//
lCount--;
//
// See if there is another pixel to draw.
//
if(lCount)
{
case 1:
//
// Get the lower nibble of the next byte of pixel
// data and extract the corresponding entry from
// the palette.
//
ulByte = (*pucData++ & 15) * 3;
ulByte = (*(unsigned long *)(pucPalette + ulByte) &
0x00ffffff);
//
// Translate this palette entry and write it to the
// screen.
//
*pucPtr++ =
GrOffScreen8BPPColorTranslate(pvDisplayData,
ulByte);
//
// Decrement the count of pixels to draw.
//
lCount--;
}
}
}
//
// The image data has been drawn.
//
break;
}
//
// The pixel data is in 8 bit per pixel format.
//
case 8:
{
//
// Loop while there are more pixels to draw.
//
while(lCount--)
{
//
// Get the next byte of pixel data and extract the
// corresponding entry from the palette.
//
ulByte = *pucData++ * 3;
ulByte = *(unsigned long *)(pucPalette + ulByte) & 0x00ffffff;
//
// Translate this palette entry and write it to the screen.
//
*pucPtr++ = GrOffScreen8BPPColorTranslate(pvDisplayData,
ulByte);
}
//
// The image data has been drawn.
//
break;
}
}
}
//*****************************************************************************
//
//! Draws a horizontal line.
//!
//! \param pvDisplayData is a pointer to the driver-specific data for this
//! display driver.
//! \param lX1 is the X coordinate of the start of the line.
//! \param lX2 is the X coordinate of the end of the line.
//! \param lY is the Y coordinate of the line.
//! \param ulValue is the color of the line.
//!
//! This function draws a horizontal line on the display. The coordinates of
//! the line are assumed to be within the extents of the display.
//!
//! \return None.
//
//*****************************************************************************
static void
GrOffScreen8BPPLineDrawH(void *pvDisplayData, long lX1, long lX2, long lY,
unsigned long ulValue)
{
unsigned char *pucData;
//
// Check the arguments.
//
ASSERT(pvDisplayData);
//
// Create a character pointer for the display-specific data (which points
// to the image buffer).
//
pucData = (unsigned char *)pvDisplayData;
//
// Get the offset to the byte of the image buffer that contains the
// starting pixel.
//
pucData += (*(unsigned short *)(pucData + 1) * lY) + lX1 + 6 + (256 * 3);
//
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -