From 12315f4d0e0ae993805f141f64cb8c73c5297311 Mon Sep 17 00:00:00 2001 From: Hans Lambermont Date: Sat, 12 Oct 2002 11:37:38 +0000 Subject: Initial revision --- source/blender/img/IMG_Api.h | 63 ++++++ source/blender/img/Makefile | 37 ++++ source/blender/img/intern/IMG_Api.cpp | 121 ++++++++++++ source/blender/img/intern/IMG_BrushRGBA32.cpp | 132 +++++++++++++ source/blender/img/intern/IMG_BrushRGBA32.h | 134 +++++++++++++ source/blender/img/intern/IMG_CanvasRGBA32.cpp | 82 ++++++++ source/blender/img/intern/IMG_CanvasRGBA32.h | 95 +++++++++ source/blender/img/intern/IMG_Color.h | 149 ++++++++++++++ source/blender/img/intern/IMG_Line.cpp | 33 ++++ source/blender/img/intern/IMG_Line.h | 142 ++++++++++++++ source/blender/img/intern/IMG_MemPtr.h | 114 +++++++++++ source/blender/img/intern/IMG_Pixmap.cpp | 59 ++++++ source/blender/img/intern/IMG_Pixmap.h | 186 ++++++++++++++++++ source/blender/img/intern/IMG_PixmapRGBA32.cpp | 262 +++++++++++++++++++++++++ source/blender/img/intern/IMG_PixmapRGBA32.h | 261 ++++++++++++++++++++++++ source/blender/img/intern/IMG_Rect.cpp | 129 ++++++++++++ source/blender/img/intern/IMG_Rect.h | 200 +++++++++++++++++++ source/blender/img/intern/IMG_Types.h | 48 +++++ source/blender/img/intern/Makefile | 49 +++++ 19 files changed, 2296 insertions(+) create mode 100644 source/blender/img/IMG_Api.h create mode 100644 source/blender/img/Makefile create mode 100644 source/blender/img/intern/IMG_Api.cpp create mode 100644 source/blender/img/intern/IMG_BrushRGBA32.cpp create mode 100644 source/blender/img/intern/IMG_BrushRGBA32.h create mode 100644 source/blender/img/intern/IMG_CanvasRGBA32.cpp create mode 100644 source/blender/img/intern/IMG_CanvasRGBA32.h create mode 100644 source/blender/img/intern/IMG_Color.h create mode 100644 source/blender/img/intern/IMG_Line.cpp create mode 100644 source/blender/img/intern/IMG_Line.h create mode 100644 source/blender/img/intern/IMG_MemPtr.h create mode 100644 source/blender/img/intern/IMG_Pixmap.cpp create mode 100644 source/blender/img/intern/IMG_Pixmap.h create mode 100644 source/blender/img/intern/IMG_PixmapRGBA32.cpp create mode 100644 source/blender/img/intern/IMG_PixmapRGBA32.h create mode 100644 source/blender/img/intern/IMG_Rect.cpp create mode 100644 source/blender/img/intern/IMG_Rect.h create mode 100644 source/blender/img/intern/IMG_Types.h create mode 100644 source/blender/img/intern/Makefile (limited to 'source/blender/img') diff --git a/source/blender/img/IMG_Api.h b/source/blender/img/IMG_Api.h new file mode 100644 index 00000000000..42b0d5e3a74 --- /dev/null +++ b/source/blender/img/IMG_Api.h @@ -0,0 +1,63 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + * @author Maarten Gribnau + * @date March 7, 2001 + */ +#ifndef _H_IMG_API +#define _H_IMG_API + +#include + + +typedef void* IMG_BrushPtr; +typedef void* IMG_CanvasPtr; + +#ifdef __cplusplus +extern "C" { +#endif + + +extern IMG_BrushPtr IMG_BrushCreate(unsigned int width, unsigned int height, float red, float green, float blue, float alpha); +extern void IMG_BrushDispose(IMG_BrushPtr brush); + +extern IMG_CanvasPtr IMG_CanvasCreate(unsigned int width, unsigned int height); +extern IMG_CanvasPtr IMG_CanvasCreateFromPtr(void* imagePtr, unsigned int width, unsigned int height, size_t rowBytes); +extern void IMG_CanvasDispose(IMG_CanvasPtr canvas); +extern void IMG_CanvasDraw(IMG_CanvasPtr canvas, IMG_BrushPtr brush, unsigned int x, unsigned int y); +extern void IMG_CanvasDrawUV(IMG_CanvasPtr canvas, IMG_BrushPtr brush, float u, float v); +extern void IMG_CanvasDrawLine(IMG_CanvasPtr canvas, IMG_BrushPtr brush, unsigned int xStart, unsigned int yStart, unsigned int xEns, unsigned int yEnd); +extern void IMG_CanvasDrawLineUV(IMG_CanvasPtr canvas, IMG_BrushPtr brush, float uStart, float vStart, float uEnd, float vEnd); + +#ifdef __cplusplus +} +#endif + +#endif // _H_IMG_API diff --git a/source/blender/img/Makefile b/source/blender/img/Makefile new file mode 100644 index 00000000000..2e1172d4635 --- /dev/null +++ b/source/blender/img/Makefile @@ -0,0 +1,37 @@ +# +# $Id$ +# +# ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. The Blender +# Foundation also sells licenses for use in proprietary software under +# the Blender License. See http://www.blender.org/BL/ for information +# about this. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. +# All rights reserved. +# +# The Original Code is: all of this file. +# +# Contributor(s): none yet. +# +# ***** END GPL/BL DUAL LICENSE BLOCK ***** +# +# Bounces make to subdirectories. + +SOURCEDIR = source/blender/img +DIRS = intern + +include nan_subdirs.mk diff --git a/source/blender/img/intern/IMG_Api.cpp b/source/blender/img/intern/IMG_Api.cpp new file mode 100644 index 00000000000..1be8b294c28 --- /dev/null +++ b/source/blender/img/intern/IMG_Api.cpp @@ -0,0 +1,121 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ +#include "../IMG_Api.h" + +#include "IMG_BrushRGBA32.h" +#include "IMG_CanvasRGBA32.h" + + +IMG_BrushPtr IMG_BrushCreate(unsigned int w, unsigned int h, float r, float g, float b, float a) +{ + IMG_BrushPtr brush = 0; + try { + IMG_ColorRGB c (r, g, b); + brush = new IMG_BrushRGBA32 (w, h, c, a); + } + catch (...) { + brush = 0; + } + return brush; +} + + +void IMG_BrushDispose(IMG_BrushPtr brush) +{ + if (brush) { + delete ((IMG_BrushRGBA32*)brush); + brush = 0; + } +} + + +IMG_CanvasPtr IMG_CanvasCreate(unsigned int w, unsigned int h) +{ + IMG_CanvasPtr canvas = 0; + try { + canvas = new IMG_CanvasRGBA32 (w, h); + } + catch (...) { + canvas = 0; + } + return canvas; +} + + +IMG_CanvasPtr IMG_CanvasCreateFromPtr(void* imagePtr, unsigned int w, unsigned int h, size_t rowBytes) +{ + IMG_CanvasPtr canvas = 0; + try { + canvas = new IMG_CanvasRGBA32 (imagePtr, w, h, rowBytes); + } + catch (...) { + canvas = 0; + } + return canvas; +} + +void IMG_CanvasDispose(IMG_CanvasPtr canvas) +{ + if (canvas) { + delete ((IMG_CanvasRGBA32*)canvas); + canvas = 0; + } +} + +#if 0 +void IMG_CanvasDraw(IMG_CanvasPtr canvas, IMG_BrushPtr brush, unsigned int x, unsigned int y) +{ + if (!(canvas && brush)) return; + ((IMG_CanvasRGBA32*)canvas)->blendPixmap((TUns32)x, (TUns32)y, *((IMG_BrushRGBA32*)brush)); +} + + +void IMG_CanvasDrawUV(IMG_CanvasPtr canvas, IMG_BrushPtr brush, float u, float v) +{ + if (!(canvas && brush)) return; + ((IMG_CanvasRGBA32*)canvas)->blendPixmap(u, v, *((IMG_BrushRGBA32*)brush)); +} +#endif + + +void IMG_CanvasDrawLine(IMG_CanvasPtr canvas, IMG_BrushPtr brush, unsigned int xStart, unsigned int yStart, unsigned int xEnd, unsigned int yEnd) +{ + if (!(canvas && brush)) return; + ((IMG_CanvasRGBA32*)canvas)->blendPixmap((TUns32)xStart, (TUns32)yStart, (TUns32)xEnd, (TUns32)yEnd, *((IMG_BrushRGBA32*)brush)); +} + + +void IMG_CanvasDrawLineUV(IMG_CanvasPtr canvas, IMG_BrushPtr brush, float uStart, float vStart, float uEnd, float vEnd) +{ + if (!(canvas && brush)) return; + ((IMG_CanvasRGBA32*)canvas)->blendPixmap(uStart, vStart, uEnd, vEnd, *((IMG_BrushRGBA32*)brush)); +} diff --git a/source/blender/img/intern/IMG_BrushRGBA32.cpp b/source/blender/img/intern/IMG_BrushRGBA32.cpp new file mode 100644 index 00000000000..7c78e98a8cf --- /dev/null +++ b/source/blender/img/intern/IMG_BrushRGBA32.cpp @@ -0,0 +1,132 @@ +/** + * $Id$ + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#include "IMG_BrushRGBA32.h" + + +#include + + +IMG_BrushRGBA32::IMG_BrushRGBA32(TUns32 w, TUns32 h, const IMG_ColorRGB& c, float a) + : IMG_PixmapRGBA32(w, h), m_color(c), m_alpha(a) +{ + m_ro = w < h ? w/2 : h/2; + m_ri = m_ro >> 1; + updateImage(); +} + + +void IMG_BrushRGBA32::setColor(const IMG_ColorRGB& c) +{ + m_color = c; + updateImage(); +} + + +void IMG_BrushRGBA32::setTransparency(float a) +{ + m_alpha = a; + if (m_alpha > 1.f) m_alpha = 1.f; + if (m_alpha < 0.f) m_alpha = 0.f; + updateImage(); +} + + +void IMG_BrushRGBA32::setRadii(TUns32 rI, TUns32 rO) +{ + if ((rI < 2) || (rO < 2)) return; + m_ri = rI; + m_ro = rO; + + TUns32 w_2 = m_width >> 1; + TUns32 h_2 = m_height >> 1; + + /* + * Make the brush size smaller than half of the minimum + * width or height of the pixmap. Make sure that inner + * radius <= outer radius. + */ + if (m_ro > w_2) m_ro = w_2; + if (m_ro > h_2) m_ro = h_2; + if (m_ri > m_ro) m_ri = m_ro; + + updateImage(); +} + + +void IMG_BrushRGBA32::updateImage() +{ + TUns32 cx = m_width >> 1; + TUns32 cy = m_height >> 1; + + // Prepare pixel values for this pixmap + IMG_ColorRGBA c (m_color.m_r, m_color.m_g, m_color.m_b, 0.f); + TPixelRGBA32 pOut = getPixelValue(c); + c.m_a = m_alpha; + TPixelRGBA32 pIn = getPixelValue(c); + TPixelRGBA32 p = getPixelValue(c); + TUns8* pa = & (((TUns8*)&p)[bi_a]); + + // Set the pixels in the destination rectangle + for (TUns32 y = 0; y < m_height; y++) { + // Park pixel pointer at the start pixels + TPixelPtr desPtr = getPixelPtr(0, y); + for (TUns32 x = 0; x < m_width; x++) { + // Calculate the distance between current pixel and center + float dX = (float)((TInt32)x) - ((TInt32)cx); + float dY = (float)((TInt32)y) - ((TInt32)cy); + float d = (float) ::sqrt(dX*dX + dY*dY); + float a; + + if (d <= m_ri) { + *desPtr = pIn; + } + else if ((d < m_ro) && (m_ri < m_ro)) { + // Calculate alpha, linear + a = (d - m_ri) / (m_ro - m_ri); + // Now: 0 <= a <= 1 + //a = m_alpha + a * (1.f - m_alpha); + a = (1.f - a) * m_alpha; + // Now: m_alpha <= a <= 1 +#if 0 + a = (float)::pow(a, 0.2); +#endif + // Store pixel + *pa = (TUns8)(a * ((float)0xFF)); + *desPtr = p; + } + else { + *desPtr = pOut; + } + desPtr++; + } + } +} diff --git a/source/blender/img/intern/IMG_BrushRGBA32.h b/source/blender/img/intern/IMG_BrushRGBA32.h new file mode 100644 index 00000000000..4cb8b3b9617 --- /dev/null +++ b/source/blender/img/intern/IMG_BrushRGBA32.h @@ -0,0 +1,134 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ +#ifndef _H_IMG_BrushRGBA32 +#define _H_IMG_BrushRGBA32 + +#include "IMG_PixmapRGBA32.h" + + +/** + * A brush used for drawing in pixmaps. + * The brush is a pixmap as well. + * Drawing can be implemented by blending the brush into the pixmap. + * + * @author Maarten Gribnau + * @date March 7, 2001 + * @todo Check the algorithm + */ + +class IMG_BrushRGBA32 : public IMG_PixmapRGBA32 { +public: + /** + * Constructs a brush image with the dimensions and color given. + * @param w width of the brush image + * @param h height of the brush image + * @param c color of the brush + * @param a transparency in the center of the brush + */ + IMG_BrushRGBA32(TUns32 w, TUns32 h, const IMG_ColorRGB& c, float a = 0.8f); + + /** + * Sets the color of the brush. + * @param c color of the brush + */ + virtual void setColor(const IMG_ColorRGB& c); + + /** + * Returns the color of the brush. + * @param c color of the brush + */ + inline virtual void getColor(IMG_ColorRGB& c) const; + + /** + * Sets the transparency of the brush. + * @param a transparency of the brush + */ + virtual void setTransparency(float a); + + /** + * Returns the transparency of the brush. + * @param a transparency of the brush + */ + inline virtual float getTransparency() const; + + /** + * Sets the shape of the brush from two radii (inner and outer). + * This creates a brush with alpha==0 inside the inner radius + * and gradually fades to alpha==1 at the outer radius. + * Inner radius should be smaller or equal to the outer radius. + * If not, the outer radius is made equal to the inner radius. + * If the either radius is larger than the bounds of the brush, + * they are clipped. + * @param rI inner radius + * @param rO outer radius + */ + virtual void setRadii(TUns32 rI, TUns32 rO); + + /** + * Returns the radii that determine the shape of the brush. + * @param rI inner radius + * @param rO outer radius + */ + inline virtual void setRadii(TUns32& rI, TUns32& rO) const; + +protected: + /** + * Updates the image of this brush. + * The image is created using the current color, transparency and shape radii. + */ + virtual void updateImage(); + + IMG_ColorRGB m_color; /** The color of the brush */ + float m_alpha; /** The transparency of the brush */ + TUns32 m_ri; /** The inner radius of the brush */ + TUns32 m_ro; /** The outer radius of the brush */ +}; + + +inline void IMG_BrushRGBA32::setRadii(TUns32& rI, TUns32& rO) const +{ + rI = m_ri; + rO = m_ro; +} + +inline float IMG_BrushRGBA32::getTransparency() const +{ + return m_alpha; +} + +inline void IMG_BrushRGBA32::getColor(IMG_ColorRGB& c) const +{ + c = m_color; +} + + +#endif // _H_IMG_BrushRGBA32 diff --git a/source/blender/img/intern/IMG_CanvasRGBA32.cpp b/source/blender/img/intern/IMG_CanvasRGBA32.cpp new file mode 100644 index 00000000000..5358265337d --- /dev/null +++ b/source/blender/img/intern/IMG_CanvasRGBA32.cpp @@ -0,0 +1,82 @@ +/** + * $Id$ + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#include "IMG_CanvasRGBA32.h" + + + +IMG_CanvasRGBA32::IMG_CanvasRGBA32(TUns32 width, TUns32 height) + : IMG_PixmapRGBA32(width, height) +{ +} + +IMG_CanvasRGBA32::IMG_CanvasRGBA32(void* image, TUns32 width, TUns32 height, TUns32 rowBytes) + : IMG_PixmapRGBA32(image, width, height, rowBytes) +{ +} + + +void IMG_CanvasRGBA32::blendPixmap( + TUns32 xStart, TUns32 yStart, TUns32 xEnd, TUns32 yEnd, + const IMG_PixmapRGBA32& pixmap) +{ + // Determine visibility of the line + IMG_Line l (xStart, yStart, xEnd, yEnd); // Line used for blending + IMG_Rect bnds (0, 0, m_width, m_height); // Bounds of this pixmap + TVisibility v = bnds.getVisibility(l); + if (v == kNotVisible) return; + if (v == kPartiallyVisible) { + bnds.clip(l); + } + + float numSteps = (((float)l.getLength()) / ((float)pixmap.getWidth() / 4)); + //numSteps *= 4; + numSteps = numSteps ? numSteps : 1; + float step = 0.f, stepSize = 1.f / ((float)numSteps); + TInt32 x, y; + for (TUns32 s = 0; s < numSteps; s++) { + l.getPoint(step, x, y); + IMG_PixmapRGBA32::blendPixmap((TUns32)x, (TUns32)y, pixmap); + step += stepSize; + } +} + + +void IMG_CanvasRGBA32::blendPixmap( + float uStart, float vStart, float uEnd, float vEnd, + const IMG_PixmapRGBA32& pixmap) +{ + TUns32 xStart, yStart, xEnd, yEnd; + getPixelAddress(uStart, vStart, xStart, yStart); + getPixelAddress(uEnd, vEnd, xEnd, yEnd); + blendPixmap(xStart, yStart, xEnd, yEnd, pixmap); +} + diff --git a/source/blender/img/intern/IMG_CanvasRGBA32.h b/source/blender/img/intern/IMG_CanvasRGBA32.h new file mode 100644 index 00000000000..4a59693cfde --- /dev/null +++ b/source/blender/img/intern/IMG_CanvasRGBA32.h @@ -0,0 +1,95 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + * @author Maarten Gribnau + * @date March 6, 2001 + */ + +#ifndef _H_IMG_CanvasRGBA32 +#define _H_IMG_CanvasRGBA32 + +#include "IMG_PixmapRGBA32.h" +#include "IMG_BrushRGBA32.h" + +/** + * A IMG_PixmapRGBA32 pixmap that allows for drawing with a IMG_BrushRGBA32. + * @author Maarten Gribnau + * @date March 6, 2001 + */ + +class IMG_CanvasRGBA32 : public IMG_PixmapRGBA32 { +public: + /** + * Constructor. + * @throw when an invalid width and/or height is passed. + * @throw when a there is not enough memory to allocate the image. + * @param width the width in pixels of the image. + * @param height the height in pixels of the image. + */ + IMG_CanvasRGBA32(TUns32 width, TUns32 height); + + /** + * Constructor. + * The image data will not be freed upon destruction of this object. + * The owner of this object is reponsible for that. + * @throw when an invalid width and/or height is passed. + * @param image pointer to the image data. + * @param width the width in pixels of the image. + * @param height the height in pixels of the image. + */ + IMG_CanvasRGBA32(void* image, TUns32 width, TUns32 height, TUns32 rowBytes); + + /** + * Blends a pixmap into this pixmap over a line. + * Repeatedly pastes the given pixmap centered at the given line into this pixmap. + * The alpha information in the given image is used to blend. + * @todo implement wrapping modes when the pixmap does not fit within the bounds. + * @todo update the drawing algorithm. + * @param x x-coordinate of the center location of the image. + * @param y y-coordinate of the center location of the image. + * @param pixmap the pixmap to blend + */ + virtual void blendPixmap(TUns32 xStart, TUns32 yStart, TUns32 xEnd, TUns32 yEnd, const IMG_PixmapRGBA32& pixmap); + + /** + * Blends a pixmap into this pixmap over a line in (u,v) coordinates. + * Pastes the given pixmap centered at the given line into this pixmap. + * The alpha information in the given image is used to blend. + * @see IMG_PixmapRGBA32::blendPixmap(TUns32 xStart, TUns32 yStart, TUns32 yStart, TUns32 yEnd, const IMG_PixmapRGBA32& pixmap) + * @todo implement wrapping modes when the pixmap does not fit within the bounds. + * @param u u-coordinate of the center location of the image. + * @param v v-coordinate of the center location of the image. + * @param pixmap the pixmap to blend + */ + virtual void blendPixmap(float uStart, float vStart, float uEnd, float vEnd, const IMG_PixmapRGBA32& pixmap); +}; + + +#endif // _H_IMG_CanvasRGBA32 diff --git a/source/blender/img/intern/IMG_Color.h b/source/blender/img/intern/IMG_Color.h new file mode 100644 index 00000000000..540907c66e9 --- /dev/null +++ b/source/blender/img/intern/IMG_Color.h @@ -0,0 +1,149 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + * @author Maarten Gribnau + * @date March 7, 2001 + */ + +#ifndef _H_IMG_Color +#define _H_IMG_Color + +class IMG_ColorRGBA; + +/** + * Implements a color with red, green and blue components. + * Components are stored as floats. + * @author Maarten Gribnau + * @date March 7, 2001 + */ + +class IMG_ColorRGB { +public: + /** + * Constructs a color with the given values. + * @param r requested red component of the color + * @param g requested green component of the color + * @param b requested blue component of the color + */ + IMG_ColorRGB(float r=0, float g=0, float b=0) + : m_r(r), m_g(g), m_b(b) {} + + /** + * Copy constructor. + * @param c the color to copy. + */ + IMG_ColorRGB(const IMG_ColorRGB& c) + : m_r(c.m_r), m_g(c.m_g), m_b(c.m_b) {} + + /** + * Constructs a color without alpha from one with. + * @param c the color to copy. + */ + inline IMG_ColorRGB(const IMG_ColorRGBA& c); + + /** Red component of the color */ + float m_r; + /** Green component of the color */ + float m_g; + /** Blue component of the color */ + float m_b; +}; + + +/** + * Implements a color with red, green, blue and alpha components. + * Components are stored as floats. + * @author Maarten Gribnau + * @date March 6, 2001 + */ + +class IMG_ColorRGBA { +public: + /** + * Constructs a color with the given values. + * @param r requested red component of the color + * @param g requested green component of the color + * @param b requested blue component of the color + * @param a requested alpha component of the color + */ + IMG_ColorRGBA(float r=0, float g=0, float b=0, float a=0) + : m_r(r), m_g(g), m_b(b), m_a(a) {} + + /** + * Copy constructor. + * @param c the color to copy. + */ + IMG_ColorRGBA(const IMG_ColorRGBA& c) + : m_r(c.m_r), m_g(c.m_g), m_b(c.m_b), m_a(c.m_a) {} + + /** + * Constructs a color with alpha from one without. + * @param c the color to copy. + */ + IMG_ColorRGBA(const IMG_ColorRGB& c) + : m_r(c.m_r), m_g(c.m_g), m_b(c.m_b), m_a(0) {} + + /** + * Blends the given color with this color. + * Uses the alpha of the given color for blending. + * The alpha of this color is left untouched. + * @param c the color to blend + */ + inline void blendColor(const IMG_ColorRGBA& c); + + /** Red component of the color */ + float m_r; + /** Green component of the color */ + float m_g; + /** Blue component of the color */ + float m_b; + /** Alpha component of the color */ + float m_a; +}; + +inline IMG_ColorRGB::IMG_ColorRGB(const IMG_ColorRGBA& c) + : m_r(c.m_r), m_g(c.m_g), m_b(c.m_b) {} + +inline void IMG_ColorRGBA::blendColor(const IMG_ColorRGBA& c) +{ + float r1 = 1 - c.m_a; // The reverse of alpha +#if IMG_REVERSED_ALPHA + m_r = c.m_a * m_r + r1 * c.m_r; + m_g = c.m_a * m_g + r1 * c.m_g; + m_b = c.m_a * m_b + r1 * c.m_b; +#else + m_r = r1 * m_r + c.m_a * c.m_r; + m_g = r1 * m_g + c.m_a * c.m_g; + m_b = r1 * m_b + c.m_a * c.m_b; +#endif +} + + +#endif // _H_IMG_Color diff --git a/source/blender/img/intern/IMG_Line.cpp b/source/blender/img/intern/IMG_Line.cpp new file mode 100644 index 00000000000..2b864a63705 --- /dev/null +++ b/source/blender/img/intern/IMG_Line.cpp @@ -0,0 +1,33 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ +#include "IMG_Line.h" + diff --git a/source/blender/img/intern/IMG_Line.h b/source/blender/img/intern/IMG_Line.h new file mode 100644 index 00000000000..27243226042 --- /dev/null +++ b/source/blender/img/intern/IMG_Line.h @@ -0,0 +1,142 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + * @author Maarten Gribnau + * @date March 12, 2001 + */ + +#ifndef _H_IMG_Line +#define _H_IMG_Line + +#include "IMG_Types.h" +#include + +/** + * A line from a start to an end point. + * Used for drawing lines in images. + * @author Maarten Gribnau + * @date March 6, 2001 + */ + +class IMG_Line { +public: + + /** + * Constructs a line with the given values. + * @param xs start point x-coordinate + * @param ys start point y-coordinate + * @param xe end point x-coordinate + * @param ye end point y-coordinate + */ + IMG_Line(TInt32 xs=0, TInt32 ys=0, TInt32 xe=0, TInt32 ye=0) + : m_xs(xs), m_ys(ys), m_xe(xe), m_ye(ye) {} + + /** + * Copy constructor. + * @param l line to copy + */ + IMG_Line(const IMG_Line& l) + : m_xs(l.m_xs), m_ys(l.m_ys), m_xe(l.m_xe), m_ye(l.m_ye) {} + + /** + * Destructor. + */ + virtual ~IMG_Line() {}; + + /** + * Access to line length. + * @return length of the line. + */ + virtual inline float getLength() const; + + /** + * Sets all members of the line. + * @param xs start point x-coordinate + * @param ys start point y-coordinate + * @param xe end point x-coordinate + * @param ye end point y-coordinate + */ + virtual inline void set(TInt32 xs, TInt32 ys, TInt32 xe, TInt32 ye); + + /** + * Returns whether this line is empty. + * Empty line are lines that have length==0. + * @return boolean value (true==empty line) + */ + virtual inline bool isEmpty() const; + + /** + * Returns point at given value for line parameter. + * Calculates the coordinates of a point on the line. + * @param t line parameter value (0<=t<=1) of the point requested. + * @param x x-coordinate of the point. + * @param y y-coordinate of the point. + */ + virtual inline void getPoint(float t, TInt32& x, TInt32& y) const; + + /** Start point x-coordinate */ + TInt32 m_xs; + /** Start point y-coordinate */ + TInt32 m_ys; + /** End point x-coordinate */ + TInt32 m_xe; + /** End point y-coordinate */ + TInt32 m_ye; +}; + + +inline float IMG_Line::getLength() const +{ + TInt32 dx = m_xe - m_xs; + TInt32 dy = m_ye - m_ys; + return ((float)::sqrt(((float)dx)*dx + ((float)dy)*dy)); +} + + +inline void IMG_Line::set(TInt32 xs, TInt32 ys, TInt32 xe, TInt32 ye) +{ + m_xs = xs; m_ys = ys; m_xe = xe; m_ye = ye; +} + + +inline bool IMG_Line::isEmpty() const +{ + return (getLength() <= 0); +} + + +inline void IMG_Line::getPoint(float t, TInt32& x, TInt32& y) const +{ + x = (TInt32) (((float)m_xs) + (t * (m_xe - m_xs))); + y = (TInt32) (((float)m_ys) + (t * (m_ye - m_ys))); +} + + +#endif // _H_IMG_Line diff --git a/source/blender/img/intern/IMG_MemPtr.h b/source/blender/img/intern/IMG_MemPtr.h new file mode 100644 index 00000000000..f6c93e50c42 --- /dev/null +++ b/source/blender/img/intern/IMG_MemPtr.h @@ -0,0 +1,114 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + * @author Maarten Gribnau + * @date March 8, 2001 + */ + +#ifndef _H_IMG_MemPtr +#define _H_IMG_MemPtr + +#include + +/** + * A memory pointer for memory of any type. + * It can be used to avoid memory leaks when allocating memory in constructors. + * @author Maarten Gribnau + * @date March 8, 2001 + */ + +template class IMG_MemPtr { +public: + /** Pointer to the memory */ + T* m_p; + bool m_owned; + + /** + * Size exception. + * A size exception is thrown when an invalid width and/or height is passed. + */ + class Size {}; + /** + * Memory exception. + * A size exception is thrown when a there is not enough memory to allocate the image. + */ + class Memory {}; + + /** + * Constructs a memory pointer. + * @param s requested size of the pointer + * @throw when an invalid width and/or height is passed. + * @throw when a there is not enough memory to allocate the image. + */ + IMG_MemPtr(size_t s) + : m_p(0), m_owned(false) + { + if (s > 0) { + m_p = new T[s]; + if (!m_p) { + throw Memory(); + } + m_owned = true; + } + else { + throw Size(); + } + } + + /** + * Constructs a memory pointer from a pointer. + * @param p the pointer + * @param s requested size of the pointer + * @throw when an invalid width and/or height is passed. + */ + IMG_MemPtr(void* p, size_t s) + : m_p(0), m_owned(false) + { + if (p && (s > 0)) { + m_p = (T*)p; + } + else { + throw Size(); + } + } + + /** + * Destructor. + */ + ~IMG_MemPtr() { if (m_p && m_owned) { delete [] m_p; m_p = 0; } } + + /** + * Access to the memory. + * @return pointer to the memory + */ + operator T*() { return m_p; } +}; + +#endif // _H_IMG_MemPtr diff --git a/source/blender/img/intern/IMG_Pixmap.cpp b/source/blender/img/intern/IMG_Pixmap.cpp new file mode 100644 index 00000000000..fa2176d299c --- /dev/null +++ b/source/blender/img/intern/IMG_Pixmap.cpp @@ -0,0 +1,59 @@ +/** + * $Id$ + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#include "IMG_Pixmap.h" + + + + +IMG_Pixmap::IMG_Pixmap() +{ + m_image = 0; + m_width = 0; + m_height = 0; + m_rowBytes = 0; + m_pixelSize = 0; + m_pixelType = kPixelTypeRGB32; +/* +#if OS_MACINTOSH + bitOrder = kQ3EndianBig; + byteOrder = kQ3EndianBig; +#else + bitOrder = kQ3EndianLittle; + byteOrder = kQ3EndianLittle; +#endif +*/ +} + + +IMG_Pixmap::~IMG_Pixmap() +{ +} \ No newline at end of file diff --git a/source/blender/img/intern/IMG_Pixmap.h b/source/blender/img/intern/IMG_Pixmap.h new file mode 100644 index 00000000000..3491174d379 --- /dev/null +++ b/source/blender/img/intern/IMG_Pixmap.h @@ -0,0 +1,186 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + * @author Maarten Gribnau + * @date March 6, 2001 + */ + +#ifndef _H_IMG_Pixmap +#define _H_IMG_Pixmap + +#include "IMG_Types.h" +#include "IMG_Color.h" +#include "IMG_Rect.h" + + +/** + * Base class for pixmaps. Here a more elaborate description of the IMG_Pixmap class should be written. + * @author Maarten Gribnau + * @date March 6, 2001 + */ + +class IMG_Pixmap { +public: + /** + * The type of pixels. + * The type of pixels that are stored in this pixmap. + */ + typedef enum { + kPixelTypeRGB32 = 0, /**< R:8, G:8, B:8, Ignore:8 */ + kPixelTypeRGBA32 = 1, /**< R:8, G:8, B:8, Alpha:8 */ +// kPixelTypeRGB16 = 2, /**< Ignore:1, R:5, G:5, B:5 */ +// kPixelTypeRGBA16 = 3, /**< Alpha:1, R:5, G:5, B:5 */ +// kPixelTypeRGB16_565 = 4, /**< R:5, G:6, B:5 */ + kPixelTypeRGB24 = 5 /**< R:8, G:8, B:8 */ + } PixelType; + + /** + * Default constructor. + */ + IMG_Pixmap(); + + /** + * Destructor. + */ + virtual ~IMG_Pixmap(); + + /** + * Access to image data + * @return pointer to the image data + */ + inline void* getImage() const; + + /** + * Access to image width. + * @return width of the image + */ + inline TUns32 getWidth() const; + + /** + * Access to image height. + * @return height of the image + */ + inline TUns32 getHeight() const; + + /** + * Returns the bounds of the pixmap in a rectangle. + * @param bounds of the image + */ + inline void getBounds(IMG_Rect& r) const; + + /** + * Access to pixel type. + * @return the pixel type + */ + inline PixelType getPixelType() const; + + /** + * Clamps u, v coordinates between 0 and 1. + * @param u requested u-coordinate + * @param v requested v-coordinate + */ + inline void clampUV(float& u, float& v) const; + + /** + * Converts (u,v) coordinates to pixel addresses. + * Assumes that (u,v) coordinates are in the [0,1] range. + * @param u requested u-coordinate in the image + * @param v requested v-coordinate in the image + * @param x calculated x-coordinate in the image + * @param y calculated y-coordinate in the image + */ + inline void getPixelAddress(float u, float v, TUns32& x, TUns32& y) const; + + /** + * Fills the rectangle given with the color given. + * Performs a bounds check. + * @param r requested bounds rectangle in the image + * @param c color to use + */ + virtual void fillRect(const IMG_Rect& r, const IMG_ColorRGBA& c) = 0; + +protected: + /** Pointer to the image data */ + void* m_image; + /** Width of the image in pixels */ + TUns32 m_width; + /** Height of the image in pixels */ + TUns32 m_height; + /** Number of bytes for one row in the image. */ + TUns32 m_rowBytes; + /** Size in bits for one pixel */ + TUns32 m_pixelSize; + /** Type of pixels in this image. */ + PixelType m_pixelType; +// TQ3Endian m_bitOrder; +// TQ3Endian m_byteOrder; +}; + +inline void* IMG_Pixmap::getImage() const +{ + return m_image; +} + +inline TUns32 IMG_Pixmap::getWidth() const +{ + return m_width; +} + +inline TUns32 IMG_Pixmap::getHeight() const +{ + return m_height; +} + +inline void IMG_Pixmap::getBounds(IMG_Rect& r) const +{ + r.set(0, 0, m_width, m_height); +} + +inline IMG_Pixmap::PixelType IMG_Pixmap::getPixelType() const +{ + return m_pixelType; +} + +inline void IMG_Pixmap::clampUV(float& u, float& v) const +{ + if (u < 0.f) u = 0.f; + if (u > 1.f) u = 1.f; + if (v < 0.f) v = 0.f; + if (v > 1.f) v = 1.f; +} + +inline void IMG_Pixmap::getPixelAddress(float u, float v, TUns32& x, TUns32& y) const +{ + //MAART TEMP! clampUV(u, v); + x = (TUns32)(((float)m_width) * u); + y = (TUns32)(((float)m_height) * v); +} + +#endif // _H_IMG_Pixmap diff --git a/source/blender/img/intern/IMG_PixmapRGBA32.cpp b/source/blender/img/intern/IMG_PixmapRGBA32.cpp new file mode 100644 index 00000000000..7ef716643b7 --- /dev/null +++ b/source/blender/img/intern/IMG_PixmapRGBA32.cpp @@ -0,0 +1,262 @@ +/** + * $Id$ + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#include "IMG_PixmapRGBA32.h" + + + +IMG_PixmapRGBA32::IMG_PixmapRGBA32(TUns32 width, TUns32 height) + : IMG_Pixmap(), m_mem(width * height) +{ + m_image = m_mem; + m_width = width; + m_height = height; + m_rowBytes = width * sizeof(TPixelRGBA32); + m_pixelSize = 8 * sizeof(TPixelRGBA32); + m_pixelType = kPixelTypeRGBA32; +} + + +IMG_PixmapRGBA32::IMG_PixmapRGBA32(void* image, TUns32 width, TUns32 height, TUns32 rowBytes) + : IMG_Pixmap(), m_mem(image, width * rowBytes) +{ + m_image = m_mem; + m_width = width; + m_height = height; + m_rowBytes = rowBytes; + m_pixelSize = 8 * sizeof(TPixelRGBA32); + m_pixelType = kPixelTypeRGBA32; +} + + +void IMG_PixmapRGBA32::fillRect(const IMG_Rect& r, const IMG_ColorRGB& c) +{ + IMG_Rect t_bnds (0, 0, m_width, m_height); // Bounds of this pixmap + IMG_Rect r_bnds (r); // Area to set + + // Determine visibility + TVisibility v = t_bnds.getVisibility(r_bnds); + if (v == kNotVisible) return; + if (v == kPartiallyVisible) { + // Clip the destination rectangle to the bounds of this pixmap + t_bnds.clip(r_bnds); + if (r_bnds.isEmpty()) { + return; + } + } + +#if 0 + // Set new pixels using shifting + // Prepare the pixel value to set + IMG_ColorRGBA ca (c); + TPixelRGBA32 pv = getPixelValue(c); + // Mask off the alpha bits + pv &= 0x00FFFFFF; //0xFFFFFF00; + + // Set the pixels in the destination rectangle + for (TInt32 y = r.m_t; y < r.m_b; y++) { + // Park pixel pointer at the start pixels + TPixelPtr desPtr = getPixelPtr(r_bnds.m_l, y); + for (TInt32 x = r.m_l; x < r.m_r; x++) { + // Set the new pixel value (retain current alpha) + *(desPtr++) = pv | ((*desPtr) & 0xFF000000); //0x000000FF); + } + } +#else + // Set new values using byte indexing + //IMG_ColorRGBA ca (c); + TPixelRGBA32 src = getPixelValue(c); + TPixelPtr desPtr; + TUns8* srcBytes = (TUns8*) &src; + + // Set the pixels in the destination rectangle + for (TInt32 y = r.m_t; y < r.m_b; y++) { + // Park pixel pointer at the start pixels + desPtr = getPixelPtr(r_bnds.m_l, y); + for (TInt32 x = r.m_l; x < r.m_r; x++) { + // Set the new pixel value (retain current alpha) + ((TUns8*)desPtr)[bi_r] = srcBytes[bi_r]; + ((TUns8*)desPtr)[bi_g] = srcBytes[bi_g]; + ((TUns8*)desPtr)[bi_b] = srcBytes[bi_b]; + desPtr++; + } + } +#endif +} + + +void IMG_PixmapRGBA32::fillRect(const IMG_Rect& r, const IMG_ColorRGBA& c) +{ + IMG_Rect t_bnds (0, 0, m_width, m_height); // Bounds of this pixmap + IMG_Rect r_bnds (r); // Area to set + + // Determine visibility + TVisibility v = t_bnds.getVisibility(r_bnds); + if (v == kNotVisible) return; + if (v == kPartiallyVisible) { + // Clip the destination rectangle to the bounds of this pixmap + t_bnds.clip(r_bnds); + if (r_bnds.isEmpty()) { + return; + } + } + + // Set the pixels in the destination rectangle + TPixelRGBA32 pixel = getPixelValue(c); + for (TInt32 y = r.m_t; y < r.m_b; y++) { + // Park pixel pointer at the start pixels + TPixelPtr desPtr = getPixelPtr(r_bnds.m_l, y); + for (TInt32 x = r.m_l; x < r.m_r; x++) { + *(desPtr++) = pixel; + } + } +} + + +void IMG_PixmapRGBA32::setPixmap(TUns32 x, TUns32 y, const IMG_PixmapRGBA32& pixmap, const IMG_Rect& bnds) +{ + IMG_Rect i_bnds (bnds); // Bounds of input pixmap + IMG_Rect t_bnds (0, 0, m_width, m_height); // Bounds of this pixmap + IMG_Rect p_bnds (bnds); // Bounds of the paste area + p_bnds.setCenter(x, y); + + // The next check could be removed if the caller is made responsible for handing us non-empty rectangles + if (i_bnds.isEmpty()) { + // Nothing to do + return; + } + + // Determine visibility of the paste area + TVisibility v = t_bnds.getVisibility(p_bnds); + if (v == kNotVisible) return; + if (v == kPartiallyVisible) { + // Clipping is needed + if (p_bnds.m_l < 0) { + i_bnds.m_l += p_bnds.m_l; + p_bnds.m_l = 0; + } + if (p_bnds.m_t < 0) { + i_bnds.m_t += p_bnds.m_t; + p_bnds.m_t = 0; + } + TInt32 d = p_bnds.getWidth(); + if (p_bnds.m_r > d) { + i_bnds.m_t -= d - p_bnds.m_r; + p_bnds.m_t = d; + } + d = p_bnds.getHeight(); + if (p_bnds.m_b > d) { + i_bnds.m_b -= d - p_bnds.m_b; + p_bnds.m_b = d; + } + } + + // Iterate through the rows + for (TInt32 r = 0; r < p_bnds.getHeight(); r++) { + // Park pixel pointers at the start pixels + TPixelPtr srcPtr = getPixelPtr(i_bnds.m_l, i_bnds.m_t + r); + TPixelPtr desPtr = getPixelPtr(p_bnds.m_l, p_bnds.m_t + r); + // Iterate through the columns + for (int c = 0; c < p_bnds.getWidth(); c++) { + *(desPtr++) = *(srcPtr++); + } + } +} + + +void IMG_PixmapRGBA32::blendPixmap(TUns32 x, TUns32 y, const IMG_PixmapRGBA32& pixmap, const IMG_Rect& bnds) +{ + IMG_Rect i_bnds (bnds); // Bounds of input pixmap + IMG_Rect t_bnds (0, 0, m_width, m_height); // Bounds of this pixmap + IMG_Rect p_bnds (bnds); // Bounds of the paste area + p_bnds.setCenter(x, y); + + // The next check could be removed if the caller is made responsible for handing us non-empty rectangles + if (i_bnds.isEmpty()) { + // Nothing to do + return; + } + + // Determine visibility of the paste area + TVisibility v = t_bnds.getVisibility(p_bnds); + if (v == kNotVisible) return; + if (v == kPartiallyVisible) { + // Clipping is needed + if (p_bnds.m_l < 0) { + i_bnds.m_l += -p_bnds.m_l; + p_bnds.m_l = 0; + } + if (p_bnds.m_t < 0) { + i_bnds.m_t += -p_bnds.m_t; + p_bnds.m_t = 0; + } + TInt32 d = t_bnds.getWidth(); + if (p_bnds.m_r > d) { + i_bnds.m_r -= p_bnds.m_r - d; + p_bnds.m_r = d; + } + d = t_bnds.getHeight(); + if (p_bnds.m_b > d) { + i_bnds.m_b -= p_bnds.m_b - d; + p_bnds.m_b = d; + } + } + + IMG_ColorRGBA srcColor; + IMG_ColorRGBA desColor; + + // Iterate through the rows + for (int r = 0; r < p_bnds.getHeight(); r++) { + // Park pixel pointers at the start pixels + TPixelPtr srcPtr = pixmap.getPixelPtr(i_bnds.m_l, i_bnds.m_t + r); + TPixelPtr desPtr = getPixelPtr(p_bnds.m_l, p_bnds.m_t + r); + // Iterate through the columns + for (int c = 0; c < p_bnds.getWidth(); c++) { + // Retrieve colors from source and destination pixmaps + getColor(*srcPtr, srcColor); + getColor(*desPtr, desColor); + // Blend the colors + desColor.blendColor(srcColor); + // Write color back to destination pixmap + *desPtr = getPixelValue(desColor); + srcPtr++; + desPtr++; + } + } +} + + +void IMG_PixmapRGBA32::blendPixmap(float u, float v, const IMG_PixmapRGBA32& pixmap) +{ + TUns32 x, y; + getPixelAddress(u, v, x, y); + blendPixmap(x, y, pixmap); +} diff --git a/source/blender/img/intern/IMG_PixmapRGBA32.h b/source/blender/img/intern/IMG_PixmapRGBA32.h new file mode 100644 index 00000000000..407e0868f09 --- /dev/null +++ b/source/blender/img/intern/IMG_PixmapRGBA32.h @@ -0,0 +1,261 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + * @author Maarten Gribnau + * @date March 6, 2001 + */ + +#ifndef _H_IMG_PixmapRGBA32 +#define _H_IMG_PixmapRGBA32 + +#include "IMG_Pixmap.h" +#include "IMG_MemPtr.h" + +/** + * Pixmap of kPixelTypeRGBA32 type. + * A pixmap with 24 bits per pixel in ABGR format. + * Provides methods to fill rectangular areas in this image with a color. + * Provides methods to paste or blend other pixmaps into this pixmap. + * @author Maarten Gribnau + * @date March 6, 2001 + */ + +class IMG_PixmapRGBA32 : public IMG_Pixmap { +public: + /** + * The pixel type in this pixmap. + */ + typedef TUns32 TPixelRGBA32; + + /** The pixel pointer type of this pixmap. */ + typedef TPixelRGBA32* TPixelPtr; + + /** Indices of color component byes within a pixel. */ + typedef enum { + bi_r = 0, + bi_g = 1, + bi_b = 2, + bi_a = 3 + } TPixelIndex; + + /** "Save" memory pointer. */ + IMG_MemPtr m_mem; + + /** + * Constructor. + * Creates a new pixmap of the kPixelTypeRGBA32 type with the requested dimensions. + * @throw when an invalid width and/or height is passed. + * @throw when a there is not enough memory to allocate the image. + * @param width the width in pixels of the image. + * @param height the height in pixels of the image. + */ + IMG_PixmapRGBA32(TUns32 width, TUns32 height); + + /** + * Constructor. + * Creates a new pixmap of the kPixelTypeRGBA32 from a pointer to image data. + * The image data will not be freed upon destruction of this object. + * The owner of this object is reponsible for that. + * @throw when an invalid width and/or height is passed. + * @param image pointer to the image data. + * @param width the width in pixels of the image. + * @param height the height in pixels of the image. + */ + IMG_PixmapRGBA32(void* image, TUns32 width, TUns32 height, TUns32 rowBytes); + +#if 0 + /** + * Destructor. + */ + virtual ~IMG_PixmapRGBA32(); +#endif + + /** + * Fills the rectangle given with the color given. + * Retains the alpha values. + * Performs a bounds check. + * @param r requested bounds rectangle in the image + * @param c color to use + */ + virtual void fillRect(const IMG_Rect& r, const IMG_ColorRGB& c); + + /** + * Fills the rectangle given with the color given. + * Sets the alpha values from the color. + * Performs a bounds check. + * @param r requested bounds rectangle in the image + * @param c color to use + */ + virtual void fillRect(const IMG_Rect& r, const IMG_ColorRGBA& c); + + /** + * Pastes a pixmap into this pixmap. + * Pastes the given pixmap centered at the given coordinates into this pixmap. + * Ignores the alpha information, this is pasted too. + * @todo implement wrapping modes when the pixmap does not fit within the bounds. + * @param x x-coordinate of the center location of the image. + * @param y y-coordinate of the center location of the image. + * @param pixmap the pixmap to paste. + */ + inline virtual void setPixmap(TUns32 x, TUns32 y, const IMG_PixmapRGBA32& pixmap); + + /** + * Pastes an area in a pixmap into this pixmap. + * Pastes an area of the given pixmap centered at the given coordinates into this pixmap. + * Ignores the alpha information, this is pasted too. + * @todo implement wrapping modes when the pixmap does not fit within the bounds. + * @param x x-coordinate of the center location of the image. + * @param y y-coordinate of the center location of the image. + * @param pixmap the pixmap to paste. + * @param bnds the bounds of the area of the pixmap to paste. + */ + virtual void setPixmap(TUns32 x, TUns32 y, const IMG_PixmapRGBA32& pixmap, const IMG_Rect& bnds); + + /** + * Blends a pixmap into this pixmap. + * Blends the given pixmap centered at the given coordinates into this pixmap. + * The alpha information in the given image is used to blend. + * @todo implement wrapping modes when the pixmap does not fit within the bounds. + * @param x x-coordinate of the center location of the image. + * @param y y-coordinate of the center location of the image. + * @param pixmap the pixmap to blend. + */ + virtual void blendPixmap(TUns32 x, TUns32 y, const IMG_PixmapRGBA32& pixmap); + + /** + * Blends an area of a pixmap into this pixmap. + * Blends an area of the given pixmap centered at the given coordinates into this pixmap. + * The alpha information in the given image is used to blend. + * @todo implement wrapping modes when the pixmap does not fit within the bounds. + * @param x x-coordinate of the center location of the image. + * @param y y-coordinate of the center location of the image. + * @param pixmap the pixmap to blend. + * @param bnds the bounds of the area of the pixmap to blend. + */ + virtual void blendPixmap(TUns32 x, TUns32 y, const IMG_PixmapRGBA32& pixmap, const IMG_Rect& bnds); + + /** + * Blends a pixmap into this pixmap at (u,v) coordinates. + * Pastes the given pixmap centered at the given coordinates into this pixmap. + * The alpha information in the given image is used to blend. + * @see IMG_PixmapRGBA32::blendPixmap(TUns32 x, TUns32 y, const IMG_PixmapRGBA32& pixmap) + * @todo implement wrapping modes when the pixmap does not fit within the bounds. + * @param u u-coordinate of the center location of the image. + * @param v v-coordinate of the center location of the image. + * @param pixmap the pixmap to blend + */ + virtual void blendPixmap(float u, float v, const IMG_PixmapRGBA32& pixmap); + +protected: + /** + * Returns pointer to the pixel. + * Returns a pointer of TPixelPtr type to the pixel at the requested coordinates. + * Does not perform a bounds check! + * @param x column address of the pixel. + * @param y row address of the pixel. + * @return the pointer calculated. + */ + inline TPixelPtr getPixelPtr(TUns32 x, TUns32 y) const; + + /** + * Returns the pixel value of a color. + * @param c the color to convert + * @return the pixel value calculated + */ + inline TPixelRGBA32 getPixelValue(const IMG_ColorRGBA& c) const; + + /** + * Returns the color of from a pixel value. + * @param p the pixel value + * @param c the color calculated + */ + inline void getColor(TPixelRGBA32 p, IMG_ColorRGBA& c) const; +}; + +inline void IMG_PixmapRGBA32::setPixmap(TUns32 x, TUns32 y, const IMG_PixmapRGBA32& pixmap) +{ + IMG_Rect bnds; + pixmap.getBounds(bnds); + setPixmap(x, y, pixmap, bnds); +} + +inline void IMG_PixmapRGBA32::blendPixmap(TUns32 x, TUns32 y, const IMG_PixmapRGBA32& pixmap) +{ + IMG_Rect bnds; + pixmap.getBounds(bnds); + blendPixmap(x, y, pixmap, bnds); +} + +inline IMG_PixmapRGBA32::TPixelPtr IMG_PixmapRGBA32::getPixelPtr(TUns32 x, TUns32 y) const +{ + return (TPixelPtr) (((TUns8*)m_image) + (y*m_rowBytes) + (x*4)); +} + + +inline IMG_PixmapRGBA32::TPixelRGBA32 IMG_PixmapRGBA32::getPixelValue(const IMG_ColorRGBA& c) const +{ +#if 0 + // Obtain pixel value through shifting + TPixelRGBA32 p = ((TPixelRGBA32) (((float) 0xFF) * c.m_a)) << 24; + p |= ((TPixelRGBA32) (((float) 0xFF) * c.m_b)) << 16; + p |= ((TPixelRGBA32) (((float) 0xFF) * c.m_g)) << 8; + p |= ((TPixelRGBA32) (((float) 0xFF) * c.m_r)); + return p; +#else + // Obtain pixel value through byte indexing + TPixelRGBA32 pixel; + TUns8* bytes = (TUns8*)&pixel; + bytes[bi_r] = (TUns8)(((float) 0xFF) * c.m_r); + bytes[bi_g] = (TUns8)(((float) 0xFF) * c.m_g); + bytes[bi_b] = (TUns8)(((float) 0xFF) * c.m_b); + bytes[bi_a] = (TUns8)(((float) 0xFF) * c.m_a); + return pixel; +#endif +} + +inline void IMG_PixmapRGBA32::getColor(TPixelRGBA32 p, IMG_ColorRGBA& c) const +{ +#if 0 + // Obtain color value through shifting + c.m_a = ((float) ((p >> 24) & 0x00FF)) / ((float) 0xFF); + c.m_b = ((float) ((p >> 16) & 0x00FF)) / ((float) 0xFF); + c.m_g = ((float) ((p >> 8) & 0x00FF)) / ((float) 0xFF); + c.m_r = ((float) ( p & 0x00FF)) / ((float) 0xFF); +#else + // Obtain color value through byte indexing + TUns8* bytes = (TUns8*)&p; + c.m_r = ((float)bytes[bi_r]) / ((float) 0xFF); + c.m_g = ((float)bytes[bi_g]) / ((float) 0xFF); + c.m_b = ((float)bytes[bi_b]) / ((float) 0xFF); + c.m_a = ((float)bytes[bi_a]) / ((float) 0xFF); +#endif +} + +#endif // _H_IMG_PixmapRGBA32 diff --git a/source/blender/img/intern/IMG_Rect.cpp b/source/blender/img/intern/IMG_Rect.cpp new file mode 100644 index 00000000000..67357712708 --- /dev/null +++ b/source/blender/img/intern/IMG_Rect.cpp @@ -0,0 +1,129 @@ +/** + * $Id$ + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#include "IMG_Rect.h" + + +TVisibility IMG_Rect::getVisibility(IMG_Rect& r) const +{ + bool lt = isInside(r.m_l, r.m_t); + bool rt = isInside(r.m_r, r.m_t); + bool lb = isInside(r.m_l, r.m_b); + bool rb = isInside(r.m_r, r.m_b); + TVisibility v; + if (lt && rt && lb && rb) { + // All points inside, rectangle is inside this + v = kFullyVisible; + } + else if (!(lt || rt || lb || rb)) { + // None of the points inside + // Check to see whether the rectangle is larger than this one + if ((r.m_l < m_l) && (r.m_t < m_t) && (r.m_r > m_r) && (r.m_b > m_b)) { + v = kPartiallyVisible; + } + else { + v = kNotVisible; + } + } + else { + // Some of the points inside, rectangle is partially inside + v = kPartiallyVisible; + } + return v; +} + +TVisibility IMG_Rect::getVisibility(IMG_Line& l) const +{ + bool s = isInside(l.m_xs, l.m_ys); + bool e = isInside(l.m_xe, l.m_ye); + TVisibility v; + if (s && e) { + v = kFullyVisible; + } + else if (s || e) { + v = kPartiallyVisible; + } + else { + v = kNotVisible; + } + return v; +} + + +void IMG_Rect::setCenter(TInt32 cx, TInt32 cy) +{ + TInt32 offset = cx - (m_l + (m_r - m_l)/2); + m_l += offset; + m_r += offset; + offset = cy - (m_t + (m_b - m_t)/2); + m_t += offset; + m_b += offset; +} + +void IMG_Rect::setCenter(TInt32 cx, TInt32 cy, TInt32 w, TInt32 h) +{ + long w_2, h_2; + + w_2 = w >> 1; + h_2 = h >> 1; + m_l = cx - w_2; + m_t = cy - h_2; + m_r = m_l + w; + m_b = m_t + h; +} + +bool IMG_Rect::clip(IMG_Rect& r) const +{ + bool clipped = false; + if (r.m_l < m_l) { + r.m_l = m_l; + clipped = true; + } + if (r.m_t < m_t) { + r.m_t = m_t; + clipped = true; + } + if (r.m_r > m_r) { + r.m_r = m_r; + clipped = true; + } + if (r.m_b > m_b) { + r.m_b = m_b; + clipped = true; + } + return clipped; +} + +bool IMG_Rect::clip(IMG_Line& l) const +{ + bool clipped = false; + return clipped; +} diff --git a/source/blender/img/intern/IMG_Rect.h b/source/blender/img/intern/IMG_Rect.h new file mode 100644 index 00000000000..654cd99d89b --- /dev/null +++ b/source/blender/img/intern/IMG_Rect.h @@ -0,0 +1,200 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + * @author Maarten Gribnau + * @date March 7, 2001 + */ + +#ifndef _H_IMG_Rect +#define _H_IMG_Rect + +#include "IMG_Types.h" +#include "IMG_Line.h" + +/** + * Implements rectangle functionality. + * Used for bounds in images. + * The four extreme coordinates are stored as left, top, right and bottom. + * left is assumed to be smaller than or equal to right. + * top is assumed to be smaller than or equal to bottom. + * @author Maarten Gribnau + * @date March 6, 2001 + */ + +class IMG_Rect { +public: + + /** + * Constructs a rectangle with the given values. + * @param l requested left coordinate of the rectangle + * @param t requested top coordinate of the rectangle + * @param r requested right coordinate of the rectangle + * @param b requested bottom coordinate of the rectangle + */ + IMG_Rect(TInt32 l=0, TInt32 t=0, TInt32 r=0, TInt32 b=0) + : m_l(l), m_t(t), m_r(r), m_b(b) {} + + /** + * Copy constructor. + * @param r rectangle to copy + */ + IMG_Rect(const IMG_Rect& r) + : m_l(r.m_l), m_t(r.m_t), m_r(r.m_r), m_b(r.m_b) {} + + /** + * Destructor. + */ + virtual ~IMG_Rect() {}; + + /** + * Access to rectangle width. + * @return width of the rectangle + */ + virtual inline TInt32 getWidth() const; + + /** + * Access to rectangle height. + * @return height of the rectangle + */ + virtual inline TInt32 getHeight() const; + + /** + * Sets all members of the rectangle. + * @param l requested left coordinate of the rectangle + * @param t requested top coordinate of the rectangle + * @param r requested right coordinate of the rectangle + * @param b requested bottom coordinate of the rectangle + */ + virtual inline void set(TInt32 l, TInt32 t, TInt32 r, TInt32 b); + + /** + * Returns whether this rectangle is empty. + * Empty rectangles are rectangles that have width==0 and/or height==0. + * @return boolean value (true==empty rectangle) + */ + virtual inline bool isEmpty() const; + + /** + * Returns whether the point is inside this rectangle. + * Point on the boundary is considered inside. + * @param x x-coordinate of point to test. + * @param y y-coordinate of point to test. + * @return boolean value (true if point is inside). + */ + virtual inline bool isInside(TInt32 x, TInt32 y) const; + + /** + * Returns whether the rectangle is inside this rectangle. + * @param r rectangle to test. + * @return visibility (not, partially or fully visible). + */ + virtual TVisibility getVisibility(IMG_Rect& r) const; + + /** + * Returns whether the line is inside this rectangle. + * @param l line to test. + * @return visibility (not, partially or fully visible). + */ + virtual TVisibility getVisibility(IMG_Line& l) const; + + /** + * Sets rectangle members. + * Sets rectangle members such that it is centered at the given location. + * @param cx requested center x-coordinate of the rectangle + * @param cy requested center y-coordinate of the rectangle + */ + virtual void setCenter(TInt32 cx, TInt32 cy); + + /** + * Sets rectangle members. + * Sets rectangle members such that it is centered at the given location, + * with the width requested. + * @param cx requested center x-coordinate of the rectangle + * @param cy requested center y-coordinate of the rectangle + * @param w requested width of the rectangle + * @param h requested height of the rectangle + */ + virtual void setCenter(TInt32 cx, TInt32 cy, TInt32 w, TInt32 h); + + /** + * Clips a rectangle. + * Updates the rectangle given such that it will fit within this one. + * This can result in an empty rectangle. + * @param r the rectangle to clip + * @return whether clipping has occurred + */ + virtual bool clip(IMG_Rect& r) const; + + /** + * Clips a line. + * Updates the line given such that it will fit within this rectangle. + * This can result in an empty line. + * @param l the line to clip + * @return whether clipping has occurred + */ + virtual bool clip(IMG_Line& l) const; + + /** Left coordinate of the rectangle */ + TInt32 m_l; + /** Top coordinate of the rectangle */ + TInt32 m_t; + /** Right coordinate of the rectangle */ + TInt32 m_r; + /** Bottom coordinate of the rectangle */ + TInt32 m_b; +}; + + +inline TInt32 IMG_Rect::getWidth() const +{ + return m_r - m_l; +} + +inline TInt32 IMG_Rect::getHeight() const +{ + return m_b - m_t; +} + +inline void IMG_Rect::set(TInt32 l, TInt32 t, TInt32 r, TInt32 b) +{ + m_l = l; m_t = t; m_r = r; m_b = b; +} + +inline bool IMG_Rect::isEmpty() const +{ + return (getWidth() == 0) || (getHeight() == 0); +} + +inline bool IMG_Rect::isInside(TInt32 x, TInt32 y) const +{ + return (x >= m_l) && (x <= m_r) && (y >= m_t) && (y <= m_b); +} + +#endif // _H_IMG_Rect diff --git a/source/blender/img/intern/IMG_Types.h b/source/blender/img/intern/IMG_Types.h new file mode 100644 index 00000000000..0c035439611 --- /dev/null +++ b/source/blender/img/intern/IMG_Types.h @@ -0,0 +1,48 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + * @author Maarten Gribnau + * @date March 7, 2001 + */ + +#ifndef _H_IMG_Types +#define _H_IMG_Types + +typedef int TInt32; +typedef unsigned char TUns8; +typedef unsigned int TUns32; + +typedef enum { + kNotVisible = 0, + kPartiallyVisible, + kFullyVisible +} TVisibility; + +#endif // _H_IMG_Types diff --git a/source/blender/img/intern/Makefile b/source/blender/img/intern/Makefile new file mode 100644 index 00000000000..b4ccd4b14e9 --- /dev/null +++ b/source/blender/img/intern/Makefile @@ -0,0 +1,49 @@ +# +# $Id$ +# +# ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. The Blender +# Foundation also sells licenses for use in proprietary software under +# the Blender License. See http://www.blender.org/BL/ for information +# about this. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. +# All rights reserved. +# +# The Original Code is: all of this file. +# +# Contributor(s): none yet. +# +# ***** END GPL/BL DUAL LICENSE BLOCK ***** +# +# + +LIBNAME = img +DIR = $(OCGDIR)/blender/$(LIBNAME) + +include nan_compile.mk + +ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows")) + CFLAGS += -funsigned-char +endif + +CFLAGS += $(LEVEL_1_C_WARNINGS) + +# path to SDNA types +CPPFLAGS += -I../../makesdna +# path to our own external headerfiles +CPPFLAGS += -I.. + -- cgit v1.2.3