[dasher: 25/27] Remove Set{Capture,Load}Background
- From: Patrick Welche <pwelche src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dasher: 25/27] Remove Set{Capture,Load}Background
- Date: Wed, 18 Aug 2010 15:11:47 +0000 (UTC)
commit b920a04e57ec1892c95af0be8df3f859a04b8b5f
Author: Alan Lawrence <acl33 inf phy cam ac uk>
Date: Tue Aug 17 19:52:26 2010 +0100
Remove Set{Capture,Load}Background
by rewriting Gtk2/CanvasExperimental not to need them (done in SendMarker
instead, as it should be!). Also fixed build problems with CanvasExperimental
- signature changes, etc. - it does actually work tho only rects/lines...
also removed CDasherView::Display (that's part of the SendMarker mechanism,
i.e. part of the Screen only), and CDasherView::RenderNodes (subclasses
implement CDasherView::Render directly instead).
Src/DasherCore/DasherInterfaceBase.cpp | 8 +--
Src/DasherCore/DasherModel.cpp | 2 +-
Src/DasherCore/DasherScreen.h | 3 -
Src/DasherCore/DasherView.cpp | 13 ----
Src/DasherCore/DasherView.h | 21 +-----
Src/DasherCore/DasherViewSquare.cpp | 4 +-
Src/DasherCore/DasherViewSquare.h | 10 ++--
Src/Gtk2/Canvas.h | 8 ---
Src/Gtk2/CanvasExperimental.cpp | 95 ++++++++++++-----------------
Src/Gtk2/CanvasExperimental.h | 20 +-----
Src/MacOSX/COSXDasherScreen.h | 6 --
Src/Win32/Widgets/Screen.h | 4 -
Src/iPhone/Classes/CDasherScreenBridge.h | 6 --
13 files changed, 57 insertions(+), 143 deletions(-)
---
diff --git a/Src/DasherCore/DasherInterfaceBase.cpp b/Src/DasherCore/DasherInterfaceBase.cpp
index 6e1f8a3..7ad448e 100644
--- a/Src/DasherCore/DasherInterfaceBase.cpp
+++ b/Src/DasherCore/DasherInterfaceBase.cpp
@@ -546,11 +546,7 @@ void CDasherInterfaceBase::NewFrame(unsigned long iTime, bool bForceRedraw) {
// - m_bRedrawScheduled = Display invalidated internally
// - bForceRedraw = Display invalidated externally
- // TODO: This is a bit hacky - we really need to sort out the redraw logic
- if((!bChanged && m_bLastChanged) || m_bRedrawScheduled || bForceRedraw) {
- m_pDasherView->Screen()->SetCaptureBackground(true);
- m_pDasherView->Screen()->SetLoadBackground(true);
- }
+ // TODO: Would be good to sort out / check through the redraw logic properly
bForceRedraw |= m_bLastChanged;
m_bLastChanged = bChanged; //will also be set in Redraw if any nodes were expanded.
@@ -600,7 +596,7 @@ void CDasherInterfaceBase::Redraw(bool bRedrawNodes, CExpansionPolicy &policy) {
// Only blit the image to the display if something has actually changed
if(bRedrawNodes || bDecorationsChanged || bActionButtonsChanged)
- m_pDasherView->Display();
+ m_pDasherView->Screen()->Display();
}
void CDasherInterfaceBase::ChangeAlphabet() {
diff --git a/Src/DasherCore/DasherModel.cpp b/Src/DasherCore/DasherModel.cpp
index d79c477..cb26c10 100644
--- a/Src/DasherCore/DasherModel.cpp
+++ b/Src/DasherCore/DasherModel.cpp
@@ -541,7 +541,7 @@ void CDasherModel::RenderToView(CDasherView *pView, CExpansionPolicy &policy) {
// The Render routine will fill iGameTargetY with the Dasher Coordinate of the
// youngest node with NF_GAME set. The model is responsible for setting NF_GAME on
// the appropriate Nodes.
- CDasherNode *pOutput = pView->Render(m_Root, m_Rootmin + m_iDisplayOffset, m_Rootmax + m_iDisplayOffset, policy, true);
+ CDasherNode *pOutput = pView->Render(m_Root, m_Rootmin + m_iDisplayOffset, m_Rootmax + m_iDisplayOffset, policy);
/////////GAME MODE TEMP//////////////
if(m_bGameMode)
diff --git a/Src/DasherCore/DasherScreen.h b/Src/DasherCore/DasherScreen.h
index 319fc1d..5be6704 100644
--- a/Src/DasherCore/DasherScreen.h
+++ b/Src/DasherCore/DasherScreen.h
@@ -122,9 +122,6 @@ public:
/// \param pColourScheme A colour scheme that should be used
virtual void SetColourScheme(const Dasher::CColourIO::ColourInfo *pColourScheme) = 0;
- virtual void SetLoadBackground (bool value)=0;
- virtual void SetCaptureBackground (bool value)=0;
-
protected:
//! Width and height of the screen
const screenint m_iWidth, m_iHeight;
diff --git a/Src/DasherCore/DasherView.cpp b/Src/DasherCore/DasherView.cpp
index f9b9afe..b615b8b 100644
--- a/Src/DasherCore/DasherView.cpp
+++ b/Src/DasherCore/DasherView.cpp
@@ -55,13 +55,6 @@ void CDasherView::ChangeScreen(CDasherScreen *NewScreen) {
/////////////////////////////////////////////////////////////////////////////
-CDasherNode *CDasherView::Render(CDasherNode *pRoot, myint iRootMin, myint iRootMax, CExpansionPolicy &policy, bool bRedrawDisplay) {
-
- m_iRenderCount = 0;
- Screen()->SetLoadBackground(false);
- return RenderNodes(pRoot, iRootMin, iRootMax, policy);
-}
-
int CDasherView::GetCoordinateCount() {
// TODO: Do we really need support for co-ordinate counts other than 2?
if(m_pInput)
@@ -99,12 +92,6 @@ void CDasherView::SetInput(CDasherInput * _pInput) {
m_pInput->SetMaxCoordinates(2, iMaxCoordinates);
}
-void CDasherView::Display() {
-
- Screen()->SetLoadBackground(true);
- m_pScreen->Display();
-}
-
void CDasherView::DasherSpaceLine(myint x1, myint y1, myint x2, myint y2, int iWidth, int iColor) {
if (!ClipLineToVisible(x1, y1, x2, y2)) return;
vector<CDasherScreen::point> vPoints;
diff --git a/Src/DasherCore/DasherView.h b/Src/DasherCore/DasherView.h
index b7b40f7..6a16135 100644
--- a/Src/DasherCore/DasherView.h
+++ b/Src/DasherCore/DasherView.h
@@ -110,18 +110,11 @@ public:
/// Drawing more complex structures, generally implemented by derived class
/// @{
- /// Top-level/public render function - renders all nodes.
- /// TODO the difference between this and RenderNodes (which gets implemented
- /// by subclasses) seems to be only that (a) this one sets m_iRenderCount to 0;
- /// since m_iRenderCount is then only incremented by subclasses, should it
- /// really be a field of CDasherView at all? and (b) it calls Screen()->SetLoadBackground(true)
- /// first - a method/call which exists only for Gtk2/CanvasExperimental.{h,cpp}...
- /// note the experimental, I doubt it works, or tbh whether it's worth making it...!
+ /// Top-level/public render function - render all the nodes.
/// @param pRoot outermost node to render. should cover screen if possible;
/// function will blank out around it (in white) if not
- /// @param bRedrawDisplay ignored; purpose unclear - also TODO...
/// @return the innermost node covering the crosshair
- CDasherNode *Render(CDasherNode *pRoot, myint iRootMin, myint iRootMax, CExpansionPolicy &policy, bool bRedrawDisplay);
+ virtual CDasherNode *Render(CDasherNode *pRoot, myint iRootMin, myint iRootMax, CExpansionPolicy &policy)=0;
/// @}
@@ -164,9 +157,6 @@ public:
void DasherDrawCentredRectangle(myint iDasherX, myint iDasherY, screenint iSize, const int Color, Opts::ColorSchemes ColorScheme, bool bDrawOutline);
void DrawText(const std::string & str, myint x, myint y, int Size, int iColor);
- /// Request the Screen to copy its buffer to the Display
- /// \todo Shouldn't be public?
- void Display();
/// @}
@@ -191,17 +181,14 @@ protected:
/* inline void UnMapScreen(screenint * DrawX, screenint * DrawY); */
bool m_bVisibleRegionValid;
+ ///Number of nodes actually rendered. Updated only by subclasses; TODO does
+ /// this belong here? (perhaps for subclass-agnostic clients to inspect...)
int m_iRenderCount;
private:
CDasherScreen *m_pScreen; // provides the graphics (text, lines, rectangles):
CDasherInput *m_pInput; // Input device abstraction
- /// Renders the Dasher node structure, including blanking out around the root node if necessary
- /// @return the innermost node covering the crosshair
- virtual CDasherNode *RenderNodes(CDasherNode *pRoot, myint iRootMin, myint iRootMax, CExpansionPolicy &policy) = 0;
-
-
/// Get the co-ordinates from the input device
int GetInputCoordinates(int iN, myint * pCoordinates);
diff --git a/Src/DasherCore/DasherViewSquare.cpp b/Src/DasherCore/DasherViewSquare.cpp
index b6830f3..a07a582 100644
--- a/Src/DasherCore/DasherViewSquare.cpp
+++ b/Src/DasherCore/DasherViewSquare.cpp
@@ -95,7 +95,7 @@ void CDasherViewSquare::HandleEvent(Dasher::CEvent *pEvent) {
}
}
-CDasherNode *CDasherViewSquare::RenderNodes(CDasherNode *pRoot, myint iRootMin, myint iRootMax,
+CDasherNode *CDasherViewSquare::Render(CDasherNode *pRoot, myint iRootMin, myint iRootMax,
CExpansionPolicy &policy) {
DASHER_ASSERT(pRoot != 0);
myint iDasherMinX;
@@ -113,6 +113,8 @@ CDasherNode *CDasherViewSquare::RenderNodes(CDasherNode *pRoot, myint iRootMin,
Dasher2Screen(iRootMax-iRootMin, iRootMin, iScreenLeft, iScreenTop);
Dasher2Screen(0, iRootMax, iScreenRight, iScreenBottom);
+ m_iRenderCount = 0;
+
CDasherNode *pOutput = pRoot->Parent();
// Blank the region around the root node:
diff --git a/Src/DasherCore/DasherViewSquare.h b/Src/DasherCore/DasherViewSquare.h
index f40df56..67c4a88 100644
--- a/Src/DasherCore/DasherViewSquare.h
+++ b/Src/DasherCore/DasherViewSquare.h
@@ -97,6 +97,11 @@ public:
///
void VisibleRegion( myint &iDasherMinX, myint &iDasherMinY, myint &iDasherMaxX, myint &iDasherMaxY );
+ ///
+ /// Render all nodes, inc. blanking around the root (supplied)
+ ///
+ virtual CDasherNode *Render(CDasherNode *pRoot, myint iRootMin, myint iRootMax, CExpansionPolicy &policy);
+
/// @}
private:
@@ -138,11 +143,6 @@ private:
CTextString *DasherDrawText(myint iMaxX, myint iMidY, const std::string & sDisplayText, CTextString *pParent, int iColor);
///
- /// Render the current state of the model.
- ///
- virtual CDasherNode *RenderNodes(CDasherNode *pRoot, myint iRootMin, myint iRootMax, CExpansionPolicy &policy);
-
- ///
/// (Recursively) render a node and all contained subnodes, in disjoint rects.
/// (i.e. appropriate for LP_SHAPE_TYPE==0). Each call responsible for rendering
/// exactly the area contained within the node.
diff --git a/Src/Gtk2/Canvas.h b/Src/Gtk2/Canvas.h
index 8b37cda..125ce96 100644
--- a/Src/Gtk2/Canvas.h
+++ b/Src/Gtk2/Canvas.h
@@ -208,14 +208,6 @@ public:
/// Returns true on success, false otherwise.
bool GetCanvasSize(GdkRectangle *pRectangle);
- void SetLoadBackground(bool bValue) {
- // Not required in this model
- };
-
- void SetCaptureBackground(bool bValue) {
- // Not required in this model
- };
-
private:
///
diff --git a/Src/Gtk2/CanvasExperimental.cpp b/Src/Gtk2/CanvasExperimental.cpp
index 036aa6f..2d0dc40 100644
--- a/Src/Gtk2/CanvasExperimental.cpp
+++ b/Src/Gtk2/CanvasExperimental.cpp
@@ -45,12 +45,11 @@
#endif
using namespace Dasher;
-CCanvas::CCanvas(GtkWidget *pCanvas, CPangoCache *pPangoCache)
- : CDasherScreen(pCanvas->allocation.width, pCanvas->allocation.height) {
+CCanvas::CCanvas(GtkWidget *pCanvas, CPangoCache *pPangoCache, int width, int height)
+ : CDasherScreen(width, height) {
m_pCanvas = pCanvas;
- m_bLoadBackground = true;
- m_bCaptureBackground = true;
+ m_bCaptureBackground = false; //default, we expect nodes first...
///IGNAS
#ifdef FRAMERATE_DIAGNOSTICS
@@ -63,8 +62,8 @@ total_frames=0;
display_depth=3;
display_fontdepth=4;
- display_fontwidth=m_pCanvas->allocation.width;
- display_fontheight=m_pCanvas->allocation.height;
+ display_fontwidth=width;
+ display_fontheight=height;
///IGNAS
@@ -77,18 +76,18 @@ total_frames=0;
m_pPangoCache = pPangoCache;
- m_iWidth = m_pCanvas->allocation.width;
- m_iHeight = m_pCanvas->allocation.height;
+ m_iWidth = width;
+ m_iHeight = height;
- display_data= (guchar *) g_malloc(m_pCanvas->allocation.width*m_pCanvas->allocation.height*display_depth * sizeof(guchar));
- display_backgrounddata= (guchar *) g_malloc(m_pCanvas->allocation.width*m_pCanvas->allocation.height*display_depth * sizeof(guchar));
+ display_data= (guchar *) g_malloc(width*height*display_depth * sizeof(guchar));
+ display_backgrounddata= (guchar *) g_malloc(width*height*display_depth * sizeof(guchar));
display_fontdata= (guchar *) g_malloc(display_fontwidth*display_fontheight*display_fontdepth * sizeof(guchar));
- point_id= (gint *) g_malloc(m_pCanvas->allocation.width * sizeof(gint));
- point_amount= (gint *) g_malloc(m_pCanvas->allocation.width * sizeof(gint));
- point_data= (gint *) g_malloc(m_pCanvas->allocation.width * sizeof(gint));
+ point_id= (gint *) g_malloc(width * sizeof(gint));
+ point_amount= (gint *) g_malloc(width * sizeof(gint));
+ point_data= (gint *) g_malloc(width * sizeof(gint));
GdkColor bg;
GdkColor fg;
bg.red=0;bg.green=0;bg.blue=0;
@@ -97,9 +96,9 @@ display_pixbuf =gdk_pixbuf_new_from_data (display_data,
GDK_COLORSPACE_RGB,
false, //no alpha
8,
- m_pCanvas->allocation.width,
- m_pCanvas->allocation.height,
- m_pCanvas->allocation.width*display_depth,
+ width,
+ height,
+ width*display_depth,
NULL,
NULL);
@@ -184,8 +183,8 @@ void CCanvas::Display() {
gdk_draw_pixbuf(m_pCanvas->window, graphics_context, display_pixbuf, 0, 0, 0, 0, m_iWidth,m_iHeight, GDK_RGB_DITHER_NORMAL, 0, 0);
}
-void CCanvas::DrawRectangle(int x1, int y1, int x2, int y2, int Color, int iOutlineColour, Opts::ColorSchemes ColorScheme, bool bDrawOutline, bool bFill, int iThickness) {
-bFill&=IGNAS_DRAW_MAIN_RECTANGLES;
+void CCanvas::DrawRectangle(int x1, int y1, int x2, int y2, int Color, int iOutlineColour, Opts::ColorSchemes ColorScheme, int iThickness) {
+bool bFill= Color!=-1 && IGNAS_DRAW_MAIN_RECTANGLES;
IGNAS_RECTANGLE_STOP_VOID
IGNAS_STOP_VOID
@@ -246,7 +245,7 @@ IGNAS_STOP_VOID
}
}
- if(bDrawOutline) {
+ if(iWidth>0) {
if( iOutlineColour == -1 )
{
@@ -546,8 +545,9 @@ bool CCanvas::HorizontalIntersectionPoint(int h,int a,int b,int x0,int y0,int x1
}
}
-void CCanvas::PolygonFill(Dasher::CDasherScreen::point *Points, int Number, int Colour)
+void CCanvas::Polygon(Dasher::CDasherScreen::point *Points, int Number, int Colour, int lineCol, int iWidth)
{
+if (Colour!=-1) {
GdkColor _c;
#if WITH_CAIRO
_c.red=(int)(cairo_colours[Colour].r*255);
@@ -619,15 +619,16 @@ void CCanvas::PolygonFill(Dasher::CDasherScreen::point *Points, int Number, int
}
}
}
-}
-void CCanvas::Polygon(Dasher::CDasherScreen::point *Points, int Number, int Colour, int iWidth) {
+} //end "Colour==-1", old PolygonFill
+//onto outline
IGNAS_STOP_VOID
-
+ if (iWidth>0) {
for(int i = 1; i < Number; i++)
{
- Line(Points[i].x,Points[i].y,Points[i-1].x,Points[i-1].y, iWidth,Colour);
+ Line(Points[i].x,Points[i].y,Points[i-1].x,Points[i-1].y, iWidth,lineCol);
}
- Line(Points[Number-1].x,Points[Number-1].y,Points[0].x,Points[0].y,iWidth,Colour);
+ Line(Points[Number-1].x,Points[Number-1].y,Points[0].x,Points[0].y,iWidth,lineCol);
+}
}
void CCanvas::SetPixel(GdkColor *c,int x,int y,int iWidth)
{
@@ -716,13 +717,13 @@ IGNAS_STOP_VOID
}
}
-void CCanvas::DrawString(const std::string &String, int x1, int y1, int size) {
+void CCanvas::DrawString(const std::string &String, int x1, int y1, int size, int col) {
IGNAS_FONT_STOP_VOID
IGNAS_STOP_VOID
#if WITH_CAIRO //set color black
- my_cairo_colour_t _c = cairo_colours[4];
+ my_cairo_colour_t _c = cairo_colours[col==-1 ? 4 : col];
cairo_set_source_rgb(display_fontcairo, _c.r, _c.g, _c.b);
#else
@@ -810,10 +811,19 @@ void CCanvas::TextSize(const std::string &String, int *Width, int *Height, int s
void CCanvas::SendMarker(int iMarker) {
switch(iMarker) {
case 0: // Switch to display buffer
+ m_bCaptureBackground=true;
break;
case 1: // Switch to decorations buffer
- StoreBackground();
- LoadBackground();
+ if (m_bCaptureBackground) {
+ //yes, rendered nodes. Store.
+ for (int i=0;i<m_iWidth*m_iHeight*display_depth;i++)
+ display_backgrounddata[i]=display_data[i];
+ m_bCaptureBackground=false;
+ } else {
+ //nodes not rendered this time. load...
+ for (int i=0;i<m_iWidth*m_iHeight*display_depth;i++)
+ display_data[i]=display_backgrounddata[i];
+ }
#ifdef FRAMERATE_DIAGNOSTICS
NewFrame();
#endif
@@ -847,33 +857,6 @@ void CCanvas::SetColourScheme(const CColourIO::ColourInfo *pColourScheme) {
#endif
}
}
-void CCanvas::SetLoadBackground(bool value)
-{
- m_bLoadBackground=value;
-}
-void CCanvas::SetCaptureBackground(bool value)
-{
- m_bCaptureBackground=value;
-}
-void CCanvas::StoreBackground()
-{
- if (m_bCaptureBackground)
- {
- for (int i=0;i<m_iWidth*m_iHeight*display_depth;i++)
- display_backgrounddata[i]=display_data[i];
- m_bCaptureBackground=false;
- }
-}
-
-void CCanvas::LoadBackground()
-{
- if (m_bLoadBackground)
- {
- for (int i=0;i<m_iWidth*m_iHeight*display_depth;i++)
- display_data[i]=display_backgrounddata[i];
- }
-
-}
bool CCanvas::GetCanvasSize(GdkRectangle *pRectangle)
{
diff --git a/Src/Gtk2/CanvasExperimental.h b/Src/Gtk2/CanvasExperimental.h
index c566be8..0e15d75 100644
--- a/Src/Gtk2/CanvasExperimental.h
+++ b/Src/Gtk2/CanvasExperimental.h
@@ -44,7 +44,7 @@ public:
/// \param pPangoCache A cache for precomputed Pango layouts
///
- CCanvas(GtkWidget * pCanvas, CPangoCache * pPangoCache);
+ CCanvas(GtkWidget * pCanvas, CPangoCache * pPangoCache, int width, int height);
~CCanvas();
///
@@ -104,7 +104,7 @@ public:
/// \param Size The size at which to render the rectangle (units?)
///
- void DrawString(const std::string &String, screenint x1, screenint y1, int Size);
+ void DrawString(const std::string &String, screenint x1, screenint y1, int Size, int Col);
///
/// Draw a rectangle
@@ -117,7 +117,7 @@ public:
/// \param bDrawOutline Whether or not to draw outlines for the boxes
///
- void DrawRectangle(screenint x1, screenint y1, screenint x2, screenint y2, int Color, int iOutlineColour, Opts::ColorSchemes ColorScheme, bool bDrawOutine, bool bFill, int iThickness);
+ void DrawRectangle(screenint x1, screenint y1, screenint x2, screenint y2, int Color, int iOutlineColour, Opts::ColorSchemes ColorScheme, int iThickness);
void DrawCircle(screenint iCX, screenint iCY, screenint iR, int iColour, int iFillColour, int iThickness, bool bFill);
@@ -176,16 +176,6 @@ public:
/// Returns true on success, false otherwise.
bool GetCanvasSize(GdkRectangle *pRectangle);
-
- ///
- /// Sets the Canvas in to the mode where it loads a background from a buffer. We
- /// need this when we draw only decorations..
- void SetLoadBackground(bool value);
- ///
- /// Saves a background in an offscreen buffer. We need this when we draw only decorations.
- ///
- void SetCaptureBackground(bool value);
-
///
/// Canvas width
///
@@ -231,16 +221,12 @@ private:
void Line(int x0,int y0,int x1,int y1,int iWidth, int Colour);
void SetPixel(GdkColor *c,int x,int y,int iWidth=1);
- void PolygonFill(Dasher::CDasherScreen::point *Points, int Number, int Colour);
bool HorizontalIntersectionPoint(int h,int a,int b,int x0,int y0,int x1,int y1, int *p);
///
/// The GTK drawing area for the canvas
///
- bool m_bLoadBackground;
bool m_bCaptureBackground;
- void StoreBackground();
- void LoadBackground();
GtkWidget *m_pCanvas;
gint *point_id;
diff --git a/Src/MacOSX/COSXDasherScreen.h b/Src/MacOSX/COSXDasherScreen.h
index 0fa3446..c108257 100644
--- a/Src/MacOSX/COSXDasherScreen.h
+++ b/Src/MacOSX/COSXDasherScreen.h
@@ -152,12 +152,6 @@ public:
void SetColourScheme(const CColourIO::ColourInfo *pColourScheme);
- virtual void SetLoadBackground (bool value) {
- }
-
- virtual void SetCaptureBackground (bool value) {
- }
-
id <DasherViewCocoa> dasherView; // objc counterpart
diff --git a/Src/Win32/Widgets/Screen.h b/Src/Win32/Widgets/Screen.h
index 0a8de65..5934b98 100644
--- a/Src/Win32/Widgets/Screen.h
+++ b/Src/Win32/Widgets/Screen.h
@@ -94,10 +94,6 @@ public:
void SendMarker(int iMarker);
- // TODO: These need to be implemented properly
- virtual void SetLoadBackground (bool value) {};
- virtual void SetCaptureBackground (bool value) {};
-
private:
const void point2POINT(const point * In, POINT * Out, int Number);
diff --git a/Src/iPhone/Classes/CDasherScreenBridge.h b/Src/iPhone/Classes/CDasherScreenBridge.h
index c501040..33e6b64 100644
--- a/Src/iPhone/Classes/CDasherScreenBridge.h
+++ b/Src/iPhone/Classes/CDasherScreenBridge.h
@@ -105,12 +105,6 @@ public:
///
void SetColourScheme(const CColourIO::ColourInfo *pColourScheme);
-
- virtual void SetLoadBackground (bool value) {
- }
-
- virtual void SetCaptureBackground (bool value) {
- }
private:
id <DasherScreenCallbacks> dasherView; // objc counterpart
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]