| // 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); |
| } |
| } |