summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/gdi_canvas.c45
-rw-r--r--common/gl_canvas.c2
-rw-r--r--python_modules/demarshal.py11
-rw-r--r--python_modules/ptypes.py15
-rw-r--r--server/red_parse_qxl.c13
-rw-r--r--server/red_worker.c5
-rw-r--r--spice.proto28
-rw-r--r--spice1.proto10
8 files changed, 49 insertions, 80 deletions
diff --git a/common/gdi_canvas.c b/common/gdi_canvas.c
index 0c99097e..c5c74620 100644
--- a/common/gdi_canvas.c
+++ b/common/gdi_canvas.c
@@ -1593,34 +1593,6 @@ static void gdi_canvas_draw_text(SpiceCanvas *spice_canvas, SpiceRect *bbox, Spi
}
}
-static int get_join_style(uint8_t join_style)
-{
- switch (join_style) {
- case SPICE_LINE_JOIN_ROUND:
- return PS_JOIN_ROUND;
- case SPICE_LINE_JOIN_BEVEL:
- return PS_JOIN_BEVEL;
- case SPICE_LINE_JOIN_MITER:
- return PS_JOIN_MITER;
- default:
- CANVAS_ERROR("bad join style %d", join_style);
- }
-}
-
-static int get_cap(int end_style)
-{
- switch (end_style) {
- case SPICE_LINE_CAP_ROUND:
- return PS_ENDCAP_ROUND;
- case SPICE_LINE_CAP_SQUARE:
- return PS_ENDCAP_SQUARE;
- case SPICE_LINE_CAP_BUTT:
- return PS_ENDCAP_FLAT;
- default:
- CANVAS_ERROR("bad end style %d", end_style);
- }
-}
-
static uint32_t *gdi_get_userstyle(GdiCanvas *canvas, uint8_t nseg, SPICE_ADDRESS addr, int start_is_gap)
{
SPICE_FIXED28_4* style = (SPICE_FIXED28_4*)SPICE_GET_ADDRESS(addr);
@@ -1656,8 +1628,6 @@ static void gdi_canvas_draw_stroke(SpiceCanvas *spice_canvas, SpiceRect *bbox, S
HPEN hpen;
HPEN prev_hpen;
LOGBRUSH logbrush;
- int ps_join = 0;
- int line_cap = 0;
uint32_t *user_style = NULL;
pixman_image_t *surface = NULL;
@@ -1775,23 +1745,16 @@ static void gdi_canvas_draw_stroke(SpiceCanvas *spice_canvas, SpiceRect *bbox, S
pixman_image_unref(surface);
}
-#if 0
- ps_join = get_join_style(stroke->attr.join_style);
- line_cap = get_cap(stroke->attr.end_style);
-
- SetMiterLimit(canvas->dc, (FLOAT)fix_to_double(stroke->attr.miter_limit), &old_miter);
-#endif
-
if (stroke->attr.flags & SPICE_LINE_FLAGS_STYLED) {
user_style = gdi_get_userstyle(canvas, stroke->attr.style_nseg,
stroke->attr.style,
!!(stroke->attr.flags & SPICE_LINE_FLAGS_START_WITH_GAP));
- hpen = ExtCreatePen(PS_GEOMETRIC | ps_join | line_cap | PS_USERSTYLE,
- (uint32_t)fix_to_double(stroke->attr.width),
+ hpen = ExtCreatePen(PS_GEOMETRIC | PS_USERSTYLE,
+ 1.0,
&logbrush, stroke->attr.style_nseg, (DWORD *)user_style);
} else {
- hpen = ExtCreatePen(PS_GEOMETRIC | ps_join | line_cap,
- (uint32_t)fix_to_double(stroke->attr.width),
+ hpen = ExtCreatePen(PS_GEOMETRIC,
+ 1.0,
&logbrush, 0, NULL);
}
prev_hpen = (HPEN)SelectObject(canvas->dc, hpen);
diff --git a/common/gl_canvas.c b/common/gl_canvas.c
index 5a03d155..10745b4c 100644
--- a/common/gl_canvas.c
+++ b/common/gl_canvas.c
@@ -617,7 +617,7 @@ static void gl_canvas_draw_stroke(SpiceCanvas *spice_canvas, SpiceRect *bbox, Sp
if (stroke->attr.flags & SPICE_LINE_FLAGS_STYLED) {
WARN("SPICE_LINE_FLAGS_STYLED");
}
- glc_set_line_width(canvas->glc, fix_to_double(stroke->attr.width));
+ glc_set_line_width(canvas->glc, 1.0);
path = get_path(canvas, stroke->path);
glc_stroke_path(canvas->glc, path);
diff --git a/python_modules/demarshal.py b/python_modules/demarshal.py
index 48b4e73e..b8195134 100644
--- a/python_modules/demarshal.py
+++ b/python_modules/demarshal.py
@@ -62,7 +62,8 @@ def write_read_primitive(writer, start, container, name, scope):
writer.error_check("pos + %s > message_end" % m.member_type.get_fixed_nw_size())
var = "%s__value" % (name)
- scope.variable_def(m.member_type.c_type(), var)
+ if not scope.variable_defined(var):
+ scope.variable_def(m.member_type.c_type(), var)
writer.assign(var, "read_%s(pos)" % (m.member_type.primitive_type()))
return var
@@ -639,7 +640,9 @@ def write_switch_parser(writer, container, switch, dest, scope):
elif t.is_pointer():
write_parse_pointer(writer, t, False, m.has_attr("c_ptr"), dest2, m.name, block)
elif t.is_primitive():
- if not m.has_attr("zero"):
+ if m.has_attr("zero"):
+ writer.statement("consume_%s(&in)" % (t.primitive_type()))
+ else:
writer.assign(dest2.get_ref(m.name), "consume_%s(&in)" % (t.primitive_type()))
#TODO validate e.g. flags and enums
elif t.is_array():
@@ -768,8 +771,8 @@ def write_member_parser(writer, container, member, dest, scope):
write_parse_pointer(writer, t, member.has_end_attr(), member.has_attr("c_ptr"), dest, member.name, scope)
elif t.is_primitive():
if member.has_attr("zero"):
- pass
- if member.has_end_attr():
+ writer.statement("consume_%s(&in)" % t.primitive_type())
+ elif member.has_end_attr():
writer.statement("*(%s *)end = consume_%s(&in)" % (t.c_type(), t.primitive_type()))
writer.increment("end", t.sizeof())
else:
diff --git a/python_modules/ptypes.py b/python_modules/ptypes.py
index bef54321..b7bcac94 100644
--- a/python_modules/ptypes.py
+++ b/python_modules/ptypes.py
@@ -610,6 +610,12 @@ class Switch(Containee):
def is_switch(self):
return True
+ def lookup_case_member(self, name):
+ for c in self.cases:
+ if c.member.name == name:
+ return c.member
+ return None
+
def has_switch_member(self, member):
for c in self.cases:
if c.member == member:
@@ -767,7 +773,14 @@ class ContainerType(Type):
return str(fixed)
def lookup_member(self, name):
- return self.members_by_name[name]
+ if self.members_by_name.has_key(name):
+ return self.members_by_name[name]
+ for m in self.members:
+ if m.is_switch():
+ member = m.lookup_case_member(name)
+ if member:
+ return member
+ raise Exception, "No member called %s found" % name
class StructType(ContainerType):
def __init__(self, name, members, attribute_list):
diff --git a/server/red_parse_qxl.c b/server/red_parse_qxl.c
index 6fb439e5..7e877768 100644
--- a/server/red_parse_qxl.c
+++ b/server/red_parse_qxl.c
@@ -358,12 +358,13 @@ static void red_get_stroke_ptr(RedMemSlotInfo *slots, int group_id,
{
red->path = red_get_path(slots, group_id, qxl->path);
red->attr.flags = qxl->attr.flags;
- red->attr.join_style = qxl->attr.join_style;
- red->attr.end_style = qxl->attr.end_style;
- red->attr.style_nseg = qxl->attr.style_nseg;
- red->attr.width = qxl->attr.width;
- red->attr.miter_limit = qxl->attr.miter_limit;
- red->attr.style = qxl->attr.style;
+ if (red->attr.flags & SPICE_LINE_FLAGS_STYLED) {
+ red->attr.style_nseg = qxl->attr.style_nseg;
+ red->attr.style = qxl->attr.style;
+ } else {
+ red->attr.style_nseg = 0;
+ red->attr.style = 0;
+ }
red_get_brush_ptr(slots, group_id, &red->brush, &qxl->brush);
red->fore_mode = qxl->fore_mode;
red->back_mode = qxl->back_mode;
diff --git a/server/red_worker.c b/server/red_worker.c
index 712ede88..fa1ca442 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -2324,9 +2324,8 @@ static int is_equal_brush(SpiceBrush *b1, SpiceBrush *b2)
// partial imp
static int is_equal_line_attr(SpiceLineAttr *a1, SpiceLineAttr *a2)
{
- return a1->flags == a2->flags && a1->join_style == a2->join_style &&
- a1->end_style == a2->end_style && a1->style_nseg == a2->style_nseg &&
- a1->width == a2->width && a1->miter_limit == a2->miter_limit &&
+ return a1->flags == a2->flags &&
+ a1->style_nseg == a2->style_nseg &&
a1->style_nseg == 0;
}
diff --git a/spice.proto b/spice.proto
index 67acb67c..75282086 100644
--- a/spice.proto
+++ b/spice.proto
@@ -131,7 +131,7 @@ channel BaseChannel {
uint32 what; /* error_code/warn_code/info_code */
uint32 message_len;
uint8 message[message_len] @end @nomarshal;
- uint8 zero @end @ctype(uint8_t) @zero @nomarshal;
+ uint8 zero @end @ctype(uint8_t) @nomarshal;
} notify;
client:
@@ -349,18 +349,6 @@ flags8 line_flags {
START_WITH_GAP = 2,
};
-enum8 line_cap {
- ROUND,
- SQUARE,
- BUTT,
-};
-
-enum8 line_join {
- ROUND,
- BEVEL,
- MITER,
-};
-
flags8 string_flags {
RASTER_A1,
RASTER_A4,
@@ -537,12 +525,14 @@ struct QMask {
struct LineAttr {
line_flags flags;
- line_join join_style;
- line_cap end_style;
- uint8 style_nseg;
- fixed28_4 width;
- fixed28_4 miter_limit;
- fixed28_4 *style[style_nseg];
+ switch (flags) {
+ case STYLED:
+ uint8 style_nseg;
+ } u1 @anon;
+ switch (flags) {
+ case STYLED:
+ fixed28_4 *style[style_nseg];
+ } u2 @anon;
};
struct RasterGlyphA1 {
diff --git a/spice1.proto b/spice1.proto
index 0150de22..c9a18d9f 100644
--- a/spice1.proto
+++ b/spice1.proto
@@ -131,7 +131,7 @@ channel BaseChannel {
uint32 what; /* error_code/warn_code/info_code */
uint32 message_len;
uint8 message[message_len] @end @nomarshal;
- uint8 zero @end @ctype(uint8_t) @zero @nomarshal;
+ uint8 zero @end @ctype(uint8_t) @nomarshal;
} notify;
client:
@@ -485,11 +485,11 @@ struct QMask {
struct LineAttr {
line_flags flags;
- line_join join_style;
- line_cap end_style;
+ line_join join_style @zero;
+ line_cap end_style @zero;
uint8 style_nseg;
- fixed28_4 width;
- fixed28_4 miter_limit;
+ fixed28_4 width @zero;
+ fixed28_4 miter_limit @zero;
fixed28_4 *style[style_nseg];
};