diff --git a/core/PImage.java b/core/PImage.java
index 522c03014..a8923a163 100644
--- a/core/PImage.java
+++ b/core/PImage.java
@@ -174,7 +174,8 @@ public class PImage implements PConstants, Cloneable {
if ((mode == CORNER) || (mode == CORNERS)) {
imageMode = mode;
} else {
- throw new RuntimeException("imageMode() only works with CORNER or CORNERS");
+ String msg = "imageMode() only works with CORNER or CORNERS";
+ throw new RuntimeException(msg);
}
}
@@ -1412,16 +1413,9 @@ public class PImage implements PConstants, Cloneable {
}
- /**
- * [toxi 030902]
- * Creates a Targa32 formatted byte sequence of specified pixel buffer
- *
- * [fry 030917]
- * Modified to write directly to OutputStream, because of
- * memory issues with first making an array of the data.
- *
- * tga spec: http://organicbit.com/closecombat/formats/tga.html
- */
+ // original TGA export method
+ // now replaced with version using RLE compression (see below)
+ /*
static public boolean saveHeaderTGA(OutputStream output,
int width, int height) {
try {
@@ -1445,7 +1439,6 @@ public class PImage implements PConstants, Cloneable {
return false;
}
-
static public boolean saveTGA(OutputStream output, int pixels[],
int width, int height) {
try {
@@ -1471,7 +1464,97 @@ public class PImage implements PConstants, Cloneable {
} catch (IOException e) {
e.printStackTrace();
}
- return false;
+ return false;
+ } */
+
+
+ /**
+ * Creates a Targa32 formatted byte sequence of specified
+ * pixel buffer now using RLE compression
+ * spec used: http://www.wotsit.org/download.asp?f=tga
+ *
+ * Also figured out how to avoid parsing the image upside-down
+ * (there's a header flag to set the image origin to top-left)
+ *
+ * Contributed by toxi 8 May 2005
+ */
+ static public boolean saveTGA(OutputStream output, int pixels[],
+ int width, int height) {
+ try {
+ byte header[] = new byte[18];
+
+ // set header info
+ header[2] = 0x02+0x08; // RGBA + RLE Compression
+ header[12] = (byte) (width & 0xff);
+ header[13] = (byte) (width >> 8);
+ header[14] = (byte) (height & 0xff);
+ header[15] = (byte) (height >> 8);
+ // bits per pixel
+ header[16] = 32;
+ // bits per colour component + origin at top-left
+ header[17] = 0x08+0x20;
+
+ output.write(header);
+
+ int maxLen = height * width;
+ int index = 0;
+ int col, prevCol;
+ int[] currPack = new int[128];
+
+ while (index1); // set flag for RLE parcel
+ break;
+ }
+ rle++;
+ }
+ // write compressed chunk (bit 7 = 1, bit 6-0 = runlength-1)
+ if (isRLE) {
+ output.write(0x80 | (rle-1));
+
+ output.write(col & 0xff);
+ output.write(col >> 8 & 0xff);
+ output.write(col >> 16 & 0xff);
+ output.write(col >>> 24 & 0xff);
+
+ } else {
+ rle = 1;
+ while(index + rle> 8 & 0xff);
+ output.write(col >> 16 & 0xff);
+ output.write(col >>> 24 & 0xff);
+ }
+ }
+ index += rle;
+ }
+ output.flush();
+ return true;
+
+ } catch (IOException e) {
+ e.printStackTrace(); // exception will be thrown below
+ return false;
+ }
}
@@ -1479,9 +1562,10 @@ public class PImage implements PConstants, Cloneable {
try {
OutputStream os = null;
+ boolean success = false;
if (filename.toLowerCase().endsWith(".tga")) {
os = new BufferedOutputStream(new FileOutputStream(filename), 32768);
- saveTGA(os, pixels, width, height);
+ success = saveTGA(os, pixels, width, height);
} else {
if (!filename.toLowerCase().endsWith(".tif") &&
@@ -1490,13 +1574,18 @@ public class PImage implements PConstants, Cloneable {
filename += ".tif";
}
os = new BufferedOutputStream(new FileOutputStream(filename), 32768);
- saveTIFF(os, pixels, width, height);
+ success = saveTIFF(os, pixels, width, height);
}
os.flush();
os.close();
} catch (IOException e) {
+ //System.err.println("Error while saving image.");
e.printStackTrace();
+ success = false;
+ }
+ if (!success) {
+ throw new RuntimeException("Error while saving image.");
}
}
}
diff --git a/core/PMethods.java b/core/PMethods.java
index b95c37c73..70329ca6f 100755
--- a/core/PMethods.java
+++ b/core/PMethods.java
@@ -23,32 +23,32 @@ public interface PMethods {
public void beginShape(int kind);
- public void normal(float nx, float ny, float nz);
+ public void normal(float nx, float ny, float nz); // 3D
- public void textureMode(int mode);
+ public void textureMode(int mode); // 3D
- public void texture(PImage image);
+ public void texture(PImage image); // 3D
public void vertex(float x, float y);
- public void vertex(float x, float y, float u, float v);
+ public void vertex(float x, float y, float u, float v); // 3D
- public void vertex(float x, float y, float z);
+ public void vertex(float x, float y, float z); // 3D
- public void vertex(float x, float y, float z,
+ public void vertex(float x, float y, float z, // 3D
float u, float v);
public void bezierVertex(float x1, float y1,
float x2, float y2,
float x3, float y3);
- public void bezierVertex(float x1, float y1, float z1,
+ public void bezierVertex(float x1, float y1, float z1, // 3D
float x2, float y2, float z2,
float x3, float y3, float z3);
public void curveVertex(float x, float y);
- public void curveVertex(float x, float y, float z);
+ public void curveVertex(float x, float y, float z); // 3D
public void endShape();
@@ -56,12 +56,12 @@ public interface PMethods {
public void point(float x, float y);
- public void point(float x, float y, float z);
+ public void point(float x, float y, float z); // 3D
public void line(float x1, float y1, float x2, float y2);
public void line(float x1, float y1, float z1,
- float x2, float y2, float z2);
+ float x2, float y2, float z2); // 3D
public void triangle(float x1, float y1, float x2, float y2,
float x3, float y3);
@@ -77,7 +77,7 @@ public interface PMethods {
//protected void rectImpl(float x1, float y1, float x2, float y2);
- // REMOVED public void circle(float x, float y, float radius);
+ //
public void ellipseMode(int mode);
@@ -85,10 +85,7 @@ public interface PMethods {
//protected void ellipseImpl(float x, float y, float hradius, float vradius);
- // REMOVED public void arcMode(int mode);
-
- // REMOVED public void arc(float start, float stop,
- // float x, float y, float radius);
+ //
public void arc(float x, float y, float hr, float vr,
float start, float stop);
@@ -98,8 +95,9 @@ public interface PMethods {
//
- // also discussed using the modes..
- // but when rotating it's gonna make things totally bizarre.
+ // also considered using the modes for box() and sphere(),
+ // but then decided against because when rotating/scaling/etc
+ // it's gonna make things totally bizarre.
// rectMode(CORNER, CORNERS, CENTER, CENTER_DIAMETER
// box(x, y, z, w, h, d) CORNER
@@ -110,15 +108,13 @@ public interface PMethods {
// sphere(x, y, z, r) CENTER
// sphere(x, y, z, r) CORNER draws the ellipse starting int the corner
- public void box(float size);
+ public void box(float size); // 3D
- public void box(float w, float h, float d);
+ public void box(float w, float h, float d); // 3D
- public void sphereDetail(int res);
+ public void sphereDetail(int res); // 3D
- public void sphere(float r);
-
- //public void sphere(float x, float y, float z, float r);
+ public void sphere(float r); // 3D
//
@@ -128,6 +124,8 @@ public interface PMethods {
public float bezierTangent(float a, float b, float c, float d,
float t);
+ public void bezierDetail(int detail);
+
public void bezier(float x1, float y1,
float x2, float y2,
float x3, float y3,
@@ -136,13 +134,9 @@ public interface PMethods {
public void bezier(float x1, float y1, float z1,
float x2, float y2, float z2,
float x3, float y3, float z3,
- float x4, float y4, float z4);
+ float x4, float y4, float z4); // 3D
- public void bezierDetail(int detail);
-
- public void curveDetail(int detail);
-
- public void curveTightness(float tightness);
+ //
public float curvePoint(float a, float b, float c, float d,
float t);
@@ -150,6 +144,10 @@ public interface PMethods {
public float curveTangent(float a, float b, float c, float d,
float t);
+ public void curveDetail(int detail);
+
+ public void curveTightness(float tightness);
+
public void curve(float x1, float y1,
float x2, float y2,
float x3, float y3,
@@ -158,7 +156,7 @@ public interface PMethods {
public void curve(float x1, float y1, float z1,
float x2, float y2, float z2,
float x3, float y3, float z3,
- float x4, float y4, float z4);
+ float x4, float y4, float z4); // 3D
//
public void image(PImage image, float x1, float y1);
@@ -171,8 +169,8 @@ public interface PMethods {
int u1, int v1, int u2, int v2);
//protected void imageImpl(PImage image,
- // float x1, float y1, float x2, float y2,
- // int u1, int v1, int u2, int v2);
+ // float x1, float y1, float x2, float y2,
+ // int u1, int v1, int u2, int v2);
//
@@ -186,65 +184,77 @@ public interface PMethods {
public void textFont(PFont which, float size);
- public void textSize(float size);
-
public void textLeading(float leading);
public void textMode(int mode);
+ public void textSize(float size);
+
public float textWidth(char c);
public float textWidth(String s);
+ //
+
public void text(char c, float x, float y);
- public void text(char c, float x, float y, float z);
+ public void text(char c, float x, float y, float z); // 3D
public void text(String s, float x, float y);
- public void text(String s, float x, float y, float z);
+ public void text(String s, float x, float y, float z); // 3D
public void text(String s, float x, float y, float w, float h);
- public void text(String s, float x1, float y1, float x2, float y2, float z);
+ public void text(String s, float x, float y, float w, float h, // 3D
+ float z);
public void text(int num, float x, float y);
- public void text(int num, float x, float y, float z);
+ public void text(int num, float x, float y, float z); // 3D
public void text(float num, float x, float y);
- public void text(float num, float x, float y, float z);
+ public void text(float num, float x, float y, float z); // 3D
+
+ //protected void textImpl(char ch, float x, float y, float z);
+
+ //protected void textImplObject(PImage glyph,
+ // float x1, float y1, float z1,
+ // float x2, float y2, float z2,
+ // int u2, int v2);
+
+ //protected void textImplScreen(PImage glyph,
+ // int xx, int yy, //int x2, int y2,
+ // int w0, int h0);
//
public void translate(float tx, float ty);
- public void translate(float tx, float ty, float tz);
-
- public void angleMode(int mode);
+ public void translate(float tx, float ty, float tz); // 3D
public void rotate(float angle);
- public void rotateX(float angle);
+ public void rotateX(float angle); // 3D
- public void rotateY(float angle);
+ public void rotateY(float angle); // 3D
- public void rotateZ(float angle);
+ public void rotateZ(float angle); // 3D
- public void rotate(float angle, float v0, float v1, float v2);
+ public void rotate(float angle, float v0, float v1, float v2); // 3D
public void scale(float s);
public void scale(float sx, float sy);
- public void scale(float sx, float sy, float sz);
+ public void scale(float sx, float sy, float sz); // 3D
//
- public void push();
+ public void pushMatrix();
- public void pop();
+ public void popMatrix();
public void resetMatrix();
@@ -254,34 +264,43 @@ public interface PMethods {
public void applyMatrix(float n00, float n01, float n02, float n03,
float n10, float n11, float n12, float n13,
float n20, float n21, float n22, float n23,
- float n30, float n31, float n32, float n33);
+ float n30, float n31, float n32, float n33); // 3D
+
+ public void loadMatrix();
public void printMatrix();
//
- public void cameraMode(int mode);
+ public void beginCamera(); // 3D
- public void beginCamera();
+ public void endCamera(); // 3D
- public void endCamera();
+ public void camera(); // 3D
- public void ortho(float left, float right,
+ public void camera(float eyeX, float eyeY, float eyeZ,
+ float centerX, float centerY, float centerZ,
+ float upX, float upY, float upZ); // 3D
+
+ public void printCamera(); // 3D
+
+ //
+
+ public void ortho(); // 3D
+
+ public void ortho(float left, float right, // 3D
float bottom, float top,
float near, float far);
- public void perspective(float fovy, float aspect, float zNear, float zFar);
+ public void perspective(); // 3D
+
+ public void perspective(float fovy, float aspect,
+ float zNear, float zFar); // 3D
public void frustum(float left, float right, float bottom,
- float top, float znear, float zfar);
+ float top, float znear, float zfar); // 3D
- public void lookat(float eyeX, float eyeY, float eyeZ,
- float centerX, float centerY, float centerZ,
- float upX, float upY, float upZ);
-
- public void printCamera();
-
- public void printProjection();
+ public void printProjection(); // 3D
//
@@ -289,57 +308,17 @@ public interface PMethods {
public float screenY(float x, float y);
- public float screenX(float x, float y, float z);
+ public float screenX(float x, float y, float z); // 3D
- public float screenY(float x, float y, float z);
+ public float screenY(float x, float y, float z); // 3D
- public float screenZ(float x, float y, float z);
+ public float screenZ(float x, float y, float z); // 3D
- public float objectX(float x, float y, float z);
+ public float modelX(float x, float y, float z); // 3D
- public float objectY(float x, float y, float z);
+ public float modelY(float x, float y, float z); // 3D
- public float objectZ(float x, float y, float z);
-
- //
-
- public void lights();
-
- public PLight createAmbient();
-
- public PLight createDiffuse();
-
- public PLight createSpecular();
-
- public PLight createSpotlight();
-
- public void light(myLight);
-
-
- public void noLights();
-
- public void light(int num, float x, float y, float z,
- float red, float green, float blue);
-
- public void lightEnable(int num);
-
- public void lightDisable(int num);
-
- public void lightPosition(int num, float x, float y, float z);
-
- public void lightAmbient(int num, float x, float y, float z);
-
- public void lightDiffuse(int num, float x, float y, float z);
-
- public void lightSpecular(int num, float x, float y, float z);
-
- public void lightDirection(int num, float x, float y, float z);
-
- public void lightFalloff(int num, float constant, float linear, float quadratic);
-
- public void lightSpotAngle(int num, float spotAngle);
-
- public void lightSpotConcentration(int num, float concentration);
+ public float modelZ(float x, float y, float z); // 3D
//
@@ -353,29 +332,19 @@ public interface PMethods {
public void colorMode(int mode,
float maxX, float maxY, float maxZ, float maxA);
- public void noTint();
+ //
- public void tint(int rgb);
+ //protected void colorCalc(float gray);
- public void tint(float gray);
+ //protected void colorCalc(float gray, float alpha);
- public void tint(float gray, float alpha);
+ //protected void colorCalc(float x, float y, float z);
- public void tint(float x, float y, float z);
+ //protected void colorCalc(float x, float y, float z, float a);
- public void tint(float x, float y, float z, float a);
+ //protected void colorCalcARGB(int argb);
- public void noFill();
-
- public void fill(int rgb);
-
- public void fill(float gray);
-
- public void fill(float gray, float alpha);
-
- public void fill(float x, float y, float z);
-
- public void fill(float x, float y, float z, float a);
+ //
public void strokeWeight(float weight);
@@ -395,6 +364,103 @@ public interface PMethods {
public void stroke(float x, float y, float z, float a);
+ protected void colorStroke();
+
+ //
+
+ public void noTint();
+
+ public void tint(int rgb);
+
+ public void tint(float gray);
+
+ public void tint(float gray, float alpha);
+
+ public void tint(float x, float y, float z);
+
+ public void tint(float x, float y, float z, float a);
+
+ //protected void tintFromCalc();
+
+ //
+
+ public void noFill();
+
+ public void fill(int rgb);
+
+ public void fill(float gray);
+
+ public void fill(float gray, float alpha);
+
+ public void fill(float x, float y, float z);
+
+ public void fill(float x, float y, float z, float a);
+
+ //protected void fillFromCalc();
+
+ //
+
+ public void ambient(int rgb); // 3D
+
+ public void ambient(float gray); // 3D
+
+ public void ambient(float x, float y, float z); // 3D
+
+ //protected void ambientFromCalc(); // 3D
+
+ //
+
+ public void specular(int rgb); // 3D
+
+ public void specular(float gray); // 3D
+
+ public void specular(float gray, float alpha); // 3D
+
+ public void specular(float x, float y, float z); // 3D
+
+ public void specular(float x, float y, float z, float a); // 3D
+
+ //protected void specularFromCalc(); // 3D
+
+ public void shininess(float shine); // 3D
+
+ //
+
+ public void emissive(int rgb); // 3D
+
+ public void emissive(float gray); // 3D
+
+ public void emissive(float x, float y, float z); // 3D
+
+ //protected void emissiveFromCalc();
+
+ //
+
+ public void lights(); // 3D
+
+ public void ambientLight(float red, float green, float blue); // 3D
+
+ public void ambientLight(float red, float green, float blue, // 3D
+ float x, float y, float z);
+
+ public void directionalLight(float red, float green, float blue, // 3D
+ float nx, float ny, float nz);
+
+ public void pointLight(float red, float green, float blue, // 3D
+ float x, float y, float z);
+
+ public void spotLight(float red, float green, float blue, // 3D
+ float x, float y, float z,
+ float nx, float ny, float nz,
+ float angle, float concentration);
+
+ public void lightFalloff(float constant,
+ float linear, float quadratic); // 3D
+
+ public void lightSpecular(float x, float y, float z); // 3D
+
+ //
+
public void background(int rgb);
public void background(float gray);
@@ -403,6 +469,8 @@ public interface PMethods {
public void background(PImage image);
+ //protected void backgroundFromCalc();
+
public void clear();
//
@@ -439,19 +507,25 @@ public interface PMethods {
//
-
public void imageMode(int mode);
public void smooth();
public void noSmooth();
- //
- // now handled by PApplet
- //public void loadPixels();
- //public void updatePixels();
- //public void updatePixels(int x, int y, int c, int d);
+ ///////////////////////////////////////////////////////////
+
+ // all functions below this point require pixel buffer manipulation
+ // and generally are wrapped or handled internally with a call to
+ // loadPixels or updatePixels.. not supported for vector subclasses.
+
+
+ public void loadPixels();
+
+ public void updatePixels();
+
+ public void updatePixels(int x, int y, int c, int d);
//
@@ -465,20 +539,23 @@ public interface PMethods {
public void set(int x, int y, PImage image);
+ //protected void setImpl(int dx, int dy, int sx, int sy, int sw, int sh,
+ // PImage src) {
+
//
public void mask(int alpha[]);
public void mask(PImage alpha);
+ //
+
public void filter(int kind);
public void filter(int kind, float param);
//
- //public void copy(PImage src, int dx, int dy); // set instead
-
public void copy(int sx1, int sy1, int sx2, int sy2,
int dx1, int dy1, int dx2, int dy2);
@@ -502,76 +579,18 @@ public interface PMethods {
//
+ //static public boolean saveHeaderTIFF(OutputStream output,
+ // int width, int height);
+
+ //static public boolean saveTIFF(OutputStream output, int pixels[],
+ // int width, int height);
+
+ //static public boolean saveHeaderTGA(OutputStream output,
+ // int width, int height) {
+
+ //static public boolean saveTGA(OutputStream output, int pixels[],
+ // int width, int height) {
+
public void save(String filename);
- public void postSetup();
-
- public void diffuse(int rgb);
-
- public void diffuse(float gray);
-
-
- public void diffuse(float gray, float alpha);
-
-
- public void diffuse(float x, float y, float z);
-
-
- public void diffuse(float x, float y, float z, float a);
-
-//////////////////////////////////////////////////////////////
-
- public void ambient(int rgb);
-
- public void ambient(float gray);
-
- public void ambient(float x, float y, float z);
-
-//////////////////////////////////////////////////////////////
-
- public void specular(int rgb);
-
- public void specular(float gray);
-
- public void specular(float gray, float alpha);
-
- public void specular(float x, float y, float z);
-
- public void specular(float x, float y, float z, float a);
-
- public void shininess(float shine);
-
- public void emissive(int rgb);
-
- public void emissive(float gray);
-
- public void emissive(float x, float y, float z);
-
-//////////////////////////////////////////////////////////////
-
- public int createAmbientLight(int rgb);
-
- public int createAmbientLight(float gray);
-
- public int createAmbientLight(float lr, float lg, float lb);
-
- public int createDirectionalLight(int rgb, float nx, float ny, float nz);
-
- public int createDirectionalLight(float gray, float nx, float ny, float nz);
-
- public int createDirectionalLight(float r, float g, float b, float nx, float ny, float nz);
-
- public int createPointLight(int rgb, float x, float y, float z);
-
- public int createPointLight(float gray, float x, float y, float z);
-
- public int createPointLight(float lr, float lg, float lb, float x, float y, float z);
-
- public int createSpotLight(int rgb, float x, float y, float z, float nx, float ny, float nz, float angle);
-
- public int createSpotLight(float gray, float x, float y, float z, float nx, float ny, float nz, float angle);
-
- public int createSpotLight(float lr, float lg, float lb, float x, float y, float z, float nx, float ny, float nz, float angle);
-}
-
-*/
\ No newline at end of file
+*/
diff --git a/core/todo.txt b/core/todo.txt
index af5f3ef35..cc3b91112 100644
--- a/core/todo.txt
+++ b/core/todo.txt
@@ -1,4 +1,5 @@
0092 core
+X rle-compressed tga save() method added by toxi
X proper/consistent api to access matrices in PGraphics/PGraphics3
X first use loadMatrix(), then m00, m01 etc
_ find the post on the board and make a note of this