Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Lambermont <hans@lambermont.dyndns.org>2002-10-12 15:37:38 +0400
committerHans Lambermont <hans@lambermont.dyndns.org>2002-10-12 15:37:38 +0400
commit12315f4d0e0ae993805f141f64cb8c73c5297311 (patch)
tree59b45827cd8293cfb727758989c7a74b40183974 /source/blender/img/intern
Initial revisionv2.25
Diffstat (limited to 'source/blender/img/intern')
-rw-r--r--source/blender/img/intern/IMG_Api.cpp121
-rw-r--r--source/blender/img/intern/IMG_BrushRGBA32.cpp132
-rw-r--r--source/blender/img/intern/IMG_BrushRGBA32.h134
-rw-r--r--source/blender/img/intern/IMG_CanvasRGBA32.cpp82
-rw-r--r--source/blender/img/intern/IMG_CanvasRGBA32.h95
-rw-r--r--source/blender/img/intern/IMG_Color.h149
-rw-r--r--source/blender/img/intern/IMG_Line.cpp33
-rw-r--r--source/blender/img/intern/IMG_Line.h142
-rw-r--r--source/blender/img/intern/IMG_MemPtr.h114
-rw-r--r--source/blender/img/intern/IMG_Pixmap.cpp59
-rw-r--r--source/blender/img/intern/IMG_Pixmap.h186
-rw-r--r--source/blender/img/intern/IMG_PixmapRGBA32.cpp262
-rw-r--r--source/blender/img/intern/IMG_PixmapRGBA32.h261
-rw-r--r--source/blender/img/intern/IMG_Rect.cpp129
-rw-r--r--source/blender/img/intern/IMG_Rect.h200
-rw-r--r--source/blender/img/intern/IMG_Types.h48
-rw-r--r--source/blender/img/intern/Makefile49
17 files changed, 2196 insertions, 0 deletions
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 <math.h>
+
+
+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 <IMG_MemPtr::Size> when an invalid width and/or height is passed.
+ * @throw <IMG_MemPtr::Memory> 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 <Size> 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 <math.h>
+
+/**
+ * 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 <stddef.h>
+
+/**
+ * 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 T> 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 <Size> when an invalid width and/or height is passed.
+ * @throw <Memory> 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 <Size> 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<TPixelRGBA32> m_mem;
+
+ /**
+ * Constructor.
+ * Creates a new pixmap of the kPixelTypeRGBA32 type with the requested dimensions.
+ * @throw <IMG_MemPtr::Size> when an invalid width and/or height is passed.
+ * @throw <IMG_MemPtr::Memory> 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 <Size> 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..
+