Commit 1deae726 authored by Oleg.Korshul's avatar Oleg.Korshul Committed by Alexander Trofimov

git-svn-id:...

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@55266 954022d7-b5bf-4e40-9824-e11837661b57
parent 3dcdcbdb
...@@ -431,6 +431,14 @@ namespace agg ...@@ -431,6 +431,14 @@ namespace agg
} }
} }
#ifdef _LINUX
inline double _hypot(const double& x, const double& y)
{
return sqrt(x * x + y * y);
}
#endif
} }
......
...@@ -22,6 +22,14 @@ ...@@ -22,6 +22,14 @@
#include "agg_array.h" #include "agg_array.h"
#include "agg_trans_affine.h" #include "agg_trans_affine.h"
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif
namespace agg namespace agg
{ {
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include <stdio.h> #include <stdio.h>
#include <string> #include <string>
#include "Array.h" #include "Array.h"
#include "errno.h"
namespace NSFile namespace NSFile
{ {
...@@ -438,7 +439,7 @@ namespace NSFile ...@@ -438,7 +439,7 @@ namespace NSFile
m_pFile = fopen((char*)pUtf8, "rb"); m_pFile = fopen((char*)pUtf8, "rb");
delete [] pUtf8; delete [] pUtf8;
#endif #endif
if (NULL == m_pFile) if (NULL == m_pFile)
return false; return false;
fseek(m_pFile, 0, SEEK_END); fseek(m_pFile, 0, SEEK_END);
...@@ -446,6 +447,15 @@ namespace NSFile ...@@ -446,6 +447,15 @@ namespace NSFile
fseek(m_pFile, 0, SEEK_SET); fseek(m_pFile, 0, SEEK_SET);
m_lFilePosition = 0; m_lFilePosition = 0;
unsigned int err = 0x7FFFFFFF;
unsigned int cur = (unsigned int)m_lFileSize;
if (err == cur)
{
CloseFile();
return false;
}
return true; return true;
} }
......
...@@ -163,7 +163,16 @@ CFontInfo* CFontInfo::FromBuffer(BYTE*& pBuffer, std::wstring strDir) ...@@ -163,7 +163,16 @@ CFontInfo* CFontInfo::FromBuffer(BYTE*& pBuffer, std::wstring strDir)
LONG len2 = lLen >> 1; LONG len2 = lLen >> 1;
wchar_t* sName = new wchar_t[len2 + 1]; wchar_t* sName = new wchar_t[len2 + 1];
for (LONG i = 0; i < len2; ++i) for (LONG i = 0; i < len2; ++i)
sName[i] = (wchar_t)(pBuffer[2 * i] | (pBuffer[2 * i + 1] << 8)); {
sName[i] = (wchar_t)(pBuffer[2 * i] | (pBuffer[2 * i + 1] << 8));
if (sName[i] == wchar_t('\\'))
sName[i] = wchar_t('/');
if (0 == sName[i])
{
len2 = i;
break;
}
}
sName[len2] = 0; sName[len2] = 0;
std::wstring strName(sName, len2); std::wstring strName(sName, len2);
...@@ -178,11 +187,20 @@ CFontInfo* CFontInfo::FromBuffer(BYTE*& pBuffer, std::wstring strDir) ...@@ -178,11 +187,20 @@ CFontInfo* CFontInfo::FromBuffer(BYTE*& pBuffer, std::wstring strDir)
len2 = lLen >> 1; len2 = lLen >> 1;
sName = new wchar_t[len2 + 1]; sName = new wchar_t[len2 + 1];
for (LONG i = 0; i < len2; ++i) for (LONG i = 0; i < len2; ++i)
sName[i] = (wchar_t)(pBuffer[2 * i] | (pBuffer[2 * i + 1] << 8)); {
sName[i] = (wchar_t)(pBuffer[2 * i] | (pBuffer[2 * i + 1] << 8));
if (sName[i] == wchar_t('\\'))
sName[i] = wchar_t('/');
if (0 == sName[i])
{
len2 = i;
break;
}
}
sName[len2] = 0; sName[len2] = 0;
std::wstring strPath(sName, len2); std::wstring strPath(sName, len2);
pBuffer += lLen; pBuffer += lLen;
RELEASEARRAYOBJECTS(sName); RELEASEARRAYOBJECTS(sName);
......
...@@ -19,7 +19,15 @@ public: ...@@ -19,7 +19,15 @@ public:
CColor() { Argb = 0xFF000000; } //Black; CColor() { Argb = 0xFF000000; } //Black;
//Color values are not premultiplied. //Color values are not premultiplied.
CColor(BYTE r, BYTE g, BYTE b) { Argb = MakeARGB(255, r, g, b); } CColor(BYTE r, BYTE g, BYTE b) { Argb = MakeARGB(255, r, g, b); }
CColor(BYTE a, LONG lColor) { Argb = ((a << AlphaShift) | lColor); } CColor(BYTE a, LONG lColor, bool bSwapRGB = false)
{
if (!bSwapRGB)
Argb = ((a << AlphaShift) | lColor);
else
{
Argb = MakeARGB(a, (BYTE)(lColor >> BlueShift), (BYTE)(lColor >> GreenShift), (BYTE)(lColor >> RedShift));
}
}
CColor(BYTE a, BYTE r, BYTE g, BYTE b) { Argb = MakeARGB(a, r, g, b); } CColor(BYTE a, BYTE r, BYTE g, BYTE b) { Argb = MakeARGB(a, r, g, b); }
CColor(ARGB argb) { Argb = argb; } CColor(ARGB argb) { Argb = argb; }
...@@ -72,4 +80,4 @@ protected: ...@@ -72,4 +80,4 @@ protected:
} }
#endif // _BUILD_COLOR_H_ #endif // _BUILD_COLOR_H_
\ No newline at end of file
...@@ -33,6 +33,11 @@ namespace Aggplus ...@@ -33,6 +33,11 @@ namespace Aggplus
#endif #endif
m_dGlobalAlpha = 1.0; m_dGlobalAlpha = 1.0;
m_bSwapRGB = false;
#ifdef _LINUX
m_bSwapRGB = true;
#endif
} }
CGraphics::CGraphics(int dwWidth, int dwHeight, int stride, BYTE* pBuffer) : m_dwConfigFlags(0) CGraphics::CGraphics(int dwWidth, int dwHeight, int stride, BYTE* pBuffer) : m_dwConfigFlags(0)
...@@ -56,6 +61,12 @@ namespace Aggplus ...@@ -56,6 +61,12 @@ namespace Aggplus
m_pBitmap = NULL; m_pBitmap = NULL;
m_pGraphics = NULL; m_pGraphics = NULL;
#endif #endif
m_bSwapRGB = false;
#ifdef _LINUX
m_bSwapRGB = true;
#endif
} }
CGraphics::CGraphics(CImage* pImage) : m_dwConfigFlags(0) CGraphics::CGraphics(CImage* pImage) : m_dwConfigFlags(0)
...@@ -84,6 +95,12 @@ namespace Aggplus ...@@ -84,6 +95,12 @@ namespace Aggplus
m_pBitmap = NULL; m_pBitmap = NULL;
m_pGraphics = NULL; m_pGraphics = NULL;
#endif #endif
m_bSwapRGB = false;
#ifdef _LINUX
m_bSwapRGB = true;
#endif
} }
CGraphics::~CGraphics() CGraphics::~CGraphics()
...@@ -646,7 +663,7 @@ namespace Aggplus ...@@ -646,7 +663,7 @@ namespace Aggplus
m_rasterizer.get_rasterizer().add_path(trans); m_rasterizer.get_rasterizer().add_path(trans);
} }
CColor oColor((BYTE)(pPen->Alpha * m_dGlobalAlpha), pPen->Color); CColor oColor((BYTE)(pPen->Alpha * m_dGlobalAlpha), pPen->Color, m_bSwapRGB);
CBrushSolid oBrush(oColor); CBrushSolid oBrush(oColor);
m_rasterizer.get_rasterizer().filling_rule(agg::fill_non_zero); m_rasterizer.get_rasterizer().filling_rule(agg::fill_non_zero);
...@@ -744,7 +761,7 @@ namespace Aggplus ...@@ -744,7 +761,7 @@ namespace Aggplus
m_rasterizer.get_rasterizer().add_path(trans); m_rasterizer.get_rasterizer().add_path(trans);
} }
CColor oColor((BYTE)pPen->Alpha, pPen->Color); CColor oColor((BYTE)pPen->Alpha, pPen->Color, m_bSwapRGB);
CBrushSolid oBrush(oColor); CBrushSolid oBrush(oColor);
m_rasterizer.get_rasterizer().filling_rule(agg::fill_non_zero); m_rasterizer.get_rasterizer().filling_rule(agg::fill_non_zero);
...@@ -1382,54 +1399,108 @@ namespace Aggplus ...@@ -1382,54 +1399,108 @@ namespace Aggplus
void CGraphics::DoFillPathTextureClampSz2(const CMatrix &mImgMtx, const void *pImgBuff, DWORD dwImgWidth, DWORD dwImgHeight, int nImgStride) void CGraphics::DoFillPathTextureClampSz2(const CMatrix &mImgMtx, const void *pImgBuff, DWORD dwImgWidth, DWORD dwImgHeight, int nImgStride)
{ {
span_alloc_type span_allocator; // Span Allocator if (!m_bSwapRGB)
{
typedef agg::pixfmt_bgra32 pixfmt; span_alloc_type span_allocator; // Span Allocator
typedef agg::image_accessor_clip<pixfmt> img_source_type;
typedef agg::span_image_filter_rgba_nn<img_source_type, interpolator_type_linear> span_gen_type; typedef agg::pixfmt_bgra32 pixfmt;
typedef agg::renderer_scanline_aa<base_renderer_type, span_alloc_type, span_gen_type> renderer_type; typedef agg::image_accessor_clip<pixfmt> img_source_type;
typedef agg::span_image_filter_rgba_nn<img_source_type, interpolator_type_linear> span_gen_type;
//double dScaleX = 270.0 / dwImgWidth; typedef agg::renderer_scanline_aa<base_renderer_type, span_alloc_type, span_gen_type> renderer_type;
//double dScaleY = 190.0 / dwImgHeight;
//double dScaleX = 270.0 / dwImgWidth;
agg::trans_affine mtx_Work(mImgMtx.m_agg_mtx); //double dScaleY = 190.0 / dwImgHeight;
//mtx_Work.scale(dScaleX, dScaleY);
agg::trans_affine mtx_Work(mImgMtx.m_agg_mtx);
//mtx_Work.multiply(m_oFullTransform.m_agg_mtx); //mtx_Work.scale(dScaleX, dScaleY);
mtx_Work.invert();
interpolator_type_linear interpolator(mtx_Work); //mtx_Work.multiply(m_oFullTransform.m_agg_mtx);
{ mtx_Work.invert();
//agg::rendering_buffer PatRendBuff((BYTE *)pImgBuff, dwImgWidth, dwImgHeight, nImgStride); interpolator_type_linear interpolator(mtx_Work);
{
agg::rendering_buffer PatRendBuff; //agg::rendering_buffer PatRendBuff((BYTE *)pImgBuff, dwImgWidth, dwImgHeight, nImgStride);
if (nImgStride < 0) agg::rendering_buffer PatRendBuff;
{
BYTE* pBuffer = (BYTE*)pImgBuff + (dwImgHeight - 1) * nImgStride; if (nImgStride < 0)
PatRendBuff.attach(pBuffer, dwImgWidth, dwImgHeight, nImgStride); {
} BYTE* pBuffer = (BYTE*)pImgBuff + (dwImgHeight - 1) * nImgStride;
else PatRendBuff.attach(pBuffer, dwImgWidth, dwImgHeight, nImgStride);
{ }
PatRendBuff.attach((BYTE*)pImgBuff, dwImgWidth, dwImgHeight, nImgStride); else
} {
PatRendBuff.attach((BYTE*)pImgBuff, dwImgWidth, dwImgHeight, nImgStride);
pixfmt img_pixf(PatRendBuff); }
img_source_type img_src(img_pixf, agg::rgba(0, 0, 0, 0));
span_gen_type sg(img_src, interpolator); pixfmt img_pixf(PatRendBuff);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg); img_source_type img_src(img_pixf, agg::rgba(0, 0, 0, 0));
//agg::render_scanlines(m_rasterizer.get_rasterizer(), m_rasterizer.get_scanline(), ri); span_gen_type sg(img_src, interpolator);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
if (fabs(m_dGlobalAlpha - 1.0) < FLT_EPSILON) //agg::render_scanlines(m_rasterizer.get_rasterizer(), m_rasterizer.get_scanline(), ri);
{
render_scanlines(ri); if (fabs(m_dGlobalAlpha - 1.0) < FLT_EPSILON)
} {
else render_scanlines(ri);
{ }
m_rasterizer.gamma_multi(m_dGlobalAlpha); else
render_scanlines(ri); {
m_rasterizer.gamma(1.0); m_rasterizer.gamma_multi(m_dGlobalAlpha);
} render_scanlines(ri);
} m_rasterizer.gamma(1.0);
}
}
}
else
{
span_alloc_type span_allocator; // Span Allocator
typedef agg::pixfmt_rgba32 pixfmt;
typedef agg::image_accessor_clip<pixfmt> img_source_type;
typedef agg::span_image_filter_rgba_nn<img_source_type, interpolator_type_linear> span_gen_type;
typedef agg::renderer_scanline_aa<base_renderer_type, span_alloc_type, span_gen_type> renderer_type;
//double dScaleX = 270.0 / dwImgWidth;
//double dScaleY = 190.0 / dwImgHeight;
agg::trans_affine mtx_Work(mImgMtx.m_agg_mtx);
//mtx_Work.scale(dScaleX, dScaleY);
//mtx_Work.multiply(m_oFullTransform.m_agg_mtx);
mtx_Work.invert();
interpolator_type_linear interpolator(mtx_Work);
{
//agg::rendering_buffer PatRendBuff((BYTE *)pImgBuff, dwImgWidth, dwImgHeight, nImgStride);
agg::rendering_buffer PatRendBuff;
if (nImgStride < 0)
{
BYTE* pBuffer = (BYTE*)pImgBuff + (dwImgHeight - 1) * nImgStride;
PatRendBuff.attach(pBuffer, dwImgWidth, dwImgHeight, nImgStride);
}
else
{
PatRendBuff.attach((BYTE*)pImgBuff, dwImgWidth, dwImgHeight, nImgStride);
}
pixfmt img_pixf(PatRendBuff);
img_source_type img_src(img_pixf, agg::rgba(0, 0, 0, 0));
span_gen_type sg(img_src, interpolator);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
//agg::render_scanlines(m_rasterizer.get_rasterizer(), m_rasterizer.get_scanline(), ri);
if (fabs(m_dGlobalAlpha - 1.0) < FLT_EPSILON)
{
render_scanlines(ri);
}
else
{
m_rasterizer.gamma_multi(m_dGlobalAlpha);
render_scanlines(ri);
m_rasterizer.gamma(1.0);
}
}
}
} }
void CGraphics::DoFillPath(const CBrush* Brush) void CGraphics::DoFillPath(const CBrush* Brush)
...@@ -1729,4 +1800,4 @@ namespace Aggplus ...@@ -1729,4 +1800,4 @@ namespace Aggplus
m_oCoordTransform.Scale(dScaleX, dScaleY, MatrixOrderAppend); m_oCoordTransform.Scale(dScaleX, dScaleY, MatrixOrderAppend);
CalculateFullTransform(); CalculateFullTransform();
} }
} }
\ No newline at end of file
...@@ -190,7 +190,7 @@ protected: ...@@ -190,7 +190,7 @@ protected:
CGdiPlusInit m_oInitGdiplus; CGdiPlusInit m_oInitGdiplus;
#endif #endif
CDIB* m_pDib; CDIB* m_pDib;
public: public:
agg::svg::frame_buffer_rgba& get_frame_buffer(); agg::svg::frame_buffer_rgba& get_frame_buffer();
...@@ -199,6 +199,9 @@ public: ...@@ -199,6 +199,9 @@ public:
bool m_bIntegerGrid; bool m_bIntegerGrid;
double m_dGlobalAlpha; double m_dGlobalAlpha;
// for RGBA painting
bool m_bSwapRGB;
public: public:
CGraphics(); CGraphics();
...@@ -314,4 +317,4 @@ protected: ...@@ -314,4 +317,4 @@ protected:
}; };
} }
#endif // _BUILD_GRAPHICS_H_ #endif // _BUILD_GRAPHICS_H_
\ No newline at end of file
...@@ -7,10 +7,14 @@ Aggplus::CBrush* CGraphicsRenderer::CreateBrush(NSStructures::CBrush* pBrush) ...@@ -7,10 +7,14 @@ Aggplus::CBrush* CGraphicsRenderer::CreateBrush(NSStructures::CBrush* pBrush)
if (NULL == pBrush) if (NULL == pBrush)
return NULL; return NULL;
bool bIsSwappedRGB = false;
if (m_pRenderer && m_pRenderer->m_bSwapRGB)
bIsSwappedRGB = true;
LONG Type = pBrush->Type; LONG Type = pBrush->Type;
if ((0 == Type) || (c_BrushTypeSolid == Type)) if ((0 == Type) || (c_BrushTypeSolid == Type))
{ {
Aggplus::CColor oColor((BYTE)(pBrush->Alpha1 * m_dGlobalAlpha), pBrush->Color1); Aggplus::CColor oColor((BYTE)(pBrush->Alpha1 * m_dGlobalAlpha), pBrush->Color1, bIsSwappedRGB);
Aggplus::CBrushSolid* pNew = new Aggplus::CBrushSolid(oColor); Aggplus::CBrushSolid* pNew = new Aggplus::CBrushSolid(oColor);
return pNew; return pNew;
...@@ -25,8 +29,8 @@ Aggplus::CBrush* CGraphicsRenderer::CreateBrush(NSStructures::CBrush* pBrush) ...@@ -25,8 +29,8 @@ Aggplus::CBrush* CGraphicsRenderer::CreateBrush(NSStructures::CBrush* pBrush)
(c_BrushTypeCylinderHor == Type) || (c_BrushTypeCylinderHor == Type) ||
(c_BrushTypeCylinderVer == Type)) (c_BrushTypeCylinderVer == Type))
{ {
Aggplus::CColor o1((BYTE)(pBrush->Alpha1 * m_dGlobalAlpha), pBrush->Color1); Aggplus::CColor o1((BYTE)(pBrush->Alpha1 * m_dGlobalAlpha), pBrush->Color1, bIsSwappedRGB);
Aggplus::CColor o2((BYTE)(pBrush->Alpha2 * m_dGlobalAlpha), pBrush->Color2); Aggplus::CColor o2((BYTE)(pBrush->Alpha2 * m_dGlobalAlpha), pBrush->Color2, bIsSwappedRGB);
Aggplus::CBrushLinearGradient* pNew = new Aggplus::CBrushLinearGradient( Aggplus::RectF(0.0f, 0.0f, 1.0f, 1.0f), o1, o2, (float)pBrush->LinearAngle, TRUE ); Aggplus::CBrushLinearGradient* pNew = new Aggplus::CBrushLinearGradient( Aggplus::RectF(0.0f, 0.0f, 1.0f, 1.0f), o1, o2, (float)pBrush->LinearAngle, TRUE );
if( pNew ) if( pNew )
...@@ -49,6 +53,13 @@ Aggplus::CBrush* CGraphicsRenderer::CreateBrush(NSStructures::CBrush* pBrush) ...@@ -49,6 +53,13 @@ Aggplus::CBrush* CGraphicsRenderer::CreateBrush(NSStructures::CBrush* pBrush)
BYTE b = (dwColor >> 8) & 0xFF; BYTE b = (dwColor >> 8) & 0xFF;
BYTE a = (dwColor) & 0xFF; BYTE a = (dwColor) & 0xFF;
if (bIsSwappedRGB)
{
BYTE tmp = r;
r = b;
b = tmp;
}
pColors[i] = Aggplus::CColor((BYTE)(a * m_dGlobalAlpha), b, g, r); pColors[i] = Aggplus::CColor((BYTE)(a * m_dGlobalAlpha), b, g, r);
pBlends[i] = (float)(pBrush->m_arrSubColors[i].position / 65536.0); pBlends[i] = (float)(pBrush->m_arrSubColors[i].position / 65536.0);
} }
...@@ -70,8 +81,8 @@ Aggplus::CBrush* CGraphicsRenderer::CreateBrush(NSStructures::CBrush* pBrush) ...@@ -70,8 +81,8 @@ Aggplus::CBrush* CGraphicsRenderer::CreateBrush(NSStructures::CBrush* pBrush)
} }
else if (c_BrushTypeHatch1 == Type) else if (c_BrushTypeHatch1 == Type)
{ {
Aggplus::CColor o1((BYTE)(pBrush->Alpha1 * m_dGlobalAlpha), pBrush->Color1); Aggplus::CColor o1((BYTE)(pBrush->Alpha1 * m_dGlobalAlpha), pBrush->Color1, bIsSwappedRGB);
Aggplus::CColor o2((BYTE)(pBrush->Alpha2 * m_dGlobalAlpha), pBrush->Color2); Aggplus::CColor o2((BYTE)(pBrush->Alpha2 * m_dGlobalAlpha), pBrush->Color2, bIsSwappedRGB);
Aggplus::CBrushHatch* pNew = new Aggplus::CBrushHatch(); Aggplus::CBrushHatch* pNew = new Aggplus::CBrushHatch();
pNew->m_dwColor1 = o1; pNew->m_dwColor1 = o1;
...@@ -1200,4 +1211,4 @@ void CGraphicsRenderer::AddRect(const double& x, const double& y, const double& ...@@ -1200,4 +1211,4 @@ void CGraphicsRenderer::AddRect(const double& x, const double& y, const double&
m_pPath->LineTo(x + w, y + h); m_pPath->LineTo(x + w, y + h);
m_pPath->LineTo(x, y + h); m_pPath->LineTo(x, y + h);
m_pPath->CloseFigure(); m_pPath->CloseFigure();
} }
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment