hackathon-dev #1
@ -2,9 +2,9 @@ BUILDUTILS=../buildutils
 | 
			
		||||
RESOURCES=../resources
 | 
			
		||||
SPLASHSCREEN=splash-vmwcblk.png
 | 
			
		||||
 | 
			
		||||
OBJS=main.o sysinput.o ep_init.o ep_upiwin.o ep_backlight.o ep_msg.o ep_devctxt.o ep_upiwin_tmp.o ep_util.o \
 | 
			
		||||
     fbinit.o rect.o gfxobj.o devctxt.o dc_screen.o fontengine.o bitmap.o fbprimitive.o \
 | 
			
		||||
     log.o gpio.o msg_queue.o time_func.o config.o splash.o
 | 
			
		||||
OBJS=main.o sysinput.o ep_init.o ep_upiwin.o ep_backlight.o ep_msg.o ep_devctxt.o ep_bitmap.o
 | 
			
		||||
     ep_upiwin_tmp.o ep_util.o fbinit.o rect.o gfxobj.o devctxt.o dc_screen.o fontengine.o \
 | 
			
		||||
	 bitmap.o fbprimitive.o log.o gpio.o msg_queue.o time_func.o config.o splash.o
 | 
			
		||||
LIBS=-lpython3.7m -lcrypt -lfreetype -lbcm2835 -lpthread -ldl -lutil -lm
 | 
			
		||||
CFLAGS=-I/usr/include/python3.7m -I/usr/include/freetype2 -I/usr/include/libpng16 \
 | 
			
		||||
       -Wall -fstack-protector -fwrapv -fno-PIE -g -O3 -DDEBUG_ASSERT
 | 
			
		||||
 | 
			
		||||
