text:
Whistler's seemingly endless array of hiking trails begin in the Village and extend like an enormous spider-web, high into the mountains. From the spectacular hikes in Garibaldi Provincial Park to the practically untouched wilderness across the valley. Whistler is much more than a world class winter resort. It is a summer hiking paradise, second to none.
Ancient Cedars often gets overlooked by hikers in Whistler. Certainly the large numbers of centuries old, massive cedars found in much of the other Whistler area hikes makes looking for them on a specific hike less of a priority. For example, hike the short 3k trail to Cheakamus Lake and you will marvel at the size, frequency and wonderful aroma of these massive and numerous giant cedars. The Wedgemount Lake trail also has some majestic cedars along the hike. You can even walk through an impressive grove of huge cedars on the Valley Trail at the end of the Whistler Golf Club. None of them compare, however, to the Ancient Cedars Trail. They are extraordinarily huge and some are estimated to be a thousand years old. The trailhead to Ancient Cedars is just a short drive north of Whistler. Just past Green Lake on Highway 99, you turn left on Cougar Mountain Rd and drive 4.5k up a bumpy logging road. The Ancient Cedars trail is well marked and well worn and only gradually uphill for the 2.5k hike, trailhead to ancient forest. At the Ancient Cedars forest there is a short circle trail that takes you throughout the giants then leads you back to the main trail for the return journey...
Why should you hike the Ancient Cedars trail?
The most impressive cedars in Whistler and a nice, easy and relaxing hike. Can be combined with a scenic drive north of Whistler to see the Green Lake viewpoint. Adjacent to the Ancient Cedars trail you will see a connecting trail to the beautiful, wild and remote Showh Lakes. These lakes are unknown to most locals and have a connecting trail between them well worth hiking. If you have a 4x4 you can park along the smaller of the two Showh Lakes.
More Hiking Info for Ancient Cedars in Whistler >>
Blackcomb Mountain has come alive with beautiful hiking trails in recent years. With the 2008 addition of the Peak to Peak Gondola which connects Blackcomb to Whistler, the demand for mountain trails is higher than ever. A dozen years ago, you would just have had some rough hiking trails to follow, and not many hikers to follow them. Now you have mapboards, trail signs, viewpoint seating areas and six popular, named trails to hike. The trails are mostly easy and relaxing, however the Decker Loop Trail at the far end of Blackcomb is very challenging and spectacularly scenic. For the most part, you will find yourself winding through a nice alpine forest scattered with enormous fields of erratics leading to one great viewpoint after another. You can hike for as little as 15 minutes or more than 3 hours, depending on the trail or trails you choose to follow. Blackcomb Lake and Blackcomb Peak that looms far above it are the most popular destinations for hikers and getting there and back can be done in a couple hours. The trails begin at the Rendezvous Lodge at the heart of Blackcomb Mountain. The Alpine Walk trail is your first section of this larger trail. It consists of a 1.6k(1mile) loop trail that takes you from the Rendezvous Lodge to the alpine to view of the Fitzsimmons Valley that separates Blackcomb and Whistler mountains.
Why should you hike the Blackcomb Mountain trails?
There are an excellent variety of trails on Blackcomb and they all have great views and beautiful alpine features. Blackcomb Lake is stunning and surrounded by jagged and almost vertical peaks. The trails are fun for all ages and abilities and every trail junction clearly shows how to continue hiking or start your return journey back to the Rendezvous Lodge and Peak to Peak Gondola.
More Hiking Info for the Blackcomb Mountain Trails >>
Black Tusk is the amazing pinnacle of volcanic rock visible for hundreds of kilometres and located near the centre of . Black Tusk, along with the Chief in Squamish are the most astoundingly noticeable peaks in the Garibaldi Range. 170,000 years ago the Black Tusk was created when a lava dome formed within a million year old, volcanic cinder cone. The cinder cone is crumbling away, revealing the starkly black, hardened lava dome within. Looking at the Black Tusk from a distance, two things seem incredible. First, that such an unusual thing formed, and second that there is a trail that takes you to its peak. With a little sketchy and dangerous, though non technical climbing, you can get to the top of Black Tusk. It is a fairly long dayhike as you cover 27k on the roundtrip hike. The final ascent of Black Tusk is a bit scary and dangerous so be prepared. You have to climb a narrow, steep and crumbly chute up about 10 metres to reach the top. Quite a few people don't climb this last part and instead just take in the extraordinary views from the base. Either way, Black Tusk is unquestionably one of the best of the best hikes in the Whistler area and in Garibaldi Provincial Park.
Why should you hike Black Tusk in Garibaldi Park?
Hiking to the top of Black Tusk is certainly one of the most extraordinary and memorable hikes around Whistler. It is a tremendous hiking workout as you gain 1735 metres in the 13.5k from the Rubble Creek trailhead to summit. It is an exhilarating hike as the last summit chute requires some courage and daring.
More Hiking Info for Black Tusk in Garibaldi Provincial Park >>
Brandywine Falls is one of the must see sights on the way to or from Whistler. The falls drop from a 66 metre, unnaturally abrupt cliff to the valley below. It is such a popular and beautiful sight that it is a Provincial Park, complete with a large and elaborate viewing platform directly opposite the falls. Located just 20 minutes south of Whistler, Brandywine Falls Provincial Park is just off of the Sea to Sky Highway. If driving from Vancouver, keep your eyes out for the Brandywine Falls sign on your right about 25 minutes north of Squamish. The parking lot is immediately off the highway and the short 1 kilometre trail takes you over then alongside the Cheakamus River to the viewing area. The only facilities in the park are pit toilets and picnic tables and there is no charge for hiking or for parking your vehicle in the park. The gate off of the highway is locked at night and in the winter so at these times you simply park at the edge of the highway and hike past the gate. Brandywine Falls Provincial Park is attached to the wonderful Sea to Sky Trail which runs between and beyond Whistler and Squamish.
Why should you hike to Brandywine Falls?
Brandywine Falls is amazingly beautiful and very easy and quick to hike to. Just a 20 minute pit stop on the drive to or from Whistler allows you to see this amazing falls. Brandywine Falls and Shannon Falls, just south of Squamish are both convenient, quick and beautiful stops on the drive from Vancouver to Whistler.
More Hiking Info for Brandywine Falls Provincial Park >>
Brandywine Meadows is a nice hike in a massive flower filled valley high up in the Callaghan Valley. Located 40 minutes south of Whistler, this tough and sometimes muddy trail gains a huge 550 metres of elevation in less than 3k (trailhead to meadows). The trailhead is tricky to find and involves a very sketchy gravel road journey that is passable without a 4x4, but barely. The sometimes very steep route is strewn with potholes, washouts and plenty of boulder sections. If you are happy driving up steep gravel roads with soccer ball sized boulders scattered throughout, then you will be ok driving the last 1.5k to the trailhead. The hike takes you to the beautiful Brandywine Meadows stretching into the distance along a cute, meandering river. The valleys far end leads to Brandywine Mountain. The mountains in the area, including Brandywine are hikeable, though the trails, if any are faint and unmarked. There are no camping facilities in Brandywine Meadows, however, the seemingly endless valley offers plenty of tent sites...
Why should you hike to Brandywine Meadows?
Challenging elevation gain, enormous valley to explore, cute river to set your tent up next to. Endless hiking possibilities in many directions from the centre of the meadows. One of the few dog friendly hikes around. Brandywine Meadows is a beautiful, picturesque valley full of colours.
More Hiking Info for Brandywine Meadows in Whistler >>
Brew Lake and Mount Brew are well hidden in the mountains beyond Brandywine Meadows. More often frequented in the winter by skiers, the area is slowly becoming noticed in the summer months. The barely marked trailhead that lurks next to the train tracks just south of Brandywine Falls has given way to a much better access point further up the trail. The Brew Main Road off of the Sea to Sky Highway just north of the turnoff to Brandywine Falls takes you high into the hills to the well concealed Brew Lake trail. From your car to the lake you just have beautiful two hour hike packed with sights and thoroughly exhausting. There are no facilities at the lake, just a beautiful wilderness paradise. If you want civilized comfort, hike up towards Mount Brew and you will come to the Brew Hut. An elaborate two level hut that is insanely well equipped and capable of accommodating a dozen people! The Brew Lake trail is challenging hike with considerable elevation gain of 745 metres in just 5k!. The trail is well off most people's radar and takes you well out of civilization just minutes after exiting your car. The trail is difficult yet constantly changing. Views, dramatic boulder fields, more views, bizarre forests, more views and a wonderfully remote lake.
Why should you hike to Brew Lake?
Though Brew Lake pales in comparison to many other Whistler hikes shown here, it has a wonderful rugged and remote charm about it. Sometimes a place so clearly brutalized by nature gives it some hard to identify beauty. You know it when you see it though, and you see it and feel it at Brew Lake.
More Hiking Info for Brew Lake South of Whistler >>
Callaghan Lake is not really a hiking destination but more of a drive to campsite on a beautiful lake, and gateway to some beautiful intermediate hikes. The campsite is small and looks a bit like a parking lot with about 6 spots to put up a tent. There is a proper boat launch at the campsite and the lake is large and beautiful to paddle. Surrounded by snowy mountains and nice rock outcrops the lake is good for fishing. The hiking trails are minimal here due to the steepness and deep forest surrounding the lake. At the far end of the lake the rustic and steep Cirque Lake trail runs along the side of the crashing waterfall all the way to the breathtaking Cirque Lake. If you are motivated and have a canoe this is an amazing area to hike in mostly untouched wilderness where the alpine allows for hiking in several directions to countless lakes and glaciers beyond. The Callaghan Lake campsite is free to use and is notorious for being a bit rowdy during summer weekends, which does make it a friendly and fun place...
Why should you hike to Callaghan Lake?
Convenient, you can drive right to the lake(4x4 is recommended due to the massive and frequent potholes as well as frequent, deep waterbars. Cars and motorhomes can make it, though slow and carefully). If you have a boat or canoe you can explore many beautiful areas of the lake and take several short hikes.
More Hiking Info for Callaghan Lake Provincial Park >>
Cheakamus Lake is an easy, relaxing hike in Garibaldi Provincial Park just a short, 16k drive from Whistler Village. The trail to the lake is in an amazing forest of giant cedars. The first 3k of the trail takes you along the beautiful Cheakamus River to the start of Cheakamus Lake and the first campsite area. There are 10 very nice and hidden tent pads on or near the lake shore. There is excellent water from several creeks in the area and a bear proof food hang as well as tidy outhouses here. Another 3k further on the trail takes you to some beautiful viewpoints on the ever increasingly majestic Cheakamus Lake trail. Huge trees, turquoise lake, snow capped mountains, and even the occasional bear siting make this hike one of Whistler's best and most family and kid friendly hikes around. The trail is never strenuous and constantly beautiful with the wonderful smells that come with an old growth cedar forest. The campsite at 6k on the Cheakamus Lake trail consists of another 7 tent sites beautifully blended into the surroundings, another bear proof food hang and outhouse...
Why should you hike to Cheakamus Lake?
Beautiful, huge tree forest, easy kid friendly trail, pristine Garibaldi Provincial Park wilderness and a spectacular and huge lake. Excellent campsites and numerous hidden beaches and wonderful, though very cold, swimming. Known for great fishing.
More Hiking Info for Cheakamus Lake in Garibaldi Provincial Park >>
Cheakamus River is the beautiful, crashing and turquoise coloured river that flows from Cheakamus Lake, through the Cheakamus Valley to Daisy Lake. Also a popular kayaking route, the main attraction to Cheakamus River is the wonderful and quite extensive network of hiking and biking trails that run along either side of it. Several trails run throughout the forest around the enormous 70 kilometre length of Cheakamus River including the Cheakamus Lake trail, the Whistler Train Wreck trail and the Sea to Sky Trail. For the most part, however, if you are talking about the Cheakamus River trails you are likely talking about the Farside and Riverside trails in Whistler's Interpretive Forest. Eight kilometres south of Whistler Village and surrounding the recently constructed neighbourhood of Cheakamus Crossing is Whistler Interpretive Forest. This beautiful forest surrounds the Cheakamus River and has been cut and replanted in several areas in the past decades. Hiking and biking trails have sprung up over the years making the area a wonderful place to explore. The main highlights of the Interpretive Forest are the beautiful Cheakamus River and the extraordinary Logger's Lake.
Why should you hike the Cheakamus River trails?
Right from the first glimpse of Cheakamus River you will be amazed. The turquoise and white foaming water crashes through the rocky and often abrupt cliffs on either side of the river. Both the Farside and Riverside trails in Whistler Interpretive Forest take you to one breathtaking viewpoint after the next. The location of Cheakamus River is quite good as well. At 8 kilometres south of Whistler Village, the Cheakamus Valley hiking trails are considerably quieter than the hectic trails around the Village and you get a much more of a wilderness feel to while hiking.
More Hiking Info for Cheakamus River & Whistler Interpretive Forest >>
is an unbelievably beautiful paradise high up above Cirque LakeCallaghan Lake in the Callaghan Valley. It requires a canoe to get you to the trailhead at the far end of Callaghan Lake and therefore is seldom hiked. The trailhead is tricky to find and the 2 kilometre trail is very steep, though surprisingly well marked with flagging tape. Once at the lake you find yourself in the wind shadow of the cirque and in a world of serenity and calm. It is an extraordinary thing to have a cirque valley to yourself. Feels like you are standing in a volcano of sorts. But a giant, tree filled meadow of a volcano with a mesmerisingly still and perfectly reflecting lake at its centre. A cirque lake is a wonderful thing, and Cirque Lake in Whistler takes you as close to a hiking paradise as a place can get. And that is just the beginning... you can hike in almost any direction. Thirty minutes past the lake and you find yourself staring at a monstrous glacier. Glaciers, mountain peaks, lakes and more lakes. You can lose yourself in the hiking possibilities in the Callaghan Valley around Cirque Lake. And one magical and striking feature of this area often goes unnoticed. The trail ends at Cirque Lake. You won't find any indication of humanity past the lake...
Why should you hike to Cirque Lake?
Wonderfully beautiful, untouched wilderness hiking. Endless hiking opportunities beyond Cirque Lake. The wildly hostile looking, yet scenic Sky Lake sits high up the valley past Cirque Lake. Trailhead must be reached by canoe, amazing! Challenging trail to Cirque Lake due to its steepness, however the trail is short and should pose no difficultly, for example, for a moderately experienced weekend hiker.
More Hiking Info for Cirque Lake in Callaghan Provincial Park >>
Garibaldi Lake is the centre and base for much of the hiking in Garibaldi Provincial Park. The Garibaldi Lake campsite is located on the amazing, turquoise shores of this massive and mostly undisturbed mountain lake. There are no trails around the perimeter of the lake with the exception of the small section leading to the campsite, so your view of the lake is a sea of unnaturally coloured water ringed by swaths of forest and a magnificent glacier towering in the distance. The water is painfully cold, though plenty of brave hikers swim here as well as camp. The camping area is well laid out and stretches deep into the forest with 50 tent clearings. You can, except for the busiest of days, put your tent out of earshot and sight of others. The trail to Garibaldi Lake from the Rubble Creek trailhead, just off of the Sea to Sky Highway takes about two hours. You gain a fair amount of elevation, 900 metres in just 9 kilometres, trailhead to lake. Partway along the trail to Garibaldi Lake the trail forks. Right to Garibaldi Lake and left goes to another beautiful campground, Taylor Meadows. Past Taylor Meadows you can link back to Garibaldi Lake by yet another linking trail. At every trail for there are nice and clear signs and sometimes maps, showing where and how far everything is...
Why should you hike to Garibaldi Lake?
Garibaldi Lake is amazingly beautiful with its huge size and unbelievable colour. The trails are beautiful and well signed and laid out in the well organized Garibaldi Provincial Park. The trails are relatively easy and there is quite a lot to see. Black Tusk, Taylor Meadows and Panorama Ridge are all within hiking distance and some of the most amazing hikes around.
More Hiking Info for Garibaldi Lake in Garibaldi Provincial Park >>


