Kaydet (Commit) 74ac2c25 authored tarafından Caolán McNamara's avatar Caolán McNamara

work around lack of cairo_rectangle_int_t with basegfx

ditch the CAIRO_VERSION_ENCODE(1, 10, 0) + sub optional
damage rect and just use our always-available basegfx
foo here.

Change-Id: I680453180f4725ac37cabf38d71b935c99edf6c7
Reviewed-on: https://gerrit.libreoffice.org/21971Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst 2387d277
......@@ -37,26 +37,6 @@ public:
virtual bool ErrorTrapPop( bool ) { return false; }
};
void AndroidSalInstance::damaged(AndroidSalFrame* /* frame */)
{
static bool beenHere = false;
static jmethodID nCallbackDamaged = 0;
// Check if we are running in an app that has registered for damage callbacks
// static public void callbackDamaged();
// Call the Java layer to post an invalidate if necessary
if (appClass != 0 && !beenHere) {
nCallbackDamaged = m_pJNIEnv->GetStaticMethodID(appClass, "callbackDamaged", "()V");
if (nCallbackDamaged == 0)
LOGE("Could not find the callbackDamaged method");
beenHere = true;
}
if (appClass != 0 && nCallbackDamaged != 0)
m_pJNIEnv->CallStaticVoidMethod(appClass, nCallbackDamaged);
}
void AndroidSalInstance::GetWorkArea( Rectangle& rRect )
{
rRect = Rectangle( Point( 0, 0 ),
......@@ -131,16 +111,6 @@ public:
AndroidSalInstance::getInstance()->GetWorkArea( rRect );
}
virtual void damaged( const basegfx::B2IBox& rDamageRect)
{
if (rDamageRect.getWidth() <= 0 ||
rDamageRect.getHeight() <= 0)
{
return;
}
AndroidSalInstance::getInstance()->damaged( this );
}
virtual void UpdateSettings( AllSettings &rSettings )
{
// Clobber the UI fonts
......
......@@ -37,63 +37,51 @@
#include <cairo.h>
#if CAIRO_VERSION < CAIRO_VERSION_ENCODE(1, 10, 0)
# define CAIRO_OPERATOR_DIFFERENCE (static_cast<cairo_operator_t>(23))
struct _cairo_rectangle_int
{
int x, y;
int width, height;
};
#endif
namespace
{
cairo_rectangle_int_t getFillDamage(cairo_t* cr)
basegfx::B2DRange getClipBox(cairo_t* cr)
{
cairo_rectangle_int_t extents;
double x1, y1, x2, y2;
cairo_clip_extents(cr, &x1, &y1, &x2, &y2);
extents.x = x1, extents.y = y1, extents.width = x2-x1, extents.height = y2-y1;
#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 10, 0)
cairo_region_t *region = cairo_region_create_rectangle(&extents);
return basegfx::B2DRange(x1, y1, x2, y2);
}
basegfx::B2DRange getFillDamage(cairo_t* cr)
{
double x1, y1, x2, y2;
cairo_fill_extents(cr, &x1, &y1, &x2, &y2);
extents.x = x1, extents.y = y1, extents.width = x2-x1, extents.height = y2-y1;
cairo_region_intersect_rectangle(region, &extents);
cairo_region_get_extents(region, &extents);
cairo_region_destroy(region);
#endif
return basegfx::B2DRange(x1, y1, x2, y2);
}
return extents;
basegfx::B2DRange getClippedFillDamage(cairo_t* cr)
{
basegfx::B2DRange aDamageRect(getFillDamage(cr));
aDamageRect.intersect(getClipBox(cr));
return aDamageRect;
}
cairo_rectangle_int_t getStrokeDamage(cairo_t* cr)
basegfx::B2DRange getStrokeDamage(cairo_t* cr)
{
cairo_rectangle_int_t extents;
double x1, y1, x2, y2;
cairo_clip_extents(cr, &x1, &y1, &x2, &y2);
extents.x = x1, extents.y = y1, extents.width = x2-x1, extents.height = y2-y1;
#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 10, 0)
cairo_region_t *region = cairo_region_create_rectangle(&extents);
cairo_stroke_extents(cr, &x1, &y1, &x2, &y2);
extents.x = x1, extents.y = y1, extents.width = x2-x1, extents.height = y2-y1;
cairo_region_intersect_rectangle(region, &extents);
cairo_region_get_extents(region, &extents);
cairo_region_destroy(region);
#endif
return extents;
return basegfx::B2DRange(x1, y1, x2, y2);
}
basegfx::B2DRange getClippedStrokeDamage(cairo_t* cr)
{
basegfx::B2DRange aDamageRect(getStrokeDamage(cr));
aDamageRect.intersect(getClipBox(cr));
return aDamageRect;
}
}
#ifndef IOS
......@@ -243,7 +231,7 @@ bool SvpSalGraphics::drawAlphaBitmap( const SalTwoRect& rTR, const SalBitmap& rS
cairo_rectangle(cr, rTR.mnDestX, rTR.mnDestY, rTR.mnDestWidth, rTR.mnDestHeight);
cairo_rectangle_int_t extents = getFillDamage(cr);
basegfx::B2DRange extents = getClippedFillDamage(cr);
cairo_clip(cr);
......@@ -309,7 +297,7 @@ bool SvpSalGraphics::drawTransformedBitmap(
cairo_transform(cr, &matrix);
cairo_rectangle(cr, 0, 0, aSize.Width(), aSize.Height());
cairo_rectangle_int_t extents = getFillDamage(cr);
basegfx::B2DRange extents = getClippedFillDamage(cr);
cairo_clip(cr);
cairo_set_source_surface(cr, source, 0, 0);
......@@ -349,7 +337,7 @@ bool SvpSalGraphics::drawAlphaRect(long nX, long nY, long nWidth, long nHeight,
const double fTransparency = (100 - nTransparency) * (1.0/100);
cairo_rectangle_int_t extents = {0, 0, 0, 0};
basegfx::B2DRange extents;
cairo_rectangle(cr, nX, nY, nWidth, nHeight);
......@@ -361,7 +349,7 @@ bool SvpSalGraphics::drawAlphaRect(long nX, long nY, long nWidth, long nHeight,
fTransparency);
if (m_aLineColor == SALCOLOR_NONE)
extents = getFillDamage(cr);
extents = getClippedFillDamage(cr);
cairo_fill_preserve(cr);
}
......@@ -373,7 +361,7 @@ bool SvpSalGraphics::drawAlphaRect(long nX, long nY, long nWidth, long nHeight,
SALCOLOR_BLUE(m_aLineColor)/255.0,
fTransparency);
extents = getStrokeDamage(cr);
extents = getClippedStrokeDamage(cr);
cairo_stroke_preserve(cr);
}
......@@ -681,7 +669,7 @@ void SvpSalGraphics::drawLine( long nX1, long nY1, long nX2, long nY2 )
applyColor(cr, m_aLineColor);
cairo_rectangle_int_t extents = getStrokeDamage(cr);
basegfx::B2DRange extents = getClippedStrokeDamage(cr);
cairo_stroke(cr);
......@@ -765,12 +753,12 @@ bool SvpSalGraphics::drawPolyLine(
cairo_set_miter_limit(cr, 15.0);
cairo_rectangle_int_t extents = {0, 0, 0, 0};
basegfx::B2DRange extents;
if (!bNoJoin)
{
AddPolygonToPath(cr, rPolyLine, rPolyLine.isClosed(), !getAntiAliasB2DDraw(), true);
extents = getStrokeDamage(cr);
extents = getClippedStrokeDamage(cr);
cairo_stroke(cr);
}
else
......@@ -781,8 +769,6 @@ bool SvpSalGraphics::drawPolyLine(
aEdge.append(rPolyLine.getB2DPoint(0));
aEdge.append(basegfx::B2DPoint(0.0, 0.0));
std::vector<cairo_rectangle_int_t> aExtents;
aExtents.reserve(nEdgeCount);
for (sal_uInt32 i = 0; i < nEdgeCount; ++i)
{
const sal_uInt32 nNextIndex((i + 1) % nPointCount);
......@@ -791,21 +777,16 @@ bool SvpSalGraphics::drawPolyLine(
aEdge.setPrevControlPoint(1, rPolyLine.getPrevControlPoint(nNextIndex));
AddPolygonToPath(cr, aEdge, false, !getAntiAliasB2DDraw(), true);
aExtents.push_back(getStrokeDamage(cr));
extents.expand(getStrokeDamage(cr));
cairo_stroke(cr);
// prepare next step
aEdge.setB2DPoint(0, aEdge.getB2DPoint(1));
}
#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 10, 0)
cairo_region_t* pRegion = cairo_region_create_rectangles(aExtents.data(), aExtents.size());
cairo_region_get_extents(pRegion, &extents);
cairo_region_destroy(pRegion);
#else
if (!aExtents.empty())
extents = aExtents[0];
#endif
extents.intersect(getClipBox(cr));
}
releaseCairoContext(cr, false, extents);
......@@ -852,7 +833,7 @@ bool SvpSalGraphics::drawPolyPolygon(const basegfx::B2DPolyPolygon& rPolyPoly, d
setupPolyPolygon(cr, rPolyPoly);
cairo_rectangle_int_t extents = {0, 0, 0, 0};
basegfx::B2DRange extents;
if (m_aFillColor != SALCOLOR_NONE)
{
......@@ -862,7 +843,7 @@ bool SvpSalGraphics::drawPolyPolygon(const basegfx::B2DPolyPolygon& rPolyPoly, d
1.0-fTransparency);
if (m_aLineColor == SALCOLOR_NONE)
extents = getFillDamage(cr);
extents = getClippedFillDamage(cr);
cairo_fill_preserve(cr);
}
......@@ -874,7 +855,7 @@ bool SvpSalGraphics::drawPolyPolygon(const basegfx::B2DPolyPolygon& rPolyPoly, d
SALCOLOR_BLUE(m_aLineColor)/255.0,
1.0-fTransparency);
extents = getStrokeDamage(cr);
extents = getClippedStrokeDamage(cr);
cairo_stroke_preserve(cr);
}
......@@ -907,20 +888,20 @@ void SvpSalGraphics::drawPolyPolygon(const basegfx::B2DPolyPolygon& rPolyPoly)
setupPolyPolygon(cr, rPolyPoly);
cairo_rectangle_int_t extents = {0, 0, 0, 0};
basegfx::B2DRange extents;
if (m_aFillColor != SALCOLOR_NONE)
{
applyColor(cr, m_aFillColor);
if (m_aLineColor == SALCOLOR_NONE)
extents = getFillDamage(cr);
extents = getClippedFillDamage(cr);
cairo_fill_preserve(cr);
}
if (m_aLineColor != SALCOLOR_NONE)
{
applyColor(cr, m_aLineColor);
extents = getStrokeDamage(cr);
extents = getClippedStrokeDamage(cr);
cairo_stroke_preserve(cr);
}
......@@ -939,12 +920,12 @@ void SvpSalGraphics::copyArea( long nDestX,
copyBits(aTR, this);
}
static cairo_rectangle_int_t renderSource(cairo_t* cr, const SalTwoRect& rTR,
static basegfx::B2DRange renderSource(cairo_t* cr, const SalTwoRect& rTR,
cairo_surface_t* source)
{
cairo_rectangle(cr, rTR.mnDestX, rTR.mnDestY, rTR.mnDestWidth, rTR.mnDestHeight);
cairo_rectangle_int_t extents = getFillDamage(cr);
basegfx::B2DRange extents = getClippedFillDamage(cr);
cairo_clip(cr);
......@@ -962,7 +943,7 @@ void SvpSalGraphics::copySource( const SalTwoRect& rTR,
cairo_t* cr = getCairoContext(false);
clipRegion(cr);
cairo_rectangle_int_t extents = renderSource(cr, rTR, source);
basegfx::B2DRange extents = renderSource(cr, rTR, source);
releaseCairoContext(cr, false, extents);
}
......@@ -1089,7 +1070,7 @@ void SvpSalGraphics::drawMask( const SalTwoRect& rTR,
cairo_rectangle(cr, rTR.mnDestX, rTR.mnDestY, rTR.mnDestWidth, rTR.mnDestHeight);
cairo_rectangle_int_t extents = getFillDamage(cr);
basegfx::B2DRange extents = getClippedFillDamage(cr);
cairo_clip(cr);
......@@ -1156,7 +1137,7 @@ void SvpSalGraphics::invert(const basegfx::B2DPolygon &rPoly, SalInvert nFlags)
cairo_t* cr = getCairoContext(false);
clipRegion(cr);
cairo_rectangle_int_t extents = {0, 0, 0, 0};
basegfx::B2DRange extents;
AddPolygonToPath(cr, rPoly, true, !getAntiAliasB2DDraw(), false);
......@@ -1177,13 +1158,13 @@ void SvpSalGraphics::invert(const basegfx::B2DPolygon &rPoly, SalInvert nFlags)
const double dashLengths[2] = { 4.0, 4.0 };
cairo_set_dash(cr, dashLengths, 2, 0);
extents = getStrokeDamage(cr);
extents = getClippedStrokeDamage(cr);
cairo_stroke(cr);
}
else
{
extents = getFillDamage(cr);
extents = getClippedFillDamage(cr);
cairo_clip(cr);
......@@ -1297,10 +1278,10 @@ cairo_user_data_key_t* SvpSalGraphics::getDamageKey()
return &aDamageKey;
}
void SvpSalGraphics::releaseCairoContext(cairo_t* cr, bool bXorModeAllowed, const cairo_rectangle_int_t& extents) const
void SvpSalGraphics::releaseCairoContext(cairo_t* cr, bool bXorModeAllowed, const basegfx::B2DRange& rExtents) const
{
sal_Int32 nExtentsLeft(extents.x), nExtentsTop(extents.y);
sal_Int32 nExtentsRight(extents.x + extents.width), nExtentsBottom(extents.y + extents.height);
sal_Int32 nExtentsLeft(rExtents.getMinX()), nExtentsTop(rExtents.getMinY());
sal_Int32 nExtentsRight(rExtents.getMaxX()), nExtentsBottom(rExtents.getMaxY());
sal_Int32 nWidth = cairo_image_surface_get_width(m_pSurface);
sal_Int32 nHeight = cairo_image_surface_get_height(m_pSurface);
nExtentsLeft = std::max<sal_Int32>(nExtentsLeft, 0);
......
......@@ -38,8 +38,6 @@ public:
// mainloop pieces
virtual bool AnyInput( VclInputFlags nType );
void damaged(AndroidSalFrame *frame);
};
#endif // INCLUDED_VCL_INC_ANDROID_ANDROIDINST_HXX
......
......@@ -48,7 +48,6 @@ class GlyphCache;
class ServerFont;
typedef struct _cairo cairo_t;
typedef struct _cairo_surface cairo_surface_t;
typedef struct _cairo_rectangle_int cairo_rectangle_int_t;
typedef struct _cairo_user_data_key cairo_user_data_key_t;
enum PaintMode { OVERPAINT, XOR, INVERT };
......@@ -218,7 +217,7 @@ public:
#endif // ENABLE_CAIRO_CANVAS
cairo_t* getCairoContext(bool bXorModeAllowed) const;
void releaseCairoContext(cairo_t* cr, bool bXorModeAllowed, const cairo_rectangle_int_t& extents) const;
void releaseCairoContext(cairo_t* cr, bool bXorModeAllowed, const basegfx::B2DRange& rExtents) const;
static cairo_surface_t* createCairoSurface(const BitmapBuffer *pBuffer);
void clipRegion(cairo_t* cr);
};
......
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