Properly parse QXLImage to the new-world SpiceImage

SpiceImage now replaces RedImage and has all image types in it.
All image data are now chunked (and as such not copied when demarshalling).
This commit is contained in:
Gerd Hoffmann 2010-07-01 17:55:33 +02:00 committed by Marc-André Lureau
parent 4a12b9c0dd
commit 0ed056da99
5 changed files with 105 additions and 80 deletions

View File

@ -93,7 +93,7 @@ def write_read_primitive(writer, start, container, name, scope):
writer.assign("pos", start + " + " + container.get_nw_offset(m, "", "__nw_size"))
writer.error_check("pos + %s > message_end" % m.member_type.get_fixed_nw_size())
var = "%s__value" % (name)
var = "%s__value" % (name.replace(".", "_"))
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()))
@ -112,7 +112,7 @@ def write_read_primitive_item(writer, item, scope):
assert(item.type.is_primitive())
writer.assign("pos", item.get_position())
writer.error_check("pos + %s > message_end" % item.type.get_fixed_nw_size())
var = "%s__value" % (item.subprefix)
var = "%s__value" % (item.subprefix.replace(".", "_"))
scope.variable_def(item.type.c_type(), var)
writer.assign(var, "read_%s(pos)" % (item.type.primitive_type()))
return var

View File

@ -811,14 +811,31 @@ class ContainerType(Type):
return str(fixed)
def lookup_member(self, name):
dot = name.find('.')
rest = None
if dot >= 0:
rest = name[dot+1:]
name = name[:dot]
member = None
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
member = self.members_by_name[name]
else:
for m in self.members:
if m.is_switch():
member = m.lookup_case_member(name)
if member != None:
break
if member != None:
break
if member == None:
raise Exception, "No member called %s found" % name
if rest != None:
return member.member_type.lookup_member(rest)
return member
class StructType(ContainerType):
def __init__(self, name, members, attribute_list):

View File

@ -95,7 +95,7 @@ def SPICE_BNF():
switchCase = Group(Group(OneOrMore(default_.setParseAction(replaceWith(None)) + colon | case_.suppress() + identifier + colon)) + variableDef) \
.setParseAction(lambda toks: ptypes.SwitchCase(toks[0][0], toks[0][1]))
switchBody = Group(switch_ + lparen + identifier + rparen + lbrace + Group(OneOrMore(switchCase)) + rbrace + identifier + attributes - semi) \
switchBody = Group(switch_ + lparen + delimitedList(identifier,delim='.', combine=True) + rparen + lbrace + Group(OneOrMore(switchCase)) + rbrace + identifier + attributes - semi) \
.setParseAction(lambda toks: ptypes.Switch(toks[0][1], toks[0][2], toks[0][3], toks[0][4]))
messageBody = structBody = Group(lbrace + ZeroOrMore(variableDef | switchBody) + rbrace)
structSpec = Group(struct_ + identifier + structBody + attributes).setParseAction(lambda toks: ptypes.StructType(toks[0][1], toks[0][2], toks[0][3]))

View File

