summaryrefslogtreecommitdiffstats
path: root/remoting/base
Commit message (Collapse)AuthorAgeFilesLines
* Introducing remoting::Stoppable helper base class implementing asynchronous ↵alexeypa@chromium.org2012-07-312-0/+104
| | | | | | | | shutdown on a specific thread. Review URL: https://chromiumcodereview.appspot.com/10796099 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@149273 0039d316-1c4b-4281-b951-d872f2087c98
* [Chromoting] Re-enable a unit test.simonmorris@chromium.org2012-07-311-5/+4
| | | | | | | | | A mac_valgrind suppression was added at r148972. Review URL: https://chromiumcodereview.appspot.com/10825092 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@149256 0039d316-1c4b-4281-b951-d872f2087c98
* [Chromoting] Disable a unit test in which win_tsan and mac_valgrind catch leaks.simonmorris@chromium.org2012-07-301-4/+5
| | | | | | | | | The unit test was added in r148888. Review URL: https://chromiumcodereview.appspot.com/10826062 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@148969 0039d316-1c4b-4281-b951-d872f2087c98
* [Chromoting] Add unit tests for up- and down-scaling.simonmorris@chromium.org2012-07-283-77/+164
| | | | | | Review URL: https://chromiumcodereview.appspot.com/10828058 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@148888 0039d316-1c4b-4281-b951-d872f2087c98
* Replace PluginMessageLoopProxy with PluginThreadTaskRunner.sergeyu@chromium.org2012-07-272-21/+21
| | | | | | | | | | | | Previosly plugin code was using PluginMessageLoopProxy that implements MessageLoopProxy interface. We no longer need MessageLoopProxy. Replacing PluginMessageLoopProxy with PluginThreadTaskRunner that implements SingleThreadTaskRunner interface Review URL: https://chromiumcodereview.appspot.com/10830016 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@148801 0039d316-1c4b-4281-b951-d872f2087c98
* [Chromoting] Add a unit test to verify that the VP8 codec doesn't change ↵simonmorris@chromium.org2012-07-273-3/+120
| | | | | | | | color values too much. Review URL: https://chromiumcodereview.appspot.com/10833022 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@148779 0039d316-1c4b-4281-b951-d872f2087c98
* Fix EncoderVp8 for odd-height images.wez@chromium.org2012-07-212-44/+33
| | | | | | | | | | | | | | | This CL makes three changes: * Use consistent Y/U/V buffer positions between the conversion & encode steps. * Don't clip the image to even dimensions before converting it. * CHECK that aligning a non-empty region results in a non-empty region. BUG=137274 TEST=Create a virtual desktop with odd dimensions and connect to it with Chromoting. Colour should not be funky, and there should be no "ghosting". Review URL: https://chromiumcodereview.appspot.com/10789051 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@147760 0039d316-1c4b-4281-b951-d872f2087c98
* Changed test video dimension from 1x1 to 32x32hclam@chromium.org2012-07-202-2/+5
| | | | | | | | | | | | Latest eider branch libvpx runs in infinite loop with dimension smaller than 32x32. BUG=None TEST=remoting_unittets runs Review URL: https://chromiumcodereview.appspot.com/10802057 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@147723 0039d316-1c4b-4281-b951-d872f2087c98
* Added support of DISPATCH_PROPERTYPUT and DISPATCH_PROPERTYPUTREF to ↵alexeypa@chromium.org2012-07-172-9/+90
| | | | | | | | | | | remoting::dispatch::Invoke(). According to MSDN (http://msdn.microsoft.com/en-us/library/windows/desktop/ms221479(v=vs.85).aspx) when IDispatch::Invoke() is used with DISPATCH_PROPERTYPUT or DISPATCH_PROPERTYPUTREF, the property setter's parameter must be named. Review URL: https://chromiumcodereview.appspot.com/10736059 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@147106 0039d316-1c4b-4281-b951-d872f2087c98
* Add DPI information to video packets.jamiewalch@chromium.org2012-07-145-2/+51
| | | | | | | | | | | | | | | The intention is that capturers can add this information and the client can make use of it to up-scale the desktop if it DPI is larger than that of the host by an integer multiple. For example, a standard-DPI host viewed on a retina-display Macbook Pro would no longer look tiny. BUG=135089 TEST=EncoderVp8Test.TestDpiPropagation Review URL: https://chromiumcodereview.appspot.com/10736046 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@146715 0039d316-1c4b-4281-b951-d872f2087c98
* The user's consent to crash dumps reporting can now be set via the UI ↵alexeypa@chromium.org2012-06-221-3/+0
| | | | | | | | | | (Windows only). The checkbox is presented on the Start/Change PIN dialog. The user's selection is then written to usagestats under ClientStateMedium key. BUG=130678 Review URL: https://chromiumcodereview.appspot.com/10537182 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@143504 0039d316-1c4b-4281-b951-d872f2087c98
* Adding support of [in] [out] parameters to remoting::dispatch::Invoke().alexeypa@chromium.org2012-06-212-29/+80
| | | | | | | | | BUG=131498 Review URL: https://chromiumcodereview.appspot.com/10532143 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@143443 0039d316-1c4b-4281-b951-d872f2087c98
* Remove old Sleep and PostDelayedTask interfaces that use int ms instead of ↵tedvessenes@gmail.com2012-06-212-24/+0
| | | | | | | | | | | | TimeDelta. The previous version of this patch was reverted due to crashing cros_x86 and cros_tegra2 builds. See: http://codereview.chromium.org/9703053/ BUG=108171 Review URL: https://chromiumcodereview.appspot.com/10572030 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@143401 0039d316-1c4b-4281-b951-d872f2087c98
* Fix up-scaling case to early-exit if no updates are within clip area.wez@chromium.org2012-06-201-0/+6
| | | | | | | | | | | The RectangleUpdateDecoder expects Decoders to report an empty update region if no updates lay within the clip area, to provide rendering flow-control. The VP8 Decoder was always reporting the entire frame as having been rendered when up-scaling, resulting in continuous re-rendering of the frame. BUG=116835,133609 TEST=Run Chromoting client with page-zoom >100% to a host with little or no changes happening on-screen and verify that the client's CPU usage is not >50%. Review URL: https://chromiumcodereview.appspot.com/10576017 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@143132 0039d316-1c4b-4281-b951-d872f2087c98
* Allow the Chromoting client plugin to support up-scaling, albeit slowly.wez@chromium.org2012-06-183-10/+48
| | | | | | | | | BUG=116138 Review URL: https://chromiumcodereview.appspot.com/9568048 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@142853 0039d316-1c4b-4281-b951-d872f2087c98
* C++ readability review fixes for r141239: Make Chromoting Host report ↵alexeypa@chromium.org2012-06-165-87/+121
| | | | | | | | | | | crashes to Breakpad (Windows only). BUG=130678 TEST=remoting_unittests.BreakpadWinDeathTest Review URL: https://chromiumcodereview.appspot.com/10535082 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@142581 0039d316-1c4b-4281-b951-d872f2087c98
* Added files for audio writers.kxing@chromium.org2012-06-152-0/+2
| | | | | | | | | | The structure of AudioWriter and ProtobufAudioWriter are similar to their video counterparts. Review URL: https://chromiumcodereview.appspot.com/10535153 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@142297 0039d316-1c4b-4281-b951-d872f2087c98
* Roll Breakpad to @970.alexeypa@chromium.org2012-06-141-2/+3
| | | | | | | | | | | | Add two NULL parameters to CrashGenerationServer ctor to match the new prototype (changed in r952) Add the files appeared in r945 to breakpad.gyp BUG=127776,132164 TEST=remoting_unittests.BreakpadWinDeathTest.* Review URL: https://chromiumcodereview.appspot.com/10544121 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@142200 0039d316-1c4b-4281-b951-d872f2087c98
* [Chromoting] Using IDispatch::Invoke() to call Omaha inetrfaces.alexeypa@chromium.org2012-06-132-0/+716
| | | | | | | | | | Omaha uses non-standard scheme for versioning its COM interfaces. Instead of letting the callers to know a fixed UUID and prototype of an interface, Omaha relies on the callers to use late binding via IDispatch::Invoke. This way it can extend an interface after it has been released by adding new members and changing its UUID. The limitation is that vtable can no longer be used. BUG=131498 Review URL: https://chromiumcodereview.appspot.com/10532099 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@141960 0039d316-1c4b-4281-b951-d872f2087c98
* Make Chromoting Host report crashes to Breakpad (Windows only). The user ↵alexeypa@chromium.org2012-06-086-0/+401
| | | | | | | | | | | | must enable crash dumps collection by setting the "usagestats" value in the ClientState or ClientStateMedium key. BUG=130678 TEST=remoting_unittests.BreakpadWinDeathTest Review URL: https://chromiumcodereview.appspot.com/10495003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@141239 0039d316-1c4b-4281-b951-d872f2087c98
* Replace ScopedThreadProxy with MessageLoopProxy & WeakPtrs.wez@chromium.org2012-06-072-159/+0
| | | | | | | | | | | | | | | | | | | This affects the following classes: * ChromotingClient * ChromotingInstance * HostUserInterface * It2MeHostUserInterface The MessageLoopProxy/WeakPtr combination requires that the WeakPtr is created on the thread referred to by the proxy; code in which that is hard to arrange usually has subtle race-conditions. This is a re-land of CL 1045404, replacing some CR_DEFINE_STATIC_LOCAL() instances with base::LazyInstance to avoid adding global initializers or finalizers. TEST=Existing unit-tests, and manual testing. Review URL: https://chromiumcodereview.appspot.com/10440107 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@141028 0039d316-1c4b-4281-b951-d872f2087c98
* Refactor EncoderVp8 to use SkRegion in place of RectVector.wez@chromium.org2012-06-043-90/+57
| | | | | | | | | | | | | This simplifies the EncoderVp8 capture preparation logic. The CL also changes the EncoderVp8 to CHECK if the capture pixel format is not supported, rather than silently failing. BUG=105401 TEST=Unit-tests and manual verification of Chromoting session video playback. Review URL: https://chromiumcodereview.appspot.com/10502003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@140354 0039d316-1c4b-4281-b951-d872f2087c98
* [Chromoting] Handle CR-LF correctly when transferring text items to and from ↵simonmorris@chromium.org2012-06-023-0/+113
| | | | | | | | | | | | | | the clipboard on a Windows host. When reading from the clipboard, CR-LF pairs are replaced by LF. When writing to the clipboard, each LF is replaced by CR-LF. BUG=117473 Review URL: https://chromiumcodereview.appspot.com/10441131 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@140206 0039d316-1c4b-4281-b951-d872f2087c98
* Revert 140102 - Remove old PostDelayedTask interfaces that use int ms ↵asanka@chromium.org2012-06-014-6/+30
| | | | | | | | | | | | | | | | instead of TimeDelta. Compile failed on ChromiumOS x86 and Tegra. BUG=108171 Review URL: https://chromiumcodereview.appspot.com/9703053 TBR=tedvessenes@gmail.com Review URL: https://chromiumcodereview.appspot.com/10496002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@140109 0039d316-1c4b-4281-b951-d872f2087c98
* Remove old PostDelayedTask interfaces that use int ms instead of TimeDelta.tedvessenes@gmail.com2012-06-014-30/+6
| | | | | | | | | BUG=108171 Review URL: https://chromiumcodereview.appspot.com/9703053 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@140102 0039d316-1c4b-4281-b951-d872f2087c98
* Base: Add a handle verifier to ScopedHandle.rvargas@chromium.org2012-05-311-1/+2
| | | | | | | | | | | | | This provides basic tracking of handles for XP. BUG=127931 TEST=none TBR=abodenha, wez Review URL: https://chromiumcodereview.appspot.com/10453082 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@139736 0039d316-1c4b-4281-b951-d872f2087c98
* Revert 139623 - Replace ScopedThreadProxy with MessageLoopProxy & WeakPtrs.wez@chromium.org2012-05-302-0/+159
| | | | | | | | | | | | | | | | | | | | This affects the following classes: * ChromotingClient * ChromotingInstance * HostUserInterface * It2MeHostUserInterface The MessageLoopProxy/WeakPtr combination requires that the WeakPtr is created on the thread referred to by the proxy; code in which that is hard to arrange usually has subtle race-conditions. TEST=Existing unit-tests, and manual testing. Review URL: https://chromiumcodereview.appspot.com/10454040 TBR=wez@chromium.org Review URL: https://chromiumcodereview.appspot.com/10446088 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@139633 0039d316-1c4b-4281-b951-d872f2087c98
* Replace ScopedThreadProxy with MessageLoopProxy & WeakPtrs.wez@chromium.org2012-05-302-159/+0
| | | | | | | | | | | | | | | | | This affects the following classes: * ChromotingClient * ChromotingInstance * HostUserInterface * It2MeHostUserInterface The MessageLoopProxy/WeakPtr combination requires that the WeakPtr is created on the thread referred to by the proxy; code in which that is hard to arrange usually has subtle race-conditions. TEST=Existing unit-tests, and manual testing. Review URL: https://chromiumcodereview.appspot.com/10454040 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@139623 0039d316-1c4b-4281-b951-d872f2087c98
* Cleanup: Remove unneeded scoped_ptr.h includes from ppapi, printing, ↵thestig@chromium.org2012-05-164-3/+5
| | | | | | | | | | | | remoting, and sync. BUG=none TEST=none TBR=brettw,hclam,akalin,abodenha Review URL: https://chromiumcodereview.appspot.com/10387107 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@137376 0039d316-1c4b-4281-b951-d872f2087c98
* Refcounted types should not have public destructors, remoting/ editionrsleevi@chromium.org2012-04-241-4/+4
| | | | | | | | | | BUG=123295 TEST=none Review URL: http://codereview.chromium.org/10066042 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@133801 0039d316-1c4b-4281-b951-d872f2087c98
* Add padding at the end of encoder buffer to workaround crbug.com/119633.sergeyu@chromium.org2012-04-121-25/+31
| | | | | | | | | | | Beside that fixed a bug in the encoder that would cause it to allocated too small buffer for images with odd size. BUG=119636 Review URL: https://chromiumcodereview.appspot.com/10020062 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@132071 0039d316-1c4b-4281-b951-d872f2087c98
* Cull unnecessary media::VideoFrame::Formats from the enum.fischman@chromium.org2012-04-114-22/+8
| | | | | | | | | | | | This removes the easy ones: RGB555, RGB565, RGB24, RGBA, NV12, and ASCII. BUG=108306 TEST=videotestmatrix is still as happy as it was. Review URL: http://codereview.chromium.org/10024072 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@131682 0039d316-1c4b-4281-b951-d872f2087c98
* Objects that derive from RefCounted/RefCountedThreadSafe should not have ↵rsleevi@chromium.org2012-04-061-1/+3
| | | | | | | | | | | | public dtors. BUG=none TEST=compiles Review URL: http://codereview.chromium.org/9997007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@131088 0039d316-1c4b-4281-b951-d872f2087c98
* [Chromoting] Let the webapp send text clipboard items to the client plugin.simonmorris@chromium.org2012-03-302-2/+2
| | | | | | | | | BUG=117473 Review URL: http://codereview.chromium.org/9834036 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@129757 0039d316-1c4b-4281-b951-d872f2087c98
* Use scoped_ptr<> to pass ownership in more places.sergeyu@chromium.org2012-03-205-37/+30
| | | | | | Review URL: http://codereview.chromium.org/9720019 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@127767 0039d316-1c4b-4281-b951-d872f2087c98
* Add the plumbing that will carry a clipboard item from a chromoting client ↵simonmorris@chromium.org2012-03-162-2/+7
| | | | | | | | | | | to a host. BUG=117473 Review URL: http://codereview.chromium.org/9646013 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@127195 0039d316-1c4b-4281-b951-d872f2087c98
* Fix startup race-conditions in new Decoder pipeline:wez@chromium.org2012-03-082-14/+26
| | | | | | | | | | | | | | | | | Fix RectangleUpdateDecoder to cope with rendering requests before it is ready. Fix PepperView not to InitiateDrawing() until initialized. Fix DecoderVp8::RenderFrame() to allow being called before a frame is decoded. Add DCHECKs for screen and view size to DecoderVp8. Clarify requirements on FrameProducer interface implementation in comments. Clarify screen and view size requirements on Decoder interface methods. BUG=116842,116851 Review URL: http://codereview.chromium.org/9624022 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@125536 0039d316-1c4b-4281-b951-d872f2087c98
* Making remoting::ScopedScHandle an instance of the ↵alexeypa@chromium.org2012-03-082-63/+16
| | | | | | | | base::win::GenericScopedHandle template. Review URL: http://codereview.chromium.org/9600069 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@125535 0039d316-1c4b-4281-b951-d872f2087c98
* Disable rendering on up-scale.wez@chromium.org2012-03-031-0/+9
| | | | | | | | | BUG=116138 Review URL: http://codereview.chromium.org/9583020 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@124868 0039d316-1c4b-4281-b951-d872f2087c98
* Add functions to expand PostDelayedTask interface.tedvessenes@gmail.com2012-02-262-2/+26
| | | | | | | | | | | | These functions add TimeDelta interfaces in addition to the int ms interfaces, which will be removed at a later date. BUG=108171 Review URL: http://codereview.chromium.org/9427023 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@123683 0039d316-1c4b-4281-b951-d872f2087c98
* This CL makes several the following improvements to the Chromoting decoder ↵alexeypa@chromium.org2012-02-248-164/+162
| | | | | | | | | | | | | | | pipeline: 1. Only the clipping area, not the full frame, is drawn. This reduces the risk of out of memory situation on high page zoom levels. Screen updates are also incremental including scrolling scenarios. 2. Decoders now write pixels directly to the Pepper API backing store making it one memcpy less. 3. Scaling and panning is fully controlled by the plugin. The decoder only supplies the pixels it was asked for by the plugin. BUG=109938 Review URL: http://codereview.chromium.org/9331003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@123573 0039d316-1c4b-4281-b951-d872f2087c98
* Make new TaskRunner, SequencedTaskRunner, and SingleThreadTaskRunner interfacesakalin@chromium.org2012-02-152-21/+2
| | | | | | | | | | | | | | TaskRunner just has Post{,Delayed}Task(), SequencedTaskRunner extends Executor to have ordering guarantees and PostNonNestable{,Delayed}Task(), and SingleThreadTaskRunner extends SequencedTaskRunner and guarantees execution on a single thread. Move a bunch of methods from MessageLoopProxy into the TaskRunner classes and make it inherit from SingleThreadTaskRunner. BUG=110973 TEST= Review URL: https://chromiumcodereview.appspot.com/9169037 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@121999 0039d316-1c4b-4281-b951-d872f2087c98
* 1. Implemented installation and uninstallation code for the Chromoting service.alexeypa@chromium.org2012-02-102-0/+88
| | | | | | | | | 2. Introduced base::win::ScopedScHandle wrapper to make sure SCM handles are released properly. Review URL: http://codereview.chromium.org/9358034 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@121389 0039d316-1c4b-4281-b951-d872f2087c98
* Introducing helper wrappers for copying a rectangle from a one partial ↵alexeypa@chromium.org2012-02-095-125/+395
| | | | | | | | | | | | | | buffer to another. YUV to RGB and RGB to RGB operations are supported. YUV to RGB allows down-scaling of re This CL also adds a supression for Valgrind which otherwise falsely complains about accessing uninitialized memory. See 113076 for details. BUG=109938,113076 TEST=remoting_unittests.Yuv2Rgb Review URL: http://codereview.chromium.org/9371002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@121258 0039d316-1c4b-4281-b951-d872f2087c98
* Reverting 120739 that caused valgrind breaks.alexeypa@chromium.org2012-02-075-395/+125
| | | | | | | | | BUG=109938 Review URL: http://codereview.chromium.org/9352017 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@120866 0039d316-1c4b-4281-b951-d872f2087c98
* Introducing helper wrappers for copying a rectangle from a one partial ↵alexeypa@chromium.org2012-02-075-125/+395
| | | | | | | | | | | buffer to another. YUV to RGB and RGB to RGB operations are supported. YUV to RGB allows down-scaling of rectangles. The wrappers hide (to some degree) gory details of manipulations with buffer pointers and rectangles. Added unit tests (remoting_unittests.Yuv2Rgb) to verify functionality of the YUV to RGB wrapper. BUG=109938 TEST=remoting_unittests.Yuv2Rgb Review URL: http://codereview.chromium.org/9320025 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@120739 0039d316-1c4b-4281-b951-d872f2087c98
* Replace RectVectors with SkRegions in Decoder.wez@chromium.org2012-01-296-105/+93
| | | | | | | | | | | BUG=105401 Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=118790 Review URL: http://codereview.chromium.org/9277001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@119632 0039d316-1c4b-4281-b951-d872f2087c98
* Revert 118790 - Compile error due to missing operator== on SkRegionrsleevi@chromium.org2012-01-246-93/+105
| | | | | | | | | | | | | | Replace RectVectors with SkRegions in Decoder. BUG=105401 Review URL: http://codereview.chromium.org/9277001 TBR=wez@chromium.org Review URL: https://chromiumcodereview.appspot.com/9146030 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@118793 0039d316-1c4b-4281-b951-d872f2087c98
* Replace RectVectors with SkRegions in Decoder.wez@chromium.org2012-01-246-105/+93
| | | | | | | | | BUG=105401 Review URL: http://codereview.chromium.org/9277001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@118790 0039d316-1c4b-4281-b951-d872f2087c98
* Fix DecoderVp8::ConvertRects() to call conversion routine with aligned rects.wez@chromium.org2012-01-142-12/+13
| | | | | | | | | | BUG=109954 TEST=No visual artefacts when scrolling up and down a Chromoting Host view a pixel at a time. Review URL: http://codereview.chromium.org/9148053 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@117769 0039d316-1c4b-4281-b951-d872f2087c98