/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2001 - 2013 Object Refinery Ltd, Pentaho Corporation and Contributors.. All rights reserved.
*/
package org.pentaho.reporting.libraries.pixie.wmf.records;
import org.pentaho.reporting.libraries.pixie.wmf.MfRecord;
import org.pentaho.reporting.libraries.pixie.wmf.MfType;
import org.pentaho.reporting.libraries.pixie.wmf.WmfFile;
import java.awt.*;
/**
* Currently i have no clue, how this is implemented. <p/> From The WINE-Sources: <p/>
* <pre>
* The layout of the record looks something like this:
* <p/>
* rdParm meaning
* 0 Always 0?
* 1 Always 6?
* 2 Looks like a handle? - not constant
* 3 0 or 1 ??
* 4 Total number of bytes
* 5 No. of separate bands = n [see below]
* 6 Largest number of x co-ords in a band
* 7-10 Bounding box x1 y1 x2 y2
* 11-... n bands
* <p/>
* Regions are divided into bands that are uniform in the
* y-direction. Each band consists of pairs of on/off x-coords and is
* written as
* m y0 y1 x1 x2 x3 ... xm m
* into successive rdParm[]s.
* <p/>
* This is probably just a dump of the internal RGNOBJ?
* </pre>
* <p/>
* <pre>
* static BOOL MF_Play_MetaCreateRegion( METARECORD *mr, HRGN hrgn )
* {
* WORD band, pair;
* WORD *start, *end;
* INT16 y0, y1;
* HRGN hrgn2 = CreateRectRgn( 0, 0, 0, 0 );
* <p/>
* for(band = 0, start = &(mr->rdParm[11]);
* band < mr->rdParm[5];
* band++, start = end + 1)
* {
* if(*start / 2 != (*start + 1) / 2)
* {
* WARN("Delimiter not even.\n");
* DeleteObject( hrgn2 );
* return FALSE;
* }
* <p/>
* end = start + *start + 3;
* if(end > (WORD *)mr + mr->rdSize)
* {
* WARN("End points outside record.\n");
* DeleteObject( hrgn2 );
* return FALSE;
* }
* <p/>
* if(*start != *end)
* {
* WARN("Mismatched delimiters.\n");
* DeleteObject( hrgn2 );
* return FALSE;
* }
* <p/>
* y0 = *(INT16 *)(start + 1);
* y1 = *(INT16 *)(start + 2);
* for(pair = 0; pair < *start / 2; pair++)
* {
* SetRectRgn( hrgn2, *(INT16 *)(start + 3 + 2*pair), y0,
* (INT16 *)(start + 4 + 2*pair), y1 );
* CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
* }
* }
* DeleteObject( hrgn2 );
* return TRUE;
* }
* </pre>
* </p>
*/
public class MfCmdCreateRegion extends MfCmd {
private int regionX;
private int regionY;
private int regionWidth;
private int regionHeight;
private Rectangle[] rects;
public MfCmdCreateRegion() {
}
public void setRecord( final MfRecord record ) {
// System.out.println("Create Region is not implemented.");
}
/**
* Writer function
*/
public MfRecord getRecord() {
final MfRecord record = new MfRecord( 0 );
record.setParam( 0, 0 );
record.setParam( 1, 6 );
record.setParam( 2, 0x1234 );
record.setParam( 3, 0 );
record.setParam( 4, 0 ); // Length
record.setParam( 5, 0 ); // Bands
record.setParam( 6, 0 ); // Max-Bands
record.setParam( 7, regionX );
record.setParam( 8, regionY );
record.setParam( 9, regionX + regionWidth );
record.setParam( 10, regionY + regionHeight );
// some more data ... a array of rectangles (16bit x 4)
// which makes up the defined region
// the rectangles are sorted and seem to be packed in some way
// todo: Not complete ..
return record;
}
public String toString() {
final StringBuffer b = new StringBuffer();
b.append( "[CREATE_REGION] " );
b.append( " no internals known (see WINE for details)" );
return b.toString();
}
public int getFunction() {
return MfType.CREATE_REGION;
}
public void replay( final WmfFile file ) {
}
public MfCmd getInstance() {
return new MfCmdCreateRegion();
}
protected void scaleXChanged() {
}
protected void scaleYChanged() {
}
public int getRegionX() {
return regionX;
}
public void setRegionX( final int regionX ) {
this.regionX = regionX;
}
public int getRegionY() {
return regionY;
}
public void setRegionY( final int regionY ) {
this.regionY = regionY;
}
public int getRegionWidth() {
return regionWidth;
}
public void setRegionWidth( final int regionWidth ) {
this.regionWidth = regionWidth;
}
public int getRegionHeight() {
return regionHeight;
}
public void setRegionHeight( final int regionHeight ) {
this.regionHeight = regionHeight;
}
public Rectangle[] getRects() {
return rects;
}
public void setRects( final Rectangle[] rects ) {
this.rects = rects;
}
}