[Scummvm-cvs-logs] SF.net SVN: scummvm:[53321] scummvm/trunk/engines/sword25/gfx/image/ vectorimagerenderer.cpp
sev at users.sourceforge.net
sev at users.sourceforge.net
Wed Oct 13 01:37:13 CEST 2010
Revision: 53321
http://scummvm.svn.sourceforge.net/scummvm/?rev=53321&view=rev
Author: sev
Date: 2010-10-12 23:37:13 +0000 (Tue, 12 Oct 2010)
Log Message:
-----------
SWORD25: Further attempt to fix vector rendering
Modified Paths:
--------------
scummvm/trunk/engines/sword25/gfx/image/vectorimagerenderer.cpp
Modified: scummvm/trunk/engines/sword25/gfx/image/vectorimagerenderer.cpp
===================================================================
--- scummvm/trunk/engines/sword25/gfx/image/vectorimagerenderer.cpp 2010-10-12 23:36:52 UTC (rev 53320)
+++ scummvm/trunk/engines/sword25/gfx/image/vectorimagerenderer.cpp 2010-10-12 23:37:13 UTC (rev 53321)
@@ -245,8 +245,83 @@
art_svp_render_aa(svp, x0, y0, x1, y1, art_rgb_svp_alpha_callback1, &data);
}
-void drawBez(ArtBpath *bez, art_u8 *buffer, int width, int height, double scaleX, double scaleY, double penWidth, unsigned int color) {
+static int art_vpath_len(ArtVpath *a) {
+ int i;
+
+ for (i = 0; a[i].code != ART_END; i++);
+ return i;
+}
+
+ArtVpath *art_vpath_cat(ArtVpath *a, ArtVpath *b) {
+ ArtVpath *dest;
+ ArtVpath *p;
+ int len_a, len_b;
+
+ len_a = art_vpath_len(a);
+ len_b = art_vpath_len(b);
+ dest = art_new(ArtVpath, len_a + len_b + 1);
+ p = dest;
+
+ for (int i = 0; i < len_a - 1; i++)
+ *p++ = *a++;
+ for (int i = 0; i <= len_b; i++)
+ *p++ = *b++;
+
+ return dest;
+}
+
+void art_svp_make_convex(ArtSVP *svp) {
+ int i;
+
+ if (svp->n_segs > 0 && svp->segs[0].dir == 0) {
+ for (i = 0; i < svp->n_segs; i++) {
+ svp->segs[i].dir = !svp->segs[i].dir;
+ }
+ }
+}
+
+ArtVpath *art_vpath_reverse(ArtVpath *a) {
+ ArtVpath *dest;
+ ArtVpath it;
+ int len;
+ int state = 0;
+ int i;
+
+ len = art_vpath_len(a);
+ dest = art_new(ArtVpath, len + 1);
+
+ for (i = 0; i < len; i++) {
+ it = a[len - i - 1];
+ if (state) {
+ it.code = ART_LINETO;
+ } else {
+ it.code = ART_MOVETO_OPEN;
+ state = 1;
+ }
+ if (a[len - i - 1].code == ART_MOVETO ||
+ a[len - i - 1].code == ART_MOVETO_OPEN) {
+ state = 0;
+ }
+ dest[i] = it;
+ }
+ dest[len] = a[len];
+
+ return dest;
+}
+
+ArtVpath *art_vpath_reverse_free(ArtVpath *a) {
+ ArtVpath *dest;
+
+ dest = art_vpath_reverse(a);
+ art_free(a);
+
+ return dest;
+}
+
+void drawBez(ArtBpath *bez1, ArtBpath *bez2, art_u8 *buffer, int width, int height, double scaleX, double scaleY, double penWidth, unsigned int color) {
ArtVpath *vec = NULL;
+ ArtVpath *vec1 = NULL;
+ ArtVpath *vec2 = NULL;
ArtSVP *svp = NULL;
#if 0
@@ -265,32 +340,34 @@
printf(" drawBez(bez, buffer, 1.0, 1.0, %f, 0x%08x);\n", penWidth, color);
#endif
- vec = art_bez_path_to_vec(bez, 0.5);
+ vec1 = art_bez_path_to_vec(bez1, 0.5);
+ vec2 = art_bez_path_to_vec(bez2, 0.5);
+ vec2 = art_vpath_reverse_free(vec2);
+ vec = art_vpath_cat(vec1, vec2);
if (scaleX != 1.0 || scaleY != 1.0) {
- ArtVpath *vec1;
- int size;
+ ArtVpath *vect;
+ int size = art_vpath_len(vec);
- for (size = 0; vec[size].code != ART_END; size++);
+ vect = art_new(ArtVpath, size + 1);
- vec1 = art_new(ArtVpath, size + 1);
-
int k;
for (k = 0; k < size; k++) {
- vec1[k].code = vec[k].code;
- vec1[k].x = vec[k].x * scaleX;
- vec1[k].y = vec[k].y * scaleY;
+ vect[k].code = vec[k].code;
+ vect[k].x = vec[k].x * scaleX;
+ vect[k].y = vec[k].y * scaleY;
}
- vec1[k].code = ART_END;
+ vect[k].code = ART_END;
art_free(vec);
- vec = vec1;
+ vec = vect;
}
if (penWidth != -1) {
svp = art_svp_vpath_stroke(vec, ART_PATH_STROKE_JOIN_ROUND, ART_PATH_STROKE_CAP_ROUND, penWidth, 1.0, 0.5);
} else {
svp = art_svp_from_vpath(vec);
+ art_svp_make_convex(svp);
}
art_rgb_svp_alpha1(svp, 0, 0, width, height, color, buffer, width * 4, NULL);
@@ -321,11 +398,11 @@
// Count vector sizes in order to minimize memory
// fragmentation
for (uint p = 0; p < _elements[e].getPathCount(); p++) {
+ if (_elements[e].getPathInfo(p).getFillStyle0() == s + 1)
+ fill0len += _elements[e].getPathInfo(p).getVecLen();
+
if (_elements[e].getPathInfo(p).getFillStyle1() == s + 1)
fill1len += _elements[e].getPathInfo(p).getVecLen();
-
- if (_elements[e].getPathInfo(p).getFillStyle0() == s + 1)
- fill0len += _elements[e].getPathInfo(p).getVecLen();
}
// Now lump together vectors
@@ -335,31 +412,23 @@
ArtBpath *fill0pos = fill0;
for (uint p = 0; p < _elements[e].getPathCount(); p++) {
- // Normal order
+ if (_elements[e].getPathInfo(p).getFillStyle0() == s + 1) {
+ for (int i = 0; i < _elements[e].getPathInfo(p).getVecLen(); i++)
+ *fill0pos++ = _elements[e].getPathInfo(p).getVec()[i];
+ }
+
if (_elements[e].getPathInfo(p).getFillStyle1() == s + 1) {
for (int i = 0; i < _elements[e].getPathInfo(p).getVecLen(); i++)
*fill1pos++ = _elements[e].getPathInfo(p).getVec()[i];
}
-
- // Reverse order
- if (_elements[e].getPathInfo(p).getFillStyle0() == s + 1) {
- for (int i = _elements[e].getPathInfo(p).getVecLen() - 1; i >= 0; i--)
- *fill0pos++ = _elements[e].getPathInfo(p).getVec()[i];
- }
}
// Close vectors
+ (*fill0pos).code = ART_END;
(*fill1pos).code = ART_END;
- (*fill0pos).code = ART_END;
- #if 0
- if (fill1len)
- drawBez(fill1, _pixelData, width, height, scaleX, scaleY, -1, _elements[e].getFillStyleColor(s));
+ drawBez(fill0, fill1, _pixelData, width, height, scaleX, scaleY, -1, _elements[e].getFillStyleColor(s));
- if (fill0len)
- drawBez(fill0, _pixelData, width, height, scaleX, scaleY, -1, _elements[e].getFillStyleColor(s));
- #endif
-
art_free(fill0);
art_free(fill1);
}
@@ -371,7 +440,7 @@
for (uint p = 0; p < _elements[e].getPathCount(); p++) {
if (_elements[e].getPathInfo(p).getLineStyle() == s + 1) {
- drawBez(_elements[e].getPathInfo(p).getVec(), _pixelData, width, height, scaleX, scaleY, penWidth, _elements[e].getLineStyleColor(s));
+ drawBez(_elements[e].getPathInfo(p).getVec(), 0, _pixelData, width, height, scaleX, scaleY, penWidth, _elements[e].getLineStyleColor(s));
}
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list