зеркало из https://github.com/mozilla/gecko-dev.git
Backed out 8 changesets (bug 1057212, bug 1059033) for Windows build bustage
CLOSED TREE Backed out changeset a54dbdca597b (bug 1059033) Backed out changeset d8d79e4fbfc4 (bug 1059033) Backed out changeset 87494588e493 (bug 1057212) Backed out changeset 3e4105ea0a73 (bug 1059033) Backed out changeset e59430ea4256 (bug 1059033) Backed out changeset 301fdfea8fbf (bug 1059033) Backed out changeset 1ef5a3a9bb06 (bug 1059033) Backed out changeset a7eaac164c36 (bug 1059033)
This commit is contained in:
Родитель
0b556d816a
Коммит
7769dc074d
|
@ -254,12 +254,7 @@ DrawTargetCG::OptimizeSourceSurface(SourceSurface *aSurface) const
|
|||
aSurface->GetType() == SurfaceType::COREGRAPHICS_CGCONTEXT) {
|
||||
return aSurface;
|
||||
}
|
||||
RefPtr<DataSourceSurface> data = aSurface->GetDataSurface();
|
||||
|
||||
return CreateSourceSurfaceFromData(data->GetData(),
|
||||
data->GetSize(),
|
||||
data->Stride(),
|
||||
data->GetFormat());
|
||||
return aSurface->GetDataSurface();
|
||||
}
|
||||
|
||||
class UnboundnessFixer
|
||||
|
|
|
@ -3,9 +3,6 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#define _USE_MATH_DEFINES
|
||||
#include <cmath>
|
||||
|
||||
#include "DrawTargetTiled.h"
|
||||
#include "Logging.h"
|
||||
|
||||
|
@ -48,20 +45,66 @@ DrawTargetTiled::Init(const TileSet& aTiles)
|
|||
return true;
|
||||
}
|
||||
|
||||
class SnapshotTiled : public SourceSurface
|
||||
{
|
||||
public:
|
||||
SnapshotTiled(const vector<Tile>& aTiles, const IntRect& aRect)
|
||||
: mRect(aRect)
|
||||
{
|
||||
for (size_t i = 0; i < aTiles.size(); i++) {
|
||||
mSnapshots.push_back(aTiles[i].mDrawTarget->Snapshot());
|
||||
mOrigins.push_back(aTiles[i].mTileOrigin);
|
||||
}
|
||||
}
|
||||
|
||||
virtual SurfaceType GetType() const { return SurfaceType::TILED; }
|
||||
virtual IntSize GetSize() const { return IntSize(mRect.XMost(), mRect.YMost()); }
|
||||
virtual SurfaceFormat GetFormat() const { return mSnapshots[0]->GetFormat(); }
|
||||
|
||||
virtual TemporaryRef<DataSourceSurface> GetDataSurface()
|
||||
{
|
||||
RefPtr<DataSourceSurface> surf = Factory::CreateDataSourceSurface(GetSize(), GetFormat());
|
||||
if (MOZ2D_WARN_IF(!surf)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
DataSourceSurface::MappedSurface mappedSurf;
|
||||
surf->Map(DataSourceSurface::MapType::WRITE, &mappedSurf);
|
||||
|
||||
{
|
||||
RefPtr<DrawTarget> dt =
|
||||
Factory::CreateDrawTargetForData(BackendType::CAIRO, mappedSurf.mData,
|
||||
GetSize(), mappedSurf.mStride, GetFormat());
|
||||
|
||||
for (size_t i = 0; i < mSnapshots.size(); i++) {
|
||||
RefPtr<DataSourceSurface> dataSurf = mSnapshots[i]->GetDataSurface();
|
||||
dt->CopySurface(dataSurf, IntRect(IntPoint(0, 0), mSnapshots[i]->GetSize()), mOrigins[i]);
|
||||
}
|
||||
}
|
||||
surf->Unmap();
|
||||
|
||||
return surf.forget();
|
||||
}
|
||||
private:
|
||||
vector<RefPtr<SourceSurface>> mSnapshots;
|
||||
vector<IntPoint> mOrigins;
|
||||
IntRect mRect;
|
||||
};
|
||||
|
||||
TemporaryRef<SourceSurface>
|
||||
DrawTargetTiled::Snapshot()
|
||||
{
|
||||
return new SnapshotTiled(mTiles, mRect);
|
||||
}
|
||||
|
||||
// Skip the mClippedOut check since this is only used for Flush() which
|
||||
// should happen even if we're clipped.
|
||||
#define TILED_COMMAND(command) \
|
||||
void \
|
||||
DrawTargetTiled::command() \
|
||||
{ \
|
||||
for (size_t i = 0; i < mTiles.size(); i++) { \
|
||||
mTiles[i].mDrawTarget->command(); \
|
||||
\
|
||||
\
|
||||
mTiles[i].mDrawTarget->command(); \
|
||||
} \
|
||||
}
|
||||
#define TILED_COMMAND1(command, type1) \
|
||||
|
@ -69,8 +112,9 @@ DrawTargetTiled::Snapshot()
|
|||
DrawTargetTiled::command(type1 arg1) \
|
||||
{ \
|
||||
for (size_t i = 0; i < mTiles.size(); i++) { \
|
||||
if (!mTiles[i].mClippedOut) \
|
||||
mTiles[i].mDrawTarget->command(arg1); \
|
||||
\
|
||||
\
|
||||
mTiles[i].mDrawTarget->command(arg1); \
|
||||
} \
|
||||
}
|
||||
#define TILED_COMMAND3(command, type1, type2, type3) \
|
||||
|
@ -78,8 +122,9 @@ DrawTargetTiled::Snapshot()
|
|||
DrawTargetTiled::command(type1 arg1, type2 arg2, type3 arg3) \
|
||||
{ \
|
||||
for (size_t i = 0; i < mTiles.size(); i++) { \
|
||||
if (!mTiles[i].mClippedOut) \
|
||||
mTiles[i].mDrawTarget->command(arg1, arg2, arg3); \
|
||||
\
|
||||
\
|
||||
mTiles[i].mDrawTarget->command(arg1, arg2, arg3); \
|
||||
} \
|
||||
}
|
||||
#define TILED_COMMAND4(command, type1, type2, type3, type4) \
|
||||
|
@ -87,8 +132,9 @@ DrawTargetTiled::Snapshot()
|
|||
DrawTargetTiled::command(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
|
||||
{ \
|
||||
for (size_t i = 0; i < mTiles.size(); i++) { \
|
||||
if (!mTiles[i].mClippedOut) \
|
||||
mTiles[i].mDrawTarget->command(arg1, arg2, arg3, arg4); \
|
||||
\
|
||||
\
|
||||
mTiles[i].mDrawTarget->command(arg1, arg2, arg3, arg4); \
|
||||
} \
|
||||
}
|
||||
#define TILED_COMMAND5(command, type1, type2, type3, type4, type5) \
|
||||
|
@ -96,82 +142,29 @@ DrawTargetTiled::Snapshot()
|
|||
DrawTargetTiled::command(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
|
||||
{ \
|
||||
for (size_t i = 0; i < mTiles.size(); i++) { \
|
||||
if (!mTiles[i].mClippedOut) \
|
||||
mTiles[i].mDrawTarget->command(arg1, arg2, arg3, arg4, arg5); \
|
||||
\
|
||||
\
|
||||
mTiles[i].mDrawTarget->command(arg1, arg2, arg3, arg4, arg5); \
|
||||
} \
|
||||
}
|
||||
|
||||
TILED_COMMAND(Flush)
|
||||
TILED_COMMAND5(DrawSurface, SourceSurface*, const Rect&,
|
||||
const Rect&, const DrawSurfaceOptions&,
|
||||
const DrawOptions&)
|
||||
TILED_COMMAND4(DrawFilter, FilterNode*, const Rect&, const Point&, const DrawOptions&)
|
||||
TILED_COMMAND1(ClearRect, const Rect&)
|
||||
TILED_COMMAND4(MaskSurface, const Pattern&, SourceSurface*, Point, const DrawOptions&)
|
||||
TILED_COMMAND3(FillRect, const Rect&, const Pattern&, const DrawOptions&)
|
||||
TILED_COMMAND4(StrokeRect, const Rect&, const Pattern&, const StrokeOptions&, const DrawOptions&)
|
||||
TILED_COMMAND5(StrokeLine, const Point&, const Point&, const Pattern&, const StrokeOptions&, const DrawOptions&)
|
||||
TILED_COMMAND4(Stroke, const Path*, const Pattern&, const StrokeOptions&, const DrawOptions&)
|
||||
TILED_COMMAND3(Fill, const Path*, const Pattern&, const DrawOptions&)
|
||||
TILED_COMMAND5(FillGlyphs, ScaledFont*, const GlyphBuffer&, const Pattern&, const DrawOptions&, const GlyphRenderingOptions*)
|
||||
TILED_COMMAND3(Mask, const Pattern&, const Pattern&, const DrawOptions&)
|
||||
|
||||
void
|
||||
DrawTargetTiled::PushClip(const Path* aPath)
|
||||
{
|
||||
mClippedOutTilesStack.push_back(std::vector<uint32_t>());
|
||||
std::vector<uint32_t>& clippedTiles = mClippedOutTilesStack.back();
|
||||
|
||||
Rect deviceRect = aPath->GetBounds(mTransform);
|
||||
|
||||
for (size_t i = 0; i < mTiles.size(); i++) {
|
||||
if (!mTiles[i].mClippedOut) {
|
||||
if (deviceRect.Intersects(Rect(mTiles[i].mTileOrigin.x,
|
||||
mTiles[i].mTileOrigin.y,
|
||||
mTiles[i].mDrawTarget->GetSize().width,
|
||||
mTiles[i].mDrawTarget->GetSize().height))) {
|
||||
mTiles[i].mDrawTarget->PushClip(aPath);
|
||||
} else {
|
||||
mTiles[i].mClippedOut = true;
|
||||
clippedTiles.push_back(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DrawTargetTiled::PushClipRect(const Rect& aRect)
|
||||
{
|
||||
mClippedOutTilesStack.push_back(std::vector<uint32_t>());
|
||||
std::vector<uint32_t>& clippedTiles = mClippedOutTilesStack.back();
|
||||
|
||||
Rect deviceRect = mTransform.TransformBounds(aRect);
|
||||
|
||||
for (size_t i = 0; i < mTiles.size(); i++) {
|
||||
if (!mTiles[i].mClippedOut) {
|
||||
if (deviceRect.Intersects(Rect(mTiles[i].mTileOrigin.x,
|
||||
mTiles[i].mTileOrigin.y,
|
||||
mTiles[i].mDrawTarget->GetSize().width,
|
||||
mTiles[i].mDrawTarget->GetSize().height))) {
|
||||
mTiles[i].mDrawTarget->PushClipRect(aRect);
|
||||
} else {
|
||||
mTiles[i].mClippedOut = true;
|
||||
clippedTiles.push_back(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DrawTargetTiled::PopClip()
|
||||
{
|
||||
for (size_t i = 0; i < mTiles.size(); i++) {
|
||||
if (!mTiles[i].mClippedOut) {
|
||||
mTiles[i].mDrawTarget->PopClip();
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<uint32_t>& clippedTiles = mClippedOutTilesStack.back();
|
||||
for (size_t i = 0; i < clippedTiles.size(); i++) {
|
||||
mTiles[clippedTiles[i]].mClippedOut = false;
|
||||
}
|
||||
|
||||
mClippedOutTilesStack.pop_back();
|
||||
}
|
||||
TILED_COMMAND1(PushClip, const Path*)
|
||||
TILED_COMMAND1(PushClipRect, const Rect&)
|
||||
TILED_COMMAND(PopClip)
|
||||
|
||||
void
|
||||
DrawTargetTiled::CopySurface(SourceSurface *aSurface,
|
||||
|
@ -205,95 +198,5 @@ DrawTargetTiled::SetTransform(const Matrix& aTransform)
|
|||
DrawTarget::SetTransform(aTransform);
|
||||
}
|
||||
|
||||
void
|
||||
DrawTargetTiled::DrawSurface(SourceSurface* aSurface, const Rect& aDest, const Rect& aSource, const DrawSurfaceOptions& aSurfaceOptions, const DrawOptions& aDrawOptions)
|
||||
{
|
||||
Rect deviceRect = mTransform.TransformBounds(aDest);
|
||||
for (size_t i = 0; i < mTiles.size(); i++) {
|
||||
if (!mTiles[i].mClippedOut &&
|
||||
deviceRect.Intersects(Rect(mTiles[i].mTileOrigin.x,
|
||||
mTiles[i].mTileOrigin.y,
|
||||
mTiles[i].mDrawTarget->GetSize().width,
|
||||
mTiles[i].mDrawTarget->GetSize().height))) {
|
||||
mTiles[i].mDrawTarget->DrawSurface(aSurface, aDest, aSource, aSurfaceOptions, aDrawOptions);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DrawTargetTiled::FillRect(const Rect& aRect, const Pattern& aPattern, const DrawOptions& aDrawOptions)
|
||||
{
|
||||
Rect deviceRect = mTransform.TransformBounds(aRect);
|
||||
for (size_t i = 0; i < mTiles.size(); i++) {
|
||||
if (!mTiles[i].mClippedOut &&
|
||||
deviceRect.Intersects(Rect(mTiles[i].mTileOrigin.x,
|
||||
mTiles[i].mTileOrigin.y,
|
||||
mTiles[i].mDrawTarget->GetSize().width,
|
||||
mTiles[i].mDrawTarget->GetSize().height))) {
|
||||
mTiles[i].mDrawTarget->FillRect(aRect, aPattern, aDrawOptions);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// The logic for this comes from _cairo_stroke_style_max_distance_from_path
|
||||
static Rect
|
||||
PathExtentsToMaxStrokeExtents(const StrokeOptions &aStrokeOptions,
|
||||
const Rect &aRect,
|
||||
const Matrix &aTransform)
|
||||
{
|
||||
float styleExpansionFactor = 0.5f;
|
||||
|
||||
if (aStrokeOptions.mLineCap == CapStyle::SQUARE) {
|
||||
styleExpansionFactor = M_SQRT1_2;
|
||||
}
|
||||
|
||||
if (aStrokeOptions.mLineJoin == JoinStyle::MITER &&
|
||||
styleExpansionFactor < M_SQRT2 * aStrokeOptions.mMiterLimit) {
|
||||
styleExpansionFactor = M_SQRT2 * aStrokeOptions.mMiterLimit;
|
||||
}
|
||||
|
||||
styleExpansionFactor *= aStrokeOptions.mLineWidth;
|
||||
|
||||
double dx = styleExpansionFactor * hypot(aTransform._11, aTransform._21);
|
||||
double dy = styleExpansionFactor * hypot(aTransform._22, aTransform._12);
|
||||
|
||||
Rect result = aRect;
|
||||
result.Inflate(dx, dy);
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
DrawTargetTiled::Stroke(const Path* aPath, const Pattern& aPattern, const StrokeOptions& aStrokeOptions, const DrawOptions& aDrawOptions)
|
||||
{
|
||||
// Approximate the stroke extents, since Path::GetStrokeExtents can be slow
|
||||
Rect deviceRect = PathExtentsToMaxStrokeExtents(aStrokeOptions,
|
||||
aPath->GetBounds(mTransform),
|
||||
mTransform);
|
||||
for (size_t i = 0; i < mTiles.size(); i++) {
|
||||
if (!mTiles[i].mClippedOut &&
|
||||
deviceRect.Intersects(Rect(mTiles[i].mTileOrigin.x,
|
||||
mTiles[i].mTileOrigin.y,
|
||||
mTiles[i].mDrawTarget->GetSize().width,
|
||||
mTiles[i].mDrawTarget->GetSize().height))) {
|
||||
mTiles[i].mDrawTarget->Stroke(aPath, aPattern, aStrokeOptions, aDrawOptions);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DrawTargetTiled::Fill(const Path* aPath, const Pattern& aPattern, const DrawOptions& aDrawOptions)
|
||||
{
|
||||
Rect deviceRect = aPath->GetBounds(mTransform);
|
||||
for (size_t i = 0; i < mTiles.size(); i++) {
|
||||
if (!mTiles[i].mClippedOut &&
|
||||
deviceRect.Intersects(Rect(mTiles[i].mTileOrigin.x,
|
||||
mTiles[i].mTileOrigin.y,
|
||||
mTiles[i].mDrawTarget->GetSize().width,
|
||||
mTiles[i].mDrawTarget->GetSize().height))) {
|
||||
mTiles[i].mDrawTarget->Fill(aPath, aPattern, aDrawOptions);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,20 +14,6 @@
|
|||
namespace mozilla {
|
||||
namespace gfx {
|
||||
|
||||
struct TileInternal : public Tile {
|
||||
TileInternal()
|
||||
: mClippedOut(false)
|
||||
{}
|
||||
|
||||
TileInternal(const Tile& aOther)
|
||||
: Tile(aOther)
|
||||
, mClippedOut(false)
|
||||
{}
|
||||
|
||||
bool mClippedOut;
|
||||
};
|
||||
|
||||
|
||||
class DrawTargetTiled : public DrawTarget
|
||||
{
|
||||
public:
|
||||
|
@ -144,51 +130,7 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
std::vector<TileInternal> mTiles;
|
||||
std::vector<std::vector<uint32_t> > mClippedOutTilesStack;
|
||||
IntRect mRect;
|
||||
};
|
||||
|
||||
class SnapshotTiled : public SourceSurface
|
||||
{
|
||||
public:
|
||||
SnapshotTiled(const std::vector<TileInternal>& aTiles, const IntRect& aRect)
|
||||
: mRect(aRect)
|
||||
{
|
||||
for (size_t i = 0; i < aTiles.size(); i++) {
|
||||
mSnapshots.push_back(aTiles[i].mDrawTarget->Snapshot());
|
||||
mOrigins.push_back(aTiles[i].mTileOrigin);
|
||||
}
|
||||
}
|
||||
|
||||
virtual SurfaceType GetType() const { return SurfaceType::TILED; }
|
||||
virtual IntSize GetSize() const { return IntSize(mRect.XMost(), mRect.YMost()); }
|
||||
virtual SurfaceFormat GetFormat() const { return mSnapshots[0]->GetFormat(); }
|
||||
|
||||
virtual TemporaryRef<DataSourceSurface> GetDataSurface()
|
||||
{
|
||||
RefPtr<DataSourceSurface> surf = Factory::CreateDataSourceSurface(GetSize(), GetFormat());
|
||||
|
||||
DataSourceSurface::MappedSurface mappedSurf;
|
||||
surf->Map(DataSourceSurface::MapType::WRITE, &mappedSurf);
|
||||
|
||||
{
|
||||
RefPtr<DrawTarget> dt =
|
||||
Factory::CreateDrawTargetForData(BackendType::CAIRO, mappedSurf.mData,
|
||||
GetSize(), mappedSurf.mStride, GetFormat());
|
||||
|
||||
for (size_t i = 0; i < mSnapshots.size(); i++) {
|
||||
RefPtr<DataSourceSurface> dataSurf = mSnapshots[i]->GetDataSurface();
|
||||
dt->CopySurface(dataSurf, IntRect(IntPoint(0, 0), mSnapshots[i]->GetSize()), mOrigins[i]);
|
||||
}
|
||||
}
|
||||
surf->Unmap();
|
||||
|
||||
return surf.forget();
|
||||
}
|
||||
|
||||
std::vector<RefPtr<SourceSurface>> mSnapshots;
|
||||
std::vector<IntPoint> mOrigins;
|
||||
std::vector<Tile> mTiles;
|
||||
IntRect mRect;
|
||||
};
|
||||
|
||||
|
|
|
@ -21,7 +21,6 @@ EXPORTS.mozilla.gfx += [
|
|||
'BorrowedContext.h',
|
||||
'Coord.h',
|
||||
'DataSurfaceHelpers.h',
|
||||
'DrawTargetTiled.h',
|
||||
'Filters.h',
|
||||
'Helpers.h',
|
||||
'Logging.h',
|
||||
|
@ -108,6 +107,7 @@ UNIFIED_SOURCES += [
|
|||
'DrawTargetCapture.cpp',
|
||||
'DrawTargetDual.cpp',
|
||||
'DrawTargetRecording.cpp',
|
||||
'DrawTargetTiled.cpp',
|
||||
'Factory.cpp',
|
||||
'FilterNodeSoftware.cpp',
|
||||
'FilterProcessing.cpp',
|
||||
|
@ -126,11 +126,6 @@ UNIFIED_SOURCES += [
|
|||
'SourceSurfaceRawData.cpp',
|
||||
]
|
||||
|
||||
SOURCES += [
|
||||
'DrawTargetTiled.cpp',
|
||||
|
||||
]
|
||||
|
||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
|
||||
SOURCES += [
|
||||
'MacIOSurface.cpp',
|
||||
|
|
|
@ -689,7 +689,6 @@ BufferTextureClient::BorrowDrawTarget()
|
|||
MOZ_ASSERT(mLocked, "BorrowDrawTarget should be called on locked textures only");
|
||||
|
||||
if (mDrawTarget) {
|
||||
mDrawTarget->SetTransform(Matrix());
|
||||
return mDrawTarget;
|
||||
}
|
||||
|
||||
|
@ -739,6 +738,7 @@ BufferTextureClient::Unlock()
|
|||
}
|
||||
|
||||
mDrawTarget->Flush();
|
||||
mDrawTarget = nullptr;
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
#include "GeckoProfiler.h"
|
||||
#include "gfx2DGlue.h"
|
||||
#include "mozilla/gfx/PathHelpers.h"
|
||||
#include "mozilla/gfx/DrawTargetTiled.h"
|
||||
#include <algorithm>
|
||||
|
||||
#if CAIRO_HAS_DWRITE_FONT
|
||||
|
@ -1119,32 +1118,12 @@ gfxContext::PushGroupAndCopyBackground(gfxContentType content)
|
|||
|
||||
Point offset = CurrentState().deviceOffset - oldDeviceOffset;
|
||||
Rect surfRect(0, 0, Float(mDT->GetSize().width), Float(mDT->GetSize().height));
|
||||
Rect sourceRect = surfRect + offset;
|
||||
Rect sourceRect = surfRect;
|
||||
sourceRect.x += offset.x;
|
||||
sourceRect.y += offset.y;
|
||||
|
||||
mDT->SetTransform(Matrix());
|
||||
|
||||
// XXX: It's really sad that we have to do this (for performance).
|
||||
// Once DrawTarget gets a PushLayer API we can implement this within
|
||||
// DrawTargetTiled.
|
||||
if (source->GetType() == SurfaceType::TILED) {
|
||||
SnapshotTiled *sourceTiled = static_cast<SnapshotTiled*>(source.get());
|
||||
for (uint32_t i = 0; i < sourceTiled->mSnapshots.size(); i++) {
|
||||
Rect tileSourceRect = sourceRect.Intersect(Rect(sourceTiled->mOrigins[i].x,
|
||||
sourceTiled->mOrigins[i].y,
|
||||
sourceTiled->mSnapshots[i]->GetSize().width,
|
||||
sourceTiled->mSnapshots[i]->GetSize().height));
|
||||
|
||||
if (tileSourceRect.IsEmpty()) {
|
||||
continue;
|
||||
}
|
||||
Rect tileDestRect = tileSourceRect - offset;
|
||||
tileSourceRect -= sourceTiled->mOrigins[i];
|
||||
|
||||
mDT->DrawSurface(sourceTiled->mSnapshots[i], tileDestRect, tileSourceRect);
|
||||
}
|
||||
} else {
|
||||
mDT->DrawSurface(source, surfRect, sourceRect);
|
||||
}
|
||||
mDT->DrawSurface(source, surfRect, sourceRect);
|
||||
mDT->SetOpaqueRect(oldDT->GetOpaqueRect());
|
||||
|
||||
PushClipsToDT(mDT);
|
||||
|
|
Загрузка…
Ссылка в новой задаче