@ -111,7 +111,7 @@ channel BaseChannel {
message {
uint32 id;
uint64 timestamp;
uint8 data[] @end @ctype(uint8_t) @as_ptr(data_len);
uint8 data[] @ctype(uint8_t) @as_ptr(data_len);
} ping;
message {
@ -435,16 +435,16 @@ struct BitmapData {
uint32 stride;
switch (flags) {
case PAL_FROM_CACHE:
uint64 palette;
uint64 palette_id;
default:
Palette *palette @outvar(bitmap);
Palette *palette @outvar(bitmap) @c_ptr;
} pal @anon;
uint8 *data[image_size(8, stride, y)] @nocopy; /* pointer to array, not array of pointers as in C */
uint8 *data[image_size(8, stride, y)] @chunk; /* pointer to array, not array of pointers as in C */
} @ctype(SpiceBitmap);
struct BinaryData {
uint32 data_size;
uint8 data[data_size] @end @nomarshal;
uint8 data[data_size] @nomarshal @chunk;
} @ctype(SpiceQUICData);
struct LZPLTData {
@ -452,58 +452,63 @@ struct LZPLTData {
uint32 data_size;
switch (flags) {
case PAL_FROM_CACHE:
uint64 palette;
uint64 palette_id;
default:
Palette *palette @nonnull @outvar(lzplt);
Palette *palette @nonnull @outvar(lzplt) @c_ptr;
} pal @anon;
uint8 data[data_size] @end @nomarshal;
uint8 data[data_size] @nomarshal @chunk;
};
struct ZlibGlzRGBData {
uint32 glz_data_size;
uint32 data_size;
uint8 data[data_size] @end @nomarshal;
uint8 data[data_size] @nomarshal @chunk;
} @ctype(SpiceZlibGlzRGBData);
struct JPEGAlphaData {
jpeg_alpha_flags flags;
uint32 jpeg_size;
uint32 data_size;
uint8 data[data_size] @end @nomarshal;
uint8 data[data_size] @nomarshal @chunk;
} @ctype(SpiceJPEGAlphaData);
struct Surface {
uint32 surface_id;
};
struct Image {
uint64 id;
image_type type;
image_flags flags;
uint32 width;
uint32 height;
switch (type) {
struct Image {
struct ImageDescriptor {
uint64 id;
image_type type;
image_flags flags;
uint32 width;
uint32 height;
} descriptor;
switch (descriptor.type) {
case BITMAP:
BitmapData bitmap_data @ctype(SpiceBitmap);
BitmapData bitmap;
case QUIC:
BinaryData quic;
case LZ_RGB:
case GLZ_RGB:
BinaryData lz_rgb;
case JPEG:
BinaryData binary_data @ctype(SpiceQUICData);
BinaryData jpeg;
case LZ_PLT:
LZPLTData lzplt_data @ctype(SpiceLZPLTData);
LZPLTData lz_plt;
case ZLIB_GLZ_RGB:
ZlibGlzRGBData zlib_glz_data @ctype(SpiceZlibGlzRGBData);
ZlibGlzRGBData zlib_glz;
case JPEG_ALPHA:
JPEGAlphaData jpeg_alpha_data @ctype(SpiceJPEGAlphaData);
JPEGAlphaData jpeg_alpha;
case SURFACE:
Surface surface_data;
} u @end;
} @ctype(SpiceImageDescriptor);
Surface surface;
} u;
};
struct Pattern {
Image *pat @nonnull;
Image *pat @nonnull @c_ptr;
Point pos;
};
@ -520,7 +525,7 @@ struct Brush {
struct QMask {
mask_flags flags;
Point pos;
Image *bitmap;
Image *bitmap @c_ptr;
};
struct LineAttr {
@ -649,7 +654,7 @@ channel DisplayChannel : BaseChannel {
message {
DisplayBase base;
struct Opaque {
Image *src_bitmap;
Image *src_bitmap @c_ptr;
Rect src_area;
Brush brush;
ropd rop_descriptor;
@ -661,7 +666,7 @@ channel DisplayChannel : BaseChannel {
message {
DisplayBase base;
struct Copy {
Image *src_bitmap;
Image *src_bitmap @c_ptr;
Rect src_area;
ropd rop_descriptor;
image_scale_mode scale_mode;
@ -672,7 +677,7 @@ channel DisplayChannel : BaseChannel {
message {
DisplayBase base;
struct Blend {
Image *src_bitmap;
Image *src_bitmap @c_ptr;
Rect src_area;
ropd rop_descriptor;
image_scale_mode scale_mode;
@ -704,7 +709,7 @@ channel DisplayChannel : BaseChannel {
message {
DisplayBase base;
struct Rop3 {
Image *src_bitmap;
Image *src_bitmap @c_ptr;
Rect src_area;
Brush brush;
uint8 rop3;
@ -739,7 +744,7 @@ channel DisplayChannel : BaseChannel {
message {
DisplayBase base;
struct Transparent {
Image *src_bitmap;
Image *src_bitmap @c_ptr;
Rect src_area;
uint32 src_color;
uint32 true_color;
@ -751,7 +756,7 @@ channel DisplayChannel : BaseChannel {
struct AlphaBlnd {
alpha_flags alpha_flags;
uint8 alpha;
Image *src_bitmap;
Image *src_bitmap @c_ptr;
Rect src_area;
} data;
} draw_alpha_blend;
@ -875,7 +880,7 @@ struct CursorHeader {
struct Cursor {
cursor_flags flags;
CursorHeader header;
uint8 data[] @end @as_ptr(data_size);
uint8 data[] @as_ptr(data_size);
};
channel CursorChannel : BaseChannel {
@ -929,13 +934,13 @@ channel PlaybackChannel : BaseChannel {
server:
message {
uint32 time;
uint8 data[] @end @as_ptr(data_size);
uint8 data[] @as_ptr(data_size);
} @ctype(SpiceMsgPlaybackPacket) data = 101;
message {
uint32 time;
audio_data_mode mode;
uint8 data[] @end @as_ptr(data_size);
uint8 data[] @as_ptr(data_size);
} mode;
message {
@ -960,13 +965,13 @@ channel RecordChannel : BaseChannel {
client:
message {
uint32 time;
uint8 data[] @end @nomarshal @as_ptr(data_size);
uint8 data[] @nomarshal @as_ptr(data_size);
} @ctype(SpiceMsgcRecordPacket) data = 101;
message {
uint32 time;
audio_data_mode mode;
uint8 data[] @end @as_ptr(data_size);
uint8 data[] @as_ptr(data_size);
} mode;
message {

View File

@ -111,7 +111,7 @@ channel BaseChannel {
message {
uint32 id;
uint64 timestamp;
uint8 data[] @end @ctype(uint8_t) @as_ptr(data_len);
uint8 data[] @ctype(uint8_t) @as_ptr(data_len);
} ping;
message {
@ -419,16 +419,16 @@ struct BitmapData {
uint32 stride;
switch (flags) {
case PAL_FROM_CACHE:
uint64 palette;
uint64 palette_id;
default:
Palette *palette @outvar(bitmap);
Palette *palette @outvar(bitmap) @c_ptr;
} pal @anon;
uint8 *data[image_size(8, stride, y)] @nocopy; /* pointer to array, not array of pointers as in C */
uint8 *data[image_size(8, stride, y)] @chunk; /* pointer to array, not array of pointers as in C */
} @ctype(SpiceBitmap);
struct BinaryData {
uint32 data_size;
uint8 data[data_size] @end @nomarshal;
uint8 data[data_size] @nomarshal @chunk;
} @ctype(SpiceQUICData);
struct LZPLTData {
@ -436,34 +436,37 @@ struct LZPLTData {
uint32 data_size;
switch (flags) {
case PAL_FROM_CACHE:
uint64 palette;
uint64 palette_id;
default:
Palette *palette @nonnull @outvar(lzplt);
Palette *palette @nonnull @outvar(lzplt) @c_ptr;
} pal @anon;
uint8 data[data_size] @end @nomarshal;
uint8 data[data_size] @nomarshal @chunk;
};
struct Image {
uint64 id;
image_type type;
image_flags flags;
uint32 width;
uint32 height;
struct ImageDescriptor {
uint64 id;
image_type type;
image_flags flags;
uint32 width;
uint32 height;
} descriptor;
switch (type) {
switch (descriptor.type) {
case BITMAP:
BitmapData bitmap_data @ctype(SpiceBitmap);
BitmapData bitmap;
case QUIC:
BinaryData quic;
case LZ_RGB:
case GLZ_RGB:
BinaryData binary_data @ctype(SpiceQUICData);
BinaryData lz_rgb;
case LZ_PLT:
LZPLTData lzplt_data @ctype(SpiceLZPLTData);
} u @end;
} @ctype(SpiceImageDescriptor);
LZPLTData lz_plt;
} u;
};
struct Pattern {
Image *pat @nonnull;
Image *pat @nonnull @c_ptr;
Point pos;
};
@ -480,7 +483,7 @@ struct Brush {
struct QMask {
mask_flags flags;
Point pos;
Image *bitmap;
Image *bitmap @c_ptr;
};
struct LineAttr {
@ -608,7 +611,7 @@ channel DisplayChannel : BaseChannel {
message {
DisplayBase base;
struct Opaque {
Image *src_bitmap;
Image *src_bitmap @c_ptr;
Rect src_area;
Brush brush;
ropd rop_descriptor;
@ -620,7 +623,7 @@ channel DisplayChannel : BaseChannel {
message {
DisplayBase base;
struct Copy {
Image *src_bitmap;
Image *src_bitmap @c_ptr;
Rect src_area;
ropd rop_descriptor;
image_scale_mode scale_mode;
@ -631,7 +634,7 @@ channel DisplayChannel : BaseChannel {
message {
DisplayBase base;
struct Blend {
Image *src_bitmap;
Image *src_bitmap @c_ptr;
Rect src_area;
ropd rop_descriptor;
image_scale_mode scale_mode;
@ -663,7 +666,7 @@ channel DisplayChannel : BaseChannel {
message {
DisplayBase base;
struct Rop3 {
Image *src_bitmap;
Image *src_bitmap @c_ptr;
Rect src_area;
Brush brush;
uint8 rop3;
@ -698,7 +701,7 @@ channel DisplayChannel : BaseChannel {
message {
DisplayBase base;
struct Transparent {
Image *src_bitmap;
Image *src_bitmap @c_ptr;
Rect src_area;
uint32 src_color;
uint32 true_color;
@ -710,7 +713,7 @@ channel DisplayChannel : BaseChannel {
struct AlphaBlnd {
int8 alpha_flags @virtual(0);
uint8 alpha;
Image *src_bitmap;
Image *src_bitmap @c_ptr;
Rect src_area;
} data;
} draw_alpha_blend;
@ -822,7 +825,7 @@ struct CursorHeader {
struct Cursor {
cursor_flags flags;
CursorHeader header;
uint8 data[] @end @as_ptr(data_size);
uint8 data[] @as_ptr(data_size);
};
channel CursorChannel : BaseChannel {
@ -876,13 +879,13 @@ channel PlaybackChannel : BaseChannel {
server:
message {
uint32 time;
uint8 data[] @end @as_ptr(data_size);
uint8 data[] @as_ptr(data_size);
} @ctype(SpiceMsgPlaybackPacket) data = 101;
message {
uint32 time;
audio_data_mode mode;
uint8 data[] @end @as_ptr(data_size);
uint8 data[] @as_ptr(data_size);
} mode;
message {
@ -907,13 +910,13 @@ channel RecordChannel : BaseChannel {
client:
message {
uint32 time;
uint8 data[] @end @nomarshal @as_ptr(data_size);
uint8 data[] @nomarshal @as_ptr(data_size);
} @ctype(SpiceMsgcRecordPacket) data = 101;
message {
uint32 time;
audio_data_mode mode;
uint8 data[] @end @as_ptr(data_size);
uint8 data[] @as_ptr(data_size);
} mode;
message {