?? line.c
字號:
//*****************************************************************************
//
// line.c - Routines for drawing lines.
//
// Copyright (c) 2007-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
//! @{
//
//*****************************************************************************
//*****************************************************************************
//
//! Draws a horizontal line.
//!
//! \param pContext is a pointer to the drawing context to use.
//! \param lX1 is the X coordinate of one end of the line.
//! \param lX2 is the X coordinate of the other end of the line.
//! \param lY is the Y coordinate of the line.
//!
//! This function draws a horizontal line, taking advantage of the fact that
//! the line is horizontal to draw it more efficiently. The clipping of the
//! horizontal line to the clipping rectangle is performed within this routine;
//! the display driver's horizontal line routine is used to perform the actual
//! line drawing.
//!
//! \return None.
//
//*****************************************************************************
void
GrLineDrawH(const tContext *pContext, long lX1, long lX2, long lY)
{
long lTemp;
//
// Check the arguments.
//
ASSERT(pContext);
//
// If the Y coordinate of this line is not in the clipping region, then
// there is nothing to be done.
//
if((lY < pContext->sClipRegion.sYMin) ||
(lY > pContext->sClipRegion.sYMax))
{
return;
}
//
// Swap the X coordinates if the first is larger than the second.
//
if(lX1 > lX2)
{
lTemp = lX1;
lX1 = lX2;
lX2 = lTemp;
}
//
// If the entire line is outside the clipping region, then there is nothing
// to be done.
//
if((lX1 > pContext->sClipRegion.sXMax) ||
(lX2 < pContext->sClipRegion.sXMin))
{
return;
}
//
// Clip the starting coordinate to the left side of the clipping region if
// required.
//
if(lX1 < pContext->sClipRegion.sXMin)
{
lX1 = pContext->sClipRegion.sXMin;
}
//
// Clip the ending coordinate to the right side of the clipping region if
// required.
//
if(lX2 > pContext->sClipRegion.sXMax)
{
lX2 = pContext->sClipRegion.sXMax;
}
//
// Call the low level horizontal line drawing routine.
//
DpyLineDrawH(pContext->pDisplay, lX1, lX2, lY, pContext->ulForeground);
}
//*****************************************************************************
//
//! Draws a vertical line.
//!
//! \param pContext is a pointer to the drawing context to use.
//! \param lX is the X coordinate of the line.
//! \param lY1 is the Y coordinate of one end of the line.
//! \param lY2 is the Y coordinate of the other end of the line.
//!
//! This function draws a vertical line, taking advantage of the fact that the
//! line is vertical to draw it more efficiently. The clipping of the vertical
//! line to the clipping rectangle is performed within this routine; the
//! display driver's vertical line routine is used to perform the actual line
//! drawing.
//!
//! \return None.
//
//*****************************************************************************
void
GrLineDrawV(const tContext *pContext, long lX, long lY1, long lY2)
{
long lTemp;
//
// Check the arguments.
//
ASSERT(pContext);
//
// If the X coordinate of this line is not within the clipping region, then
// there is nothing to be done.
//
if((lX < pContext->sClipRegion.sXMin) ||
(lX > pContext->sClipRegion.sXMax))
{
return;
}
//
// Swap the Y coordinates if the first is larger than the second.
//
if(lY1 > lY2)
{
lTemp = lY1;
lY1 = lY2;
lY2 = lTemp;
}
//
// If the entire line is out of the clipping region, then there is nothing
// to be done.
//
if((lY1 > pContext->sClipRegion.sYMax) ||
(lY2 < pContext->sClipRegion.sYMin))
{
return;
}
//
// Clip the starting coordinate to the top side of the clipping region if
// required.
//
if(lY1 < pContext->sClipRegion.sYMin)
{
lY1 = pContext->sClipRegion.sYMin;
}
//
// Clip the ending coordinate to the bottom side of the clipping region if
// required.
//
if(lY2 > pContext->sClipRegion.sYMax)
{
lY2 = pContext->sClipRegion.sYMax;
}
//
// Call the low level vertical line drawing routine.
//
DpyLineDrawV(pContext->pDisplay, lX, lY1, lY2, pContext->ulForeground);
}
//*****************************************************************************
//
//! Computes the clipping code used by the Cohen-Sutherland clipping algorithm.
//!
//! \param pContext is a pointer to the drawing context to use.
//! \param lX is the X coordinate of the point.
//! \param lY is the Y coordinate of the point.
//!
//! This function computes the clipping code used by the Cohen-Sutherland
//! clipping algorithm. Clipping is performed by classifying the endpoints of
//! the line based on their relation to the clipping region; this determines
//! those relationships.
//!
//! \return Returns the clipping code.
//
//*****************************************************************************
static long
GrClipCodeGet(const tContext *pContext, long lX, long lY)
{
long lCode;
//
// Initialize the clipping code to zero.
//
lCode = 0;
//
// Set bit zero of the clipping code if the Y coordinate is above the
// clipping region.
//
if(lY < pContext->sClipRegion.sYMin)
{
lCode |= 1;
}
//
// Set bit one of the clipping code if the Y coordinate is below the
// clipping region.
//
if(lY > pContext->sClipRegion.sYMax)
{
lCode |= 2;
}
//
// Set bit two of the clipping code if the X coordinate is to the left of
// the clipping region.
//
if(lX < pContext->sClipRegion.sXMin)
{
lCode |= 4;
}
//
// Set bit three of the clipping code if the X coordinate is to the right
// of the clipping region.
//
if(lX > pContext->sClipRegion.sXMax)
{
lCode |= 8;
}
//
// Return the clipping code.
//
return(lCode);
}
//*****************************************************************************
//
//! Clips a line to the clipping region.
//!
//! \param pContext is a pointer to the drawing context to use.
//! \param plX1 is the X coordinate of the start of the line.
//! \param plY1 is the Y coordinate of the start of the line.
//! \param plX2 is the X coordinate of the end of the line.
//! \param plY2 is the Y coordinate of the end of the line.
//!
//! This function clips a line to the extents of the clipping region using the
//! Cohen-Sutherland clipping algorithm. The ends of the line are classified
//! based on their relation to the clipping region, and the codes are used to
//! either trivially accept a line (both end points within the clipping
//! region), trivially reject a line (both end points to one side of the
//! clipping region), or to adjust an endpoint one axis at a time to the edge
//! of the clipping region until the line can either be trivially accepted or
//! trivially rejected.
//!
//! The provided coordinates are modified such that they reside within the
//! extents of the clipping region if the line is not rejected. If it is
//! rejected, the coordinates may be modified during the process of attempting
//! to clip them.
//!
//! \return Returns one if the clipped line lies within the extent of the
//! clipping region and zero if it does not.
//
//*****************************************************************************
static long
GrLineClip(const tContext *pContext, long *plX1, long *plY1, long *plX2,
long *plY2)
{
long lCode, lCode1, lCode2, lX, lY;
//
// Compute the clipping codes for the two endpoints of the line.
//
lCode1 = GrClipCodeGet(pContext, *plX1, *plY1);
lCode2 = GrClipCodeGet(pContext, *plX2, *plY2);
//
// Loop forever. This loop will be explicitly broken out of when the line
// is either trivially accepted or trivially rejected.
//
while(1)
{
//
// If both codes are zero, then both points lie within the extent of
// the clipping region. In this case, trivally accept the line.
//
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -