components/u8g2/csrc/u8g2_hvline.c

changeset 0
88d965579617
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/u8g2/csrc/u8g2_hvline.c	Tue Oct 08 12:00:31 2019 +0200
@@ -0,0 +1,255 @@
+/*
+
+  u8g2_hvline.c
+
+  Universal 8bit Graphics Library (https://github.com/olikraus/u8g2/)
+
+  Copyright (c) 2016, olikraus@gmail.com
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without modification, 
+  are permitted provided that the following conditions are met:
+
+  * Redistributions of source code must retain the above copyright notice, this list 
+    of conditions and the following disclaimer.
+    
+  * Redistributions in binary form must reproduce the above copyright notice, this 
+    list of conditions and the following disclaimer in the documentation and/or other 
+    materials provided with the distribution.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
+  CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
+  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
+  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
+  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
+  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
+  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
+  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
+  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
+  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
+
+
+  Calltree
+  
+    void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir)
+    u8g2->cb->draw_l90
+    u8g2_draw_hv_line_2dir
+    u8g2->ll_hvline(u8g2, x, y, len, dir);
+    
+
+*/
+
+#include "u8g2.h"
+#include <assert.h>
+
+/*==========================================================*/
+/* intersection procedure */
+
+/*
+  Description:
+    clip range from pos a (included) with line len (a+len excluded) agains c (included) to d (excluded)
+  Assumptions:
+    len > 0
+    c <= d		(this is not checked)
+  will return 0 if there is no intersection and if a > b
+
+*/
+
+static uint8_t u8g2_clip_intersection2(u8g2_uint_t *ap, u8g2_uint_t *len, u8g2_uint_t c, u8g2_uint_t d)
+{
+  u8g2_uint_t a = *ap;
+  u8g2_uint_t b;
+  b  = a;
+  b += *len;
+
+  /*
+    Description:
+      clip range from a (included) to b (excluded) agains c (included) to d (excluded)
+    Assumptions:
+      a <= b		(violation is checked and handled correctly)
+      c <= d		(this is not checked)
+    will return 0 if there is no intersection and if a > b
+
+    optimized clipping: c is set to 0 --> 27 Oct 2018: again removed the c==0 assumption
+    
+    replaced by uint8_t u8g2_clip_intersection2
+  */
+
+  /* handle the a>b case correctly. If code and time is critical, this could */
+  /* be removed completly (be aware about memory curruption for wrong */
+  /* arguments) or return 0 for a>b (will lead to skipped lines for wrong */
+  /* arguments) */  
+  
+  /* removing the following if clause completly may lead to memory corruption of a>b */
+  if ( a > b )
+  {    
+    /* replacing this if with a simple "return 0;" will not handle the case with negative a */    
+    if ( a < d )
+    {
+      b = d;
+      b--;
+    }
+    else
+    {
+      a = c;
+    }
+  }
+  
+  /* from now on, the asumption a <= b is ok */
+  
+  if ( a >= d )
+    return 0;
+  if ( b <= c )
+    return 0;
+  if ( a < c )		
+    a = c;
+  if ( b > d )
+    b = d;
+  
+  *ap = a;
+  b -= a;
+  *len = b;
+  return 1;
+}
+
+
+
+/*==========================================================*/
+/* draw procedures */
+
+/*
+  x,y		Upper left position of the line within the pixel buffer 
+  len		length of the line in pixel, len must not be 0
+  dir		0: horizontal line (left to right)
+		1: vertical line (top to bottom)
+  This function first adjusts the y position to the local buffer. Then it
+  will clip the line and call u8g2_draw_low_level_hv_line()
+
+*/
+void u8g2_draw_hv_line_2dir(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir)
+{
+
+  /* clipping happens before the display rotation */
+
+  /* transform to pixel buffer coordinates */
+  y -= u8g2->pixel_curr_row;
+  
+  u8g2->ll_hvline(u8g2, x, y, len, dir);
+}
+
+
+/*
+  This is the toplevel function for the hv line draw procedures.
+  This function should be called by the user.
+  
+  "dir" may have 4 directions: 0 (left to right), 1, 2, 3 (down up)
+*/
+void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir)
+{
+  /* Make a call to the callback function (e.g. u8g2_draw_l90_r0). */
+  /* The callback may rotate the hv line */
+  /* after rotation this will call u8g2_draw_hv_line_4dir() */
+  
+#ifdef U8G2_WITH_CLIP_WINDOW_SUPPORT
+  if ( u8g2->is_page_clip_window_intersection != 0 )
+#endif /* U8G2_WITH_CLIP_WINDOW_SUPPORT */
+    if ( len != 0 )
+    {
+    
+      /* convert to two directions */    
+      if ( len > 1 )
+      {
+	if ( dir == 2 )
+	{
+	  x -= len;
+	  x++;
+	}
+	else if ( dir == 3 )
+	{
+	  y -= len;
+	  y++;
+	}
+      }
+      dir &= 1;  
+      
+      /* clip against the user window */
+      if ( dir == 0 )
+      {
+	if ( y < u8g2->user_y0 )
+	  return;
+	if ( y >= u8g2->user_y1 )
+	  return;
+	if ( u8g2_clip_intersection2(&x, &len, u8g2->user_x0, u8g2->user_x1) == 0 )
+	  return;
+      }
+      else
+      {
+	if ( x < u8g2->user_x0 )
+	  return;
+	if ( x >= u8g2->user_x1 )
+	  return;
+	if ( u8g2_clip_intersection2(&y, &len, u8g2->user_y0, u8g2->user_y1) == 0 )
+	  return;
+      }
+      
+      
+      u8g2->cb->draw_l90(u8g2, x, y, len, dir);
+    }
+}
+
+void u8g2_DrawHLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len)
+{
+// #ifdef U8G2_WITH_INTERSECTION
+//   if ( u8g2_IsIntersection(u8g2, x, y, x+len, y+1) == 0 ) 
+//     return;
+// #endif /* U8G2_WITH_INTERSECTION */
+  u8g2_DrawHVLine(u8g2, x, y, len, 0);
+}
+
+void u8g2_DrawVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len)
+{
+// #ifdef U8G2_WITH_INTERSECTION
+//   if ( u8g2_IsIntersection(u8g2, x, y, x+1, y+len) == 0 ) 
+//     return;
+// #endif /* U8G2_WITH_INTERSECTION */
+  u8g2_DrawHVLine(u8g2, x, y, len, 1);
+}
+
+void u8g2_DrawPixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y)
+{
+#ifdef U8G2_WITH_INTERSECTION
+  if ( y < u8g2->user_y0 )
+    return;
+  if ( y >= u8g2->user_y1 )
+    return;
+  if ( x < u8g2->user_x0 )
+    return;
+  if ( x >= u8g2->user_x1 )
+    return;
+#endif /* U8G2_WITH_INTERSECTION */
+  u8g2_DrawHVLine(u8g2, x, y, 1, 0);
+}
+
+/*
+  Assign the draw color for all drawing functions.
+  color may be 0 or 1. The actual color is defined by the display.
+  With color = 1 the drawing function will set the display memory to 1.
+  For OLEDs this ususally means, that the pixel is enabled and the LED 
+  at the pixel is turned on.
+  On an LCD it usually means that the LCD segment of the pixel is enabled, 
+  which absorbs the light.
+  For eInk/ePaper it means black ink.
+
+  7 Jan 2017: Allow color value 2 for XOR operation.
+  
+*/
+void u8g2_SetDrawColor(u8g2_t *u8g2, uint8_t color)
+{
+  u8g2->draw_color = color;	/* u8g2_SetDrawColor: just assign the argument */ 
+  if ( color >= 3 )
+    u8g2->draw_color = 1;	/* u8g2_SetDrawColor: make color as one if arg is invalid */
+}
+

mercurial