text:
Steve Armstrong
- Certified
- Twitter: @Nebulator
Steve began working in the security arena in 1994 whilst serving in the UK Royal Air Force. He specialized in the technical aspects of IT security from 1997 onward, and before retiring from active duty, he lead the RAF's penetration and TEMPEST testing teams. He founded Logically Secure in 2006 to provide specialist security advice to government departments, defense contractors, the online video gaming industry, and both music and film labels worldwide.
When not teaching for SANS, Steve provides penetration testing and incident response services for some of the biggest household names in gaming and music media. To relax Steve enjoys playing Battlefield to loud music and developing collaborative DFIR tools.
Here is What Students Say About Steve Armstrong:
"Steve Armstrong's energy is contagious. Although the day was long, I felt alert and engaged at all times." - Amr Zakaa Khalife, Vodafone Egypt
Steve Armstrong Will Be Teaching the Following Course:
|SEC504: Hacker Tools, Techniques, Exploits and Incident Handling

subset: commoncrawl


text:
HIV (human immunodeficiency virus) is the virus that causes AIDS (acquired immune deficiency syndrome). HIV kills or damages cells in the body's immune system, gradually destroying the body's ability to fight infection and certain cancers. CDC estimated that 1.1 million people were living with HIV/AIDS in the United States in 2010.
People with HIV/AIDS are at high risk of serious influenza-related complications. Studies done before routine use of highly active antiretroviral therapy (HAART) suggested an increased risk for heart- and lung-related hospitalizations in people infected with HIV during influenza season as opposed to other times of the year, and a higher risk of influenza-related death in HIV-infected people. Other studies have indicated that influenza symptoms might be prolonged and the risk of influenza-related complications is higher for certain HIV-infected people. Vaccination with a flu shot has been shown to produce an immune response against influenza viruses in certain people infected with HIV.
Because influenza can result in serious illness, HIV-infected persons are recommended for vaccination. To help you prepare for the flu this season, this fact sheet provides Questions & Answers to guide the administration of both flu shots and antiviral medications to people with HIV/AIDS.
Should People With HIV/AIDS Receive the Inactivated Influenza Vaccine?
People with HIV/AIDS are at high risk of serious influenza-related complications and should get the inactivated influenza vaccine (the flu shot). Persons with advanced HIV disease may have a poor immune response to vaccination. Therefore, pre-exposure chemoprophylaxis (use of antiviral medications to prevent influenza infection) may be considered for these patients if they are likely to be exposed to people with influenza.
Are There People With HIV/AIDS Who Should NOT Receive the Inactivated Influenza Vaccine?
Contraindications to the use of inactivated influenza vaccine (the flu shot) in persons with HIV/AIDS are the same as those for persons without HIV/AIDS.
- Children younger than 6 months of age (influenza vaccine is not approved for this age group)
- If you have any severe, life-threatening allergies. If you ever had a life-threatening allergic reaction after a dose of flu vaccine, or have a severe allergy to any part of this vaccine, including (for example) an allergy to gelatin, antibiotics, or eggs, you may be advised not to get vaccinated. Most, but not all, types of flu vaccine contain a small amount of egg protein. For people with milder egg allergies, see "Influenza Vaccination of Persons With a History of Egg Allergy."
- If you ever had Guillain-Barré Syndrome (a severe paralyzing illness, also called GBS). Some people with a history of GBS should not get this vaccine. This should be discussed with your doctor.
- If you are not feeling well. It is usually okay to get flu vaccine when you have a mild illness, but you might be advised to wait until you feel better. You should come back when you are better.
Should People With HIV/AIDS Receive the Nasal-Spray Flu Vaccine (Live Attenuated Influenza Vaccine [LAIV] (FluMist®)?
No. Persons with HIV/AIDS should not get the nasal spray vaccine [LAIV] (FluMist®). LAIV (FluMist®) contains a weakened form of the live influenza virus. LAIV (FluMist®) is not recommended for use in people with weakened immune systems (immunosuppression).
Should People With HIV/AIDS Receive Influenza Antiviral Medications for Treatment of Influenza?
Yes. It's very important that influenza antiviral drugs be used early to treat flu in people who are very sick with flu (for example people who are in the hospital) and people who are sick with flu and who have a greater chance of getting serious flu complications, such as people with HIV/AIDS.
Studies have shown that flu antiviral drugs work best for treatment if they are started within 2 days of getting sick. There may still be benefit in treating people with antiviral drugs even after two days have gone by, especially if the sick person has a greater chance of serious flu complications (See box on "What You Should Know About Flu Antiviral Drugs") or is very sick, for example in the hospital because of the flu.
When Should People With HIV/AIDS Receive Antiviral Medications for Chemoprophylaxis (Prevention of Influenza)?
People with HIV/AIDS should be prescribed oral oseltamivir or inhaled zanamivir to prevent infection with influenza when they cannot otherwise be protected during times when there is a high risk for exposure to influenza. Use should be in accordance with current recommendations from CDC or local public health authorities. Current CDC guidance on use of chemoprophylaxis should be consulted, and updated recommendations from CDC can be found on the seasonal influenza (flu) site.
There are no published data on interactions between the recommended influenza antiviral agents (oseltamivir, zanamivir and peramivir) and drugs used in the management of HIV infected persons. Patients should be observed for adverse drug reactions to influenza antiviral chemoprophylaxis agents, especially when neurologic conditions or renal insufficiency is present.
Should Health Care Workers Who Have Contact With HIV/AIDS Patients Be Vaccinated?
Influenza vaccination is recommended for health care workers, including those who are involved in direct care of HIV-infected patients. More information about vaccination of health care workers can be found in "Prevention and Control of Influenza With Vaccines: Recommendations of the Advisory Committee on Immunization Practices (ACIP), 2010." Health care workers who are younger than 50 years of age, and are not pregnant may receive the nasal-spray flu vaccine (LAIV/FluMist) as long as they do not care for severely immunosuppressed persons who require a protective environment.


text:
By Joe Ward
15 October 2008
15 October 2008
Prerequisite knowledge
General experience building applications with Flash Professional or ActionScript is suggested. The examples in this article were built with Flash CS4. To examine the examples more closely, download the sample files and open the files in the Pixel Bender Toolkit and Flash CS4 or later.
User level
Required products
Sample files
Adobe Pixel Bender is a graphics processing engine supported by Adobe Flash Player 10, Adobe After Effects, and Adobe Photoshop. The language is based on fragment shader languages, such as OpenGL Shading Language (GLSL), used to optimize pixel drawing operations in 3D rendering. In Flash Player, you can use Pixel Bender programs to create filters, blends, area fills, and line fills.
Pixel Bender effects can be applied to any display object, including images, vector graphics, and even digital video. The execution speed is extremely fast; effects that would have taken seconds per frame to execute in ActionScript can now be achieved in real time:
Pixel Bender programs, called kernels, are written and compiled using the Adobe Pixel Bender Toolkit. The compiled bytecode produced by the toolkit can be loaded into a Shader object and used by your SWF content. The Pixel Bender Toolkit is installed automatically when you install Flash CS4 Professional.
Documentation for using Pixel Bender in Adobe Flash CS4 Professional is available in the Programming ActionScript 3.0 chapter: Working with Pixel Bender shaders and in the ActionScript Component and Language Reference in the Shader class section. This documentation contains a detailed description of the objects you can use with Pixel Bender in Flash CS4. Documentation on the Pixel Bender language is available from the Help menu of the Pixel Bender Toolkit.
If you want to see what's possible, as well as learn some new tricks, I recommend reviewing examples of Pixel Bender programs. In addition to the examples provided in this article, you can find a public repository of kernels hosted by Adobe at the Pixel Bender Exchange. The authors of these kernel programs have kindly agreed to share them with the wider Flash developer community. Perhaps your kernel will be the next one posted? There is also a forum for discussing Pixel Bender programming. Also visit the Pixel Bender Technology Center.
Before jumping into kernel coding, let's take a brief look at the Pixel Bender language. You probably won't become an expert in the language just from reading this article, but the following discussion should help you understand programs written in the Pixel Bender language. For far more detail, refer to the Adobe Pixel Bender Language 1.0 Tutorial and Reference Guide, available from the Help menu of the Pixel Bender Toolkit application.
Pixel Bender uses procedural syntax similar to languages such as C, Java, and ActionScript. It includes built-in data types and functions targeted at image processing. If you are already familiar with ActionScript, then learning to write Pixel Bender kernels should be reasonably straightforward. The main differences in syntax between ActionScript and Pixel Bender language include:
- Type declarations for variables go in front of the variable name, instead of after it. The var keyword is not used. Thus, instead of declaring an integer value with:
var foo:int;
you use the syntax:
int foo;
- New objects cannot be created at runtime. Thus, the
newkeyword is not supported (or needed).
- Pixel Bender uses the data type, float, instead of the data type, Number, for representing real numbers. The term float stands for floating-point (which just means that the decimal point can "float" to any position in the number).
- It is important to remember that when you type a floating point number in a Pixel Bender program, you must include a decimal point. Otherwise, the Pixel Bender compiler will treat the number as an integer rather than a float value. Unlike ActionScript, Pixel Bender does not do any implicit data conversion. So if, for example, you type 1 instead of 1.0, you will get an abstruse error message from the Pixel Bender Toolkit.
- Pixel Bender includes built-in vector data types. A vector type can be recognized by the number appended to the base type name. For example, a float3 type is a vector containing three elements of type float.
- The following statement illustrates a typical use of a vector data type in Pixel Bender:
float4 rgbaPixel = float4( 1.0, 0.3, 0.2, 0.8 );
- The statement above declares a new vector variable named
rgbaPixeland assigns it a color value. The expression,
float4( 1.0, 0.3, 0.2, 0.8 ), defines a literal float4 vector constant, which is assigned to the
- Pixel Bender supports vector swizzling. The members of a vector can be accessed using dot notation and one of three sets of elements names:
x,y,z,w; or
s,t,p,q. Swizzling lets you rearrange the elements simply by reordering the element names. For example, the following statement swaps the red and green color channels of a pixel vector when assigning the pixel value to another variable:
pixel4 mixedUp = rgbaPixel.grba;
You can also repeat channels:
pixel4 allRed = rgbaPixel.rrra;
and drop channels:
pixel2 redAndBlue = rgbaPixel.rb;
Note: The choice of which set of element names to use with a vector variable is up to you. For example,
myVector.r is the same as
myVector.x. A good practice is to use the rgba set for colors, and the xyzw or stpq sets for positions. You cannot mix names from more than one set in the same reference.
- Pixel Bender also supports built-in matrix data types. A matrix data type is similar to a vector, but contains a two dimensional array of numbers. The float3x3 matrix type, for example, contains three vectors of three elements.
- Pixel Bender in Flash Player does not support loops, custom functions (other than the
evaluatePixel()function), or arrays.
Note: When developing Pixel Bender kernels for Flash Player, be sure to enable the Turn on Flash Player Warnings and Errors option (under the Build menu of the toolkit window). With this option enabled, the compiler will inform you immediately when you are using unsupported Pixel Bender language features. (Otherwise, you won't see the errors until you try to export the kernel for Flash Player.)
The typical Pixel bender kernel performs the following tasks:
- Samples a pixel from the input image
- Applies a calculation to the sampled pixel color
- Assigns the modified value to the output pixel
The following simple Pixel Bender kernel does each of these tasks. The program defines a kernel named ChannelScrambler:
<languageVersion : 1.0;>
kernel ChannelScramblerFilter
< namespace : "com.adobe.example";
vendor : "Adobe Systems Inc.";
version : 1;
description : "Changes the color channel order from rgba to gbra.";
input image4 inputImage;
output pixel4 outPixel;
void evaluatePixel()
pixel4 samplePixel = sampleNearest( inputImage, outCoord() );
outPixel = samplePixel.gbra;
The kernel declares an input image, named
inputImage, and an output pixel, named
outPixel. In the
evaluatePixel() function, the pixel at the output coordinates currently being processed is accessed using two built-in functions,
sampleNearest() and
outCoord(). Next, the sampled pixel is assigned to the
outPixel variable, using swizzling to reorder the color channels.
This kernel produces the following result when used as a filter in SWF files generated in Flash CS4:
The required elements of a Pixel Bender program include the languageVersion tag:
<languageVersion: 1.0;>
and the kernel name declaration:
kernel ChannelScrambler{...}
Inside the kernel, there must be a single output declaration, such as
output pixel4 outPixel, and an
evaluatePixel() function. A kernel may have any number of inputs, including no inputs at all. However, the way you use a kernel in Flash Player creates additional requirements on the number of inputs. A shader used as a blend requires two inputs, a shader used as a filter requires one input, and a shader used as a fill does not require any inputs at all.
A Pixel Bender kernel is run once for every pixel in the output image. No state information is saved between runs, so it isn't possible to collect an average pixel value by accumulating the pixels sampled in each run. Each run of the kernel must compute all the information it needs—although you can pre-compute information in ActionScript and pass it in as an input or parameter.
To access the pixel values in an input image, you must use the sampling functions. Sampling is accomplished with the following built-in functions:
sampleNearest()returns a vector containing the channel values of the pixel closest to the specified coordinates. (There is also a
sampleLinear()function that behaves slightly differently.)
outCoord()returns the coordinates of the current output pixel.
As Pixel Bender processes an image, it executes the kernel for every pixel in the output image. The
outCoord() function returns the coordinates of the current pixel. The Pixel Bender coordinate system is similar to that used by Flash Player. The origin is registered at the top, left corner. Positive values increase to the right and down. Pixels are always square.
You are not limited to sampling the pixel directly at the
outCoord() position. For example, you could use the following sampling statement to sample the pixel that is 10 pixels right and 5 pixels down from the current pixel:
pixel4 inputPixel = sampleNearest( inputImage, outCoord() + float2( 10.0, 5.0 ) );
The expression,
outCoord() + float2( 10.0, 5.0 ), adds a two-element vector to the vector of coordinates produced by the
outCoord() function. An equivalent way to code the same expression is:
float2(outCoord().x + 10.0, outCoord().y + 5.0).
If the sample coordinates go beyond the bounds of the input image, then a color vector containing all zeros is returned. For example, if the input is of type image4, then sampling an exterior pixel will return a completely transparent black pixel. If the input is of type image3, then it will return a black pixel (without an alpha channel). The Pixel Bender coordinate space theoretically extends to infinity. There are, of course, practical limits on the range of coordinates that can be expressed, as well as limits on the usefulness of sampling data that does not exist.
Once you have a vector representing a pixel, there are a number of ways to work with the color values. For example, if you have a pixel4 variable named
pix, you can address the individual color channels, or combinations of channels in the following ways:
- Red channel:
- Green channel:
- Blue channel:
- Alpha channel:
- Red and alpha channels:
- All the color channels with red and blue swapped and no alpha channel:
A single color channel is a 32-bit floating-point number, normally between
0.0 (black) and
1.0 (white). The output color values can be outside this range, but they won't change the rendered appearance. In other words,
pixel3(-1.0, -1.0, -1.0) is just as black as
pixel3(0.0, 0.0, 0.0) when rendered as a bitmap. (However, if you run multiple filters on the same image, the difference can be significant since the second filter will see
(-1.0, -1.0, -1.0) not
(0.0, 0.0, 0.0) when sampling that pixel.)
You can perform arithmetic on a pixel vector with either scalar or vector values. When using scalar values, the operation is applied to each channel. For example, the following operation will divide the value of each channel in half (including the alpha channel):
pixel4 pix = sampleNearest( inputImage, outCoord());
pix = pix / 2.0;
The same operation could also be written using vectors:
pix = pix * pixel4( 0.5, 0.5, 0.5, 0.5 );
Although Pixel Bender images have 32-bits per channel, graphics in Flash CS4 only have 8-bits per channel. When a kernel is run in Flash Player, the input image data is converted to 32-bits per channel and then converted back to 8-bits per channel when kernel execution is complete.
Inputs are declared with the input keyword:
input image4 sourceImage;
Inputs can be declared using the data types: image1, image2, image3, or image4. The different inputs in a kernel can have different numbers of channels. The number of channels in the output image produced by the shader is determined by the data type of the output pixel, not by the data types of the inputs.
You can declare more inputs than are required for the way a kernel is used in Flash Player. However, Flash Player will only automatically assign image data to the required inputs. You must assign an image to the extra inputs before assigning the kernel as a blend, filter or fill. For example, if your filter kernel used an additional image to create a textured effect, you would have to assign the texture as an input to the kernel before assigning the ShaderFilter containing the kernel to the filter array of a display object (more on how to do that later in this article).
In addition to input images, you can supply other values to a kernel as parameters. Parameters are declared with the parameter keyword and can be any data type, except image (or region—which you can't use in kernels written for Flash Player anyway). You can declare metadata for parameters to specify the default, minimum, and maximum values. You can also supply a description. The metadata is declared between angle braces (
<>) and can be accessed in Flash Player. It is always a good idea to define a reasonable default value for a parameter.
The following parameter statement declares a float3 parameter with metadata:
parameter float3 weights
defaultValue : float3( 0.5, 0.5, 0.5 );
minValue : float3( 0.1, 0.1, 0.1 );
maxValue : float3( 0.9, 0.9, 0.9 );
description : "A three element vector of weight values."
To access parameter values in Flash Player, you use the
data property of the ActionScript Shader object containing the kernel. The current, minimum and maximum values of the above parameter can be accessed in ActionScript with the following statements (assuming that
myShader is a Shader object containing a kernel with this parameter):
var currentWeights:Array = myShader.data.weights.value;
var minWeights:Array = myShader.data.weights.minimumValue;
var maxWeights:Array = myShader.data.weights.maximumValue;
Since the parameter is a float3 vector type, the ActionScript arrays returned will contain three elements. If the parameter was a scalar type, such as float, then the arrays returned would contain a single element.
Use the Export Kernel Filter for Flash Player command from the Pixel Bender Toolkit to compile and export the kernel for use in Flash Player. Kernels are exported with a file extension .pbj (see Figure 1).
Figure 1. Exporting the kernal from the Pixel Bender Toolkit
To load a Pixel Bender kernel in Flash Player, you must either embed or load the compiled kernel.
The Embed tag, newly supported in Flash CS4 Professional, instructs the ActionScript compiler to embed the Pixel Bender kernel when it creates the SWF file. The Embed tag is used with a variable definition of type, Class, as shown in the following example:
[Embed(source="channelscrambler.pbj", mimeType="application/octet-stream")]
var ChannelScramblerKernel:Class;
To use the kernel, create an instance of the class, in this case, ChannelScramblerFilter. The following code uses an embedded kernel to create new Shader and ShaderFilter objects, which are applied it to a MovieClip instance on the Stage:
var camellia_mc:MovieClip;
//Embed the PixelBender kernel in the output SWF
[Embed(source="channelscrambler.pbj", mimeType="application/octet-stream")]
var ChannelScramblerKernel:Class;
var shader:Shader = new Shader(new ChannelScramblerKernel() );
var shaderFilter:ShaderFilter = new ShaderFilter( shader );
camellia_mc.filters = [ shaderFilter ];
Using the Embed tag is typically the simplest method of loading Pixel Bender kernels, but you can also load kernels at runtime. The following example uses the URLLoader class to load a kernel:
var camellia_mc:MovieClip;
var urlRequest:URLRequest = new URLRequest( "channelscrambler.pbj" );
var urlLoader:URLLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.addEventListener( Event.COMPLETE, applyFilter );
urlLoader.load( urlRequest );
function applyFilter( event:Event ):void
urlLoader.removeEventListener( Event.COMPLETE, applyFilter );
var shader:Shader = new Shader( event.target.data );
var shaderFilter:ShaderFilter = new ShaderFilter( shader );
camellia_mc.filters = [ shaderFilter ];
Note: When you use the Embed tag, Flash CS4 Professional uses the Flex.swc library from the Flex SDK. This SDK is installed with Flash CS4, typically in the Common/Configuration/ActionScript 3.0/libs/flex_sdk_3 subdirectory. The first time you test or publish a movie using the Embed tag, you will be asked to confirm the location of the Flex SDK. You can click OK to use the Flex SDK installed with Flash CS4, or you can change the path if you prefer to use a different version of Flex. The setting used for a project can be changed later on the Advanced ActionScript 3.0 Settings dialog box, under the Library path tab. (Access the Advanced ActionScript 3.0 Settings dialog box from the Flash tab of the Publish Settings by clicking the Settings button next to the Script drop-down menu.)
A blend combines the colors in the display object to which the blend is applied with the colors below the object on the Stage. Flash Player supports several built-in blends, defined in the BlendMode class. As a learning exercise, we duplicate a couple of the built-in blends. Then we create a blend that can't be easily achieved using the built-in options.
To apply a blend to a display object, create a Shader object with the loaded kernel bytecode and assign it to the
blendShader property of the display object. A blend kernel must have two inputs. The first input is the foreground display object (whose
blendShader property is set). The second input is whatever is behind the foreground object. If you use additional inputs, perhaps for creating masks or textures, you must assign an image in the form of a BitmapData object to these inputs yourself before applying the blend.
In a multiply blend, each color in the foreground object is multiplied by the color of the background object. This blend darkens the result, except in the scenario where one of the images is pure white:
The following kernel declares two inputs, named foreground and background, and an output, named result. In the
evaluatePixel() function, the pixel at the current coordinate is sampled in each image using the
sampleNearest() function. The pixels are then multiplied together.
<languageVersion : 1.0;>
kernel MultiplyBlend
< namespace : "com.adobe.example";
vendor : "Adobe Systems Inc.";
version : 1;
description : "A simple multiply blend";
input image4 foreground;
input image4 background;
output pixel4 result;
void evaluatePixel()
pixel4 a = sampleNearest( foreground, outCoord() );
pixel4 b = sampleNearest( background, outCoord() );
result = a * b;
Note: When you multiply two vectors in the Pixel Bender language, each corresponding pair of component values are multiplied together. Thus, if
a and
b are float2 vectors, for example, the statement:
a * b
is equivalent to the two statements:
a.x * b.x
a.y * b.y
The following ActionScript code is used to load and apply the blend:
var camellia_mc:MovieClip;
//Embed the Pixel Bender kernel in the output SWF
[Embed(source="multiplyblend.pbj", mimeType="application/octet-stream")]
var MultiplyBlendKernel:Class;
var shader:Shader = new Shader( new MultiplyBlendKernel() );
camellia_mc.blendShader = shader;
A screen blend inverts the colors, multiplies them together, and then inverts the result. This has the opposite effect as applying the multiply blend. The screen blend lightens the result, except in the scenario where one of the images is black:
<languageVersion : 1.0;>
kernel ScreenBlend
< namespace : "com.adobe.example";
vendor : "Adobe Systems Inc.";
version : 1;
description : "Screen blend";
input image4 foreground;
input image4 background;
output pixel4 result;
void evaluatePixel()
pixel4 a = sampleNearest( background, outCoord() );
pixel4 b = sampleNearest( foreground, outCoord() );
result = 1.0 - (1.0 - a) * (1.0 - b);
As you can see, this kernel is almost identical to the multiply kernel. Only the mathematical operation used to produce the result has changed. This example uses the same ActionScript code, except it is loading and applying a different shader.
A hard light blend is a combination of the multiply and screen blends. If the foreground pixel is lighter than 50% gray, then a screen blend is performed. Otherwise, a multiply blend is performed:
<languageVersion : 1.0;>
kernel HardLightBlend
< namespace : "com.adobe.example";
vendor : "Adobe Systems Inc.";
version : 1;
description : "Hard light blend";
input image4 foreground;
input image4 background;
output pixel4 result;
void evaluatePixel()
pixel4 a = sampleNearest( background, outCoord() );
pixel4 b = sampleNearest( foreground, outCoord() );
float gray = (b.r + b.g + b.b)/3.0;
if( gray < 0.5 )
result = 2.0 * a * b;
result = 1.0 - 2.0 * (1.0 - a) * (1.0 - b);
The hard light blend is a bit more complicated than the previous two. First, the gray level of the pixel in the foreground image is calculated by averaging the color channels. Then, an
if statement is used to select either a multiply or a screen blend operation.
Again, this example uses the same ActionScript code, but it loads and applies a different shader.
Now for something that is a bit more difficult to achieve with the built-in blends. The next filter uses a noise texture and
sin() functions to generate a wood grain or marbling effect. The effect depends on the characteristics of the noise texture and generally looks best with Perlin-type noise:
The shader works by sampling the pixels values from the noise image. Instead of using the noise pixels directly in the image, the shader feeds the noise value into a series of
sin() functions. The background is multiplied by the result. A turbulence parameter is used to control the curviness of the resulting effect:
<languageVersion: 1.0;>
kernel GrainBlend
< namespace : "com.adobe.example";
vendor : "Adobe Systems Inc.";
version : 1;
description : "Creates a wood grain or marbling effect"; >
input image4 background;
input image4 noise;
output pixel4 dst;
parameter float turbulence
maxValue : 500.0;
minValue : 0.0;
defaultValue : 150.0;
void evaluatePixel()
pixel4 a = sampleNearest(background, outCoord());
pixel4 b = sampleNearest(noise, outCoord());
float alpha = a.a; //save the original alpha
if( (b.a > 0.0) && (a.a > 0.0)){
float seed = outCoord().x + (((b.r + b.g + b.b)/3.0) * turbulence);
float grain = (0.7 * sin(seed) + 0.3 * sin(2.0 * seed + 0.3) + 0.2 * sin(3.0 * seed + 0.2));
dst = sampleNearest(background, outCoord()) * (grain + 0.5);
dst.a = alpha; //restore the original alpha
else {
//Just copy the background pixel outside the area of the noise image
dst = sampleNearest(background, outCoord());
The ActionScript code used for this example loads and applies the shader in the same way as the previous examples. In addition, the example creates a slider to control the turbulence parameter:
import fl.controls.Slider;
import fl.events.SliderEvent;
var noise_mc:MovieClip;
var turbulence:Slider;
//Embed the Pixel Bender kernel in the output SWF
[Embed(source="grainblend.pbj", mimeType="application/octet-stream")]
var GrainBlendKernel:Class;
//Create the Shader object
var shader:Shader = new Shader( new GrainBlendKernel() );
//Set the slider values based on the parameter metadata
turbulence.minimum = shader.data.turbulence.minValue;
turbulence.maximum = shader.data.turbulence.maxValue;
turbulence.value = shader.data.turbulence.defaultValue;
turbulence.liveDragging = true;
turbulence.addEventListener( SliderEvent.CHANGE, updateFilter );
//Apply the blend
noise_mc.blendShader = shader;
function updateFilter( event:SliderEvent ):void
shader.data.turbulence.value = [turbulence.value];
noise_mc.blendMode = BlendMode.NORMAL;
noise_mc.blendShader = shader;
The example uses a slider to control the shader turbulence parameter. The minimum, maximum and starting values of the slider are set according to the parameter metadata. Then, the
updateFilter() method is used to change the parameter value whenever a change event is dispatched by the Slider object. Because a shader object is cloned when you set the
blendShader property of a display object, you cannot simply change the parameter value of the original Shader object. You must also reassign the updated Shader object to the
blendShader property.
For simplicity, this example uses a bitmap for the noise texture. You can also use the
perlinNoise() function of the BitmapData class to create a suitable texture.
Shaders used as filters are applied to a single image. In addition to creating a Shader object, as we did for blends, you must also create a ShaderFilter object, passing in the Shader containing the kernel:
var shader:Shader = new Shader( loadedBytes );
var shaderFilter:ShaderFilter = new ShaderFilter( shader );
The ShaderFilter object "wraps" the shader and allows you to use the shader like a built-in filter, by adding it to the
filters array of a display object:
displayObject.filters = [ shaderFilter ];
The object to which a shader is applied is automatically set as the first input of the kernel. If a filter kernel takes additional images as inputs, these must be set before the filter is assigned to a display object.
We've already looked at a simple filter, ChannelScrambler, so let's go straight to a more complex example, the Gaussian blur.
A Gaussian blur is an example of a convolution filter. (Convolution is a fancy word for a filter that computes a weighted average of nearby pixels.) Although Flash CS4 Professional includes a built-in class for creating convolution filters of arbitrary size, programming a Gaussian blur in Pixel Bender is a good exercise that demonstrates several important aspects of Pixel Bender.
General-purpose convolution filters aren't easy to achieve in Pixel Bender because Flash Player doesn't support loops in kernel code. Instead of using a
for loop, we have to write an individual program statement to sample each pixel in the neighborhood. This example kernel creates a Gaussian blur that can have a sampling radius between 1 and 6 (corresponding to convolution matrices ranging in size between 3 × 3 to 13 × 13).
The filter takes advantage of the fact that a Gaussian blur is separable, which simply means that you can perform the operation in two passes. One pass blurs the image horizontally, and the other pass blurs the image vertically. This saves several calculations, since for each final pixel, only about 4 times the radius pixels have to be sampled, and weighted and averaged, rather than 2 times the radius2 pixels. For example, at the largest radius supported by this filter, 26 input pixels are sampled for each final output pixel in both the vertical and horizontal passes combined. If the filter computed the blur in a single pass, 169 input pixels would have to be sampled for each output pixel.
To overcome the lack of a
for loop, the kernel treats each integer radius value separately. For each allowed radius value, the two pixels located at that distance to either side of the current pixel are sampled. The Gaussian weights are the same for both pixels, so they are added together. Once all the necessary pixels are sampled, the weight and scale factors are applied.
The following kernel code is used for the horizontal pass (a similar kernel is used for the vertical pass):
<languageVersion: 1.0;>
kernel HorizontalGaussianBlur
< namespace : "com.adobe.example";
vendor : "Adobe Systems Inc.";
version : 1;
description : "The horizontal convolution of a Gaussian blur"; >
input image4 src;
output float4 result;
parameter int radius
minValue : 1;
maxValue : 6;
defaultValue : 6;
void evaluatePixel()
pixel4 center, band1, band2, band3, band4, band5, band6;
float2 pos = outCoord();
//Sample image in bands
if( radius > 5 )
band6 = sampleNearest(src, float2(pos.x - 6.0, pos.y))
+ sampleNearest(src, float2(pos.x + 6.0, pos.y));
if( radius > 4 )
band5 = sampleNearest(src, float2(pos.x - 5.0, pos.y))
+ sampleNearest(src, float2(pos.x + 5.0, pos.y));
if( radius > 3 )
band4 = sampleNearest(src, float2(pos.x - 4.0, pos.y))
+ sampleNearest(src, float2(pos.x + 4.0, pos.y));
if( radius > 2 )
band3 = sampleNearest(src, float2(pos.x - 3.0, pos.y))
+ sampleNearest(src, float2(pos.x + 3.0, pos.y));
if( radius > 1 )
band2 = sampleNearest(src, float2(pos.x - 2.0, pos.y))
+ sampleNearest(src, float2(pos.x + 2.0, pos.y));
band1 = sampleNearest(src, float2(pos.x - 1.0, pos.y))
+ sampleNearest(src, float2(pos.x + 1.0, pos.y));
center = sampleNearest(src, pos);
//Apply weights and compute resulting pixel
if( radius == 6 )
result = (band6 + (band5 * 12.0) + (band4 * 66.0) + (band3 * 220.0) + (band2 * 495.0) + (band1 * 792.0) + (center * 924.0))/4096.0;
if( radius == 5 )
result = (band5 + (band4 * 10.0) + (band3 * 45.0) + (band2 * 120.0) + (band1 * 210.0) + (center * 252.0))/1024.0;
if( radius == 4 )
result = (band4 + (band3 * 8.0) + (band2 * 28.0) + (band1 * 56.0) + (center * 70.0))/256.0;
if( radius == 3 )
result = (band3 + (band2 * 6.0) + (band1 * 15.0) + (center * 20.0))/64.0;
if( radius == 2 )
result = (band2 + (band1 * 4.0) + (center * 6.0))/16.0;
if( radius == 1 )
result = (band1 + (center * 2.0))/4.0;
Both kernels must be applied as filters for the complete effect. It does not matter which order the filters are applied in. The ActionScript code shown below uses a slider to control the radius parameter:
import fl.controls.Slider;
import fl.events.SliderEvent;
var camellia_mc:MovieClip;
var radiusSlider:Slider;
//Embed the Pixel Bender kernel in the output SWF
[Embed(source="verticalgaussianblur.pbj", mimeType="application/octet-stream")]
var VerticalBlurKernel:Class;
[Embed(source="horizontalgaussianblur.pbj", mimeType="application/octet-stream")]
var HorizontalBlurKernel:Class;
//Create the shaders
var vBlurShader:Shader = new Shader( new VerticalBlurKernel() );
var hBlurShader:Shader = new Shader( new HorizontalBlurKernel() );
//Create the filters
var hBlurFilter:ShaderFilter = new ShaderFilter( hBlurShader );
var vBlurFilter:ShaderFilter = new ShaderFilter( vBlurShader );
//Initialize the slider using the radius parameter metadata
radiusSlider.value = hBlurShader.data.radius.value;
radiusSlider.minimum = hBlurShader.data.radius.minValue;
radiusSlider.maximum = hBlurShader.data.radius.maxValue;
radiusSlider.liveDragging = true;
radiusSlider.addEventListener( SliderEvent.CHANGE, updateFilters );
//Apply the filters
camellia_mc.filters = [ hBlurFilter, vBlurFilter ];
//Reapply the filters when the slider is changed
function updateFilters( event:SliderEvent ):void
hBlurShader.data.radius.value = vBlurShader.data.radius.value = [radiusSlider.value];
camellia_mc.filters = [ hBlurFilter, vBlurFilter ];
The example sets the radius of each filter to the same value. As with blends, the shader filters must be reassigned to the display object after changing parameter values.
To use a kernel as an area fill, create a Shader object containing the kernel bytecode and pass that to the
beginShaderFill() function of the display object
graphics property when drawing the object. Like bitmap fills, shader fills are registered to the origin of the display object. This registration can be adjusted by using a translation matrix.
Shaders used as area or line fills are not automatically assigned an input image. (If you need an image as part of the fill algorithm, you must explicitly assign an image to the input before calling the
beginShaderFill() method.)
The next fill example creates a checker pattern. The size and color of the checker squares are controlled by kernel parameters:
The checker algorithm uses the modulo function to compare the current pixel position to multiples of the checker size:
float vertical = mod(position.x, checkerSize * 2.0);
This modulo function returns the remainder produced by dividing the
x coordinate by
checkerSize multiplied by
2. If, for example,
checkerSize is equal to
10, then we get the pattern
0-19, 0-19, 0-19,... as x increases across the image. So whenever the result is less than the checker size, the kernel draws color A, otherwise it draws color B. That creates stripes. To produce the checker pattern, we have to apply the technique in both the horizontal and vertical directions, like this:
float vertical = mod(position.x, checkerSize * 2.0);
float horizontal = mod(position.y, checkerSize * 2.0);
The remaining question is how to combine these results. The logical XOR operator (^^), which only returns
true when just one of the inputs is
true, is perfect here:
( vertical < checkerSize ) ^^ ( horizontal < checkerSize )
The following example displays the full kernel code:
<languageVersion : 1.0;>
kernel CheckerFill
< namespace : "com.adobe.example";
vendor : "Adobe Systems Inc.";
version : 1;
description : "A checkered field generator";
output pixel4 dst;
parameter float checkerSize
defaultValue : 10.0;
minValue : 1.0;
maxValue : 75.0;
parameter pixel4 colorA
defaultValue : pixel4(0.0, 1.0, 1.0, 1.0);
parameter pixel4 colorB
defaultValue : pixel4( 0.0, 0.0, 0.0, 1.0 );
void evaluatePixel()
float2 position = outCoord();
float vertical = mod(position.x, checkerSize * 2.0);
float horizontal = mod(position.y, checkerSize * 2.0);
dst = (( vertical < checkerSize ) ^^ ( horizontal < checkerSize )) ? colorA : colorB;
The ActionScript code used for this example is slightly more complex than the previous examples, both because more parameters are used for the kernel and because the parameters themselves are more complex.
In the example, the
initialize() function is called when the CheckerFill kernel has finished loading. This function creates the Shader object and uses the metadata of the kernel parameters to set up the initial values for the controls. It then calls the
drawShape() function, which draws a circle using a shader fill.
To update the fill, the
drawShape() function is called again whenever a change event is dispatched by one of the controls. The function sets the kernel parameters based on the current control values, clears the current graphics, and redraws the shape:
import fl.controls.Slider;
import fl.events.SliderEvent;
import fl.controls.ColorPicker;
import fl.events.ColorPickerEvent;
var filledShape:Shape = new Shape();
var checkerSize:Slider;
var colorA:ColorPicker;
var colorB:ColorPicker;
var areaShader:Shader;
//Embed the Pixel Bender kernel in the output SWF
[Embed(source="checkerfill.pbj", mimeType="application/octet-stream")]
var CheckerFillKernel:Class;
//Create the Shader object using the embedded kernel
areaShader = new Shader( new CheckerFillKernel() );
//Set controls using shader parameter metadata
checkerSize.minimum = areaShader.data.checkerSize.minValue;
checkerSize.maximum = areaShader.data.checkerSize.maxValue;
checkerSize.value = areaShader.data.checkerSize.value;
checkerSize.liveDragging = true;
checkerSize.addEventListener( SliderEvent.CHANGE, updateFilters );
colorA.selectedColor = vectorToColor( areaShader.data.colorA.value );
colorA.addEventListener( ColorPickerEvent.CHANGE, updateFilters );
colorB.selectedColor = vectorToColor( areaShader.data.colorB.value );
colorB.addEventListener( ColorPickerEvent.CHANGE, updateFilters );
filledShape.x = 150;
addChild( filledShape );
function updateFilters( event:Event ):void
areaShader.data.checkerSize.value = [ checkerSize.value ];
areaShader.data.colorA.value = colorToVector( colorA.selectedColor | 0xff000000 );
areaShader.data.colorB.value = colorToVector( colorB.selectedColor | 0xff000000 );
function drawShape():void
with( filledShape.graphics )
beginShaderFill( areaShader );
drawCircle( 100, 75, 75 );
function vectorToColor( pixelChannels:Array ):uint
return (pixelChannels[3] * 0xff << 24) |
(pixelChannels[0] * 0xff << 16) |
(pixelChannels[1] * 0xff << 8) |
pixelChannels[2] * 0xff;
function colorToVector( color:uint ):Array
var result:Array = new Array(4);
result[3] = ((color >> 24) & 0x000000ff)/0xff;
result[0] = ((color >> 16) & 0x000000ff)/0xff;
result[1] = ((color >> 8) & 0x000000ff)/0xff;
result[2] = (color & 0x000000ff)/0xff;
return result;
In the earlier examples we incorporated a slider to set the kernel parameters. The color picker controls used in this example are not quite as straightforward. Parameter values are accessed in Flash Player as an array. In the case of a scalar parameter, such as
checkerSize, the array holds a single value. For vector types such as colors, the array contains an element for each element of the vector. Since the
colorA and
colorB parameters are of type pixel4, there are four values in the array, one for each channel in the pixel. A color in ActionScript, on the other hand, is represented as a single 32-bit uint value containing all the channel information. In addition, the alpha channel is the first channel in a uint color, but it is the last channel in the Shader object parameter array. The example functions,
vectorToColor() and
colorToVector(), translate the colors between the two forms so that we can transfer color selections between the ColorPicker objects and the shader parameters.
vectorToColor() function works by multiplying each color channel returned by the Pixel Bender kernel by 256 (hexadecimal value 0xff). The resulting value is then shifted to the corresponding argb position within the 32-bit uint value using the bitwise left shift operator (<<). Finally, the four channels are combined into a single uint with the bitwise OR operator ( | ) and returned.
colorToVector() function performs the inverse operation. For each channel, the function does a bitwise right shift operation (>>), masks out the bits that belong to any other channel with the bitwise AND operator (&) and divides the result by 256 (0xff) to scale the value between 0 and 1. The results are assigned to the appropriate element of an array, in the order expected by Pixel Bender, and then returned.


text:
Slow Roasted Tomato Soup (v)
Topped with chopped parsley, served with ciabatta bread.
Emerson Road, Washington, Tyne And Wear, NE37 1LE 0191 419 4449
Open today: Opening Hours: (Monday) 8am-11pm (Tuesday) 8am-11pm (Wednesday) 8am-11pm (Thursday) 8am-11pm (Friday) 7am-11pm (Saturday) 7am-11pm (Sunday) 8am-11pm Upcoming Holidays: Christmas Eve 8am-11pm Christmas Day 11:30am-5pm Boxing Day 11:30am-9pm Fri 27th Dec 8am-11pm Sat 28th Dec 8am-11pm Sun 29th Dec 8am-11pm Mon 30th Dec 8am-11pm New Years Eve 8am-11pm New Years Day 9am-9pm Thu 2nd Jan 8am-11pm
There's just something about the festive season that puts a smile on our face at Toby Carvery Washington. Whether it's the quality time spent with family, our homely yet comforting atmosphere or the delicious food & drink that we all enjoy.
From 14th November – 31st December (Excluding Christmas Day and Boxing Day), you'll be able to enjoy our Festive Menu from just £10.79 for 2-courses or upgrade to 3-courses for just £3.50 between Monday – Saturday and £4 on Sundays.
Just as you'd expect, our Festive Menu features our famous 4-meat carvery, freshly steamed veg and plenty of roasted trimmings (with optional Pigs in Blankets!) – we are the Home of the Roast after all!
We'll also be serving up some brand-new festive dishes for you to enjoy.
So, pull up a chair at Toby Carvery Washington, get friends, family or colleagues together for a festive carvery made by those who do it best.
Please note: Parties of 8+ require a £5 non-refundable deposit per guest, which is payable at the time of booking.
To make a booking, head to our bookings page, call Toby Carvery Washington or speak to our Christmas Coordinator in house. If you have special requirements or are booking a large party, let us know in advance so we can do our best to accommodate you.


text:
Michelle La Sala is race director for the California International Marathon, or CIM. She ran in this year's Boston Marathon and had already finished the race when the two bombs that killed three people and injured more than 260 others exploded.
"It was a scary thing but in terms of the changes that a lot of races have made to just kind of step up security and safety, that was a great outcome."
La Sala says increased security at the start and finish lines and throughout the race course are among the changes CIM has made.
"We will have a bomb-sniffing dog at the starting line, we are requiring photo ID for packet pickup this year which is something we've never done."
La Sala also says runners will have to put your their extra clothing in clear bags at the "sweat check." And she says CIM has created an internal crisis communication plan with police and other emergency responders.
The 26.2 mile race stretches from Folsom to the state Capitol building in Downtown Sacramento.


text:
Authentic Smith Island Cakes
Two Tins of Homemade chocolate fudge, made with a traditional Smith Island recipe, a hint of peanut butter, and shipped in a gorgeous custom tin. (Fudge weight: 1 & 1/4 pounds per tin or 2 & 1/2 pounds total for your order.)
Have a question? View our FAQs or call us at (410) 425-CAKE (2253)
Receive exclusive email offers
Phone Orders and Customer Service:
Visit Our Store and Save 30% Every Day!
Open Year Round, Monday - Friday, 8:30 am - 4:00 pm
Smith Island Baking Co.
45 West Chesapeake Avenue
Crisfield, Maryland 21817
©2019 Smith Island Baking Co. All rights reserved.
Privacy Policy/Terms


text:
The basics
Chicago (0-0-0) vs. New York (0-0-0) at Red Bull Arena, Harrison
All-time record: Chicago holds a 20-10-6 all-time regular season record against New York.
TV info
7:00 p.m. E.S.T. on ESPN & ESPN Deportes
What's at stake?
New York can continue the momentum of last weekend's 3-1 win over Brazilian club Santos with a solid effort against Chicago. New York could take a big step in eradicating the sour taste of a last place finish in 2009 with a win over the Fire. Carlos de los Cobos makes his debut as Fire head coach with several new faces.
Last meeting
If the Red Bulls cringe a bit at the fact that their team is hosting the Fire, forgive them. Last May, New York completely outclassed Chicago at Giants Stadium, holding more possession, creating more chances, amassing more corners and registering a 2:1 advantage on shots on goal. Yet the Red Bulls still managed to find a way to lose 1-0. The Red Bulls would go on to lose 10 of their next 11 in league play.
Remember when?
It was a midweek cup final at Giants Stadium on October 15, 2003. Chicago got a 68th minute goal from forward Damani Ralph to defeat the MetroStars (now the Red Bulls) and earn its third Lamar Hunt U.S. Open Cup title in six years. With its conquest in East Rutherford, N.J., the Fire became the first MLS team to win the cup final on the road. Ralph was in training with the Red Bulls during the offseason in a comeback attempt from serious injury. The Red Bulls did not sign him.
Heroes & Villains ...
Kandji/Angel vs. C.J. Brown & Co.: Imposing play has often frustrated the Red Bulls forwards and Chicago's defenders are not afraid to be physical when need be. How Brown manages to contain, and when need be, mix it up with Angel, promises to be an entertaining affair to watch. Angel is returning to full health after suffering a right knee injury in a pre-season match against Toronto. Thursday was his first full practice with the team in several weeks.
John-McBride pairing makes MLS debut: On the flip side, the Red Bulls centerbacks will be tested by the former Fulham strike partnership of Collins John and Brian McBride. The duo combined well together in England, with John netting 11 goals in 2005-2006. The Red Bulls back line features a rookie, Tim Ream, who said that he is honored to play against fellow St. Louis University grad McBride, but that this time last year, "I thought I'd be watching the MLS opener on a bench somewhere and not actually being in it."
Stat that makes you go, "Hmm …"
New York hasn't beaten Chicago in their last five match-ups against their Eastern Conference foe, having been outscored 13-3 over the stretch. The Red Bulls last win against the Fire came on September 1, 2007 at New York.
He said it
"I don't try to look back – I'm excited about this year. There are a lot of positives this year." New York Red Bulls' forward Juan Pablo Angel on closing the chapter on last season and opening 2010.


text:
Our Progress
The LGBT community is a community of fighters. We may never make sense of the tragedy in Orlando, but look at the reaction; look at the outpouring of love, compassion, and support. Compare it to the widespread indifference after the 1973 UpStairs Lounge attack, which claimed 32 lives. That's our progress. And that's what we will continue to fight for.
The astute among you may have perceived somewhat of a?reduction in the frequency of updates over the past several weeks. With Slap approaching its seventh year, I?need a break to focus on other things for a bit. In the meantime, by popular demand, a prancing unicorn has returned to the top of the page to keep all you amazing visitors company, and I remain as happy as ever to hear from you guys on Facebook?and Twitter?during this Slap Upside the Hiatus.
Check out this trailer for?An Abominable Crime, a documentary about the rampant (and often ignored) homophobia problem in Jamaica. The filmmakers are currently fundraising to help get this film finished, and The Pulitzer Center has offered to match all Kickstarter donations. So go check it out and offer some support if you can.
Men Aquitted For Ordering Gay Drink
Two Cameroon men who were sentenced to five years in prison for "looking gay" after ordering Bailey's Irish Cream have been?acquitted?of the charges by an appeals court. The two had already passed a year of their sentence before the?acquittal.
Homosexuality is illegal in Cameroon, and is subject to harsh penalties. Ordering Bailey's Irish Cream hardly seems like conclusive evidence of being gay, though. I mean, yes, it's from the country that brought us Billy Elliot and tiny rainbow-obsessed men in green tailcoats, but that doesn't make Guinness and bar fighting particularly gay, does it?
Russia Goes After American Pop Divas
Less than a year ago, the Russian city of St. Petersburg passed a law banning "homosexual propaganda," with expected hysterical results. From equal rights marches to rainbows on milk cartons, no one seems to be safe from the accusing eyes of the ruling United Russia party in their search for violators of their new?law. Over 70 arrests and countless accusations have been made since the law's introduction, and, naturally, that applies to… visiting pop divas.
Last month, Madonna was the subject of a Russian court case accusing the singer of "traumatizing minors" by advocating for gay rights during a concert in August. While Madonna didn't attend or comment on the case, the plaintiffs sought 333 million rubles (about $10 million dollars) in damages, claiming that the singer's advocacy would cause the nation's birth rate to plummet and "erode the nation's defense capability by depriving the country of future soldiers."
The case was dismissed, mercifully.?That hasn't stopped an appeal from being launched, however, and a new pop star has now been put in the bizarre law's cross hairs.
Lady Gaga has now been accused of promoting homosexual propaganda at the beginning of a concert last Wednesday. "We will contact the prosecutors and the law?enforcement?agencies to carry out a thorough investigation of the situation," Vitaly Milonov, the MP responsible for the anti-gay law, told the media.
- Lawsuit against Madonna dismissed in Russia [Associated Press]
- Lady Gaga accused of illegally promoting gay rights in Russia [The Globe and Mail]
Skip Out On The Anti-Gay Salvation Army
It's about that time of year when the folks at The Salvation Army start ringing bells in front of their red kettles, soliciting donations. If you happen to see a Salvation Army kettle this holiday season, here's a few reasons you should probably give your money to a more worthwhile charity instead:
The Salvation Army Is An Anti-Gay Political Lobby Group
The Salvation Army is Christian organisation based on Methodist theology that uses donations to oppose GLBT equality around the world. When you donate toward The Salvation Army, you're funding a political lobby group that uses its power to fight equal rights.
The Salvation Army spearheaded a well-funded effort against the decriminalization of homosexuality in New Zealand, as well as opposition to the repeal of the bizarre Section 2A of England, Wales, and Scotland's Local Government Act. This sought to forbid local authorities from publishing anything the portrays homosexuality in a positive light, and banned teaching "the acceptability of homosexuality as a pretended family relationship" in the region. The organisation continues to advocate against the legal recognition of same-sex marriages and other equal rights ordinances.
The Salvation Army Prioritizes Anti-Gay Doctrine Over Helping The Needy
In 2004, a New York municipal ordinance required all non-profit and charitable organisations to offer the same partner benefits to same-sex couples as they do for opposite-sex ones. The Salvation Army not only vocally opposed this measure, but they actually threatened to close down each of their New York soup kitchens unless they got their way. While the ordinance didn't change, Mayor Bloomberg announced that he wouldn't enforce it, and the soup kitchens remained open.
The Salvation Army Thinks You Should Die
And if you still think that The Salvation Army's charitable activities justify their political action, here's a real kicker: In a June, 2012 radio interview, when asked about the organisation's use of violently anti-gay scripture in their 170-page official doctrine, Andrew Craibe, the Salvation Army's media relations director in Australia, defended its inclusion.
Interviewer: According to the Salvation Army, [gay people] deserve death. How do you respond to that, as part of your doctrine?
Craibe: Well, that's part of our belief system.
Interviewer: So we should die.
Craibe: You know, we have an alignment to the Scriptures, but that's our belief.
Interviewer: Wow. So we should die.
Harsh stuff, huh? So, if you're feeling extra charitable this year, consider donating directly to a local shelter, or help out reputable and transparent international charities like Doctors Without Borders. Let the regressive lobby groups find their money some other way.
Slap reader Paul has written in with some good news coming out of Nova Scotia. The province passed its Transgendered Persons Protection Act on Friday, explicitly protecting trans Nova Scotians from housing and employment discrimination. The bill still requires royal assent before becoming law, but there's nothing to worry about there. I've yet to see the terms "queen" and "denied GLBT rights" appear alongside each other.
Vatican Reacts To Equal Marriage Advances
Last Tuesday saw some pretty big wins for equal marriage rights in the United States. Voters in Maryland, Washington, and Maine solidly supported same-sex marriage, marking the first time that a popular vote granted marriage rights to same-sex couples in the country.
As usual, whenever big steps toward equality is made, I just have to check in on the Pope to make sure he hasn't ruptured too many eye?vessels. And from the?noticeably?stronger language coming out of the?Vatican lately, he might need some prescription eye drops.
"It is clear that in Western countries there is a widespread tendency to modify the classic vision of marriage between a man and woman, or rather to try to give it up, erasing its specific and privileged legal recognition compared to other forms of union," Federico Lombardi, the Vatican's?chief?spokesman, announced after Tuesday's elections.
Funny, I wasn't under the impression that Maryland, Washington, and Maine "gave up" heterosexual marriage on Tuesday, but hey, in a country where the rights of minorities are voted on by the majority, I suppose anything can happen.
"Why not contemplate also freely chosen polygamy and, of course, not to discriminate, polyandry?" Lombardi asked rhetorically.
Well, that's a little funny, because if you look at what the bible has to say about polygamous marriages (or "traditional marriages," as historians would be correct to call them), I wouldn't expect the Vatican to have any strong objections about it. Right?
Family Coalition Party Focuses On Bathrooms
Let's do some quick word association. When I say "gender identity," say the first thing tha—OMG TOILETS!!!!
I'm not exactly sure where Ontario's fringe Family Coalition Party gets its funding, considering they routinely get less than a quarter of a percent of the popular vote, but they seem to have enough resources to design and distribute some rather astonishing flyers equating the passage of a bill adding gender identity to the human rights code with bathroom predators.
NDP MPP Cheri DiNovo's Bill 33, which passed in June, finally updated the Ontario human rights code to explicitly include trans Canadians in its existing protections. I guess the Family Coalition Party isn't too happy about it, though, judging from the flyers distributed across Cheri's riding. Referring to the bill as "The Bathroom Bill," the party accuses DiNovo of enabling child predators by letting "a man who calls himself transgendered" to enter women's washrooms, threatening "the lives of girls and women by putting them at greater risk from male sexual predators."
Uh, they do realize that sexual predatory behaviour—especially toward minors—is already illegal, right? Do they seriously think this bill opened some kind of loophole here?
DiNovo, of course, sees the attack for what it is. "The transphobic message of the flyer is that trans folk are, in essence, pedophiles," she told the media. "The whole structure of their argument is ludicrous unless you understand that basic message: there's no such thing as a trans person; there's just male pedophiles dressed as women."
Bravo, Cheri. Now don't waste any more time on these kooks and their crazy flyers.
If you speak French, you're in for a real treat from this group of protestors in France. And if you don't, I think you'll find that the clip transcends language into something that is universally?mockable.
Russian Anti-Gay Lobby Warns About Gay Milk
Other countries take note. If you enact crazy anti-gay laws?forbidding?any positive portrayals of homosexuality, here's what you can expect to happen:
A popular brand of milk is being accused of illegally promoting homosexuality in St-Petersburg, Russia. The milk, a PepsiCo-owned brand, features a jolly dairy farmer, standing in a lovely green field beside a rather happy-looking cow, with a rainbow arching across the sky.
"A rainbow appeared on the [milk] cartons, a world-renowned symbol of the gay movement," said?Anatoly Artukh, a member of the anti-gay lobby group People's Council. "That immediately put me on alert."
Put him on alert for what, exactly? That someone, somewhere is going to sit down for breakfast, see a rainbow on their milk carton and think: "Hey, you know what I've never questioned before? My sexuality. Maybe I'll call that number I saw written on the wall of that truck stop's men's room."
Heaven forbid a real rainbow should ever appear across the sky in St-Petersburg. The?meteorologists?would have quite a bit of explaining to do.
Of course, here in Canada, milk that has undergone the?homogenization?process is marketed as "homo milk." And it's marketed to children. I know a lot of people who drank homo milk growing up that didn't turn out gay, but then again—there wasn't a rainbow on the carton.
- Russian activists slam 'gay milk propaganda' [ABC News Australia]
Report Says Women Drivers Cause Homosexuality
Saudi Arabia is one of the only countries in the world that forbids women from driving. Any woman caught behind the wheel there is subject to arrest and lashings.
Amidst growing international criticism for this policy, a report prepared for the country's legislative assembly has been released to justify their laws and bolster support. The report's findings don't look good, I'm afraid: Allowing women to drive vehicles, it says, would "increase prostitution, pornography, homosexuality, and divorce."
The authors didn't detail how women drivers actually results in these things, but my mother drove me places growing up, and I turned out gay. So—as you can see—all the pieces fit.
My former MP, Rob Anders, a fierce opponent of "homosexual sex marriage," has once again done something incredibly dumb. Rick Mercer explains it nicely.
Pope Says Gays Aren't Fully Developed Humans Who Threaten Families
In a speech to French bishops last week, Pope Benedict XVI announced that gay people aren't fully developed humans and are threatening families. While I'm sure very few gay people actually care what the pope thinks of us, sometimes this guy just evokes imagery I really want to draw.
"The family is threatened in many places by a faulty conception of human nature," the Pope said in reference to the emergence of equal marriage laws. "[The Church] must promote those values that permit the full development of the human person," he continued.
Hmm… I was born a few weeks prematurely. Do you suppose that's what the Pope means?
At any rate, this about-face on the subject of the "full development of the human person" is kind of new for the Catholic Church, who normally argues for the rights of zygotes, fetuses, and other not fully developed humans. Still, for the time being, it's clear that half-developed human creatures (all of which are gay) are out to destroy your family. So, you know, be on the look out for that or something.
Students and researchers at the University of Alberta have created a website that counts homophobic slurs on Twitter in real time. It's both amazingly awesome and a little depressing, but makes me pretty happy to be a U of A alumni. Check it out.
A lot of gay people find their relationships don't receive much support from their parents, but I think a lot of us can be glad we don't have anyone quite this determined: A Hong Kong billionaire is offering over $65 million to any man who can woo his daughter away from her wife and partner of seven years. Because, you know, a strange man motivated by large sums of money is apparently a much, much preferable suitor than a woman motivated entirely out of love.
Australian Parliament Votes Down Equal Marriage Rights
I've always thought that Canada and Australia are similar in a lot of ways. It's kind of like a parallel Canada with a warmer climate, more poisonous animals, and a superior electoral system. And now, like Canada once did, it's going through some setbacks in its transition on the path to equal marriage rights.
Australia's parliament voted down an equal marriage bill last week in a vote of 98 to 42. It's a big disappointment for a lot of same-sex couples who will now have to wait before getting the same civil benefits that opposite-sex couples have.
Canada had some similar votes, not long ago.?In 1995, Canadian parliament rejected a bill that would have allowed for civil unions by a vote of 128 to 52. Then, in 1999 parliament passed a motion affirming the legal definition of marriage as "the union of one man and one woman to the exclusion of all others" by a vote of 215 to 55. Yet, almost four years later to the day, Ontario was finally issuing legal same-sex marriages. Before two more years could pass, nearly all the provinces had followed suit. On July 20, 2005 (coincidentally, the anniversary of my coming out date) a parliamentary vote had given equal marriage rights to every single Canadian, six years after an overwhelming defeat for equality in the house of commons.
So, to my friends in Australia: I wouldn't fret too much over this setback. According to polls, popular support is already on your side, and—more importantly—so is history. You might be a few years behind Canada in rights, and more than a few degrees above Canada in temperature, but thanks to everyone keeping up the good fight, you're still ahead of many other countries around the world and I'm utterly convinced you'll be enjoying full equality much sooner than later. Keep it up!
Principal Cancels Course To Prevent Gay Student From Taking It
The lengths people go to in order to stop gay people from enjoying their life…
Thomas Amons, a principal for the Beaumont Independent School District's Taylor Career and Technology Center in Texas, has canceled an entire cosmetology course rather than let a student whom he thought was gay take it.
Cequada Clark, the course instructor, said that Amons had asked her to kick out the student because he seemed "flamboyantly gay," but she refused for moral reasons. Undeterred, the principal then consulted BISD's legal team to see if it would be possible to prevent the student from enrolling due to his sexual orientation. When the "no" response came back the next day, Amons shut down the entire course and Ms. Clark was fired.
Well, that's a little drastic, wouldn't you think? After all, from the school's perspective, gay money works the same as straight money. If anything, money from a gay cosmetology enthusiast might even smell nicer and have fewer creases.
- Sexuality the deciding factor in program's closure [The Examiner]
Slap reader Christian submits this bit of craziness: David Cecil, a British theatre producer, is facing a possible prison sentence after staging a play criticizing Uganda's anti-gay attitudes. The performance, entitled The River and The Mountain, is about a gay businessman who is killed by his own employees. Since it clearly wasn't very well received by Ugandan authorities, I have a proposal for his next production: The Producer and The Slapees, a gripping tale about a gay theatre producer who is jailed for putting on a freakin' play.
Slap reader Daniel sends us this crazy bit of news: A doctor in Sydney, Australia has prescribed chemical castration drugs to an 18 year old New Zealand patient in an attempt to "cure" his homosexually. Cyproterone acetate blocks production of testosterone, mostly eliminating sexual drive in males. Luckily, the Medical Council of NSW did some of their own elimination after a thorough review of the case, banning the 75 year old doctor from practicing medicine outside the field of radiology.
The kingdom of Saudi Arabia has launched a formal objection to a proposed kind of website address ending in .gay. The complaint asserts that the new top level domain name would offend their culture. Personally, I just wonder what the difference between google.com and google.gay would be. Perhaps the logo would be even more rainbowy.
Christian Group Sues School Board Over Lesson Plans
A group calling itself the "Parental Rights in Education Defense Fund" along with an anonymous "beleaguered parent" is suing the Ontario school system for not providing advance notice of gay subject matter.
"The parent seeks nothing more than to be given advance notice so that he can […] withdraw his children before the lesson," the group announced on Friday.
While the press release itself didn't mention gay issues specifically, the newly-formed group's website obsesses over the topic almost exclusively, also establishing their opposition to "misguided" Gay-Straight Alliances, and any book written by GLBT authors.
Say, isn't it odd that the same groups who often demand schools "teach the controversy" when it comes to learning about evolution and other scientific progresses, are so quick to censor and block other material? I spent my entire grade school education in the Catholic school system where gay topics were never discussed, probably on purpose. The only thing that withholding this information did for gay students like me was leave us uninformed and ignorant for many years before having to find out what we needed to know on our own from an uneven selection of reliable and unreliable sources.
At any rate, I want to offer a thought to this parent. Since he has chosen to sue the school board anonymously, let's refer to him as Count Moriarty Von Jafar IV.
Mr. Moriarty Von Jafar, expose your kids to as many ideas as possible and stop presuming ownership over their minds. By all means, introduce them to your own ideas (and trust me, there's plenty of time to teach your kids your own ideas; they don't have to always hear your worldview first), but have the responsibility to let them discover ideas you don't particularly like. Shielding them from a world you don't always see eye-to-eye with is a complete impossibility, and that's a wonderful thing. The less sheltered and more challenged a mind is, the more resilient and capable it becomes.
Anti-Gay Group Says Equal Marriage Leads To Abortion
The Society for the Protection of Unborn Children (SPUC), an anti-choice and anti-gay lobby group based in the UK, has distributed fliers suggesting that legal same-sex marriage will lead to an increased number of abortions.
"Legalised same-sex marriage will increase confusion about what it means to be a man or woman and removes natural conception from the idea of marriage," the pamphlet states. "We must protect real marriage because it protects children in the womb."
Now, I know it sounds like there are some logical connections missing in this assertion. You may think that, due to the dedication and procedures necessary for a gay or lesbian couple to have a child, abortions would be highly unlikely in the LGBT community. SPUC, however, was clearly limited for space and had to omit some details. So, on behalf of SPUC, here's how I think that they think this works:
All men are secretly gay and always have been, which is why governments enact laws to keep them from marrying each other. Once such legal barriers disappear, however, men will no longer be interested in any sort of physical reproduction with women, threatening the human race with extinction. Desperate for babies to continue our survival, humanity will have no choice but to construct a system of automated weaponry to launch razor-thin projectiles tipped with pre-fertilized eggs directly into the tummies of women (all of whom are still heterosexual since everyone knows that lesbianism is just a myth). The impregnated women—now alone and having left the kitchen to pursue careers—will be ill-equipped to raise their egg-gun children on their own, forcing them to choose between a quick abortion and a life of poverty. Piles of aborted fetuses will litter the cities, one beside each coin-operated abort-o-matic booth.
Did I get that right, SPUC?


text:
Notify me when this product becomes available:
This product is supplied unassembled and unpainted. Glue and paints not included.
This European style Farmhouse comes with a combination roof, shuttered doors and a balcony, it also features a small planter with trellis and a conservatory.
The Barn includes a working platform with bale hook and ladder, large double doors, a pitched roof with missing tile and features wooden trim details.
The 25mm Farm Accessories includes two troughs, two pigsties, a small wall with gate and fences an outbuilding and a chicken coop.
The Troll Trader Farm is an ideal method of spicing up your gaming table with a slice of rural character.
Made from 3mm MDF and 1mm greyboard. Suitable to use with 25 - 28mm war games.
Models supplied unpainted and require assembly. We advise using PVA glue for the best results.
NB. All orders shipped from the UK - view preparation & shipping times
Customs fees and import duties are the responsibility of the customer.
Standard Service: FREE on orders over $50.00, otherwise $12.50 (US & Canada).
Courier Service also available - view details.
Pick up at Show: available at checkout (depending on date).
Visit Us: view details.
If there are any problems with your order, or somebody just bought you the wrong thing as a present, please get in touch. We're nice guys and we'll do our best to solve the problem:
Call: +44 115 978 4495 (7.00am - 11.00am EST)
Email: firstname.lastname@example.com
Whether you want to know when your order will arrive or which hats your Napoleonic troops should be wearing, our customer service team can help!
Call: +44 115 978 4495 (7.00am - 11.00am EST)
Email: firstname.lastname@example.com
Temporarily Out of Stock
Notify me when this product becomes available:
This 18cm Mature Oak Tree is part of 4Grounds Trees & Scenic Material range, it is suitable for 28mm to 15mm games. An oak is a... View full product details
Notify me when this product becomes available:
This 20cm Mature Willow Tree is part of 4Grounds Trees & Scenic Material range, it is suitable for 28mm games. Willows, also called sallows, and osiers,... View full product details
Temporarily Out of Stock
Notify me when this product becomes available:
Known as 'Te Guruma' handcarts in rural Japan, these two types of East Asian Hand Cart with their rustic design are typical of such carts... View full product details
Sign up to get the latest on sales, new releases and more …
© 2019 Warlord Games US.
All Rights Reserved. Website designed in-house by Warlord Games.
BBC, DOCTOR WHO (word marks, logos and devices), TARDIS, DALEKS, CYBERMAN and K-9 (word marks and devices) are trade marks of the British Broadcasting Corporation and are used under licence. BBC logo © BBC 1996. Doctor Who logo © BBC 2009. Dalek image © BBC/ Terry Nation 1963. Cyberman image © BBC/Kit Pedler/Gerry Davis 1966. K-9 image © BBC/Bob Baker/Dave Martin 1977.
2000AD®;2000AD is a registered trade mark; ® and © Rebellion A/S; All rights reserved. STRONTIUM DOG™ Rebellion A/S, ©Rebellion A/S, All rights reserved.
© Copyright Warlord Games Ltd. 2015. Beyond the Gates of Antares, Beyond the Gates of Antares logo, Algoryn, Boromite, Lavamite, Isorian Shard, Concord, Ghar, NuHu and Freeborn are trademarks of Warlord Games Ltd. All rights reserved.
. . . . .
Welcome to our store!
Please get started by choosing the currency you'd like to shop in:
NB. If you change currencies later, you will need to create a new account
and anything in your cart will be lost.


text:
LaFerrari – the big draw
The "LaFerrari"'s success with the public continues unabated at the 83rd Geneva International Motor Show. These two photographs snapped five minutes apart prove beyond a shadow of a doubt that the 963 hp (800 from the V12 and 163 from the electric motor) punched out by the first hybrid supercar in Maranello history are the main attraction of the Swiss event. The shot on the left shows the Prancing Horse stand at 9.58 this morning while the one on the right shows it just after it opened to the public.


text:
Venue info
The Fleece, 12 St Thomas St, Bristol, BS1 6JJ.
Unless otherwise stated this is an all ages venue (under 16s must be accompanied by a adult)
Since The Blue Aeroplanes acquired The Fleece in May 2010 it has been rescued from eternal damnation as a "once great" and turned into "one of the best venues in the UK"
Relaxed atmosphere, a massive bar that is never more than 2 deep and an outside smoking/drinking/chatting area. Towns with huge arenas and stadiums would probably kill to have a venue like the Fleece in their midst.
There was a time when we'd have said the days of seeing a big band in such a small venue are gone but the hard work put in by the Aeroplanes coupled with the prestige that surrounds The Fleece means that those days are well and truly back.
A massive refurbishment at the start of 2013 means the venue can now claim to have "luxurious" toilets (at least in live music venue terms!)
With the demolition of the main entrance lobby and the installation of larger toilets the capacity has now increased from 330 to 450.
Despite being a national touring circuit venue, The Fleece regularly books local bands. If you'd like a gig email [email protected] for more details.
It is possible to buy E-Tickets for this event. This means they will not be posted to you. Instead, you just log in to your account, find the event in your orders. Click "View" and print the 'ticket' on an A4. You will need a printer connected to your computer as you MUST produce this on arrival at The Fleece, where it will be scanned or matched to the Box Office list
Unless otherwise stated Door time is 7.30pm


text:
Who says Chinese products are worthless crap? This truck looks like it collided with a train, but is apparently still drivable. It's great that it works, but the driver could probably use something more than a yellow plastic helmet to protect him from the snaggle of jagged metal surrounding the "cab."
They must have really had to get to work. It doesn't look like the passenger even has a seat, and is about one good bump away from being catapulted onto the road.
Photo credit: carnewschina.com


text:
EU Cookie Directive
This site uses cookies. Some cookies may have been set already.
To find out more, read our Privacy and Cookies Statement. By browsing this website, you agree to our use of cookies.
Hide this message
You may qualify for social welfare payments based on a combined Irish and U.S.A. contribution record if you do not have enough contributions on either record alone.


text:
Please login first to complete purchase/ quotation request, view custom order reports, or create favorites list.
Don't have an account with us yet? Please set up an account to place order or obtain customer services.
Caerulein, a decapeptide analog of the potent pancreatic secretagogue cholecystokinin, stimulates gastric, biliary, and pancreatic secretion. Caerulein injections cause acute pancreatitis in mice.
Copyright © 2002-2019 AnaSpec, Inc. All rights reserved. | Site Map | Terms & Conditions | 1-800-452-5530