Tekst onder Kopieermachine.dwf

svn path=/Slnkdwf/trunk/; revision=12543
This commit is contained in:
Jos Groot Lipman
2012-06-01 17:38:36 +00:00
parent b25f840f00
commit e941faeb78

View File

@@ -7,7 +7,7 @@
#include <math.h>
// Bij EPlotsection (external DWF)
CSLNKSymbolDefinition::CSLNKSymbolDefinition(CComQIPtr<IEPlotSection> EPlotSection)
CSLNKSymbolDefinition::CSLNKSymbolDefinition(CComQIPtr<IEPlotSection> EPlotSection)
{
m_iEPlotSection = EPlotSection;
@@ -23,7 +23,7 @@ CSLNKSymbolDefinition::CSLNKSymbolDefinition(CComQIPtr<IEPlotSection> EPlotSecti
};
// Bij Contour list (builtin symbol)
CSLNKSymbolDefinition::CSLNKSymbolDefinition(int count, WT_Logical_Point const *points)
CSLNKSymbolDefinition::CSLNKSymbolDefinition(int count, WT_Logical_Point const *points)
{
m_BuiltIn = true;
m_wtFile.set_eplotsection(NULL);
@@ -55,7 +55,7 @@ CSLNKSymbolDefinition::CSLNKSymbolDefinition(CString const filepath, double cons
//myDoTRACE("\nCreates symbol bitmap (%d,%d)->PNG %d byte (W2D was %d)", pixeldx,pixeldy,m_size, epli->size());
m_AsBitmap = new
m_AsBitmap = new
WT_PNG_Group4_Image(
(int)img.GetHeight(), /*rows*/
(int)img.GetWidth(), /*cols*/
@@ -64,7 +64,7 @@ CSLNKSymbolDefinition::CSLNKSymbolDefinition(CString const filepath, double cons
NULL,
m_size,
(WT_Byte*)m_Buffer,
WT_Logical_Point(0,0),
WT_Logical_Point(0,0),
WT_Logical_Point(img.GetWidth(),img.GetHeight()),
WD_False); // Geen copy, we verwijderen zelf expliciet
@@ -92,7 +92,7 @@ CSLNKSymbolDefinition::~CSLNKSymbolDefinition(void)
// http://geometryalgorithms.com/Archive/algorithm_0107/algorithm_0107.htm
// (v2: bounding convex hull waarschijnlijk overkill)
#include <assert.h>
WT_Result CSLNKSymbolDefinition::calculateBoundary (WT_Polygon &BoundingContour, WT_Transform *tm/*=null*/)
WT_Result CSLNKSymbolDefinition::calculateBoundary (WT_Polygon &BoundingContour, WT_Transform *tm/*=null*/)
{
WT_Result result;
@@ -115,7 +115,7 @@ WT_Result CSLNKSymbolDefinition::calculateBoundary (WT_Polygon &BoundingContour,
// Door de enorm grote dwf-coordinaten lopen we een integer overflow risico tijdens
// onze bepaling van Pmin en Pmax (die min en max van x+y bepalen) en in theorie
// ook van Qmin en Qmax (die over het verschil x-y gaan) hoewel dat in de praktijk rond 0 zal liggen
// Daarom rekenen we systematisch met de helft. Dat moet risico's voorkomen en de afrondfout nemen
// Daarom rekenen we systematisch met de helft. Dat moet risico's voorkomen en de afrondfout nemen
// we voor lief
// Merk op dat de resulterende Octagon kleiner is dan de de bounding box, die zeker binnen de coordinaat
// ruimte valt dus voor het eindresultaat is er geen risico. Alleen oppassen voor tussenresultaten dus
@@ -126,8 +126,8 @@ WT_Result CSLNKSymbolDefinition::calculateBoundary (WT_Polygon &BoundingContour,
Xmin = Ymin = Pmin2 = Qmin2 = INT_MAX;
Xmax = Ymax = Pmax2 = Qmax2 = INT_MIN;
BOOL ViewportDone = FALSE; // We doen alleen de eerste viewport.
// Gaf problemen bij symbolen die vanuit paperspace waren geexporteerd
BOOL ViewportDone = FALSE; // We doen alleen de eerste viewport.
// Gaf problemen bij symbolen die vanuit paperspace waren geexporteerd
// Do the actual reading.
while ((result = m_wtFile.process_next_object()) == WT_Result::Success)
{
@@ -151,7 +151,7 @@ WT_Result CSLNKSymbolDefinition::calculateBoundary (WT_Polygon &BoundingContour,
WT_Viewport *viewport = (WT_Viewport *)m_wtFile.current_object();
WT_Units symbolunits = viewport->viewport_units();
m_dwgScale = symbolunits.application_to_dwf_transform()(0,0); // Symbol's dScale
break;
break;
}
break;
}
@@ -189,8 +189,8 @@ WT_Result CSLNKSymbolDefinition::calculateBoundary (WT_Polygon &BoundingContour,
}
// Voor WT_Pointset gebaseerde objecten kunnen we het ook wel beter
if (obj->object_id() == WT_Object::Polygon_ID ||
obj->object_id() == WT_Object::Polyline_ID ||
if (obj->object_id() == WT_Object::Polygon_ID ||
obj->object_id() == WT_Object::Polyline_ID ||
obj->object_id() == WT_Object::Polytriangle_ID)
{
WT_Point_Set *pts;
@@ -201,7 +201,7 @@ WT_Result CSLNKSymbolDefinition::calculateBoundary (WT_Polygon &BoundingContour,
case WT_Object::Polyline_ID : pts = (WT_Polyline *)m_wtFile.current_object(); break;
case WT_Object::Polytriangle_ID: pts = (WT_Polytriangle *)m_wtFile.current_object(); break;
}
for (int i=0;i<pts->count(); i++)
{
WT_Logical_Point &pt = pts->points()[i];
@@ -235,20 +235,20 @@ WT_Result CSLNKSymbolDefinition::calculateBoundary (WT_Polygon &BoundingContour,
m_wtFile.heuristics().set_apply_transform(false);
m_wtFile.close();
// Rechthoek
// WT_Logical_Point pts1[4] = { WT_Logical_Point(Xmin, Ymin),
// WT_Logical_Point(Xmax, Ymin),
// WT_Logical_Point(Xmax, Ymax),
// WT_Logical_Point(Xmin, Ymax)};
//m_BoundingBox = WT_Logical_Box(Xmin, Ymin, Xmax, Ymax);
// Diamant heeft overflow risico
// WT_Logical_Point pts2[4] = { WT_Logical_Point(Pmin2+Qmin2, Pmin2-Qmin2),
// WT_Logical_Point(Pmin2+Qmax2, Pmin2-Qmax2),
// WT_Logical_Point(Pmax2+Qmax2, Pmax2-Qmax2),
// WT_Logical_Point(Pmax2+Qmin2, Pmax2-Qmin2)};
// Octagon
// Expressievolgorde is telkens belangrijk om overflow te voorkomen
WT_Logical_Point pts3[8] = { WT_Logical_Point(Pmin2-Ymin+Pmin2, Ymin),
@@ -262,7 +262,7 @@ WT_Result CSLNKSymbolDefinition::calculateBoundary (WT_Polygon &BoundingContour,
m_Center = WT_Logical_Point(Xmin/2+Xmax/2,Ymin/2+Ymax/2);
BoundingContour.set(sizeof(pts3)/sizeof(pts3[0]), pts3, true);
return result;
}
@@ -273,7 +273,7 @@ WT_Drawable *CSLNKSymbolDefinition::asBitmap(int pixeldx, int pixeldy, long pape
{
// TODO: Wat als pixeldy != m_AsBitmap->rows()
// Dat dwfdx anders is is minder boeiend, dat verschaalt wel
WT_PNG_Group4_Image *newBitmap = new
WT_PNG_Group4_Image *newBitmap = new
WT_PNG_Group4_Image(
m_AsBitmap->rows(), /*rows*/
m_AsBitmap->columns(), /*cols*/
@@ -327,7 +327,7 @@ WT_Drawable *CSLNKSymbolDefinition::asBitmap(int pixeldx, int pixeldy, long pape
///RGBQUAD back = {0,0,0,0};
img.SetTransIndex(img.GetNearestIndex(back));
// img.SetTransColor(back); // Voor als we zonder pallette werken
BYTE *m_Buffer=NULL;
long m_size;
img.Encode(m_Buffer, m_size, CXIMAGE_FORMAT_PNG);
@@ -337,7 +337,7 @@ WT_Drawable *CSLNKSymbolDefinition::asBitmap(int pixeldx, int pixeldy, long pape
DeleteDC(myDC);
ReleaseDC( NULL, pDC ); //Do not forget!
m_AsBitmap = new
m_AsBitmap = new
WT_PNG_Group4_Image(
pixeldy, /*rows*/
pixeldy, /*cols*/
@@ -371,7 +371,7 @@ WT_Result CSLNKSymbolDefinition::serialize(WT_File & file, WT_Color pColor, BOOL
WD_False).serialize(file);
return WT_Result::Success;
}
if (m_BuiltIn) // Die hebben alleen een bounding contour
return WT_Result::Success;
@@ -380,11 +380,13 @@ WT_Result CSLNKSymbolDefinition::serialize(WT_File & file, WT_Color pColor, BOOL
if (pColorSet)
pColor.serialize(file);
else
WT_Color().serialize(file); // Op de default zetten.
WT_Color().serialize(file); // Op de default zetten.
//TODO: Moet eigenlijk voor alle attributen
file.desired_rendition().line_weight() = WT_Line_Weight(0);
WT_Line_Weight().serialize(file);
file.desired_rendition().font() = WT_Font();
WT_Font().serialize(file);
WT_Result result;
// Open onze symbool DWF
@@ -394,7 +396,7 @@ WT_Result CSLNKSymbolDefinition::serialize(WT_File & file, WT_Color pColor, BOOL
return result; // Waarschijnlijk builtin symbol?
// Op zich is er minder kans op overflow als we het symbool tijden het inlezen
// al richting (0,0) zetten. Dan wordt echter niet meer de definitieve transform
// al richting (0,0) zetten. Dan wordt echter niet meer de definitieve transform
// uitgevoerd omdat m_transformed op WD_True staat.
// WT_Logical_Point lshift(- m_Origin.m_x,- m_Origin.m_y);
//