src/lib/MSPUBBlockID.h | 1 + src/lib/MSPUBCollector.cpp | 16 +++++++++++++++- src/lib/MSPUBCollector.h | 1 + src/lib/MSPUBParser.cpp | 5 +++++ src/lib/ShapeInfo.h | 9 ++++++++- 5 files changed, 30 insertions(+), 2 deletions(-)
New commits: commit a51d131b9196afd68e44df43b75e56fb59d43450 Author: Brennan Vincent <brennan.vinc...@gmail.com> Date: Fri Feb 1 06:22:26 2013 -0700 pub2k2+ implement images cropped to shapes. diff --git a/src/lib/MSPUBBlockID.h b/src/lib/MSPUBBlockID.h index 9ea0f5e..5a42d72 100644 --- a/src/lib/MSPUBBlockID.h +++ b/src/lib/MSPUBBlockID.h @@ -42,6 +42,7 @@ enum MSPUBBlockID // Don't be alarmed by multiple elements with the same value; CHUNK_TYPE = 0x2, CHUNK_OFFSET = 0x4, CHUNK_PARENT_SEQNUM = 0x5, + SHAPE_CROP = 0xb7, SHAPE_WIDTH = 0xaa, SHAPE_HEIGHT = 0xab, SHAPE_DONT_STRETCH_BA = 0x07, diff --git a/src/lib/MSPUBCollector.cpp b/src/lib/MSPUBCollector.cpp index 5653df8..ad3006a 100644 --- a/src/lib/MSPUBCollector.cpp +++ b/src/lib/MSPUBCollector.cpp @@ -412,7 +412,16 @@ boost::function<void(void)> libmspub::MSPUBCollector::paintShape(const ShapeInfo const Coordinate &coord = info.m_coordinates.get_value_or(Coordinate()); BorderPosition borderPosition = hasBorderArt ? INSIDE_SHAPE : info.m_borderPosition.get_value_or(HALF_INSIDE_SHAPE); - ShapeType type = info.m_type.get_value_or(RECTANGLE); + ShapeType type; + if (info.m_cropType.is_initialized()) + { + type = info.m_cropType.get(); + } + else + { + type = info.m_type.get_value_or(RECTANGLE); + } + if (hasFill) { double x, y, height, width; @@ -1495,4 +1504,9 @@ void libmspub::MSPUBCollector::setMasterPage(unsigned seqNum, unsigned masterPag m_masterPagesByPageSeqNum[seqNum] = masterPageSeqNum; } +void libmspub::MSPUBCollector::setShapeCropType(unsigned seqNum, ShapeType cropType) +{ + m_shapeInfosBySeqNum[seqNum].m_cropType = cropType; +} + /* vim:set shiftwidth=2 softtabstop=2 expandtab: */ diff --git a/src/lib/MSPUBCollector.h b/src/lib/MSPUBCollector.h index 03e7dc5..719eb1e 100644 --- a/src/lib/MSPUBCollector.h +++ b/src/lib/MSPUBCollector.h @@ -89,6 +89,7 @@ public: void setNextPage(unsigned seqNum); void setShapeType(unsigned seqNum, ShapeType type); + void setShapeCropType(unsigned seqNum, ShapeType cropType); void setShapePictureRecolor(unsigned seqNum, const ColorReference &recolor); void setShapeTableInfo(unsigned seqNum, const TableInfo &ti); void setShapeBorderImageId(unsigned seqNum, unsigned borderImageId); diff --git a/src/lib/MSPUBParser.cpp b/src/lib/MSPUBParser.cpp index 8ccb000..4beead4 100644 --- a/src/lib/MSPUBParser.cpp +++ b/src/lib/MSPUBParser.cpp @@ -791,6 +791,11 @@ bool libmspub::MSPUBParser::parseShape(WPXInputStream *input, m_collector->setShapeVerticalTextAlign(chunk.seqNum, static_cast<VerticalAlign>(info.data)); } + else if (info.id == SHAPE_CROP) + { + m_collector->setShapeCropType(chunk.seqNum, + static_cast<ShapeType>(info.data)); + } } if (shouldStretchBorderArt) { diff --git a/src/lib/ShapeInfo.h b/src/lib/ShapeInfo.h index 70d00c4..a0d193a 100644 --- a/src/lib/ShapeInfo.h +++ b/src/lib/ShapeInfo.h @@ -52,6 +52,7 @@ void noop(const CustomShape *); struct ShapeInfo { boost::optional<ShapeType> m_type; + boost::optional<ShapeType> m_cropType; boost::optional<unsigned> m_imgIndex; boost::optional<unsigned> m_borderImgIndex; boost::optional<Coordinate> m_coordinates; @@ -78,7 +79,7 @@ struct ShapeInfo boost::optional<VerticalAlign> m_verticalAlign; boost::optional<ColorReference> m_pictureRecolor; boost::optional<Shadow> m_shadow; - ShapeInfo() : m_type(), m_imgIndex(), m_borderImgIndex(), + ShapeInfo() : m_type(), m_cropType(), m_imgIndex(), m_borderImgIndex(), m_coordinates(), m_lines(), m_pageSeqNum(), m_textId(), m_adjustValuesByIndex(), m_adjustValues(), m_rotation(), m_flips(), m_margins(), m_borderPosition(), @@ -95,6 +96,12 @@ struct ShapeInfo { return getFromDynamicCustomShape(m_customShape.get()); } + if (m_cropType.is_initialized()) + { + return boost::shared_ptr<const CustomShape>( + libmspub::getCustomShape(m_cropType.get()), + boost::function<void (const CustomShape *)>(noop)); + } return boost::shared_ptr<const CustomShape>( libmspub::getCustomShape(m_type.get_value_or(RECTANGLE)), boost::function<void (const CustomShape *)>(noop)); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits