From 7fb2533bb044e7b48fb2495e4c07d868bd97b812 Mon Sep 17 00:00:00 2001 From: jules Date: Thu, 8 Aug 2013 18:01:47 +0100 Subject: [PATCH] Some rendering fixes. --- .../contexts/juce_LowLevelGraphicsContext.h | 3 +-- ...uce_LowLevelGraphicsPostScriptRenderer.cpp | 7 ++---- .../juce_LowLevelGraphicsPostScriptRenderer.h | 1 + .../native/juce_RenderingHelpers.h | 23 +++++++++++++++---- .../native/juce_mac_NSViewComponentPeer.mm | 8 +++---- 5 files changed, 27 insertions(+), 15 deletions(-) diff --git a/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h b/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h index c82c19731f..92298fa789 100644 --- a/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h +++ b/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h @@ -67,8 +67,7 @@ public: virtual void setOrigin (int x, int y) = 0; virtual void addTransform (const AffineTransform&) = 0; virtual float getScaleFactor() = 0; - - virtual float getTargetDeviceScaleFactor() { return 1.0f; } + virtual float getTargetDeviceScaleFactor() = 0; virtual bool clipToRectangle (const Rectangle&) = 0; virtual bool clipToRectangleList (const RectangleList&) = 0; diff --git a/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp b/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp index fb0be4ff47..bd04f52cac 100644 --- a/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp +++ b/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp @@ -105,11 +105,8 @@ void LowLevelGraphicsPostScriptRenderer::addTransform (const AffineTransform& /* jassertfalse; } -float LowLevelGraphicsPostScriptRenderer::getScaleFactor() -{ - jassertfalse; //xxx - return 1.0f; -} +float LowLevelGraphicsPostScriptRenderer::getScaleFactor() { return 1.0f; } +float LowLevelGraphicsPostScriptRenderer::getTargetDeviceScaleFactor() { return 1.0f; } bool LowLevelGraphicsPostScriptRenderer::clipToRectangle (const Rectangle& r) { diff --git a/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h b/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h index d46760a3ef..3c6d8b0eab 100644 --- a/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h +++ b/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h @@ -50,6 +50,7 @@ public: void setOrigin (int x, int y) override; void addTransform (const AffineTransform&) override; float getScaleFactor() override; + float getTargetDeviceScaleFactor() override; bool clipToRectangle (const Rectangle&) override; bool clipToRectangleList (const RectangleList&) override; diff --git a/modules/juce_graphics/native/juce_RenderingHelpers.h b/modules/juce_graphics/native/juce_RenderingHelpers.h index 14207438a1..9939a58d5b 100644 --- a/modules/juce_graphics/native/juce_RenderingHelpers.h +++ b/modules/juce_graphics/native/juce_RenderingHelpers.h @@ -94,7 +94,10 @@ public: float getScaleFactor() const noexcept { - return isOnlyTranslated ? 1.0f : complexTransform.getScaleFactor(); + return isOnlyTranslated ? 1.0f + : (isRotated ? complexTransform.getScaleFactor() + : jmax (complexTransform.mat00, + complexTransform.mat11)); } void moveOriginInDeviceSpace (const int dx, const int dy) noexcept @@ -1892,7 +1895,8 @@ struct ClipRegions const int clipTop = i->getY(); const int clipBottom = i->getBottom(); - if (f.totalBottom > clipTop && f.totalTop < clipBottom && f.totalRight > clipLeft && f.totalLeft < clipRight) + if (f.totalBottom > clipTop && f.totalTop < clipBottom + && f.totalRight > clipLeft && f.totalLeft < clipRight) { if (f.isOnePixelWide()) { @@ -2052,6 +2056,16 @@ public: return clip != nullptr; } + static Rectangle getLargestIntegerWithin (Rectangle r) + { + const int x1 = (int) std::ceil (r.getX()); + const int y1 = (int) std::ceil (r.getY()); + const int x2 = (int) std::floor (r.getRight()); + const int y2 = (int) std::floor (r.getBottom()); + + return Rectangle (x1, y1, x2 - x1, y2 - y1); + } + bool excludeClipRectangle (const Rectangle& r) { if (clip != nullptr) @@ -2060,11 +2074,11 @@ public: if (transform.isOnlyTranslated) { - clip = clip->excludeClipRectangle (transform.translated (r)); + clip = clip->excludeClipRectangle (getLargestIntegerWithin (transform.translated (r.toFloat()))); } else if (! transform.isRotated) { - clip = clip->excludeClipRectangle (transform.transformed (r)); + clip = clip->excludeClipRectangle (getLargestIntegerWithin (transform.transformed (r.toFloat()))); } else { @@ -2543,6 +2557,7 @@ public: void setOrigin (int x, int y) override { stack->transform.setOrigin (x, y); } void addTransform (const AffineTransform& t) override { stack->transform.addTransform (t); } float getScaleFactor() override { return stack->transform.getScaleFactor(); } + float getTargetDeviceScaleFactor() override { return stack->transform.getScaleFactor(); } Rectangle getClipBounds() const override { return stack->getClipBounds(); } bool isClipEmpty() const override { return stack->clip == nullptr; } bool clipRegionIntersects (const Rectangle& r) override { return stack->clipRegionIntersects (r); } diff --git a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm index 4e8741e912..87e0dc4786 100644 --- a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm @@ -365,12 +365,12 @@ public: bool contains (Point localPos, bool trueIfInAChildWindow) const override { - if (! (isPositiveAndBelow (localPos.getX(), component.getWidth()) - && isPositiveAndBelow (localPos.getY(), component.getHeight()))) - return false; - NSRect frameRect = [view frame]; + if (! (isPositiveAndBelow (localPos.getX(), (int) frameRect.size.width) + && isPositiveAndBelow (localPos.getY(), (int) frameRect.size.height))) + return false; + NSView* v = [view hitTest: NSMakePoint (frameRect.origin.x + localPos.getX(), frameRect.origin.y + frameRect.size.height - localPos.getY())];