diff --git a/headers/private/interface/PictureDataWriter.h b/headers/private/interface/PictureDataWriter.h index 9015c05f7e..4af9187f24 100644 --- a/headers/private/interface/PictureDataWriter.h +++ b/headers/private/interface/PictureDataWriter.h @@ -1,9 +1,9 @@ /* - * Copyright 2006-2007, Haiku Inc. + * Copyright 2006-2007 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. * * Authors: - * Stefano Ceccherini (burton666@libero.it) + * Stefano Ceccherini, burton666@libero.it */ #ifndef _PICTURE_DATA_WRITER_H #define _PICTURE_DATA_WRITER_H @@ -16,74 +16,93 @@ #include + class BPositionIO; class BRegion; - class PictureDataWriter { public: - PictureDataWriter(); - PictureDataWriter(BPositionIO *data); - virtual ~PictureDataWriter(); + PictureDataWriter(); + PictureDataWriter(BPositionIO* data); + virtual ~PictureDataWriter(); - status_t SetTo(BPositionIO *data); + status_t SetTo(BPositionIO* data); - status_t WriteSetHighColor(const rgb_color &color); - status_t WriteSetLowColor(const rgb_color &color); - status_t WriteSetOrigin(const BPoint &point); - status_t WriteSetDrawingMode(const drawing_mode &mode); - status_t WriteSetPenLocation(const BPoint &point); - status_t WriteSetPenSize(const float &penSize); - status_t WriteSetLineMode(const cap_mode &cap, const join_mode &join, const float &miterLimit); - status_t WriteSetScale(const float &scale); - status_t WriteSetTransform(BAffineTransform transform); - status_t WriteSetPattern(const pattern &pat); - status_t WriteSetClipping(const BRegion ®ion); - status_t WriteClearClipping(); + status_t WriteSetHighColor(const rgb_color& color); + status_t WriteSetLowColor(const rgb_color& color); + status_t WriteSetOrigin(const BPoint& point); + status_t WriteSetDrawingMode(const drawing_mode& mode); + status_t WriteSetPenLocation(const BPoint& point); + status_t WriteSetPenSize(const float& penSize); + status_t WriteSetLineMode(const cap_mode& cap, + const join_mode& join, + const float& miterLimit); + status_t WriteSetScale(const float& scale); + status_t WriteSetTransform(BAffineTransform transform); + status_t WriteSetPattern(const ::pattern& pattern); + status_t WriteSetClipping(const BRegion& region); + status_t WriteClearClipping(); - status_t WritePushState(); - status_t WritePopState(); - - status_t WriteSetFontFamily(const font_family family); - status_t WriteSetFontStyle(const font_style style); - status_t WriteSetFontSpacing(const int32 &spacing); - status_t WriteSetFontSize(const float &size); - status_t WriteSetFontRotation(const float &rotation); - status_t WriteSetFontEncoding(const int32 &encoding); - status_t WriteSetFontFlags(const int32 &flags); - status_t WriteSetFontShear(const float &shear); - status_t WriteSetFontFace(const int32 &face); + status_t WritePushState(); + status_t WritePopState(); - status_t WriteStrokeLine(const BPoint &start, const BPoint &end); - status_t WriteInvertRect(const BRect &rect); - status_t WriteDrawRect(const BRect &rect, const bool &fill); - status_t WriteDrawRoundRect(const BRect &rect, const BPoint &radius, const bool &fill); - status_t WriteDrawEllipse(const BRect &rect, const bool &fill); - status_t WriteDrawArc(const BPoint ¢er, const BPoint &radius, - const float &startTheta, const float &arcTheta, const bool &fill); - status_t WriteDrawPolygon(const int32 &numPoints, BPoint *points, - const bool &isClosed, const bool &fill); - status_t WriteDrawBezier(const BPoint points[4], const bool &fill); - status_t WriteDrawString(const BPoint &where, const char *string, - const int32 &length, const escapement_delta &delta); - status_t WriteDrawShape(const int32 &opCount, const void *opList, - const int32 &ptCount, const void *ptList, const bool &fill); - status_t WriteDrawBitmap(const BRect &srcRect, const BRect &dstRect, const int32 &width, const int32 &height, - const int32 &bytesPerRow, const int32 &colorSpace, const int32 &flags, - const void *data, const int32 &length); + status_t WriteSetFontFamily(const font_family family); + status_t WriteSetFontStyle(const font_style style); + status_t WriteSetFontSpacing(const int32& spacing); + status_t WriteSetFontSize(const float& size); + status_t WriteSetFontRotation(const float& rotation); + status_t WriteSetFontEncoding(const int32& encoding); + status_t WriteSetFontFlags(const int32& flags); + status_t WriteSetFontShear(const float& shear); + status_t WriteSetFontFace(const int32& face); - status_t WriteDrawPicture(const BPoint &where, const int32 &token); + status_t WriteStrokeLine(const BPoint& start, + const BPoint& end); + status_t WriteInvertRect(const BRect& rect); + status_t WriteDrawRect(const BRect& rect, + const bool& fill); + status_t WriteDrawRoundRect(const BRect& rect, + const BPoint& radius, const bool& fill); + status_t WriteDrawEllipse(const BRect& rect, + const bool& fill); + status_t WriteDrawArc(const BPoint& center, + const BPoint& radius, + const float& startTheta, + const float& arcTheta, const bool& fill); + status_t WriteDrawPolygon(const int32& numPoints, + BPoint* points, const bool& isClosed, + const bool& fill); + status_t WriteDrawBezier(const BPoint points[4], + const bool& fill); + status_t WriteDrawString(const BPoint& where, + const char* string, const int32& length, + const escapement_delta& delta); + status_t WriteDrawShape(const int32& opCount, + const void* opList, const int32& ptCount, + const void* ptList, const bool& fill); + status_t WriteDrawBitmap(const BRect& srcRect, + const BRect& dstRect, const int32& width, + const int32& height, + const int32& bytesPerRow, + const int32& colorSpace, + const int32& flags, + const void* data, const int32& length); + + status_t WriteDrawPicture(const BPoint& where, + const int32& token); protected: // throw a status_t on error - void BeginOp(const int16 &op); - void EndOp(); - void WriteData(const void *data, size_t size); - template void Write(const T &data) { WriteData(&data, sizeof(data)); } - + void BeginOp(const int16& op); + void EndOp(); + void WriteData(const void* data, size_t size); + template void Write(const T& data) + { WriteData(&data, sizeof(data)); } + private: - BPositionIO *fData; - std::stack fStack; + BPositionIO* fData; + std::stack fStack; }; + #endif // _PICTURE_DATA_WRITER_H diff --git a/src/kits/interface/PictureDataWriter.cpp b/src/kits/interface/PictureDataWriter.cpp index 21b64106b2..3f9f5c911c 100644 --- a/src/kits/interface/PictureDataWriter.cpp +++ b/src/kits/interface/PictureDataWriter.cpp @@ -1,9 +1,9 @@ /* - * Copyright 2006-2009, Haiku Inc. + * Copyright 2006-2009 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. * * Authors: - * Stefano Ceccherini (stefano.ceccherini@gmail.com) + * Stefano Ceccherini, stefano.ceccherini@gmail.com */ #include @@ -20,6 +20,7 @@ #define THROW_ERROR(error) throw (status_t)(error) + // TODO: Review writing of strings. AFAIK in the picture data format // They are not supposed to be NULL terminated // (at least, it's not mandatory) so we should write their size too. @@ -30,7 +31,7 @@ PictureDataWriter::PictureDataWriter() } -PictureDataWriter::PictureDataWriter(BPositionIO *data) +PictureDataWriter::PictureDataWriter(BPositionIO* data) : fData(data) { @@ -43,92 +44,99 @@ PictureDataWriter::~PictureDataWriter() status_t -PictureDataWriter::SetTo(BPositionIO *data) +PictureDataWriter::SetTo(BPositionIO* data) { if (data == NULL) return B_BAD_VALUE; + fData = data; + return B_OK; } status_t -PictureDataWriter::WriteSetOrigin(const BPoint &point) +PictureDataWriter::WriteSetOrigin(const BPoint& point) { try { BeginOp(B_PIC_SET_ORIGIN); Write(point); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteInvertRect(const BRect &rect) +PictureDataWriter::WriteInvertRect(const BRect& rect) { try { WriteSetDrawingMode(B_OP_INVERT); - + BeginOp(B_PIC_FILL_RECT); Write(rect); EndOp(); WriteSetDrawingMode(B_OP_COPY); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteSetDrawingMode(const drawing_mode &mode) +PictureDataWriter::WriteSetDrawingMode(const drawing_mode& mode) { try { BeginOp(B_PIC_SET_DRAWING_MODE); Write((int16)mode); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteSetPenLocation(const BPoint &point) +PictureDataWriter::WriteSetPenLocation(const BPoint& point) { try { BeginOp(B_PIC_SET_PEN_LOCATION); Write(point); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteSetPenSize(const float &penSize) +PictureDataWriter::WriteSetPenSize(const float& penSize) { try { BeginOp(B_PIC_SET_PEN_SIZE); Write(penSize); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteSetLineMode(const cap_mode &cap, - const join_mode &join, const float &miterLimit) +PictureDataWriter::WriteSetLineMode(const cap_mode& cap, const join_mode& join, + const float& miterLimit) { try { BeginOp(B_PIC_SET_LINE_MODE); @@ -136,23 +144,25 @@ PictureDataWriter::WriteSetLineMode(const cap_mode &cap, Write((int16)join); Write(miterLimit); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteSetScale(const float &scale) +PictureDataWriter::WriteSetScale(const float& scale) { try { BeginOp(B_PIC_SET_SCALE); Write(scale); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } @@ -164,43 +174,45 @@ PictureDataWriter::WriteSetTransform(BAffineTransform transform) BeginOp(B_PIC_SET_TRANSFORM); Write(transform); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteSetPattern(const pattern &pat) +PictureDataWriter::WriteSetPattern(const ::pattern& pattern) { try { BeginOp(B_PIC_SET_STIPLE_PATTERN); - Write(pat); + Write< ::pattern>(pattern); EndOp(); - } catch (status_t &status) { + } catch (status_t& status) { return status; } + return B_OK; } status_t -PictureDataWriter::WriteSetClipping(const BRegion ®ion) +PictureDataWriter::WriteSetClipping(const BRegion& region) { // TODO: I don't know if it's compatible with R5's BPicture version try { const int32 numRects = region.CountRects(); - if (numRects > 0 && region.Frame().IsValid()) { + if (numRects > 0 && region.Frame().IsValid()) { BeginOp(B_PIC_SET_CLIPPING_RECTS); - Write(numRects); - for (int32 i = 0; i < numRects; i++) { - Write(region.RectAt(i)); - } + Write(numRects); + for (int32 i = 0; i < numRects; i++) + Write(region.RectAt(i)); + EndOp(); } else WriteClearClipping(); - } catch (status_t &status) { + } catch (status_t& status) { return status; } @@ -214,90 +226,94 @@ PictureDataWriter::WriteClearClipping() try { BeginOp(B_PIC_CLEAR_CLIPPING_RECTS); EndOp(); - } catch (status_t &status) { + } catch (status_t& status) { return status; } + return B_OK; } status_t -PictureDataWriter::WriteSetHighColor(const rgb_color &color) +PictureDataWriter::WriteSetHighColor(const rgb_color& color) { try { BeginOp(B_PIC_SET_FORE_COLOR); Write(color); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteSetLowColor(const rgb_color &color) +PictureDataWriter::WriteSetLowColor(const rgb_color& color) { try { BeginOp(B_PIC_SET_BACK_COLOR); Write(color); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteDrawRect(const BRect &rect, - const bool &fill) +PictureDataWriter::WriteDrawRect(const BRect& rect, const bool& fill) { try { BeginOp(fill ? B_PIC_FILL_RECT : B_PIC_STROKE_RECT); - Write(rect); + Write(rect); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteDrawRoundRect(const BRect &rect, - const BPoint &radius, const bool &fill) +PictureDataWriter::WriteDrawRoundRect(const BRect& rect, const BPoint& radius, + const bool& fill) { try { BeginOp(fill ? B_PIC_FILL_ROUND_RECT : B_PIC_STROKE_ROUND_RECT); Write(rect); Write(radius); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteDrawEllipse(const BRect &rect, const bool &fill) +PictureDataWriter::WriteDrawEllipse(const BRect& rect, const bool& fill) { try { BeginOp(fill ? B_PIC_FILL_ELLIPSE : B_PIC_STROKE_ELLIPSE); - Write(rect); + Write(rect); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteDrawArc(const BPoint ¢er, - const BPoint &radius, const float &startTheta, - const float &arcTheta, const bool &fill) +PictureDataWriter::WriteDrawArc(const BPoint& center, const BPoint& radius, + const float& startTheta, const float& arcTheta, const bool& fill) { try { BeginOp(fill ? B_PIC_FILL_ARC : B_PIC_STROKE_ARC); @@ -306,74 +322,78 @@ PictureDataWriter::WriteDrawArc(const BPoint ¢er, Write(startTheta); Write(arcTheta); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteDrawPolygon(const int32 &numPoints, - BPoint *points, const bool &isClosed, const bool &fill) +PictureDataWriter::WriteDrawPolygon(const int32& numPoints, BPoint* points, + const bool& isClosed, const bool& fill) { try { BeginOp(fill ? B_PIC_FILL_POLYGON : B_PIC_STROKE_POLYGON); Write(numPoints); for (int32 i = 0; i < numPoints; i++) Write(points[i]); + if (!fill) Write((uint8)isClosed); + EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteDrawBezier(const BPoint points[4], - const bool &fill) +PictureDataWriter::WriteDrawBezier(const BPoint points[4], const bool& fill) { try { BeginOp(fill ? B_PIC_FILL_BEZIER : B_PIC_STROKE_BEZIER); for (int32 i = 0; i < 4; i++) Write(points[i]); + EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteStrokeLine(const BPoint &start, - const BPoint &end) +PictureDataWriter::WriteStrokeLine(const BPoint& start, const BPoint& end) { try { BeginOp(B_PIC_STROKE_LINE); Write(start); Write(end); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteDrawString(const BPoint &where, - const char *string, const int32 &length, - const escapement_delta &escapement) +PictureDataWriter::WriteDrawString(const BPoint& where, const char* string, + const int32& length, const escapement_delta& escapement) { try { BeginOp(B_PIC_SET_PEN_LOCATION); Write(where); EndOp(); - + BeginOp(B_PIC_DRAW_STRING); Write(escapement.space); Write(escapement.nonspace); @@ -382,8 +402,8 @@ PictureDataWriter::WriteDrawString(const BPoint &where, WriteData(string, length); Write(0); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } return B_OK; @@ -391,9 +411,8 @@ PictureDataWriter::WriteDrawString(const BPoint &where, status_t -PictureDataWriter::WriteDrawShape(const int32 &opCount, - const void *opList, const int32 &ptCount, const void *ptList, - const bool &fill) +PictureDataWriter::WriteDrawShape(const int32& opCount, const void* opList, + const int32& ptCount, const void* ptList, const bool& fill) { try { BeginOp(fill ? B_PIC_FILL_SHAPE : B_PIC_STROKE_SHAPE); @@ -402,23 +421,23 @@ PictureDataWriter::WriteDrawShape(const int32 &opCount, WriteData(opList, opCount * sizeof(uint32)); WriteData(ptList, ptCount * sizeof(BPoint)); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } - + return B_OK; } status_t -PictureDataWriter::WriteDrawBitmap(const BRect &srcRect, - const BRect &dstRect, const int32 &width, const int32 &height, - const int32 &bytesPerRow, const int32 &colorSpace, - const int32 &flags, const void *data, const int32 &length) +PictureDataWriter::WriteDrawBitmap(const BRect& srcRect, const BRect& dstRect, + const int32& width, const int32& height, const int32& bytesPerRow, + const int32& colorSpace, const int32& flags, const void* data, + const int32& length) { if (length != height * bytesPerRow) debugger("PictureDataWriter::WriteDrawBitmap: invalid length"); - try { + try { BeginOp(B_PIC_DRAW_PIXELS); Write(srcRect); Write(dstRect); @@ -429,16 +448,16 @@ PictureDataWriter::WriteDrawBitmap(const BRect &srcRect, Write(flags); WriteData(data, length); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteDrawPicture(const BPoint &where, - const int32 &token) +PictureDataWriter::WriteDrawPicture(const BPoint& where, const int32& token) { // TODO: I'm not sure about this function. I think we need // to attach the picture data too. @@ -447,11 +466,12 @@ PictureDataWriter::WriteDrawPicture(const BPoint &where, try { BeginOp(B_PIC_DRAW_PICTURE); Write(where); - Write(token); + Write(token); EndOp(); - } catch (status_t &status) { + } catch (status_t& status) { return status; } + return B_OK; } @@ -464,9 +484,10 @@ PictureDataWriter::WriteSetFontFamily(const font_family family) WriteData(family, strlen(family)); Write(0); EndOp(); - } catch (status_t &status) { + } catch (status_t& status) { return status; - } + } + return B_OK; } @@ -479,107 +500,115 @@ PictureDataWriter::WriteSetFontStyle(const font_style style) WriteData(style, strlen(style)); Write(0); EndOp(); - } catch (status_t &status) { + } catch (status_t& status) { return status; } + return B_OK; } status_t -PictureDataWriter::WriteSetFontSpacing(const int32 &spacing) +PictureDataWriter::WriteSetFontSpacing(const int32& spacing) { try { BeginOp(B_PIC_SET_FONT_SPACING); Write(spacing); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteSetFontSize(const float &size) +PictureDataWriter::WriteSetFontSize(const float& size) { try { BeginOp(B_PIC_SET_FONT_SIZE); Write(size); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteSetFontRotation(const float &rotation) +PictureDataWriter::WriteSetFontRotation(const float& rotation) { try { BeginOp(B_PIC_SET_FONT_ROTATE); Write(rotation); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteSetFontEncoding(const int32 &encoding) +PictureDataWriter::WriteSetFontEncoding(const int32& encoding) { try { BeginOp(B_PIC_SET_FONT_ENCODING); Write(encoding); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteSetFontFlags(const int32 &flags) +PictureDataWriter::WriteSetFontFlags(const int32& flags) { try { BeginOp(B_PIC_SET_FONT_FLAGS); Write(flags); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteSetFontShear(const float &shear) +PictureDataWriter::WriteSetFontShear(const float& shear) { try { BeginOp(B_PIC_SET_FONT_SHEAR); Write(shear); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } status_t -PictureDataWriter::WriteSetFontFace(const int32 &face) +PictureDataWriter::WriteSetFontFace(const int32& face) { try { BeginOp(B_PIC_SET_FONT_FACE); Write(face); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } @@ -590,9 +619,10 @@ PictureDataWriter::WritePushState() try { BeginOp(B_PIC_PUSH_STATE); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } @@ -603,23 +633,24 @@ PictureDataWriter::WritePopState() try { BeginOp(B_PIC_POP_STATE); EndOp(); - } catch (status_t &status) { - return status; + } catch (status_t& status) { + return status; } + return B_OK; } // private void -PictureDataWriter::BeginOp(const int16 &op) +PictureDataWriter::BeginOp(const int16& op) { if (fData == NULL) THROW_ERROR(B_NO_INIT); fStack.push(fData->Position()); fData->Write(&op, sizeof(op)); - + // Init the size of the opcode block to 0 int32 size = 0; fData->Write(&size, sizeof(size)); @@ -635,7 +666,7 @@ PictureDataWriter::EndOp() off_t curPos = fData->Position(); off_t stackPos = fStack.top(); fStack.pop(); - + // The size of the op is calculated like this: // current position on the stream minus the position on the stack, // minus the space occupied by the op code itself (int16) @@ -651,11 +682,12 @@ PictureDataWriter::EndOp() void -PictureDataWriter::WriteData(const void *data, size_t size) +PictureDataWriter::WriteData(const void* data, size_t size) { ssize_t result = fData->Write(data, size); if (result < 0) THROW_ERROR(result); + if ((size_t)result != size) - THROW_ERROR(B_IO_ERROR); + THROW_ERROR(B_IO_ERROR); }