|  | // Copyright (C) 2018 The Android Open Source Project | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | const LOADING_TEXT = 'Loading...'; | 
|  | let LOADING_TEXT_WIDTH = 0; | 
|  |  | 
|  | /** | 
|  | * Checker board the range [leftPx, rightPx]. | 
|  | */ | 
|  | export function checkerboard( | 
|  | ctx: CanvasRenderingContext2D, | 
|  | heightPx: number, | 
|  | leftPx: number, | 
|  | rightPx: number): void { | 
|  | const widthPx = rightPx - leftPx; | 
|  | ctx.font = '12px Roboto Condensed'; | 
|  | ctx.fillStyle = '#eee'; | 
|  | ctx.fillRect(leftPx, 0, widthPx, heightPx); | 
|  | ctx.fillStyle = '#666'; | 
|  | const oldBaseline = ctx.textBaseline; | 
|  | ctx.textBaseline = 'middle'; | 
|  | if (LOADING_TEXT_WIDTH === 0) { | 
|  | LOADING_TEXT_WIDTH = ctx.measureText(LOADING_TEXT).width; | 
|  | } | 
|  | if (LOADING_TEXT_WIDTH <= widthPx) { | 
|  | ctx.fillText( | 
|  | LOADING_TEXT, | 
|  | leftPx + widthPx / 2 - LOADING_TEXT_WIDTH / 2, | 
|  | heightPx / 2); | 
|  | } | 
|  | ctx.textBaseline = oldBaseline; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Checker board everything between [startPx, endPx] except [leftPx, rightPx]. | 
|  | */ | 
|  | export function checkerboardExcept( | 
|  | ctx: CanvasRenderingContext2D, | 
|  | heightPx: number, | 
|  | startPx: number, | 
|  | endPx: number, | 
|  | leftPx: number, | 
|  | rightPx: number): void { | 
|  | // [leftPx, rightPx] doesn't overlap [startPx, endPx] at all: | 
|  | if (rightPx <= startPx || leftPx >= endPx) { | 
|  | checkerboard(ctx, heightPx, startPx, endPx); | 
|  | return; | 
|  | } | 
|  |  | 
|  | // Checkerboard [startPx, leftPx]: | 
|  | if (leftPx > startPx) { | 
|  | checkerboard(ctx, heightPx, startPx, leftPx); | 
|  | } | 
|  |  | 
|  | // Checkerboard [rightPx, endPx]: | 
|  | if (rightPx < endPx) { | 
|  | checkerboard(ctx, heightPx, rightPx, endPx); | 
|  | } | 
|  | } |