From 976c9cf3adf5dd91e6ed77d66b01f47efd7a5845 Mon Sep 17 00:00:00 2001 From: patacongo Date: Wed, 6 Jun 2012 18:07:49 +0000 Subject: [PATCH] Fix a divide-by-zero error in the trapezoid drawing logic git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4807 42af7a65-404d-4744-a932-0658087f49c3 --- ChangeLog | 4 ++++ Documentation/NuttX.html | 2 +- configs/pic32mx7mmb/nsh/appconfig | 2 +- graphics/nxglib/fb/nxglib_filltrapezoid.c | 20 ++++++++++++++---- graphics/nxglib/lcd/nxglib_filltrapezoid.c | 24 +++++++++++++++++----- 5 files changed, 41 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5b3063c30d..7b32ae20f9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2896,4 +2896,8 @@ when the work queue is enabled. This is partially because some interrupt related logic is not built in that case. Simply disabling then re- enabling interrupts restores the proper state. + * graphics/nxglib/lcd/nxglib_filltrapezoid.c and fb/nxglib_filltrapezoid.c: + Fix an error when the trapezoid is only 1 line high. In this case, a + divide by zero error would occur. The fix is to draw the 1 line high + trapezoid as a run. diff --git a/Documentation/NuttX.html b/Documentation/NuttX.html index a467917f09..8a4489ff6f 100644 --- a/Documentation/NuttX.html +++ b/Documentation/NuttX.html @@ -2275,7 +2275,7 @@

STATUS: Two verified configurations are available: - (1) The basic OS test configuration that verfies the correctnexx port of Nuttx, and (2) an extensive NuttShell (NSH) configuration. + (1) The basic OS test configuration that verfies the correctness port of Nuttx, and (2) an extensive NuttShell (NSH) configuration. The NSH configuration includes: (1) Full network support, (2) Verified SPI driver, diff --git a/configs/pic32mx7mmb/nsh/appconfig b/configs/pic32mx7mmb/nsh/appconfig index 99292fc2bd..faa1f49ce7 100644 --- a/configs/pic32mx7mmb/nsh/appconfig +++ b/configs/pic32mx7mmb/nsh/appconfig @@ -65,7 +65,7 @@ ifeq ($(CONFIG_CDCACM),y) CONFIGURED_APPS += examples/cdcacm # Uncomment the following to enable the examples/usbterm built-in # CONFIGURED_APPS += examples/usbterm -#else +else # Prolifics PL2303 emulation configurations diff --git a/graphics/nxglib/fb/nxglib_filltrapezoid.c b/graphics/nxglib/fb/nxglib_filltrapezoid.c index 64554fae1c..7623bf84fc 100644 --- a/graphics/nxglib/fb/nxglib_filltrapezoid.c +++ b/graphics/nxglib/fb/nxglib_filltrapezoid.c @@ -1,8 +1,8 @@ /**************************************************************************** * graphics/nxglib/fb/nxglib_filltrapezoid.c * - * Copyright (C) 2008-2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Copyright (C) 2008-2012 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -126,8 +126,20 @@ void NXGL_FUNCNAME(nxgl_filltrapezoid,NXGLIB_SUFFIX)( /* Calculate the slope of the left and right side of the trapezoid */ - dx1dy = b16divi((trap->bot.x1 - x1), nrows - 1); - dx2dy = b16divi((trap->bot.x2 - x2), nrows - 1); + if (nrows > 1) + { + dx1dy = b16divi((trap->bot.x1 - x1), nrows - 1); + dx2dy = b16divi((trap->bot.x2 - x2), nrows - 1); + } + else + { + /* The trapezoid is a run! Use the average width. */ + + x1 = (x1 + trap->bot.x1) >> 1; + x2 = (x2 + trap->bot.x2) >> 1; + dx1dy = 0; + dx2dy = 0; + } /* Perform vertical clipping */ diff --git a/graphics/nxglib/lcd/nxglib_filltrapezoid.c b/graphics/nxglib/lcd/nxglib_filltrapezoid.c index 0653da4138..3ba44b34a7 100644 --- a/graphics/nxglib/lcd/nxglib_filltrapezoid.c +++ b/graphics/nxglib/lcd/nxglib_filltrapezoid.c @@ -1,8 +1,8 @@ /**************************************************************************** * graphics/nxglib/lcd/nxglib_filltrapezoid.c * - * Copyright (C) 2010-2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Copyright (C) 2010-2012 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -124,9 +124,23 @@ void NXGL_FUNCNAME(nxgl_filltrapezoid,NXGLIB_SUFFIX) /* Calculate the slope of the left and right side of the trapezoid */ - dy = boty - topy; - dx1dy = b16divi((botx1 - topx1), dy); - dx2dy = b16divi((botx2 - topx2), dy); + dy = boty - topy; + if (dy > 0) + { + dx1dy = b16divi((botx1 - topx1), dy); + dx2dy = b16divi((botx2 - topx2), dy); + } + else + { + /* The trapezoid is a run! Use the average width. */ + + topx1 = (topx1 + botx1) >> 1; + topx2 = (topx2 + botx2) >> 1; + botx1 = topx1; + botx2 = topx2; + dx1dy = 0; + dx2dy = 0; + } /* Perform vertical clipping */