@ -89,6 +89,7 @@ static BOOL screen_line(PVOID privdata, INT32 x1, INT32 y1, INT32 x2, INT32 y2,
 | 
			
		||||
  ASSERT(y2 >= 0);
 | 
			
		||||
  ASSERT(y2 < Fb_Info->height);
 | 
			
		||||
  
 | 
			
		||||
  /* uses Bresenham's line algorithm with 16-bit fixed-point arithmetic */
 | 
			
		||||
  if (ABS(dx) < ABS(dy))
 | 
			
		||||
  {
 | 
			
		||||
    if (y1 > y2)
 | 
			
		||||
 | 
			
		||||
@ -35,9 +35,6 @@ static BOOL line_clip(PINT32 output, INT32 x1, INT32 y1, INT32 x2, INT32 y2, INT
 | 
			
		||||
  INT32 tmp;
 | 
			
		||||
  int nloop = 0;
 | 
			
		||||
  
 | 
			
		||||
  Log(LDEBUG, "clipping line from (%d, %d) to (%d, %d) against bounding box (%d, %d, %d, %d)", x1 >> CPX, y1 >> CPX, x2 >> CPX, y2 >> CPX,
 | 
			
		||||
      xmin >> CPX, ymin >> CPX, xmax >> CPX, ymax >> CPX);
 | 
			
		||||
  
 | 
			
		||||
  /* Cohen-Sutherland line-clipping algorithm (see Foley & Van Dam, pp. 145-149) */
 | 
			
		||||
  for (;;)
 | 
			
		||||
  {
 | 
			
		||||
@ -49,18 +46,11 @@ static BOOL line_clip(PINT32 output, INT32 x1, INT32 y1, INT32 x2, INT32 y2, INT
 | 
			
		||||
    outcode1 = line_clip_outcode(x1, y1, xmin, ymin, xmax, ymax);
 | 
			
		||||
	outcode2 = line_clip_outcode(x2, y2, xmin, ymin, xmax, ymax);
 | 
			
		||||
	if ((outcode1 & outcode2) != 0)
 | 
			
		||||
	{
 | 
			
		||||
	  Log(LDEBUG,"*REJECT*");
 | 
			
		||||
	  return FALSE; /* trivial rejection */
 | 
			
		||||
	}
 | 
			
		||||
	else if ((outcode1 == 0) && (outcode2 == 0))
 | 
			
		||||
	{
 | 
			
		||||
	  Log(LDEBUG,"*ACCEPT*");
 | 
			
		||||
	  break; /* trivial acceptance */
 | 
			
		||||
	}
 | 
			
		||||
	if (outcode1 == 0)
 | 
			
		||||
	{
 | 
			
		||||
	  Log(LDEBUG, "exchange points");
 | 
			
		||||
	  tmp = x1;
 | 
			
		||||
	  x1 = x2;
 | 
			
		||||
	  x2 = tmp;
 | 
			
		||||
@ -73,28 +63,23 @@ static BOOL line_clip(PINT32 output, INT32 x1, INT32 y1, INT32 x2, INT32 y2, INT
 | 
			
		||||
	{
 | 
			
		||||
	  x1 += M(x2 - x1, D(ymin - y1, y2 - y1));
 | 
			
		||||
	  y1 = ymin;
 | 
			
		||||
	  Log(LDEBUG, "clipped against top to point (%d, %d)", x1 >> CPX, y1 >> CPX);
 | 
			
		||||
	}
 | 
			
		||||
	else if (outcode1 & 0x4)
 | 
			
		||||
	{
 | 
			
		||||
	  x1 += M(x2 - x1, D(ymax - ONE - y1, y2 - y1));
 | 
			
		||||
	  y1 = ymax - ONE;
 | 
			
		||||
	  Log(LDEBUG, "clipped against bottom to point (%d, %d)", x1 >> CPX, y1 >> CPX);
 | 
			
		||||
	}
 | 
			
		||||
	else if (outcode1 & 0x2)
 | 
			
		||||
	{
 | 
			
		||||
	  y1 += M(y2 - y1, D(xmax - ONE - x1, x2 - x1));
 | 
			
		||||
	  x1 = xmax - ONE;
 | 
			
		||||
	  Log(LDEBUG, "clipped against right to point (%d, %d)", x1 >> CPX, y1 >> CPX);
 | 
			
		||||
	}
 | 
			
		||||
	else if (outcode1 & 0x1)
 | 
			
		||||
	{
 | 
			
		||||
	  y1 += M(y2 - y1, D(xmin - x1, x2 - x1));
 | 
			
		||||
	  x1 = xmin;
 | 
			
		||||
	  Log(LDEBUG, "clipped against left to point (%d, %d)", x1 >> CPX, y1 >> CPX);
 | 
			
		||||
	}
 | 
			
		||||
  }
 | 
			
		||||
  Log(LDEBUG, "final line is from (%d, %d) to (%d, %d)", x1 >> CPX, y1 >> CPX, x2 >> CPX, y2 >> CPX);
 | 
			
		||||
  output[0] = x1;
 | 
			
		||||
  output[1] = y1;
 | 
			
		||||
  output[2] = x2;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										119
									
								
								src/ep_bitmap.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										119
									
								
								src/ep_bitmap.c
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,119 @@
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#define PY_SSIZE_T_CLEAN
 | 
			
		||||
#include <Python.h>
 | 
			
		||||
#include "gfxobj.h"
 | 
			
		||||
#include "bitmap.h"
 | 
			
		||||
#include "ep_types.h"
 | 
			
		||||
 | 
			
		||||
static PyMethodDef BitmapMethods[] = {
 | 
			
		||||
  {NULL, NULL, 0, NULL}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static PyObject *bitmap_get_width(BitmapObject *self, void *closure)
 | 
			
		||||
{
 | 
			
		||||
  if (!(self->pbmp))
 | 
			
		||||
  {
 | 
			
		||||
    PyErr_SetString(PyExc_RuntimeError, "bad bitmap object");
 | 
			
		||||
    return NULL;
 | 
			
		||||
  }
 | 
			
		||||
  return PyLong_FromUnsignedLong(self->pbmp->width);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static PyObject *bitmap_get_height(BitmapObject *self, void *closure)
 | 
			
		||||
{
 | 
			
		||||
  if (!(self->pbmp))
 | 
			
		||||
  {
 | 
			
		||||
    PyErr_SetString(PyExc_RuntimeError, "bad bitmap object");
 | 
			
		||||
    return NULL;
 | 
			
		||||
  }
 | 
			
		||||
  return PyLong_FromUnsignedLong(self->pbmp->height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static PyGetSetDef BitmapProperties[] = {
 | 
			
		||||
  {"width", (getter)bitmap_get_width, NULL,
 | 
			
		||||
   "Width of this bitmap", NULL},
 | 
			
		||||
  {"height", (getter)bitmap_get_height, NULL,
 | 
			
		||||
   "Height of this bitmap", NULL},
 | 
			
		||||
  {NULL, NULL, NULL, NULL, NULL}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static int bitmap_init(BitmapObject *self, PyObject *args, PyObject *kwds)
 | 
			
		||||
{
 | 
			
		||||
  static char *kwlist[] = { "width", "height", NULL };
 | 
			
		||||
  int width = 0, height = 0;
 | 
			
		||||
  
 | 
			
		||||
  if (!PyArg_ParseTupleAndKeywords(args, kwds, "$ii", kwlist, &width, &height))
 | 
			
		||||
    return -1;
 | 
			
		||||
  
 | 
			
		||||
  width = MAX(1, width);
 | 
			
		||||
  height = MAX(1, height);
 | 
			
		||||
  self->pbmp = BMP_Create(width, height, NULL);
 | 
			
		||||
  if (!(self->bmp))
 | 
			
		||||
  {
 | 
			
		||||
	  PyErr_SetString(PyExc_RuntimeError, "unable to create bitmap");
 | 
			
		||||
	  return -1;
 | 
			
		||||
  }
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void bitmap_dealloc(BitmapObject *self)
 | 
			
		||||
{
 | 
			
		||||
  if (self->pbmp)
 | 
			
		||||
    BMP_Delete(self->pbmp);
 | 
			
		||||
  Py_TYPE(self)->tp_free((PyObject *)self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PyTypeObject BitmapType = {
 | 
			
		||||
  PyVarObject_HEAD_INIT(NULL, 0)
 | 
			
		||||
  .tp_name = "upiwin.Bitmap",
 | 
			
		||||
  .tp_doc = "Bitmap object",
 | 
			
		||||
  .tp_basicsize = sizeof(BitmapObject),
 | 
			
		||||
  .tp_itemsize = 0,
 | 
			
		||||
  .tp_flags = Py_TPFLAGS_DEFAULT,
 | 
			
		||||
  .tp_new = PyType_GenericNew,
 | 
			
		||||
  .tp_init = (initproc)bitmap_init,
 | 
			
		||||
  .tp_dealloc = (destructor)bitmap_dealloc,
 | 
			
		||||
  .tp_methods = BitmapMethods,
 | 
			
		||||
  .tp_getset = BitmapProperties,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
HRESULT Epython_register_bitmap(PyObject *module)
 | 
			
		||||
{
 | 
			
		||||
  if (PyType_Ready(&BitmapType) < 0)
 | 
			
		||||
	return E_FAIL;
 | 
			
		||||
  Py_INCREF(&BitmapType);
 | 
			
		||||
  if (PyModule_AddObject(module, "Bitmap", (PyObject *)(&BitmapType)) < 0)
 | 
			
		||||
  {
 | 
			
		||||
    Py_DECREF(&BitmapType);
 | 
			
		||||
	return E_FAIL;
 | 
			
		||||
  }
 | 
			
		||||
  return S_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PyObject *Epython_wrap_bitmap(PBITMAP pbmp)
 | 
			
		||||
{
 | 
			
		||||
  PyObject *rc = NULL, *args, *kwargs;
 | 
			
		||||
  BitmapObject *pbitmapobj;
 | 
			
		||||
  
 | 
			
		||||
  args = PyTuple_New(0);
 | 
			
		||||
  if (args)
 | 
			
		||||
  {
 | 
			
		||||
	kwargs = PyDict_New();
 | 
			
		||||
	if (kwargs)
 | 
			
		||||
	{
 | 
			
		||||
	  rc = PyType_GenericNew(&BitmapType, args, kwargs);
 | 
			
		||||
	  if (rc)
 | 
			
		||||
	  {
 | 
			
		||||
	    pbitmapobj = (BitmapObject)rc;
 | 
			
		||||
		BMP_Delete(pbitmapobj->pbmp);
 | 
			
		||||
		pbitmapobj->pbmp = pbmp;
 | 
			
		||||
	  }
 | 
			
		||||
	  Py_DECREF(kwargs);
 | 
			
		||||
	}
 | 
			
		||||
    Py_DECREF(args);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  if (!rc)
 | 
			
		||||
    PyErr_SetString(PyExc_RuntimeError, "unable to create bitmap");
 | 
			
		||||
  return rc;
 | 
			
		||||
}
 | 
			
		||||
@ -7,13 +7,7 @@
 | 
			
		||||
#include "devctxt.h"
 | 
			
		||||
#include "dc_screen.h"
 | 
			
		||||
#include "ep_init.h"
 | 
			
		||||
 | 
			
		||||
typedef struct tagDevCtxtObject {
 | 
			
		||||
  PyObject_HEAD
 | 
			
		||||
  PDCTXT pdctxt;
 | 
			
		||||
} DevCtxtObject;
 | 
			
		||||
 | 
			
		||||
PyTypeObject DevCtxtType;  /* forward declaration */
 | 
			
		||||
#include "ep_types.h"
 | 
			
		||||
 | 
			
		||||
static PyObject *devctxt_set_pixel(DevCtxtObject *self, PyObject *args)
 | 
			
		||||
{
 | 
			
		||||
@ -145,6 +139,54 @@ static PyObject *devctxt_set_clip_rect(DevCtxtObject *self, PyObject *args)
 | 
			
		||||
  return PyBool_FromLong(rc);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static PyObject *devctxt_select_bitmap(DevCtxtObject *self, BitmapObject *newbmp)
 | 
			
		||||
{
 | 
			
		||||
  BitmapObject *old_bitmap = NULL;
 | 
			
		||||
  PBITMAP old_pbmp;
 | 
			
		||||
  
 | 
			
		||||
  if ((self->pdctxt->flags & DCFLG_TYPES) != DCFLG_IS_MEMORY)
 | 
			
		||||
  {
 | 
			
		||||
    PyErr_SetString(PyExc_RuntimeError, "must select bitmap into memory device context");
 | 
			
		||||
	return NULL;
 | 
			
		||||
  }
 | 
			
		||||
  old_bitmap = self->selected_bitmap;  
 | 
			
		||||
  old_pbmp = DC_SelectObject(self->pdctxt, newbmp->pbmp);
 | 
			
		||||
  if (!old_bitmap)
 | 
			
		||||
  {
 | 
			
		||||
    old_bitmap = Epython_wrap_bitmap(old_pbmp);
 | 
			
		||||
	if (!old_bitmap)
 | 
			
		||||
	{
 | 
			
		||||
	  DC_SelectObject(self->pdctxt, old_pbmp);
 | 
			
		||||
	  return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	  PY_INCREF(old_bitmap);
 | 
			
		||||
  }
 | 
			
		||||
  Py_DECREF(self->selected_bitmap);
 | 
			
		||||
  self->selected_bitmap = newbmp;
 | 
			
		||||
  Py_INCREF(self->selected_bitmap);
 | 
			
		||||
  return old_bitmap;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static PyObject *devctxt_select_object(DevCtxtObject *self, PyObject *args)
 | 
			
		||||
{
 | 
			
		||||
  PyObject *obj;
 | 
			
		||||
  PBITMAP old_bitmap;
 | 
			
		||||
  BitmapObject *old_bmp_object, *new_bmp_object;
 | 
			
		||||
  
 | 
			
		||||
  if (!PyArg_ParseTuple(args, "O", &obj))
 | 
			
		||||
    return NULL;
 | 
			
		||||
  if (!obj)
 | 
			
		||||
  {
 | 
			
		||||
    PyErr_SetString(PyExc_RuntimeError, "bad object selected");
 | 
			
		||||
	return NULL;
 | 
			
		||||
  }
 | 
			
		||||
  if (PyObject_TypeCheck(obj, &BitmapType))
 | 
			
		||||
    return devctxt_select_bitmap(self, (BitmapObject *)obj);
 | 
			
		||||
  PyErr_SetString(PyExc_RuntimeError, "unknown type of object selected");
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static PyMethodDef DevCtxtMethods[] = {
 | 
			
		||||
  {"set_pixel", (PyCFunction)devctxt_set_pixel, METH_VARARGS,
 | 
			
		||||
   "Sets a single pixel on the display."},
 | 
			
		||||
@ -158,6 +200,8 @@ static PyMethodDef DevCtxtMethods[] = {
 | 
			
		||||
   "Draws a solid rectangle."},
 | 
			
		||||
  {"bitblt", (PyCFunction)devctxt_bitblt, METH_VARARGS,
 | 
			
		||||
   "Copy bits from one device context to another."},
 | 
			
		||||
  {"select_object", (PyCFunction)devctxt_select_object, METH_VARARGS,
 | 
			
		||||
   "Selects a graphic object into the device context."},
 | 
			
		||||
  {"get_clip_rect", (PyCFunction)devctxt_get_clip_rect, METH_VARARGS,
 | 
			
		||||
   "Returns the current clipping rectangle of the device context."},
 | 
			
		||||
  {"set_clip_rect", (PyCFunction)devctxt_set_clip_rect, METH_VARARGS,
 | 
			
		||||
@ -165,7 +209,6 @@ static PyMethodDef DevCtxtMethods[] = {
 | 
			
		||||
  {NULL, NULL, 0, NULL}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static PyObject *devctxt_get_rop2(DevCtxtObject *self, void *closure)
 | 
			
		||||
{
 | 
			
		||||
  if (!(self->pdctxt))
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										28
									
								
								src/ep_types.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										28
									
								
								src/ep_types.h
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,28 @@
 | 
			
		||||
#ifndef __EP_TYPES_H_INCLUDED
 | 
			
		||||
#define __EP_TYPES_H_INCLUDED
 | 
			
		||||
 | 
			
		||||
#define PY_SSIZE_T_CLEAN
 | 
			
		||||
#include <Python.h>
 | 
			
		||||
#include "wintype.h"
 | 
			
		||||
#include "gfxtype.h"
 | 
			
		||||
#include "gfxobj.h"
 | 
			
		||||
#include "devctxt.h"
 | 
			
		||||
#include "bitmap.h"
 | 
			
		||||
 | 
			
		||||
typedef struct tagBitmapObject {
 | 
			
		||||
  PyObject_HEAD
 | 
			
		||||
  PBITMAP pbmp;
 | 
			
		||||
} BitmapObject;
 | 
			
		||||
 | 
			
		||||
typedef struct tagDevCtxtObject {
 | 
			
		||||
  PyObject_HEAD
 | 
			
		||||
  PDCTXT pdctxt;
 | 
			
		||||
  BitmapObject *selected_bitmap;
 | 
			
		||||
} DevCtxtObject;
 | 
			
		||||
 | 
			
		||||
extern PyTypeObject DevCtxtType;
 | 
			
		||||
extern PyTypeObject BitmapType;
 | 
			
		||||
 | 
			
		||||
extern PyObject *Epython_wrap_bitmap(PBITMAP pbmp);
 | 
			
		||||
 | 
			
		||||
#endif /* __EP_TYPES_H_INCLUDED */
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user