Laxkit
0.0.7.1
|
Cubic tensor product patch with colors defined at each vertex. More...
Public Member Functions | |
ColorPatchData (double xx, double yy, double ww, double hh, int nr, int nc, unsigned int stle) | |
Passes info to PatchData and creates new colors array with unspecified colors. | |
ColorPatchData () | |
Creates new colors array if (xsize && ysize) else colors=NULL. | |
const char * | whattype () |
virtual SomeData * | duplicate (SomeData *dup) |
virtual void | Set (double xx, double yy, double ww, double hh, int nr, int nc, unsigned int stle) |
Set in rect xx,yy,ww,hh with nr rows and nc columns. Removes old info. | |
virtual void | SetColor (int pr, int pc, int red=0, int green=0, int blue=0, int alpha=0xffff) |
virtual void | collapse (int rr, int cc) |
Merge rows, and/or columns. | |
virtual void | grow (int where, double *tr) |
Grow the patch off an edge. | |
virtual int | subdivide (int r, double rt, int c, double ct) |
Subdivide a single row number r, position rt, and a single column c, position ct. | |
virtual int | subdivide (int xn=2, int yn=2) |
Calls PatchData::subdivide(), then does special subdividing of colors array. | |
virtual int | WhatColor (double s, double t, Laxkit::ScreenColor *color_ret) |
Retrieve the color for point s,t in the patch, where s and t are in range [0..1]. | |
virtual int | hasColorData () |
Return whether there are any points in the patch yet. | |
virtual void | dump_out (FILE *f, int indent, int what, Laxkit::anObject *context) |
virtual void | dump_in_atts (LaxFiles::Attribute *att, int flag, Laxkit::anObject *context) |
Reverse of dump_out(). | |
Public Member Functions inherited from LaxInterfaces::PatchData | |
PatchData () | |
Creates a patch with points=NULL, size=0. | |
PatchData (double xx, double yy, double ww, double hh, int nr, int nc, unsigned int stle) | |
Creates a new patch in rect xx,yy,ww,hh with nr rows and nc columns. | |
virtual void | FindBBox () |
Find bbox. | |
virtual int | pointin (flatpoint pp, int pin=1) |
virtual flatpoint | getControlPoint (int r, int c) |
Return points[r*xsize+c]. | |
virtual flatpoint | getPoint (double t, double s) |
Return the point corresponding to (s,t), where s and t are in range [0..1]. s for column, t for row. | |
virtual flatpoint * | bezAtEdge (flatpoint *p, int i, int row) |
Return a bezier curve corresponding to the row (row==1) or column (row==0) i. | |
virtual flatpoint * | bezCrossSection (flatpoint *p, int i, double t, int row) |
Return the cross section bezier curve at subpatch row (or column) i, and parameter t. | |
virtual int | bezOfPatch (flatpoint *p, int r, int rl, int c, int cl) |
Return the bezier outline of a subsection of the patch. | |
virtual void | resolveToSubpatch (double s, double t, int &c, double &ss, int &r, double &tt) |
From a point s,t (range 0..1), return the subpatch r,c plus offset into that subpatch. | |
virtual void | resolveFromSubpatch (int c, double ss, int r, double tt, double &s, double &t) |
From subpatch (r,c) and offset, return a point s,t with range [0..1],[0..1]. | |
virtual void | getGt (double *G, int roffset, int coffset, int isfory) |
See subdivide() for what Gt is. | |
virtual int | inSubPatch (flatpoint p, int *r_ret, int *c_ret, double *t_ret, double *s_ret, double d) |
Return which subpatch the point seems to be in. | |
virtual int | coordsInSubPatch (flatpoint p, int r, int c, double maxd, double *s_ret, double *t_ret) |
Find an approximate (s,t) point to p. | |
virtual void | zap (flatpoint p, flatpoint x, flatpoint y) |
Remap to be in parallelogram of p,x,y. | |
virtual void | zap () |
Remap so the patch corresponds to its rectangular bounding box. | |
virtual void | InterpolateControls (int whichcontrols) |
Interpolate control points according to whichcontrols. | |
virtual int | warpPatch (flatpoint center, double r1, double r2, double s, double e) |
Make data wrap inside a ring between radius 1 and 2, start angle s, end angle e. | |
virtual int | renderToBuffer (unsigned char *buffer, int bufw, int bufh, int bufstride, int bufdepth, int bufchannels) |
Write to buffer assuming samples are 8 bit ARGB. | |
virtual void | rpatchpoint (PatchRenderContext *context, flatpoint ul, flatpoint ur, flatpoint ll, flatpoint lr, double s1, double t1, double s2, double t2, int which) |
Recursive render. Used by renderToBuffer(). | |
virtual void | patchpoint (PatchRenderContext *context, double s0, double ds, double t0, double dt, int n) |
Called from renderToBuffer(). No recursion, just draw a bunch of rects for patch. | |
Public Member Functions inherited from LaxInterfaces::SomeData | |
virtual void | touchContents () |
virtual Laxkit::LaxImage * | GetPreview () |
If usepreview==1 and preview, then return preview. | |
virtual void | GeneratePreview (int w, int h) |
Create a preview image with transparency for a cached screen preview. | |
virtual const char * | Id () |
virtual const char * | Id (const char *newid) |
SomeData () | |
SomeData (double nminx, double nmaxx, double nminy, double nmaxy) | |
Constructor, setting the bounds. | |
virtual flatpoint | BBoxPoint (double x, double y, bool transform_to_parent) |
virtual flatpoint | ReferencePoint (int which, bool transform_to_parent) |
virtual int | fitto (double *boxm, DoubleBBox *box, double alignx, double aligny, int whentoscale=2) |
Fit this data to box. | |
virtual SomeData * | GetParent () |
virtual void | dump_in (FILE *f, int indent, Laxkit::anObject *context, LaxFiles::Attribute **Att=NULL) |
Dump in an attribute, then call dump_in_atts(thatatt,0). | |
virtual LaxFiles::Attribute * | dump_out_atts (LaxFiles::Attribute *att, int what, Laxkit::anObject *savecontext) |
Public Member Functions inherited from Laxkit::anObject | |
anObject () | |
Set object_id=getUniqueNumber(). | |
virtual | ~anObject () |
Empty virtual destructor. | |
virtual anObject * | duplicate (anObject *ref=NULL) |
virtual int | inc_count () |
Increment the data's count by 1. Returns count. | |
virtual int | dec_count () |
Decrement the count of the data, deleting if count is less than or equal to 0. | |
virtual int | the_count () |
Public Member Functions inherited from Laxkit::Affine | |
Affine (const double *m) | |
If mm==NULL, set identity. | |
Affine (const Affine &m) | |
Affine (double xx, double xy, double yx, double yy, double tx, double ty) | |
Affine & | operator= (Affine const &m) |
Affine & | operator*= (Affine const &m) |
Affine | operator* (Affine const m) |
virtual void | set (Affine a) |
virtual void | setIdentity () |
virtual bool | isIdentity () |
virtual void | setRotation (double angle) |
virtual void | setScale (double sx, double sy) |
virtual void | setBasis (flatpoint o, flatpoint x, flatpoint y) |
virtual void | setBasics (double x, double y, double sx, double sy, double angle, double shear) |
virtual void | getBasics (double *x, double *y, double *sx, double *sy, double *angle, double *shear) |
virtual void | Translate (flatvector d) |
virtual void | Rotate (double angle) |
virtual void | Rotate (double angle, flatpoint around_point) |
virtual void | RotatePointed (flatpoint anchor1, flatpoint anchor2, flatpoint newanchor2) |
virtual void | RotateScale (flatpoint anchor1, flatpoint anchor2, flatpoint newanchor2) |
Rotate and scale so that anchor1 stays fixed, but anchor2 is shifted to newanchor2. | |
virtual void | Stretch (flatpoint anchor1, flatpoint anchor2, flatpoint newanchor2) |
virtual void | AnchorShear (flatpoint anchor1, flatpoint anchor2, flatpoint anchor3, flatpoint newanchor3) |
Transform so that anchor1 and 2 stay fixed, but anchor3 is shifted to newanchor3. | |
virtual void | Scale (double s) |
virtual void | Scale (flatpoint o, double s) |
Scale around point o. | |
virtual void | Scale (flatpoint o, double sx, double sy) |
virtual void | Scale (flatpoint anchor1, flatpoint anchor2, flatpoint newanchor2) |
Scale as if you move anchor2 to newanchor2, while anchor1 stays the same. | |
virtual void | FlipH () |
virtual void | FlipV () |
virtual void | Flip (flatpoint f1, flatpoint f2) |
Flip across the axis of f1 to f2. | |
virtual void | Multiply (Affine &m) |
this=this*m | |
virtual void | PreMultiply (Affine &m) |
this=m*this | |
virtual Affine | Inversion () |
Return a new matrix that is the inverse of this, if possible. | |
virtual void | Invert () |
Make this the inverse of whatever it is. | |
virtual flatpoint | transformPoint (flatpoint p) |
virtual flatpoint | transformPointInverse (flatpoint p) |
virtual flatpoint | transformVector (flatpoint p) |
Apply the transfrom, but ignore this's translation component. | |
virtual const double * | m () const |
virtual void | m (const double *mm) |
virtual void | m (double xx, double xy, double yx, double yy, double tx, double ty) |
virtual double | m (int c) |
virtual void | m (int c, double v) |
virtual void | Unshear (int preserve_x, int normalize) |
Clear shearing and unequal scaling. Null vectors stay null vectors. | |
virtual void | Normalize () |
Make x and y both be unit vectors, but point in the same direction as before. | |
virtual flatpoint | origin () |
virtual void | origin (flatpoint o) |
virtual flatpoint | xaxis () |
virtual void | xaxis (flatpoint x) |
virtual flatpoint | yaxis () |
virtual void | yaxis (flatpoint y) |
Public Member Functions inherited from Laxkit::DoubleBBox | |
DoubleBBox () | |
Create empty invalid bbox (maxx<minx and maxy<miny). | |
DoubleBBox (flatpoint p) | |
Create box whose bounds are p. | |
DoubleBBox (double mix, double max, double miy, double may) | |
Create box whose bounds are as given. | |
virtual void | clear () |
Make box invalid: set minx=miny=0 and maxx=maxy=-1. | |
virtual void | addtobounds (double x, double y) |
virtual void | addtobounds (flatpoint p) |
Expand bounds to contain p. Set the bounds to p if current bounds are invalid. | |
virtual void | addtobounds (DoubleBBox *bbox) |
Add the bbox to the bounds. Set the bounds if current bounds are invalid. | |
virtual void | addtobounds (const double *m, DoubleBBox *bbox) |
Add bbox to bounds, first transforming it by 6 element transform matrix m. | |
virtual void | setbounds (DoubleBBox *bbox) |
Just copy over the bounds. | |
virtual void | setbounds (flatpoint *pts, int n) |
Make this bbox be the bounds for the given n points. (does not add to previous bounds) | |
virtual void | setbounds (double mix, double max, double miy, double may) |
Set the bounds to the specified values. | |
virtual int | validbounds () |
Returns maxx>=minx && maxy>=miny. | |
virtual int | intersect (double mix, double max, double miy, double may, int settointersection=0) |
Intersect the given bounds with this's bounds. Return 1 for non-empty intersection. | |
virtual int | intersect (DoubleBBox *bbox, int settointersection=0) |
Just return intersect(bbox.minx,...,settointersection). | |
virtual int | intersect (double *m, DoubleBBox *bbox, int touching, int settointersection) |
Does the transformed box touch. **** incomplete implementation. | |
virtual int | boxcontains (double x, double y) |
Return whether the given point is contained within or on the bounds. | |
virtual flatpoint | BBoxPoint (double x, double y) |
Public Attributes | |
Laxkit::ScreenColor * | colors |
Public Attributes inherited from LaxInterfaces::PatchData | |
int | renderdepth |
How and how much to render in renderToBuffer. | |
int | griddivisions |
flatpoint * | points |
int | xsize |
int | ysize |
unsigned int | style |
PatchControls | controls |
LineStyle | linestyle |
Public Attributes inherited from LaxInterfaces::SomeData | |
Laxkit::LaxImage * | preview |
A preview image potentially to be used to not have to rerender on each refresh. | |
int | usepreview |
Flag for whether to use SomeData::preview rather than rendering. | |
std::time_t | previewtime |
The time the preview was generated, if at all, as returned by time(). | |
std::time_t | modtime |
The time of last modification through a SomeData function. | |
int | bboxstyle |
flatpoint | centerpoint |
unsigned int | flags |
int | iid |
Id of the interface that should handle this data. | |
char * | nameid |
Public Attributes inherited from Laxkit::anObject | |
int | suppress_debug |
DeleteRefCountedFunc | deleteMe |
Called when the count is decremented to 0. | |
unsigned long | object_id |
char * | object_idstr |
Public Attributes inherited from Laxkit::DoubleBBox | |
double | minx |
double | maxx |
double | miny |
double | maxy |
Cubic tensor product patch with colors defined at each vertex.
In any square segment, the color inside is the linear blend of the colors of the 4 corners.
See ColorPatchInterface.
*** this must be expanded to enable use of somewhat user definable functions for color determination, (see postscript spec for more). also should implement the coons patch as a special case of this.. the coons patch would simply interpolate the inner control points from the outer.
*** the implementation here is rather a mess
LaxInterfaces::ColorPatchData::ColorPatchData | ( | double | xx, |
double | yy, | ||
double | ww, | ||
double | hh, | ||
int | nr, | ||
int | nc, | ||
unsigned int | stle | ||
) |
Passes info to PatchData and creates new colors array with unspecified colors.
Note that the PatchData constructor calls Set(), which does not call ColorPatchData::Set().
References LaxInterfaces::PatchData::renderdepth, and LaxInterfaces::SomeData::usepreview.
Merge rows, and/or columns.
r and c are subpatch indices, not point indices. So to merge the first column of patches and the next column of patches, then pass c=1. If c<1 then no columns are merged. Similarly for rows.
If r>0 and c>0, then columns are merged first, then rows.
This uses PatchData::collapse(), then adjusts the color array accordingly.
Reimplemented from LaxInterfaces::PatchData.
|
virtual |
Grow the patch off an edge.
If where==0, add a column to the left. If where==1, add a row to the top. If where==2, add a column to the right. If where==3, add a row to the bottom.
The new edge is the oldedge+v, and the intervening controls are interpolated. The new colors are duplicates of the old edge's colors.
This uses PatchData::grow(), then adjusts the color array accordingly.
Reimplemented from LaxInterfaces::PatchData.
|
virtual |
Set in rect xx,yy,ww,hh with nr rows and nc columns. Removes old info.
Afterward the colors can be anything. Might want to code preserving what is possible to preserve...
Reimplemented from LaxInterfaces::PatchData.
Referenced by LaxInterfaces::ColorPatchInterface::newPatchData().
|
virtual |
pr,pc is row/column of vertex, 0=first vertex, 1=second vertex, ...
Referenced by LaxInterfaces::ColorPatchInterface::newPatchData().
Subdivide a single row number r, position rt, and a single column c, position ct.
If r<0, then do not subdivide on a row. Same for when c<0. if r or c are to large, then do not subdivide.
r and c are border numbers, so r*3 is index int points. rt and ct are in the range [0..1], with rt==0 being row r, and rt==1 being row r+1.
Return 0 for success, nonzero for failure (nothing changed).
This uses PatchData::subdivide(), then adjusts the color array accordingly.
Reimplemented from LaxInterfaces::PatchData.
References Laxkit::coloravg(), and LaxInterfaces::PatchData::subdivide().
Calls PatchData::subdivide(), then does special subdividing of colors array.
This should preserve the appearance from before the subdivision. The colors for the new vertex points will have the proper colors as they were in the original patch.
Return 0 for success, nonzero for failure (nothing changed).
Reimplemented from LaxInterfaces::PatchData.
References Laxkit::coloravg(), and LaxInterfaces::PatchData::subdivide().
|
virtual |
Retrieve the color for point s,t in the patch, where s and t are in range [0..1].
Returns 0 if there is a non-null patch, else 1.
Reimplemented from LaxInterfaces::PatchData.
References Laxkit::coloravg(), and LaxInterfaces::PatchData::resolveToSubpatch().