@@ -58,7 +58,7 @@ public: | |||||
getSDKPath() = "${user.home}/SDKs/android-sdk-mac_x86"; | getSDKPath() = "${user.home}/SDKs/android-sdk-mac_x86"; | ||||
if (getNDKPath().toString().isEmpty()) | if (getNDKPath().toString().isEmpty()) | ||||
getNDKPath() = "${user.home}/SDKs/android-ndk-r5"; | |||||
getNDKPath() = "${user.home}/SDKs/android-ndk-r6b"; | |||||
if (getInternetNeeded().toString().isEmpty()) | if (getInternetNeeded().toString().isEmpty()) | ||||
getInternetNeeded() = true; | getInternetNeeded() = true; | ||||
@@ -156,9 +156,13 @@ protected: | |||||
} | } | ||||
//============================================================================== | //============================================================================== | ||||
void writeSolutionFile (OutputStream& out, const String& versionString, const File& vcProject) | |||||
void writeSolutionFile (OutputStream& out, const String& versionString, String commentString, const File& vcProject) | |||||
{ | { | ||||
if (commentString.isNotEmpty()) | |||||
commentString += newLine; | |||||
out << "Microsoft Visual Studio Solution File, Format Version " << versionString << newLine | out << "Microsoft Visual Studio Solution File, Format Version " << versionString << newLine | ||||
<< commentString | |||||
<< "Project(\"" << createGUID (projectName + "sln_guid") << "\") = \"" << projectName << "\", \"" | << "Project(\"" << createGUID (projectName + "sln_guid") << "\") = \"" << projectName << "\", \"" | ||||
<< vcProject.getFileName() << "\", \"" << projectGUID << '"' << newLine | << vcProject.getFileName() << "\", \"" << projectGUID << '"' << newLine | ||||
<< "EndProject" << newLine | << "EndProject" << newLine | ||||
@@ -395,7 +399,7 @@ public: | |||||
{ | { | ||||
MemoryOutputStream mo; | MemoryOutputStream mo; | ||||
writeSolutionFile (mo, getSolutionVersionString(), getVCProjFile()); | |||||
writeSolutionFile (mo, getSolutionVersionString(), String::empty, getVCProjFile()); | |||||
overwriteFileIfDifferentOrThrow (getSLNFile(), mo); | overwriteFileIfDifferentOrThrow (getSLNFile(), mo); | ||||
} | } | ||||
@@ -1037,7 +1041,7 @@ public: | |||||
{ | { | ||||
MemoryOutputStream mo; | MemoryOutputStream mo; | ||||
writeSolutionFile (mo, "11.00", getVCProjFile()); | |||||
writeSolutionFile (mo, "11.00", "# Visual Studio 2010", getVCProjFile()); | |||||
overwriteFileIfDifferentOrThrow (getSLNFile(), mo); | overwriteFileIfDifferentOrThrow (getSLNFile(), mo); | ||||
} | } | ||||
@@ -1,4 +1,5 @@ | |||||
Microsoft Visual Studio Solution File, Format Version 11.00 | Microsoft Visual Studio Solution File, Format Version 11.00 | ||||
# Visual Studio 2010 | |||||
Project("{B49533A3-E69B-E288-783B-47C939C7FB33}") = "Juce Demo", "Juce Demo.vcxproj", "{E9F746BA-9271-B101-E5E2-1615849AF13D}" | Project("{B49533A3-E69B-E288-783B-47C939C7FB33}") = "Juce Demo", "Juce Demo.vcxproj", "{E9F746BA-9271-B101-E5E2-1615849AF13D}" | ||||
EndProject | EndProject | ||||
Global | Global | ||||
@@ -1,4 +1,5 @@ | |||||
Microsoft Visual Studio Solution File, Format Version 11.00 | Microsoft Visual Studio Solution File, Format Version 11.00 | ||||
# Visual Studio 2010 | |||||
Project("{BA4B9728-10E7-5D2D-B621-D98C8C6069F5}") = "juce", "juce.vcxproj", "{6C6FE871-80B5-5611-1C8D-17A6CCA9ADFA}" | Project("{BA4B9728-10E7-5D2D-B621-D98C8C6069F5}") = "juce", "juce.vcxproj", "{6C6FE871-80B5-5611-1C8D-17A6CCA9ADFA}" | ||||
EndProject | EndProject | ||||
Global | Global | ||||
@@ -1,4 +1,5 @@ | |||||
Microsoft Visual Studio Solution File, Format Version 11.00 | Microsoft Visual Studio Solution File, Format Version 11.00 | ||||
# Visual Studio 2010 | |||||
Project("{564A18DF-F8DA-8D8F-D473-CFFE700460BA}") = "Jucer", "Jucer.vcxproj", "{47850045-7AC4-D12B-6F23-A2E7E3B3617A}" | Project("{564A18DF-F8DA-8D8F-D473-CFFE700460BA}") = "Jucer", "Jucer.vcxproj", "{47850045-7AC4-D12B-6F23-A2E7E3B3617A}" | ||||
EndProject | EndProject | ||||
Global | Global | ||||
@@ -375,6 +375,7 @@ String Time::formatted (const String& format) const | |||||
//============================================================================== | //============================================================================== | ||||
int Time::getYear() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_year + 1900; } | int Time::getYear() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_year + 1900; } | ||||
int Time::getMonth() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_mon; } | int Time::getMonth() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_mon; } | ||||
int Time::getDayOfYear() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_yday; } | |||||
int Time::getDayOfMonth() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_mday; } | int Time::getDayOfMonth() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_mday; } | ||||
int Time::getDayOfWeek() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_wday; } | int Time::getDayOfWeek() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_wday; } | ||||
int Time::getHours() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_hour; } | int Time::getHours() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_hour; } | ||||
@@ -132,17 +132,20 @@ public: | |||||
String getMonthName (bool threeLetterVersion) const; | String getMonthName (bool threeLetterVersion) const; | ||||
/** Returns the day of the month. | /** Returns the day of the month. | ||||
The value returned is in the range 1 to 31. | The value returned is in the range 1 to 31. | ||||
*/ | */ | ||||
int getDayOfMonth() const noexcept; | int getDayOfMonth() const noexcept; | ||||
/** Returns the number of the day of the week. | /** Returns the number of the day of the week. | ||||
The value returned is in the range 0 to 6 (0 = sunday, 1 = monday, etc). | The value returned is in the range 0 to 6 (0 = sunday, 1 = monday, etc). | ||||
*/ | */ | ||||
int getDayOfWeek() const noexcept; | int getDayOfWeek() const noexcept; | ||||
/** Returns the number of the day of the year. | |||||
The value returned is in the range 0 to 365. | |||||
*/ | |||||
int getDayOfYear() const noexcept; | |||||
/** Returns the name of the weekday. | /** Returns the name of the weekday. | ||||
@param threeLetterVersion if true, it'll return a 3-letter abbreviation, e.g. "Tue"; if | @param threeLetterVersion if true, it'll return a 3-letter abbreviation, e.g. "Tue"; if | ||||
@@ -684,12 +684,14 @@ var ValueTree::getProperty (const Identifier& name, const var& defaultReturnValu | |||||
return object == nullptr ? defaultReturnValue : object->getProperty (name, defaultReturnValue); | return object == nullptr ? defaultReturnValue : object->getProperty (name, defaultReturnValue); | ||||
} | } | ||||
void ValueTree::setProperty (const Identifier& name, const var& newValue, UndoManager* const undoManager) | |||||
ValueTree& ValueTree::setProperty (const Identifier& name, const var& newValue, UndoManager* const undoManager) | |||||
{ | { | ||||
jassert (name.toString().isNotEmpty()); | jassert (name.toString().isNotEmpty()); | ||||
if (object != nullptr && name.toString().isNotEmpty()) | if (object != nullptr && name.toString().isNotEmpty()) | ||||
object->setProperty (name, newValue, undoManager); | object->setProperty (name, newValue, undoManager); | ||||
return *this; | |||||
} | } | ||||
bool ValueTree::hasProperty (const Identifier& name) const | bool ValueTree::hasProperty (const Identifier& name) const | ||||
@@ -167,8 +167,9 @@ public: | |||||
If the undoManager parameter is non-null, its UndoManager::perform() method will be used, | If the undoManager parameter is non-null, its UndoManager::perform() method will be used, | ||||
so that this change can be undone. | so that this change can be undone. | ||||
@see var, getProperty, removeProperty | @see var, getProperty, removeProperty | ||||
@returns a reference to the value tree, so that you can daisy-chain calls to this method. | |||||
*/ | */ | ||||
void setProperty (const Identifier& name, const var& newValue, UndoManager* undoManager); | |||||
ValueTree& setProperty (const Identifier& name, const var& newValue, UndoManager* undoManager); | |||||
/** Returns true if the node contains a named property. */ | /** Returns true if the node contains a named property. */ | ||||
bool hasProperty (const Identifier& name) const; | bool hasProperty (const Identifier& name) const; | ||||
@@ -144,5 +144,11 @@ bool FillType::isInvisible() const noexcept | |||||
return colour.isTransparent() || (gradient != nullptr && gradient->isInvisible()); | return colour.isTransparent() || (gradient != nullptr && gradient->isInvisible()); | ||||
} | } | ||||
FillType FillType::transformed (const AffineTransform& t) const | |||||
{ | |||||
FillType f (*this); | |||||
f.transform = f.transform.followedBy (t); | |||||
return f; | |||||
} | |||||
END_JUCE_NAMESPACE | END_JUCE_NAMESPACE |
@@ -112,6 +112,11 @@ public: | |||||
/** Returns true if this fill type is completely transparent. */ | /** Returns true if this fill type is completely transparent. */ | ||||
bool isInvisible() const noexcept; | bool isInvisible() const noexcept; | ||||
/** Returns a copy of this fill, adding the specified transform applied to the | |||||
existing transform. | |||||
*/ | |||||
FillType transformed (const AffineTransform& transform) const; | |||||
//============================================================================== | //============================================================================== | ||||
/** The solid colour being used. | /** The solid colour being used. | ||||
@@ -49,19 +49,15 @@ public: | |||||
~LowLevelGraphicsSoftwareRenderer(); | ~LowLevelGraphicsSoftwareRenderer(); | ||||
bool isVectorDevice() const; | bool isVectorDevice() const; | ||||
//============================================================================== | |||||
void setOrigin (int x, int y); | void setOrigin (int x, int y); | ||||
void addTransform (const AffineTransform& transform); | |||||
void addTransform (const AffineTransform&); | |||||
float getScaleFactor(); | float getScaleFactor(); | ||||
bool clipToRectangle (const Rectangle<int>& r); | |||||
bool clipToRectangleList (const RectangleList& clipRegion); | |||||
void excludeClipRectangle (const Rectangle<int>& r); | |||||
void clipToPath (const Path& path, const AffineTransform& transform); | |||||
void clipToImageAlpha (const Image& sourceImage, const AffineTransform& transform); | |||||
bool clipRegionIntersects (const Rectangle<int>& r); | |||||
bool clipToRectangle (const Rectangle<int>&); | |||||
bool clipToRectangleList (const RectangleList&); | |||||
void excludeClipRectangle (const Rectangle<int>&); | |||||
void clipToPath (const Path&, const AffineTransform&); | |||||
void clipToImageAlpha (const Image&, const AffineTransform&); | |||||
bool clipRegionIntersects (const Rectangle<int>&); | |||||
Rectangle<int> getClipBounds() const; | Rectangle<int> getClipBounds() const; | ||||
bool isClipEmpty() const; | bool isClipEmpty() const; | ||||
@@ -71,29 +67,25 @@ public: | |||||
void beginTransparencyLayer (float opacity); | void beginTransparencyLayer (float opacity); | ||||
void endTransparencyLayer(); | void endTransparencyLayer(); | ||||
//============================================================================== | |||||
void setFill (const FillType& fillType); | |||||
void setFill (const FillType&); | |||||
void setOpacity (float opacity); | void setOpacity (float opacity); | ||||
void setInterpolationQuality (Graphics::ResamplingQuality quality); | |||||
void setInterpolationQuality (Graphics::ResamplingQuality); | |||||
//============================================================================== | |||||
void fillRect (const Rectangle<int>& r, bool replaceExistingContents); | |||||
void fillPath (const Path& path, const AffineTransform& transform); | |||||
void fillRect (const Rectangle<int>&, bool replaceExistingContents); | |||||
void fillPath (const Path&, const AffineTransform&); | |||||
void drawImage (const Image& sourceImage, const AffineTransform& transform); | |||||
void drawImage (const Image&, const AffineTransform&); | |||||
void drawLine (const Line <float>& line); | void drawLine (const Line <float>& line); | ||||
void drawVerticalLine (int x, float top, float bottom); | void drawVerticalLine (int x, float top, float bottom); | ||||
void drawHorizontalLine (int x, float top, float bottom); | void drawHorizontalLine (int x, float top, float bottom); | ||||
//============================================================================== | |||||
void setFont (const Font& newFont); | |||||
void setFont (const Font&); | |||||
Font getFont(); | Font getFont(); | ||||
void drawGlyph (int glyphNumber, float x, float y); | void drawGlyph (int glyphNumber, float x, float y); | ||||
void drawGlyph (int glyphNumber, const AffineTransform& transform); | |||||
void drawGlyph (int glyphNumber, const AffineTransform&); | |||||
//============================================================================== | |||||
#ifndef DOXYGEN | #ifndef DOXYGEN | ||||
class SavedState; | class SavedState; | ||||
#endif | #endif | ||||
@@ -139,8 +139,6 @@ public: | |||||
return; | return; | ||||
#endif | #endif | ||||
OpenGLHelpers::resetErrorState(); | |||||
glGenFramebuffersEXT (1, &frameBufferHandle); | glGenFramebuffersEXT (1, &frameBufferHandle); | ||||
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, frameBufferHandle); | glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, frameBufferHandle); | ||||
@@ -302,6 +300,8 @@ bool OpenGLFrameBuffer::initialise (const OpenGLFrameBuffer& other) | |||||
glColor4f (1.0f, 1.0f, 1.0f, 1.0f); | glColor4f (1.0f, 1.0f, 1.0f, 1.0f); | ||||
other.drawAt (0, 0); | other.drawAt (0, 0); | ||||
pimpl->unbind(); | pimpl->unbind(); | ||||
return true; | |||||
} | } | ||||
return false; | return false; | ||||
@@ -384,9 +384,8 @@ bool OpenGLFrameBuffer::readPixels (PixelARGB* target, const Rectangle<int>& are | |||||
return false; | return false; | ||||
glPixelStorei (GL_PACK_ALIGNMENT, 4); | glPixelStorei (GL_PACK_ALIGNMENT, 4); | ||||
glReadPixels (area.getX(), area.getY(), area.getWidth(), area.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE, target); | |||||
glReadPixels (area.getX(), area.getY(), area.getWidth(), area.getHeight(), GL_BGRA_EXT, GL_UNSIGNED_BYTE, target); | |||||
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0); | glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0); | ||||
return true; | return true; | ||||
} | } | ||||
@@ -395,8 +394,6 @@ bool OpenGLFrameBuffer::writePixels (const PixelARGB* data, const Rectangle<int> | |||||
if (! makeCurrentRenderingTarget()) | if (! makeCurrentRenderingTarget()) | ||||
return false; | return false; | ||||
const int invertedY = pimpl->height - area.getBottom(); | |||||
OpenGLHelpers::prepareFor2D (pimpl->width, pimpl->height); | OpenGLHelpers::prepareFor2D (pimpl->width, pimpl->height); | ||||
glDisable (GL_DEPTH_TEST); | glDisable (GL_DEPTH_TEST); | ||||
glDisable (GL_BLEND); | glDisable (GL_BLEND); | ||||
@@ -414,11 +411,11 @@ bool OpenGLFrameBuffer::writePixels (const PixelARGB* data, const Rectangle<int> | |||||
const GLint cropRect[4] = { 0, 0, area.getWidth(), area.getHeight() }; | const GLint cropRect[4] = { 0, 0, area.getWidth(), area.getHeight() }; | ||||
glTexParameteriv (GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, cropRect); | glTexParameteriv (GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, cropRect); | ||||
glDrawTexiOES (area.getX(), invertedY, 1, area.getWidth(), area.getHeight()); | |||||
glDrawTexiOES (area.getX(), area.getY(), 1, area.getWidth(), area.getHeight()); | |||||
glBindTexture (GL_TEXTURE_2D, 0); | glBindTexture (GL_TEXTURE_2D, 0); | ||||
} | } | ||||
#else | #else | ||||
glRasterPos2i (area.getX(), invertedY); | |||||
glRasterPos2i (area.getX(), area.getY()); | |||||
glBindTexture (GL_TEXTURE_2D, 0); | glBindTexture (GL_TEXTURE_2D, 0); | ||||
glPixelStorei (GL_UNPACK_ALIGNMENT, 4); | glPixelStorei (GL_UNPACK_ALIGNMENT, 4); | ||||
glDrawPixels (area.getWidth(), area.getHeight(), GL_BGRA_EXT, GL_UNSIGNED_BYTE, data); | glDrawPixels (area.getWidth(), area.getHeight(), GL_BGRA_EXT, GL_UNSIGNED_BYTE, data); | ||||
@@ -163,6 +163,12 @@ void OpenGLHelpers::applyTransform (const AffineTransform& t) | |||||
glMultMatrixf (m); | glMultMatrixf (m); | ||||
} | } | ||||
void OpenGLHelpers::enableScissorTest (const Rectangle<int>& clip) | |||||
{ | |||||
glEnable (GL_SCISSOR_TEST); | |||||
glScissor (clip.getX(), clip.getY(), clip.getWidth(), clip.getHeight()); | |||||
} | |||||
void OpenGLHelpers::drawQuad2D (float x1, float y1, | void OpenGLHelpers::drawQuad2D (float x1, float y1, | ||||
float x2, float y2, | float x2, float y2, | ||||
float x3, float y3, | float x3, float y3, | ||||
@@ -210,140 +216,6 @@ void OpenGLHelpers::drawQuad3D (float x1, float y1, float z1, | |||||
} | } | ||||
//============================================================================== | //============================================================================== | ||||
namespace OpenGLGradientHelpers | |||||
{ | |||||
void drawTriangles (GLenum mode, const GLfloat* vertices, const GLfloat* textureCoords, const int numElements) | |||||
{ | |||||
glEnable (GL_TEXTURE_2D); | |||||
glEnableClientState (GL_VERTEX_ARRAY); | |||||
glEnableClientState (GL_TEXTURE_COORD_ARRAY); | |||||
glDisableClientState (GL_COLOR_ARRAY); | |||||
glDisableClientState (GL_NORMAL_ARRAY); | |||||
glVertexPointer (2, GL_FLOAT, 0, vertices); | |||||
glTexCoordPointer (2, GL_FLOAT, 0, textureCoords); | |||||
glColor4f (1.0f, 1.0f, 1.0f, 1.0f); | |||||
glDrawArrays (mode, 0, numElements); | |||||
} | |||||
void fillWithLinearGradient (const Rectangle<int>& rect, | |||||
const ColourGradient& grad, | |||||
const AffineTransform& transform, | |||||
const int textureSize) | |||||
{ | |||||
const Point<float> p1 (grad.point1.transformedBy (transform)); | |||||
const Point<float> p2 (grad.point2.transformedBy (transform)); | |||||
const Point<float> p3 (Point<float> (grad.point1.getX() - (grad.point2.getY() - grad.point1.getY()) / textureSize, | |||||
grad.point1.getY() + (grad.point2.getX() - grad.point1.getX()) / textureSize).transformedBy (transform)); | |||||
const AffineTransform textureTransform (AffineTransform::fromTargetPoints (p1.getX(), p1.getY(), 0.0f, 0.0f, | |||||
p2.getX(), p2.getY(), 1.0f, 0.0f, | |||||
p3.getX(), p3.getY(), 0.0f, 1.0f)); | |||||
const GLfloat l = (GLfloat) rect.getX(); | |||||
const GLfloat r = (GLfloat) rect.getRight(); | |||||
const GLfloat t = (GLfloat) rect.getY(); | |||||
const GLfloat b = (GLfloat) rect.getBottom(); | |||||
const GLfloat vertices[] = { l, t, r, t, l, b, r, b }; | |||||
GLfloat textureCoords[] = { l, t, r, t, l, b, r, b }; | |||||
textureTransform.transformPoints (textureCoords[0], textureCoords[1], textureCoords[2], textureCoords[3]); | |||||
textureTransform.transformPoints (textureCoords[4], textureCoords[5], textureCoords[6], textureCoords[7]); | |||||
drawTriangles (GL_TRIANGLE_STRIP, vertices, textureCoords, 4); | |||||
} | |||||
void fillWithRadialGradient (const Rectangle<int>& rect, | |||||
const ColourGradient& grad, | |||||
const AffineTransform& transform) | |||||
{ | |||||
const Point<float> centre (grad.point1.transformedBy (transform)); | |||||
const float screenRadius = centre.getDistanceFrom (rect.getCentre().toFloat()) | |||||
+ Point<int> (rect.getWidth() / 2, | |||||
rect.getHeight() / 2).getDistanceFromOrigin() | |||||
+ 8.0f; | |||||
const AffineTransform inverse (transform.inverted()); | |||||
const float sourceRadius = jmax (Point<float> (screenRadius, 0.0f).transformedBy (inverse).getDistanceFromOrigin(), | |||||
Point<float> (0.0f, screenRadius).transformedBy (inverse).getDistanceFromOrigin()); | |||||
const int numDivisions = 90; | |||||
GLfloat vertices [4 + numDivisions * 2]; | |||||
GLfloat textureCoords [4 + numDivisions * 2]; | |||||
{ | |||||
GLfloat* t = textureCoords; | |||||
*t++ = 0.0f; | |||||
*t++ = 0.0f; | |||||
const GLfloat texturePos = sourceRadius / grad.point1.getDistanceFrom (grad.point2); | |||||
for (int i = numDivisions + 1; --i >= 0;) | |||||
{ | |||||
*t++ = texturePos; | |||||
*t++ = 0.0f; | |||||
} | |||||
} | |||||
{ | |||||
GLfloat* v = vertices; | |||||
*v++ = centre.getX(); | |||||
*v++ = centre.getY(); | |||||
const Point<float> first (grad.point1.translated (0, -sourceRadius) | |||||
.transformedBy (transform)); | |||||
*v++ = first.getX(); | |||||
*v++ = first.getY(); | |||||
for (int i = 1; i < numDivisions; ++i) | |||||
{ | |||||
const float angle = i * (float_Pi * 2.0f / numDivisions); | |||||
const Point<float> p (grad.point1.translated (std::sin (angle) * sourceRadius, | |||||
std::cos (angle) * -sourceRadius) | |||||
.transformedBy (transform)); | |||||
*v++ = p.getX(); | |||||
*v++ = p.getY(); | |||||
} | |||||
*v++ = first.getX(); | |||||
*v++ = first.getY(); | |||||
} | |||||
glEnable (GL_SCISSOR_TEST); | |||||
glScissor (rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight()); | |||||
drawTriangles (GL_TRIANGLE_FAN, vertices, textureCoords, numDivisions + 2); | |||||
glDisable (GL_SCISSOR_TEST); | |||||
} | |||||
} | |||||
void OpenGLHelpers::fillRectWithColourGradient (const Rectangle<int>& rect, | |||||
const ColourGradient& gradient, | |||||
const AffineTransform& transform) | |||||
{ | |||||
const int textureSize = 256; | |||||
OpenGLTexture texture; | |||||
HeapBlock<PixelARGB> lookup (textureSize); | |||||
gradient.createLookupTable (lookup, textureSize); | |||||
texture.load (lookup, textureSize, 1); | |||||
texture.bind(); | |||||
if (gradient.point1 == gradient.point2) | |||||
{ | |||||
fillRectWithColour (rect, gradient.getColourAtPosition (1.0)); | |||||
} | |||||
else | |||||
{ | |||||
if (gradient.isRadial) | |||||
OpenGLGradientHelpers::fillWithRadialGradient (rect, gradient, transform); | |||||
else | |||||
OpenGLGradientHelpers::fillWithLinearGradient (rect, gradient, transform, textureSize); | |||||
} | |||||
} | |||||
void OpenGLHelpers::fillRectWithColour (const Rectangle<int>& rect, const Colour& colour) | void OpenGLHelpers::fillRectWithColour (const Rectangle<int>& rect, const Colour& colour) | ||||
{ | { | ||||
glEnableClientState (GL_VERTEX_ARRAY); | glEnableClientState (GL_VERTEX_ARRAY); | ||||
@@ -365,48 +237,11 @@ void OpenGLHelpers::fillRect (const Rectangle<int>& rect) | |||||
glDrawArrays (GL_TRIANGLE_STRIP, 0, 4); | glDrawArrays (GL_TRIANGLE_STRIP, 0, 4); | ||||
} | } | ||||
void OpenGLHelpers::fillRectWithTiledTexture (int textureWidth, int textureHeight, | |||||
const Rectangle<int>& clip, | |||||
const AffineTransform& transform, | |||||
float alpha) | |||||
{ | |||||
glEnable (GL_TEXTURE_2D); | |||||
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | |||||
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | |||||
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); | |||||
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); | |||||
glEnableClientState (GL_VERTEX_ARRAY); | |||||
glEnableClientState (GL_TEXTURE_COORD_ARRAY); | |||||
glDisableClientState (GL_COLOR_ARRAY); | |||||
glDisableClientState (GL_NORMAL_ARRAY); | |||||
glColor4f (1.0f, 1.0f, 1.0f, alpha); | |||||
const GLfloat clipX = (GLfloat) clip.getX(); | |||||
const GLfloat clipY = (GLfloat) clip.getY(); | |||||
const GLfloat clipR = (GLfloat) clip.getRight(); | |||||
const GLfloat clipB = (GLfloat) clip.getBottom(); | |||||
const GLfloat vertices[] = { clipX, clipY, clipR, clipY, clipX, clipB, clipR, clipB }; | |||||
GLfloat textureCoords[] = { clipX, clipY, clipR, clipY, clipX, clipB, clipR, clipB }; | |||||
{ | |||||
const AffineTransform t (transform.inverted().scaled (1.0f / textureWidth, | |||||
1.0f / textureHeight)); | |||||
t.transformPoints (textureCoords[0], textureCoords[1], textureCoords[2], textureCoords[3]); | |||||
t.transformPoints (textureCoords[4], textureCoords[5], textureCoords[6], textureCoords[7]); | |||||
} | |||||
glVertexPointer (2, GL_FLOAT, 0, vertices); | |||||
glTexCoordPointer (2, GL_FLOAT, 0, textureCoords); | |||||
glDrawArrays (GL_TRIANGLE_STRIP, 0, 4); | |||||
} | |||||
//============================================================================== | //============================================================================== | ||||
struct OpenGLEdgeTableRenderer | struct OpenGLEdgeTableRenderer | ||||
{ | { | ||||
OpenGLEdgeTableRenderer (float r_, float g_, float b_, const Point<int>& origin_) noexcept | |||||
: origin (origin_), r (r_), g (g_), b (b_), lastAlpha (-1) | |||||
OpenGLEdgeTableRenderer (float r_, float g_, float b_) noexcept | |||||
: r (r_), g (g_), b (b_), lastAlpha (-1) | |||||
{ | { | ||||
} | } | ||||
@@ -421,12 +256,8 @@ struct OpenGLEdgeTableRenderer | |||||
void setEdgeTableYPos (const int y) noexcept | void setEdgeTableYPos (const int y) noexcept | ||||
{ | { | ||||
const int lineY = y + origin.getY(); | |||||
vertices[1] = (GLfloat) lineY; | |||||
vertices[3] = (GLfloat) (lineY + 1); | |||||
vertices[5] = (GLfloat) lineY; | |||||
vertices[7] = (GLfloat) (lineY + 1); | |||||
vertices[1] = vertices[5] = (GLfloat) y; | |||||
vertices[3] = vertices[7] = (GLfloat) (y + 1); | |||||
} | } | ||||
void handleEdgeTablePixel (const int x, const int alphaLevel) noexcept | void handleEdgeTablePixel (const int x, const int alphaLevel) noexcept | ||||
@@ -451,18 +282,13 @@ struct OpenGLEdgeTableRenderer | |||||
private: | private: | ||||
GLfloat vertices[8]; | GLfloat vertices[8]; | ||||
const Point<int> origin; | |||||
const float r, g, b; | const float r, g, b; | ||||
int lastAlpha; | int lastAlpha; | ||||
void drawHorizontal (int x, const int w, const int alphaLevel) noexcept | void drawHorizontal (int x, const int w, const int alphaLevel) noexcept | ||||
{ | { | ||||
x += origin.getX(); | |||||
vertices[0] = (GLfloat) x; | |||||
vertices[2] = (GLfloat) x; | |||||
vertices[4] = (GLfloat) (x + w); | |||||
vertices[6] = (GLfloat) (x + w); | |||||
vertices[0] = vertices[2] = (GLfloat) x; | |||||
vertices[4] = vertices[6] = (GLfloat) (x + w); | |||||
if (lastAlpha != alphaLevel) | if (lastAlpha != alphaLevel) | ||||
{ | { | ||||
@@ -477,10 +303,9 @@ private: | |||||
}; | }; | ||||
void OpenGLHelpers::fillEdgeTable (const EdgeTable& edgeTable, | void OpenGLHelpers::fillEdgeTable (const EdgeTable& edgeTable, | ||||
float red, float green, float blue, | |||||
const Point<int>& offset) | |||||
float red, float green, float blue) | |||||
{ | { | ||||
OpenGLEdgeTableRenderer etr (red, green, blue, offset); | |||||
OpenGLEdgeTableRenderer etr (red, green, blue); | |||||
etr.draw (edgeTable); | etr.draw (edgeTable); | ||||
} | } | ||||
@@ -776,6 +601,7 @@ void TriangulatedPath::draw (const int oversamplingLevel) const | |||||
{ | { | ||||
glColor4f (1.0f, 1.0f, 1.0f, 1.0f / (oversamplingLevel * oversamplingLevel)); | glColor4f (1.0f, 1.0f, 1.0f, 1.0f / (oversamplingLevel * oversamplingLevel)); | ||||
glPushMatrix(); | |||||
glTranslatef (-0.5f, -0.5f, 0.0f); | glTranslatef (-0.5f, -0.5f, 0.0f); | ||||
const float inc = 1.0f / oversamplingLevel; | const float inc = 1.0f / oversamplingLevel; | ||||
@@ -791,6 +617,8 @@ void TriangulatedPath::draw (const int oversamplingLevel) const | |||||
glTranslatef (-1.0f, inc, 0.0f); | glTranslatef (-1.0f, inc, 0.0f); | ||||
} | } | ||||
glPopMatrix(); | |||||
} | } | ||||
void TriangulatedPath::optimiseStorage() | void TriangulatedPath::optimiseStorage() | ||||
@@ -57,6 +57,8 @@ public: | |||||
static void applyTransform (const AffineTransform& t); | static void applyTransform (const AffineTransform& t); | ||||
static void enableScissorTest (const Rectangle<int>& clip); | |||||
/** Draws a 2D quad with the specified corner points. */ | /** Draws a 2D quad with the specified corner points. */ | ||||
static void drawQuad2D (float x1, float y1, | static void drawQuad2D (float x1, float y1, | ||||
float x2, float y2, | float x2, float y2, | ||||
@@ -76,21 +78,9 @@ public: | |||||
/** Fills a rectangle with the specified colour. */ | /** Fills a rectangle with the specified colour. */ | ||||
static void fillRectWithColour (const Rectangle<int>& rect, | static void fillRectWithColour (const Rectangle<int>& rect, | ||||
const Colour& colour); | const Colour& colour); | ||||
/** Fills a rectangle with the specified gradient. */ | |||||
static void fillRectWithColourGradient (const Rectangle<int>& rect, | |||||
const ColourGradient& gradient, | |||||
const AffineTransform& transform); | |||||
static void fillRectWithTiledTexture (int textureWidth, int textureHeight, | |||||
const Rectangle<int>& targetArea, | |||||
const AffineTransform& transform, | |||||
float alpha); | |||||
/** Renders an edge-table into the current context. */ | /** Renders an edge-table into the current context. */ | ||||
static void fillEdgeTable (const EdgeTable& edgeTable, | static void fillEdgeTable (const EdgeTable& edgeTable, | ||||
float red, float green, float blue, | |||||
const Point<int>& offset); | |||||
float red, float green, float blue); | |||||
/** Checks whether the current context supports the specified extension. */ | /** Checks whether the current context supports the specified extension. */ | ||||
static bool isExtensionSupported (const char* extensionName); | static bool isExtensionSupported (const char* extensionName); | ||||