| @@ -58,7 +58,7 @@ public: | |||
| getSDKPath() = "${user.home}/SDKs/android-sdk-mac_x86"; | |||
| if (getNDKPath().toString().isEmpty()) | |||
| getNDKPath() = "${user.home}/SDKs/android-ndk-r5"; | |||
| getNDKPath() = "${user.home}/SDKs/android-ndk-r6b"; | |||
| if (getInternetNeeded().toString().isEmpty()) | |||
| 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 | |||
| << commentString | |||
| << "Project(\"" << createGUID (projectName + "sln_guid") << "\") = \"" << projectName << "\", \"" | |||
| << vcProject.getFileName() << "\", \"" << projectGUID << '"' << newLine | |||
| << "EndProject" << newLine | |||
| @@ -395,7 +399,7 @@ public: | |||
| { | |||
| MemoryOutputStream mo; | |||
| writeSolutionFile (mo, getSolutionVersionString(), getVCProjFile()); | |||
| writeSolutionFile (mo, getSolutionVersionString(), String::empty, getVCProjFile()); | |||
| overwriteFileIfDifferentOrThrow (getSLNFile(), mo); | |||
| } | |||
| @@ -1037,7 +1041,7 @@ public: | |||
| { | |||
| MemoryOutputStream mo; | |||
| writeSolutionFile (mo, "11.00", getVCProjFile()); | |||
| writeSolutionFile (mo, "11.00", "# Visual Studio 2010", getVCProjFile()); | |||
| overwriteFileIfDifferentOrThrow (getSLNFile(), mo); | |||
| } | |||
| @@ -1,4 +1,5 @@ | |||
| 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}" | |||
| EndProject | |||
| Global | |||
| @@ -1,4 +1,5 @@ | |||
| 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}" | |||
| EndProject | |||
| Global | |||
| @@ -1,4 +1,5 @@ | |||
| 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}" | |||
| EndProject | |||
| 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::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::getDayOfWeek() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_wday; } | |||
| int Time::getHours() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_hour; } | |||
| @@ -132,17 +132,20 @@ public: | |||
| String getMonthName (bool threeLetterVersion) const; | |||
| /** Returns the day of the month. | |||
| The value returned is in the range 1 to 31. | |||
| */ | |||
| int getDayOfMonth() const noexcept; | |||
| /** Returns the number of the day of the week. | |||
| The value returned is in the range 0 to 6 (0 = sunday, 1 = monday, etc). | |||
| */ | |||
| 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. | |||
| @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); | |||
| } | |||
| 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()); | |||
| if (object != nullptr && name.toString().isNotEmpty()) | |||
| object->setProperty (name, newValue, undoManager); | |||
| return *this; | |||
| } | |||
| 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, | |||
| so that this change can be undone. | |||
| @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. */ | |||
| bool hasProperty (const Identifier& name) const; | |||
| @@ -144,5 +144,11 @@ bool FillType::isInvisible() const noexcept | |||
| 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 | |||
| @@ -112,6 +112,11 @@ public: | |||
| /** Returns true if this fill type is completely transparent. */ | |||
| 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. | |||
| @@ -49,19 +49,15 @@ public: | |||
| ~LowLevelGraphicsSoftwareRenderer(); | |||
| bool isVectorDevice() const; | |||
| //============================================================================== | |||
| void setOrigin (int x, int y); | |||
| void addTransform (const AffineTransform& transform); | |||
| void addTransform (const AffineTransform&); | |||
| 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; | |||
| bool isClipEmpty() const; | |||
| @@ -71,29 +67,25 @@ public: | |||
| void beginTransparencyLayer (float opacity); | |||
| void endTransparencyLayer(); | |||
| //============================================================================== | |||
| void setFill (const FillType& fillType); | |||
| void setFill (const FillType&); | |||
| 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 drawVerticalLine (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(); | |||
| void drawGlyph (int glyphNumber, float x, float y); | |||
| void drawGlyph (int glyphNumber, const AffineTransform& transform); | |||
| void drawGlyph (int glyphNumber, const AffineTransform&); | |||
| //============================================================================== | |||
| #ifndef DOXYGEN | |||
| class SavedState; | |||
| #endif | |||
| @@ -139,8 +139,6 @@ public: | |||
| return; | |||
| #endif | |||
| OpenGLHelpers::resetErrorState(); | |||
| glGenFramebuffersEXT (1, &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); | |||
| other.drawAt (0, 0); | |||
| pimpl->unbind(); | |||
| return true; | |||
| } | |||
| return false; | |||
| @@ -384,9 +384,8 @@ bool OpenGLFrameBuffer::readPixels (PixelARGB* target, const Rectangle<int>& are | |||
| return false; | |||
| 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); | |||
| return true; | |||
| } | |||
| @@ -395,8 +394,6 @@ bool OpenGLFrameBuffer::writePixels (const PixelARGB* data, const Rectangle<int> | |||
| if (! makeCurrentRenderingTarget()) | |||
| return false; | |||
| const int invertedY = pimpl->height - area.getBottom(); | |||
| OpenGLHelpers::prepareFor2D (pimpl->width, pimpl->height); | |||
| glDisable (GL_DEPTH_TEST); | |||
| 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() }; | |||
| 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); | |||
| } | |||
| #else | |||
| glRasterPos2i (area.getX(), invertedY); | |||
| glRasterPos2i (area.getX(), area.getY()); | |||
| glBindTexture (GL_TEXTURE_2D, 0); | |||
| glPixelStorei (GL_UNPACK_ALIGNMENT, 4); | |||
| glDrawPixels (area.getWidth(), area.getHeight(), GL_BGRA_EXT, GL_UNSIGNED_BYTE, data); | |||
| @@ -163,6 +163,12 @@ void OpenGLHelpers::applyTransform (const AffineTransform& t) | |||
| 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, | |||
| float x2, float y2, | |||
| 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) | |||
| { | |||
| glEnableClientState (GL_VERTEX_ARRAY); | |||
| @@ -365,48 +237,11 @@ void OpenGLHelpers::fillRect (const Rectangle<int>& rect) | |||
| 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 | |||
| { | |||
| 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 | |||
| { | |||
| 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 | |||
| @@ -451,18 +282,13 @@ struct OpenGLEdgeTableRenderer | |||
| private: | |||
| GLfloat vertices[8]; | |||
| const Point<int> origin; | |||
| const float r, g, b; | |||
| int lastAlpha; | |||
| 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) | |||
| { | |||
| @@ -477,10 +303,9 @@ private: | |||
| }; | |||
| 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); | |||
| } | |||
| @@ -776,6 +601,7 @@ void TriangulatedPath::draw (const int oversamplingLevel) const | |||
| { | |||
| glColor4f (1.0f, 1.0f, 1.0f, 1.0f / (oversamplingLevel * oversamplingLevel)); | |||
| glPushMatrix(); | |||
| glTranslatef (-0.5f, -0.5f, 0.0f); | |||
| const float inc = 1.0f / oversamplingLevel; | |||
| @@ -791,6 +617,8 @@ void TriangulatedPath::draw (const int oversamplingLevel) const | |||
| glTranslatef (-1.0f, inc, 0.0f); | |||
| } | |||
| glPopMatrix(); | |||
| } | |||
| void TriangulatedPath::optimiseStorage() | |||
| @@ -57,6 +57,8 @@ public: | |||
| static void applyTransform (const AffineTransform& t); | |||
| static void enableScissorTest (const Rectangle<int>& clip); | |||
| /** Draws a 2D quad with the specified corner points. */ | |||
| static void drawQuad2D (float x1, float y1, | |||
| float x2, float y2, | |||
| @@ -76,21 +78,9 @@ public: | |||
| /** Fills a rectangle with the specified colour. */ | |||
| static void fillRectWithColour (const Rectangle<int>& rect, | |||
| 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. */ | |||
| 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. */ | |||
| static bool isExtensionSupported (const char* extensionName); | |||