Initial revision

This commit is contained in:
Hans Lambermont
2002-10-12 11:37:38 +00:00
commit 12315f4d0e
1699 changed files with 444708 additions and 0 deletions

View File

@@ -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 <stddef.h>
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

View File

@@ -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

View File

@@ -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));
}

View File

@@ -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++;
}
}
}

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -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()
{
}

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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

View File

@@ -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..