////////////////////////////////////////////////////////////////////////// // renderSelectionHUD void GaGameUnit::renderSelectionHUD( ScnCanvasComponentRef Canvas, BcFixed TimeFraction, BcU32 TeamID ) { if( Behaviour_ != BEHAVIOUR_DEAD ) { BcU32 TextureIdx = Desc_.Type_; BcFixedVec2d GamePosition( getInterpolatedPosition( TimeFraction ) ); const BcReal ScaleFactor = 32.0f; BcVec2d Position( GamePosition.x(), GamePosition.y() ); BcVec2d Size( Desc_.Size_.x(), Desc_.Size_.y() ); Position *= ScaleFactor; Size *= ScaleFactor; BcVec2d PositionA( Position + ( BcVec2d( -Size.x(), -Size.y() ) * 0.45f ) ); BcVec2d PositionB( Position + ( BcVec2d( Size.x(), -Size.y() ) * 0.45f ) ); BcVec2d PositionC( Position + ( BcVec2d( Size.x(), Size.y() ) * 0.45f ) ); BcVec2d PositionD( Position + ( BcVec2d( -Size.x(), Size.y() ) * 0.45f ) ); BcVec2d SizeA( BcVec2d( 16.0f, 16.0f ) ); BcVec2d SizeB( BcVec2d( -16.0f, 16.0f ) ); BcVec2d SizeC( BcVec2d( -16.0f, -16.0f ) ); BcVec2d SizeD( BcVec2d( 16.0f, -16.0f ) ); // Draw selection marker. RsColour MarkerColour = TeamID == TeamID_ ? ( RsColour::WHITE ) : ( RsColour::RED ) * RsColour( 1.0f, 1.0f, 1.0f, 0.75f ); Canvas->drawSpriteCentered( PositionA, SizeA, 2, MarkerColour, 3 ); Canvas->drawSpriteCentered( PositionB, SizeB, 2, MarkerColour, 3 ); Canvas->drawSpriteCentered( PositionC, SizeC, 2, MarkerColour, 3 ); Canvas->drawSpriteCentered( PositionD, SizeD, 2, MarkerColour, 3 ); } }
PaperFormat GetPaperFormat(SizeD size) { SizeD sizeP = size.dx < size.dy ? size : SizeD(size.dy, size.dx); // common ISO 216 formats (metric) if (limitValue(sizeP.dx, 8.26, 8.28) == sizeP.dx && limitValue(sizeP.dy, 11.68, 11.70) == sizeP.dy) return Paper_A4; if (limitValue(sizeP.dx, 11.68, 11.70) == sizeP.dx && limitValue(sizeP.dy, 16.53, 16.55) == sizeP.dy) return Paper_A3; if (limitValue(sizeP.dx, 5.82, 5.85) == sizeP.dx && limitValue(sizeP.dy, 8.26, 8.28) == sizeP.dy) return Paper_A5; // common US/ANSI formats (imperial) if (limitValue(sizeP.dx, 8.49, 8.51) == sizeP.dx && limitValue(sizeP.dy, 10.99, 11.01) == sizeP.dy) return Paper_Letter; if (limitValue(sizeP.dx, 8.49, 8.51) == sizeP.dx && limitValue(sizeP.dy, 13.99, 14.01) == sizeP.dy) return Paper_Legal; if (limitValue(sizeP.dx, 10.99, 11.01) == sizeP.dx && limitValue(sizeP.dy, 16.99, 17.01) == sizeP.dy) return Paper_Tabloid; if (limitValue(sizeP.dx, 5.49, 5.51) == sizeP.dx && limitValue(sizeP.dy, 8.49, 8.51) == sizeP.dy) return Paper_Statement; return Paper_Other; }
// format page size according to locale (e.g. "29.7 x 21.0 cm" or "11.69 x 8.27 in") // Caller needs to free the result static WCHAR *FormatPageSize(BaseEngine *engine, int pageNo, int rotation) { RectD mediabox = engine->PageMediabox(pageNo); SizeD size = engine->Transform(mediabox, pageNo, 1.0f / engine->GetFileDPI(), rotation).Size(); const WCHAR *formatName = L""; SizeD sizeP = size.dx < size.dy ? size : SizeD(size.dy, size.dx); // common ISO 216 formats (metric) if (limitValue(sizeP.dx, 8.26, 8.28) == sizeP.dx && limitValue(sizeP.dy, 11.68, 11.70) == sizeP.dy) formatName = L" (A4)"; else if (limitValue(sizeP.dx, 11.68, 11.70) == sizeP.dx && limitValue(sizeP.dy, 16.53, 16.55) == sizeP.dy) formatName = L" (A3)"; else if (limitValue(sizeP.dx, 5.82, 5.85) == sizeP.dx && limitValue(sizeP.dy, 8.26, 8.28) == sizeP.dy) formatName = L" (A5)"; // common US/ANSI formats (imperial) else if (limitValue(sizeP.dx, 8.49, 8.51) == sizeP.dx && limitValue(sizeP.dy, 10.99, 11.01) == sizeP.dy) formatName = L" (Letter)"; else if (limitValue(sizeP.dx, 8.49, 8.51) == sizeP.dx && limitValue(sizeP.dy, 13.99, 14.01) == sizeP.dy) formatName = L" (Legal)"; else if (limitValue(sizeP.dx, 10.99, 11.01) == sizeP.dx && limitValue(sizeP.dy, 16.99, 17.01) == sizeP.dy) formatName = L" (Tabloid)"; WCHAR unitSystem[2]; GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_IMEASURE, unitSystem, dimof(unitSystem)); bool isMetric = unitSystem[0] == '0'; double unitsPerInch = isMetric ? 2.54 : 1.0; const WCHAR *unit = isMetric ? L"cm" : L"in"; double width = size.dx * unitsPerInch; double height = size.dy * unitsPerInch; if (((int)(width * 100)) % 100 == 99) width += 0.01; if (((int)(height * 100)) % 100 == 99) height += 0.01; ScopedMem<WCHAR> strWidth(str::FormatFloatWithThousandSep(width)); ScopedMem<WCHAR> strHeight(str::FormatFloatWithThousandSep(height)); return str::Format(L"%s x %s %s%s", strWidth, strHeight, unit, formatName); }
static void GeomTest() { PointD ptD(12.4, -13.6); utassert(ptD.x == 12.4 && ptD.y == -13.6); PointI ptI = ptD.ToInt(); utassert(ptI.x == 12 && ptI.y == -14); ptD = ptI.Convert<double>(); utassert(PointD(12, -14) == ptD); utassert(PointD(12.4, -13.6) != ptD); SizeD szD(7.7, -3.3); utassert(szD.dx == 7.7 && szD.dy == -3.3); SizeI szI = szD.ToInt(); utassert(szI.dx == 8 && szI.dy == -3); szD = szI.Convert<double>(); utassert(SizeD(8, -3) == szD); utassert(!szD.IsEmpty() && !szI.IsEmpty()); utassert(SizeI().IsEmpty() && SizeD().IsEmpty()); struct SRIData { int x1s, x1e, y1s, y1e; int x2s, x2e, y2s, y2e; bool intersect; int i_xs, i_xe, i_ys, i_ye; int u_xs, u_xe, u_ys, u_ye; } testData[] = { { 0,10, 0,10, 0,10, 0,10, true, 0,10, 0,10, 0,10, 0,10 }, /* complete intersect */ { 0,10, 0,10, 20,30,20,30, false, 0, 0, 0, 0, 0,30, 0,30 }, /* no intersect */ { 0,10, 0,10, 5,15, 0,10, true, 5,10, 0,10, 0,15, 0,10 }, /* { | } | */ { 0,10, 0,10, 5, 7, 0,10, true, 5, 7, 0,10, 0,10, 0,10 }, /* { | | } */ { 0,10, 0,10, 5, 7, 5, 7, true, 5, 7, 5, 7, 0,10, 0,10 }, { 0,10, 0,10, 5, 15,5,15, true, 5,10, 5,10, 0,15, 0,15 }, }; for (size_t i = 0; i < dimof(testData); i++) { struct SRIData *curr = &testData[i]; RectI rx1(curr->x1s, curr->y1s, curr->x1e - curr->x1s, curr->y1e - curr->y1s); RectI rx2 = RectI::FromXY(curr->x2s, curr->y2s, curr->x2e, curr->y2e); RectI isect = rx1.Intersect(rx2); if (curr->intersect) { utassert(!isect.IsEmpty()); utassert(isect.x == curr->i_xs && isect.y == curr->i_ys); utassert(isect.x + isect.dx == curr->i_xe && isect.y + isect.dy == curr->i_ye); } else { utassert(isect.IsEmpty()); } RectI urect = rx1.Union(rx2); utassert(urect.x == curr->u_xs && urect.y == curr->u_ys); utassert(urect.x + urect.dx == curr->u_xe && urect.y + urect.dy == curr->u_ye); /* if we swap rectangles, the results should be the same */ std::swap(rx1, rx2); isect = rx1.Intersect(rx2); if (curr->intersect) { utassert(!isect.IsEmpty()); utassert(isect.x == curr->i_xs && isect.y == curr->i_ys); utassert(isect.x + isect.dx == curr->i_xe && isect.y + isect.dy == curr->i_ye); } else { utassert(isect.IsEmpty()); } urect = rx1.Union(rx2); utassert(RectI::FromXY(curr->u_xs, curr->u_ys, curr->u_xe, curr->u_ye) == urect); utassert(!rx1.Contains(PointI(-2, -2))); utassert(rx1.Contains(rx1.TL())); utassert(!rx1.Contains(PointI(rx1.x, INT_MAX))); utassert(!rx1.Contains(PointI(INT_MIN, rx1.y))); } }