This is Interesting: Free Magazines for Graphics designers and webmasters  


Home > Archive > Computer Graphics with Photoshop > June 2004 > Multiple rotations





You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

Author Multiple rotations
Captain Blammo

2004-05-31, 7:14 pm

I've been trying to take an image and produce 359 rotated versions of it (1
degree increments, of course). However, I just can't figure out how to
automate it. I managed to rotate one image 359 times and save it on top of
itself, but that wasn't so helpful.

I know that I could do it by rotating previous rotations if I kept at it,
but that's a really good way to mess up the image quality. What I really
need to do is rotate by 1 degree, save, rotate by 2 degrees, save, rotate by
3 degrees, etc.

Just to clarify, I should have 360 files at the end of the process
(including the original).

Any help is greatly appreciated!

Ewan





jjs

2004-05-31, 7:14 pm

In article <PJJuc.51204$Np3.2222466@ursa-nb00s0.nbnet.nb.ca>, "Captain
Blammo" <eas6@nbnet.nb.ca> wrote:

> I've been trying to take an image and produce 359 rotated versions of it (1
> degree increments, of course). However, I just can't figure out how to
> automate it. I managed to rotate one image 359 times and save it on top of
> itself, but that wasn't so helpful.
>
> I know that I could do it by rotating previous rotations if I kept at it,
> but that's a really good way to mess up the image quality. What I really
> need to do is rotate by 1 degree, save, rotate by 2 degrees, save, rotate by
> 3 degrees, etc.
>
> Just to clarify, I should have 360 files at the end of the process
> (including the original).


Imageready comes with Photoshop. Try it. There should be an action called
"SPIN". It will create a new layer for each interation. Modify as
neccessary. (If you have CS you can save each layer as a separate file
rather than one big with 360 layers.)
Captain Blammo

2004-05-31, 7:14 pm

> Imageready comes with Photoshop. Try it. There should be an action called
> "SPIN". It will create a new layer for each interation. Modify as
> neccessary. (If you have CS you can save each layer as a separate file
> rather than one big with 360 layers.)


The "Spin" action seems to be what I'm after, apart from that it spins in
the wrong direction, and the angular increments are too large. Also, I
couldnt figure out how to save each layer as a file.

Is there no way to use scripting of some sort to do this? I looked for ways
to use Photoshop's tools from the command line, but couldn't find anything.

Something like this would do the job in an incredibly simple fashion:

for(count=1; count<360; count=count+1)
{
open(picname.psd);
rotate(count);
save(picname + count +, GIF);
close(picname.psd);
}

Is there nothing of the sort available? It seems like an awful waste of time
to record an action with me rotating a picture 360 times and saving it.

Ewan


jjs

2004-05-31, 7:14 pm

In article <NALuc.51262$Np3.2224348@ursa-nb00s0.nbnet.nb.ca>, "Captain
Blammo" <eas6@nbnet.nb.ca> wrote:

> The "Spin" action seems to be what I'm after, apart from that it spins in
> the wrong direction, and the angular increments are too large. Also, I
> couldnt figure out how to save each layer as a file.
>
> Is there no way to use scripting of some sort to do this? I looked for ways
> to use Photoshop's tools from the command line, but couldn't find anything.


It's my day off so I'm not near my workstation so forgive if I'm not
perfectly accurate, but in ImageReady you can change that action to a
whatever increment you want, and in any direction you want. To do that,
just double-click on the action part named "Angle:" and type in the
degrees you want in MINUS degrees for counter-clockwise. For example,
instead of 20 type in -20.

Regarding the saving of layers, it's been covered here. I only got CS an
hour before I left work Friday so I can't swear that it does that (but I'd
bet a beer it does, possibly under an 'export' menu item), and regardless
you can download a trial of a program that does exactly that via
drag-n-drop here: http://www.metadma.com/LayerSplitter.html

Sometimes it's okay to drop the compulsion to program and to do with what
you have when the outcome is adequate. Or read the documentation. RTFM!

It took me longer to type the above than to cut the ImageReady adjustments
neccessary to do what you need to do. But for the program-compulsive, this
is the outcome. Use a text editing macro. Knock yourself out.

// Action file - Generated by Adobe ImageReady 2.0
// ===========================================================================
{
action = new Action("Spin");
action.expanded = true;
action.runInBackground = false;
action.saveSource = false;
action.saveTarget = true;
action.targetLocation = tlSourceFolder;
action.dupFileNameBehavior = dfnAdd2Digits;
action.windowsFileNaming = true;
action.macFileNaming = true;
action.unixFileNaming = true;
action.displayImages = false;
action.pauseBeforeSave = false;
action.errorBehavior = dfnOverwriteConfirm;
action.version = 2;

step1 = new CopyLayerSet;
step1.enabled = true;
step1.doDialog = false;
step1.expanded = false;
action.AddStep(step1);

step2 = new LayerVisibility;
step2.enabled = true;
step2.doDialog = false;
step2.expanded = false;
step2.visible = false;
step2.toggleOthers = false;
action.AddStep(step2);

step3 = new DuplicateLayer;
step3.enabled = true;
step3.doDialog = false;
step3.expanded = false;
action.AddStep(step3);

step4 = new LayerVisibility;
step4.enabled = true;
step4.doDialog = false;
step4.expanded = false;
step4.visible = true;
step4.toggleOthers = false;
action.AddStep(step4);

step5 = new TransformLayer;
step5.enabled = true;
step5.doDialog = false;
step5.expanded = false;
step5.positionX = 0.000000;
step5.positionY = 0.000000;
step5.positionMode = ePositionRelative;
step5.percentage = 1.000000;
step5.horzSkew = 0.000000;
step5.vertSkew = 0.000000;
step5.rotation = 30.000000;
action.AddStep(step5);

step6 = new CopyLayerSet;
step6.enabled = true;
step6.doDialog = false;
step6.expanded = false;
action.AddStep(step6);

step7 = new LayerVisibility;
step7.enabled = true;
step7.doDialog = false;
step7.expanded = false;
step7.visible = false;
step7.toggleOthers = false;
action.AddStep(step7);

step8 = new SelectBackwardLayer;
step8.enabled = true;
step8.doDialog = false;
step8.expanded = false;
action.AddStep(step8);

step9 = new DuplicateLayer;
step9.enabled = true;
step9.doDialog = false;
step9.expanded = false;
action.AddStep(step9);

step10 = new LayerVisibility;
step10.enabled = true;
step10.doDialog = false;
step10.expanded = false;
step10.visible = true;
step10.toggleOthers = false;
action.AddStep(step10);

step11 = new TransformLayer;
step11.enabled = true;
step11.doDialog = false;
step11.expanded = true;
step11.positionX = 0.000000;
step11.positionY = 0.000000;
step11.positionMode = ePositionRelative;
step11.percentage = 1.000000;
step11.horzSkew = 0.000000;
step11.vertSkew = 0.000000;
step11.rotation = 60.000000;
action.AddStep(step11);

step12 = new CopyLayerSet;
step12.enabled = true;
step12.doDialog = false;
step12.expanded = false;
action.AddStep(step12);

step13 = new LayerVisibility;
step13.enabled = true;
step13.doDialog = false;
step13.expanded = false;
step13.visible = false;
step13.toggleOthers = false;
action.AddStep(step13);

step14 = new SelectBackwardLayer;
step14.enabled = true;
step14.doDialog = false;
step14.expanded = false;
action.AddStep(step14);

step15 = new DuplicateLayer;
step15.enabled = true;
step15.doDialog = false;
step15.expanded = false;
action.AddStep(step15);

step16 = new LayerVisibility;
step16.enabled = true;
step16.doDialog = false;
step16.expanded = false;
step16.visible = true;
step16.toggleOthers = false;
action.AddStep(step16);

step17 = new TransformLayer;
step17.enabled = true;
step17.doDialog = false;
step17.expanded = false;
step17.positionX = 0.000000;
step17.positionY = 0.000000;
step17.positionMode = ePositionRelative;
step17.percentage = 1.000000;
step17.horzSkew = 0.000000;
step17.vertSkew = 0.000000;
step17.rotation = 90.000000;
action.AddStep(step17);

step18 = new CopyLayerSet;
step18.enabled = true;
step18.doDialog = false;
step18.expanded = false;
action.AddStep(step18);

step19 = new LayerVisibility;
step19.enabled = true;
step19.doDialog = false;
step19.expanded = false;
step19.visible = false;
step19.toggleOthers = false;
action.AddStep(step19);

step20 = new SelectBackwardLayer;
step20.enabled = true;
step20.doDialog = false;
step20.expanded = false;
action.AddStep(step20);

step21 = new DuplicateLayer;
step21.enabled = true;
step21.doDialog = false;
step21.expanded = false;
action.AddStep(step21);

step22 = new LayerVisibility;
step22.enabled = true;
step22.doDialog = false;
step22.expanded = false;
step22.visible = true;
step22.toggleOthers = false;
action.AddStep(step22);

step23 = new TransformLayer;
step23.enabled = true;
step23.doDialog = false;
step23.expanded = false;
step23.positionX = 0.000000;
step23.positionY = 0.000000;
step23.positionMode = ePositionRelative;
step23.percentage = 1.000000;
step23.horzSkew = 0.000000;
step23.vertSkew = 0.000000;
step23.rotation = 120.000000;
action.AddStep(step23);

step24 = new CopyLayerSet;
step24.enabled = true;
step24.doDialog = false;
step24.expanded = false;
action.AddStep(step24);

step25 = new LayerVisibility;
step25.enabled = true;
step25.doDialog = false;
step25.expanded = false;
step25.visible = false;
step25.toggleOthers = false;
action.AddStep(step25);

step26 = new SelectBackwardLayer;
step26.enabled = true;
step26.doDialog = false;
step26.expanded = false;
action.AddStep(step26);

step27 = new DuplicateLayer;
step27.enabled = true;
step27.doDialog = false;
step27.expanded = false;
action.AddStep(step27);

step28 = new LayerVisibility;
step28.enabled = true;
step28.doDialog = false;
step28.expanded = false;
step28.visible = true;
step28.toggleOthers = false;
action.AddStep(step28);

step29 = new TransformLayer;
step29.enabled = true;
step29.doDialog = false;
step29.expanded = false;
step29.positionX = 0.000000;
step29.positionY = 0.000000;
step29.positionMode = ePositionRelative;
step29.percentage = 1.000000;
step29.horzSkew = 0.000000;
step29.vertSkew = 0.000000;
step29.rotation = 150.000000;
action.AddStep(step29);

step30 = new CopyLayerSet;
step30.enabled = true;
step30.doDialog = false;
step30.expanded = false;
action.AddStep(step30);

step31 = new LayerVisibility;
step31.enabled = true;
step31.doDialog = false;
step31.expanded = false;
step31.visible = false;
step31.toggleOthers = false;
action.AddStep(step31);

step32 = new SelectBackwardLayer;
step32.enabled = true;
step32.doDialog = false;
step32.expanded = false;
action.AddStep(step32);

step33 = new DuplicateLayer;
step33.enabled = true;
step33.doDialog = false;
step33.expanded = false;
action.AddStep(step33);

step34 = new LayerVisibility;
step34.enabled = true;
step34.doDialog = false;
step34.expanded = false;
step34.visible = true;
step34.toggleOthers = false;
action.AddStep(step34);

step35 = new TransformLayer;
step35.enabled = true;
step35.doDialog = false;
step35.expanded = false;
step35.positionX = 0.000000;
step35.positionY = 0.000000;
step35.positionMode = ePositionRelative;
step35.percentage = 1.000000;
step35.horzSkew = 0.000000;
step35.vertSkew = 0.000000;
step35.rotation = 180.000000;
action.AddStep(step35);

step36 = new CopyLayerSet;
step36.enabled = true;
step36.doDialog = false;
step36.expanded = false;
action.AddStep(step36);

step37 = new LayerVisibility;
step37.enabled = true;
step37.doDialog = false;
step37.expanded = false;
step37.visible = false;
step37.toggleOthers = false;
action.AddStep(step37);

step38 = new SelectBackwardLayer;
step38.enabled = true;
step38.doDialog = false;
step38.expanded = false;
action.AddStep(step38);

step39 = new DuplicateLayer;
step39.enabled = true;
step39.doDialog = false;
step39.expanded = false;
action.AddStep(step39);

step40 = new LayerVisibility;
step40.enabled = true;
step40.doDialog = false;
step40.expanded = false;
step40.visible = true;
step40.toggleOthers = false;
action.AddStep(step40);

step41 = new TransformLayer;
step41.enabled = true;
step41.doDialog = false;
step41.expanded = false;
step41.positionX = 0.000000;
step41.positionY = 0.000000;
step41.positionMode = ePositionRelative;
step41.percentage = 1.000000;
step41.horzSkew = 0.000000;
step41.vertSkew = 0.000000;
step41.rotation = 210.000000;
action.AddStep(step41);

step42 = new CopyLayerSet;
step42.enabled = true;
step42.doDialog = false;
step42.expanded = false;
action.AddStep(step42);

step43 = new LayerVisibility;
step43.enabled = true;
step43.doDialog = false;
step43.expanded = false;
step43.visible = false;
step43.toggleOthers = false;
action.AddStep(step43);

step44 = new SelectBackwardLayer;
step44.enabled = true;
step44.doDialog = false;
step44.expanded = false;
action.AddStep(step44);

step45 = new DuplicateLayer;
step45.enabled = true;
step45.doDialog = false;
step45.expanded = false;
action.AddStep(step45);

step46 = new LayerVisibility;
step46.enabled = true;
step46.doDialog = false;
step46.expanded = false;
step46.visible = true;
step46.toggleOthers = false;
action.AddStep(step46);

step47 = new TransformLayer;
step47.enabled = true;
step47.doDialog = false;
step47.expanded = false;
step47.positionX = 0.000000;
step47.positionY = 0.000000;
step47.positionMode = ePositionRelative;
step47.percentage = 1.000000;
step47.horzSkew = 0.000000;
step47.vertSkew = 0.000000;
step47.rotation = 240.000000;
action.AddStep(step47);

step48 = new CopyLayerSet;
step48.enabled = true;
step48.doDialog = false;
step48.expanded = false;
action.AddStep(step48);

step49 = new LayerVisibility;
step49.enabled = true;
step49.doDialog = false;
step49.expanded = false;
step49.visible = false;
step49.toggleOthers = false;
action.AddStep(step49);

step50 = new SelectBackwardLayer;
step50.enabled = true;
step50.doDialog = false;
step50.expanded = false;
action.AddStep(step50);

step51 = new DuplicateLayer;
step51.enabled = true;
step51.doDialog = false;
step51.expanded = false;
action.AddStep(step51);

step52 = new LayerVisibility;
step52.enabled = true;
step52.doDialog = false;
step52.expanded = false;
step52.visible = true;
step52.toggleOthers = false;
action.AddStep(step52);

step53 = new TransformLayer;
step53.enabled = true;
step53.doDialog = false;
step53.expanded = false;
step53.positionX = 0.000000;
step53.positionY = 0.000000;
step53.positionMode = ePositionRelative;
step53.percentage = 1.000000;
step53.horzSkew = 0.000000;
step53.vertSkew = 0.000000;
step53.rotation = 270.000000;
action.AddStep(step53);

step54 = new CopyLayerSet;
step54.enabled = true;
step54.doDialog = false;
step54.expanded = false;
action.AddStep(step54);

step55 = new LayerVisibility;
step55.enabled = true;
step55.doDialog = false;
step55.expanded = false;
step55.visible = false;
step55.toggleOthers = false;
action.AddStep(step55);

step56 = new SelectBackwardLayer;
step56.enabled = true;
step56.doDialog = false;
step56.expanded = false;
action.AddStep(step56);

step57 = new DuplicateLayer;
step57.enabled = true;
step57.doDialog = false;
step57.expanded = false;
action.AddStep(step57);

step58 = new LayerVisibility;
step58.enabled = true;
step58.doDialog = false;
step58.expanded = false;
step58.visible = true;
step58.toggleOthers = false;
action.AddStep(step58);

step59 = new TransformLayer;
step59.enabled = true;
step59.doDialog = false;
step59.expanded = false;
step59.positionX = 0.000000;
step59.positionY = 0.000000;
step59.positionMode = ePositionRelative;
step59.percentage = 1.000000;
step59.horzSkew = 0.000000;
step59.vertSkew = 0.000000;
step59.rotation = 300.000000;
action.AddStep(step59);

step60 = new CopyLayerSet;
step60.enabled = true;
step60.doDialog = false;
step60.expanded = false;
action.AddStep(step60);

step61 = new LayerVisibility;
step61.enabled = true;
step61.doDialog = false;
step61.expanded = false;
step61.visible = false;
step61.toggleOthers = false;
action.AddStep(step61);

step62 = new SelectBackwardLayer;
step62.enabled = true;
step62.doDialog = false;
step62.expanded = false;
action.AddStep(step62);

step63 = new DuplicateLayer;
step63.enabled = true;
step63.doDialog = false;
step63.expanded = false;
action.AddStep(step63);

step64 = new LayerVisibility;
step64.enabled = true;
step64.doDialog = false;
step64.expanded = false;
step64.visible = true;
step64.toggleOthers = false;
action.AddStep(step64);

step65 = new TransformLayer;
step65.enabled = true;
step65.doDialog = false;
step65.expanded = false;
step65.positionX = 0.000000;
step65.positionY = 0.000000;
step65.positionMode = ePositionRelative;
step65.percentage = 1.000000;
step65.horzSkew = 0.000000;
step65.vertSkew = 0.000000;
step65.rotation = 330.000000;
action.AddStep(step65);

step66 = new GoToNextFrame;
step66.enabled = true;
step66.doDialog = false;
step66.expanded = false;
action.AddStep(step66);
Derek Fountain

2004-05-31, 11:14 pm

> Is there no way to use scripting of some sort to do this? I looked for
> ways to use Photoshop's tools from the command line, but couldn't find
> anything.
>
> Something like this would do the job in an incredibly simple fashion:
>
> for(count=1; count<360; count=count+1)
> {
> open(picname.psd);
> rotate(count);
> save(picname + count +, GIF);
> close(picname.psd);
> }
>
> Is there nothing of the sort available? It seems like an awful waste of
> time to record an action with me rotating a picture 360 times and saving
> it.


It may be sacriliedge in this newsgroup, but sometimes Photoshop isn't the
best tool for image manipulation. <Gasps, then the house falls silent...>
Hey, it's a rare occurence, but it happens!

For scripting jobs, which this clearly is, it's often simpler to use a
scripting language with tools which are designed to be used from script. If
you have Imagemagick on your system (http://www.imagemagick.org/) you can
use its excellent 'mogrify' command to do this from Python:


#!/usr/bin/python

from shutil import copy
from os import system

for deg in range(1,360):
srcfile = "camp.jpg"
destfile = "camp_%03d.jpg" % deg
copy( srcfile, destfile )
system( "mogrify -rotate %d %s" % (deg, destfile) )


Given a file called camp.jpg (which I happen to have on my system) that does
exactly what you want. Imagemagick and Python (Perl, Tcl, Java, whatever)
run on Win32, Mac9/X and UNIX. This script was tested on Linux, but it'll
probably work unchanged on Win32 or Mac.
jjs

2004-05-31, 11:14 pm

In article <40bbd301$0$8120$5a62ac22@freenews.iinet.net.au>, Derek
Fountain <devnull@example.com> wrote:

> It may be sacriliedge in this newsgroup, but sometimes Photoshop isn't the
> best tool for image manipulation. <Gasps, then the house falls silent...>
> Hey, it's a rare occurence, but it happens!


It's not a sacrilege at all. A high-end program invites high-end
expectations from professionals.

> For scripting jobs, which this clearly is [... snip interesting tip...]


But the job in question need not be scripted. I think that's the point.
The OP was shooting first, asking questions later. He did not understand
what PS can do in the first place and demanded that somehow it read his
(programmer) mind rather than him reading the docs.
Captain Blammo

2004-06-01, 7:14 pm

> Regarding the saving of layers, it's been covered here. I only got CS an
> hour before I left work Friday so I can't swear that it does that (but I'd
> bet a beer it does, possibly under an 'export' menu item), and regardless
> you can download a trial of a program that does exactly that via
> drag-n-drop here: http://www.metadma.com/LayerSplitter.html


Sorry, I should have mentioned that I'm using photoshop 7.0, not CS. It
won't even run on win98 :-)

> Sometimes it's okay to drop the compulsion to program and to do with what
> you have when the outcome is adequate. Or read the documentation. RTFM!


If I had the compulsion to program, I would've been using scripting from the
beginning, it's just that the program didn't do what I wanted it to. Trust
me, I R'd T F'ing M, and couldn't find anything helpful at all. After
wasting enough time on a task, one naturally turns to other solutions.

I tried changing values for the action, but all I could find was a series of
rotations that I would have had to change individually, not to mention
adding more of them. There was no "angle" setting. In any case, thank you
for pointing out that such a thing as an action file actually exists,
because they didn't seem to be mentioned in the help file.

I note that the action files for Photoshop can't be read as text, unlike the
Imageready ones. What do I need to view/edit them?

Thanks for the help.

Ewan


Captain Blammo

2004-06-01, 7:14 pm

> It may be sacriliedge in this newsgroup, but sometimes Photoshop isn't the
> best tool for image manipulation. <Gasps, then the house falls silent...>
> Hey, it's a rare occurence, but it happens!


I must say that it came as a bit of a suprise to me when I realised it
wasn't the right tool for the job :-)

> For scripting jobs, which this clearly is, it's often simpler to use a
> scripting language with tools which are designed to be used from script.

If
> you have Imagemagick on your system (http://www.imagemagick.org/) you can
> use its excellent 'mogrify' command to do this from Python:

<snip script>

Ah, marvellous! Worked like a charm. I appreciate the script too, as I've
never used either Python or Imagemagick before. Would I be right in thinking
that I could also use mogrify from within shell scripts?

Thanks very much!

Ewan


jjs

2004-06-01, 11:14 pm

In article <Lq4vc.51775$Np3.2249653@ursa-nb00s0.nbnet.nb.ca>, "Captain
Blammo" <eas6@nbnet.nb.ca> wrote:

[color=darkred]
> I tried changing values for the action, but all I could find was a series of
> rotations that I would have had to change individually, not to mention
> adding more of them. There was no "angle" setting.


Of course there was an "angle:" setting. It's in the 'transform current
layer' part of the action. There are not so many that changing them is a
burden. Sorry if you find that too much trouble to find.
Captain Blammo

2004-06-01, 11:14 pm

> > I tried changing values for the action, but all I could find was a
series of
>
> Of course there was an "angle:" setting. It's in the 'transform current
> layer' part of the action. There are not so many that changing them is a
> burden. Sorry if you find that too much trouble to find.


I consider 360 angle changes, not to mention subsequent changes if I want to
change the increments, to be very much not worth it next to a 7 line script
that can be changed in seconds.

I'm sorry if my laziness offends you, but I was never the kind for
repetitive and unnecessary tasks. I did get the point; I know it could be
done in Imageready, but I don't think the program was too upset about me
using something a bit more streamlined for the purpose.

Ewan


jjs

2004-06-01, 11:14 pm

In article <pFavc.52088$Np3.2259362@ursa-nb00s0.nbnet.nb.ca>, "Captain
Blammo" <eas6@nbnet.nb.ca> wrote:

> I consider 360 angle changes, not to mention subsequent changes if I want to
> change the increments, to be very much not worth it next to a 7 line script
> that can be changed in seconds.


Yer just a whiner. If you wanted the output, you would just do it.
Captain Blammo

2004-06-01, 11:14 pm

> > I consider 360 angle changes, not to mention subsequent changes if I
want to
script[color=darkred]
>
> Yer just a whiner. If you wanted the output, you would just do it.


Um, I did. In 5 minutes, using the *other* way.

Ewan


jjs

2004-06-02, 4:14 am

In article <QQavc.52100$Np3.2259590@ursa-nb00s0.nbnet.nb.ca>, "Captain
Blammo" <eas6@nbnet.nb.ca> wrote:

> want to
> script
>
> Um, I did. In 5 minutes, using the *other* way.


Um, well I'm just a whiner, I guess.
Captain Blammo

2004-06-02, 4:14 am

> > > Yer just a whiner. If you wanted the output, you would just do it.
>
> Um, well I'm just a whiner, I guess.


Man, we should team up and whine about something in tandem. Just think of
what we could accomplish.........

Ewan


Derek Fountain

2004-06-02, 12:14 pm

> Ah, marvellous! Worked like a charm. I appreciate the script too, as I've
> never used either Python or Imagemagick before. Would I be right in
> thinking that I could also use mogrify from within shell scripts?


Yes, of course. Most people use command line tools like mogrify from shell,
at least under *nix. I happened to use Python for that example because I've
been working with Python recently and it came most naturally. Normally I'd
use Perl. :o)
Sponsored Links


Copyright 2003 - 2008 forum4designers.com  Software forum  Computer Hardware reviews